겸손한 개발을 위한 자양분

함수원형

 

__declspec(naked) LRESULT __stdcall NtUserMessageCall(

    HWND        hwnd,

    UINT        msg,

    WPARAM      wParam,

    LPARAM      lParam,

    ULONG_PTR   xParam,

    DWORD       xpfnProc,

    BOOL        bAnsi )

 

NtUserMessageCall … SendMessage 에 해당하는 시스템 서비스던가…? 기억력 감퇴;;

 

어찌되었든, NtUserMessageCall 에서의 메시지 처리는 xpfnProc 인자를 통해 이뤄집니다.

해당 인자는 Message를 처리해야 하는 win32k 의 처리 procedure 를 가리킵니다.

 

 

확인을 해보면,

가령 NtUserMessageCall 을 호출하는 RealDefWindowProcWorker 의 경우

.text:77D7AEB2 loc_77D7AEB2:                           ; CODE XREF: RealDefWindowProcWorker(x,x,x,x,x)-81C1j

.text:77D7AEB2                                         ; RealDefWindowProcWorker(x,x,x,x,x)+B2C9j ...

.text:77D7AEB2                 push    [ebp+lpMultiByteStr]

.text:77D7AEB5                 push    2B0h         // FNID_SENDMESSAGEEX

.text:77D7AEBA                 push    0

.text:77D7AEBC                 push    0

.text:77D7AEBE                 push    [ebp+hMem]

.text:77D7AEC1                 push    128h

.text:77D7AEC6

.text:77D7AEC6 loc_77D7AEC6:                           ; CODE XREF: RealDefWindowProcWorker(x,x,x,x,x)-81CAj

.text:77D7AEC6                                         ; RealDefWindowProcWorker(x,x,x,x,x)+3029Fj

.text:77D7AEC6                 push    ebx

.text:77D7AEC7                 jmp     loc_77D4C756

 

.text:77D4C756 loc_77D4C756:                           ; CODE XREF: RealDefWindowProcWorker(x,x,x,x,x)+2FE07j

.text:77D4C756                 call    ds:_gapfnScSendMessage ; NtUserMessageCall(x,x,x,x,x,x,x)

xpfnProc 0x2B0h

 

.text:77D4B2A5 loc_77D4B2A5:                           ; CODE XREF: RealDefWindowProcWorker(x,x,x,x,x)+38j

.text:77D4B2A5                 cmp     edi, 400h

.text:77D4B2AB                 push    [ebp+lpMultiByteStr] ; int

.text:77D4B2AE                 push    29Eh          // FNID_DEFWINDOWPROC

.text:77D4B2B3                 push    0               ; int

.text:77D4B2B5                 push    [ebp+hMem]      ; hMem

.text:77D4B2B8                 push    dword ptr [ebp+WideCharStr] ; int

.text:77D4B2BB                 push    edi             ; int

.text:77D4B2BC                 push    eax             ; int

.text:77D4B2BD                 jnb     loc_77D7AB10

.text:77D4B2C3                 xor     ecx, ecx

.text:77D4B2C5                 mov     cl, ds:_MessageTable[edi]

.text:77D4B2CB                 and     ecx, 3Fh        ; int

.text:77D4B2CE                 call    ds:_gapfnScSendMessage[ecx*4] ; NtUserMessageCall(x,x,x,x,x,x,x)

xpfnProc 0x29Eh

 

위의 두 부분에서 NtUserMessageCall 을 호출하고 있으며,

이때, NtUserMessageCall 에서는 이를 다음과 같이 처리합니다.

bf834b50 8b4d1c          mov     ecx,dword ptr [ebp+1Ch] // xpfnProc

bf834b53 83c106          add     ecx,6

bf834b56 83e11f          and     ecx,1Fh

bf834b59 ff7518          push    dword ptr [ebp+18h]

bf834b5c 50              push    eax

bf834b5d ff7510          push    dword ptr [ebp+10h]

bf834b60 ff750c          push    dword ptr [ebp+0Ch]

bf834b63 ff7508          push    dword ptr [ebp+8]

bf834b66 a158859abf      mov     eax,dword ptr [win32k!gpsi (bf9a8558)]

bf834b6b ff54880c        call    dword ptr [eax+ecx*4+0Ch]

 

위의 어셈 코드에서, 호출되는 procedure 의 주소를 보면,

bc5d0650  00200031

bc5d0654  00000000

bc5d0658  00000155

bc5d065c  bf90ade2 win32k!xxxWrapSBWnd16Proc

bc5d0660  bf80f420 win32k!xxxWrapRealDefWindowProc

bc5d0664  bf86a712 win32k!xxxWrapMenuWindowProc

bc5d0668  bf915448 win32k!xxxWrapDesktopWndProc

bc5d066c  bf80f420 win32k!xxxWrapRealDefWindowProc    >> (29E+6) & 1F

bc5d0670  bf80f420 win32k!xxxWrapRealDefWindowProc

bc5d0674  bf8cb6f2 win32k!xxxWrapSwitchWndProc

bc5d0678  bf942a7c win32k!xxxUnusedFunctionId

bc5d067c  bf942a7c win32k!xxxUnusedFunctionId

bc5d0680  bf942a7c win32k!xxxUnusedFunctionId

bc5d0684  bf942a7c win32k!xxxUnusedFunctionId

bc5d0688  bf942a7c win32k!xxxUnusedFunctionId

bc5d068c  bf942a7c win32k!xxxUnusedFunctionId

bc5d0690  bf942a7c win32k!xxxUnusedFunctionId

bc5d0694  bf942a7c win32k!xxxUnusedFunctionId

bc5d0698  bf942a7c win32k!xxxUnusedFunctionId

bc5d069c  bf90b699 win32k!fnHkINLPCWPEXSTRUCT

bc5d06a0  bf92f155 win32k!fnHkINLPCWPRETEXSTRUCT

bc5d06a4  bf942a7c win32k!xxxUnusedFunctionId

bc5d06a8  bf942a7c win32k!xxxUnusedFunctionId

bc5d06ac  bf942a7c win32k!xxxUnusedFunctionId

bc5d06b0  bf942a7c win32k!xxxUnusedFunctionId

bc5d06b4  bf831785 win32k!xxxWrapSendMessage          >> (2B0+6) & 1F

bc5d06b8  bf8a003f win32k!xxxSendMessageFF

bc5d06bc  bf82eedc win32k!xxxSendMessageEx

bc5d06c0  bf89ef23 win32k!xxxWrapCallWindowProc

bc5d06c4  bf8622d9 win32k!xxxWrapSendMessageBSM

bc5d06c8  bf942a7c win32k!xxxUnusedFunctionId

bc5d06cc  bf942a7c win32k!xxxUnusedFunctionId

bc5d06d0  bf82f3dd win32k!xxxWrapSendNotifyMessage

bc5d06d4  bf82f461 win32k!xxxWrapSendMessageCallback

bc5d06d8  bf942a7c win32k!xxxUnusedFunctionId

bc5d06dc  bf90a41b win32k!xxxSBWndProc

bc5d06e0  bf80d027 win32k!xxxDefWindowProc

bc5d06e4  bf865f56 win32k!xxxMenuWindowProc

bc5d06e8  bf87fac4 win32k!xxxDesktopWndProc

bc5d06ec  bf80d027 win32k!xxxDefWindowProc

bc5d06f0  bf80d027 win32k!xxxDefWindowProc

 

위와 같이 메시지를 처리하는 실제 procedure 들의 주소가 담긴 테이블을 확인할 수 있으며,

RealDefWindowProcWorker 가 호출하는 0x2B0, 0x29E 인자에 대응하는 실제 procedure 를 찾을 수 있습니다.

 

다음은 xpfnProc에 대응하는 FNID 값입니다.

#define FNID_START                  0x0000029A

#define FNID_WNDPROCSTART           0x0000029A

 

#define FNID_SCROLLBAR              0x0000029A      // xxxSBWndProc;

#define FNID_ICONTITLE              0x0000029B      // xxxDefWindowProc;

#define FNID_MENU                   0x0000029C      // xxxMenuWindowProc;

#define FNID_DESKTOP                0x0000029D      // xxxDesktopWndProc;

#define FNID_DEFWINDOWPROC          0x0000029E      // xxxDefWindowProc;

 

#define FNID_WNDPROCEND             0x0000029E      // see PatchThreadWindows

#define FNID_CONTROLSTART           0x0000029F

 

#define FNID_BUTTON                 0x0000029F      // No server side proc

#define FNID_COMBOBOX               0x000002A0      // No server side proc

#define FNID_COMBOLISTBOX           0x000002A1      // No server side proc

#define FNID_DIALOG                 0x000002A2      // No server side proc

#define FNID_EDIT                   0x000002A3      // No server side proc

#define FNID_LISTBOX                0x000002A4      // No server side proc

#define FNID_MDICLIENT              0x000002A5      // No server side proc

#define FNID_STATIC                 0x000002A6      // No server side proc

 

#define FNID_IME                    0x000002A7      // No server side proc

#define FNID_CONTROLEND             0x000002A7

 

#define FNID_HKINLPCWPEXSTRUCT      0x000002A8

#define FNID_HKINLPCWPRETEXSTRUCT   0x000002A9

#define FNID_DEFFRAMEPROC           0x000002AA      // No server side proc

#define FNID_DEFMDICHILDPROC        0x000002AB      // No server side proc

#define FNID_MB_DLGPROC             0x000002AC      // No server side proc

#define FNID_MDIACTIVATEDLGPROC     0x000002AD      // No server side proc

#define FNID_SENDMESSAGE            0x000002AE

 

#define FNID_SENDMESSAGEFF          0x000002AF

#define FNID_SENDMESSAGEEX          0x000002B0

#define FNID_CALLWINDOWPROC         0x000002B1

#define FNID_SENDMESSAGEBSM         0x000002B2

#define FNID_SWITCH                 0x000002B3      // Just used by GetTopMostInserAfter

#define FNID_TOOLTIP                0x000002B4

#define FNID_END                    0x000002B4

Visual DDK

잡담2010. 1. 6. 16:03

OSR의 The NT Insider (Nov-Dec 2009) 가 왔길래 읽어보다가,
Visual DDK 라는걸 보게 되었는데...

이거 뭔가 새로운 신세계인듯...


http://visualddk.sysprogs.org/

아동 후원~

잡담2009. 11. 25. 11:40
사용자 삽입 이미지

국내 1만원 , 해외 1만원

내게는 크지 않은 돈이지만,
누군가에게는 큰 돈일 수도 있기 때문에~

후원 시작~

http://www.goodneighbors.kr/

Visual Studio 6 를 설치할때,
인스톨러가 MS JVM 설치 유무를 검사하는 것 같습니다.
그런데, 64Bit OS 에는 이 MS JVM 이 설치가 안되네요.

JVM 이 설치된 것 처럼 위장하기 위해서는
MSJAVA.DLL 파일을 시스템 디렉토리에 복사해주면됩니다.

저는, 인터넷에서 원본 파일을 구해보지는 않았으나
간단히 콘솔에서 0바이트 파일을 만들어 복사하는 것 만으로도
설치를 정상적으로 할 수 있었습니다.

끝.