Дайте прототип, плиз. Что то никак не пойму, где там какой параметр. В исходниках 2к прототип (для win32k.sys) такой: Код (Text): W32KAPI HWND NtUserCreateWindowEx( IN DWORD dwExStyle, IN PLARGE_STRING pstrClassName, IN PLARGE_STRING pstrWindowName OPTIONAL, IN DWORD dwStyle, IN int x, IN int y, IN int nWidth, IN int nHeight, IN HWND hwndParent, IN HMENU hmenu, IN HANDLE hModule, IN LPVOID pParam, IN DWORD dwFlags); Но судя по тому что я вижу в WinDbg, второй параметр точно не указатель. Для user32.dll Код (Text): kd> bp user32!NtUserCreateWindowEx kd> g Breakpoint 0 hit user32!NtUserCreateWindowEx: 001b:77d517df b857110000 mov eax,1157h kd> kvn # ChildEBP RetAddr Args to Child 00 0012fe50 77d557f8 80010100 00008002 0012feb4 user32!NtUserCreateWindowEx 01 0012ff28 77d56877 00400000 00008002 00000000 user32!InternalCreateDialog+0x5bc (FPO: [Non-Fpo]) 02 0012ff5c 77d568cc 00400000 00404060 00000000 user32!InternalDialogBox+0xa9 (FPO: [Non-Fpo]) 03 0012ff7c 77d5892d 00400000 00404060 00000000 user32!DialogBoxIndirectParamAorW+0x37 (FPO: [Non-Fpo]) 04 0012ffa8 00401027 00400000 00000065 00000000 user32!DialogBoxParamA+0x4c (FPO: [Non-Fpo]) kd> dps 00008002 00008002 ???????? 00008006 ???????? 0000800a ???????? 0000800e ???????? 00008012 ???????? 00008016 ???????? 0000801a ???????? И для win32k.sys Код (Text): kd> bp win32k!NtUserCreateWindowEx WARNING: Software breakpoints on session addresses can cause bugchecks. Use hardware execution breakpoints (ba e) if possible. breakpoint 1 redefined kd> g Breakpoint 1 hit win32k!NtUserCreateWindowEx: bf82f80f 6a54 push 54h kd> kvn # ChildEBP RetAddr Args to Child 00 f8093d20 804df06b 80010100 00008002 00008002 win32k!NtUserCreateWindowEx (FPO: [Non-Fpo]) 01 f8093d20 7c90eb94 80010100 00008002 00008002 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f8093d64) 02 0012f9ac 77d517eb 77d517b1 80010100 00008002 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 03 0012fe50 77d557f8 80010100 00008002 0012feb4 user32!NtUserCreateWindowEx+0xc 04 0012ff28 77d56877 00400000 00008002 00000000 user32!InternalCreateDialog+0x5bc (FPO: [Non-Fpo]) 05 0012ff5c 77d568cc 00400000 00404060 00000000 user32!InternalDialogBox+0xa9 (FPO: [Non-Fpo]) 06 0012ff7c 77d5892d 00400000 00404060 00000000 user32!DialogBoxIndirectParamAorW+0x37 (FPO: [Non-Fpo]) 07 0012ffa8 00401027 00400000 00000065 00000000 user32!DialogBoxParamA+0x4c (FPO: [Non-Fpo]) WARNING: Stack unwind information not available. Following frames may be wrong. 08 0012fff0 00000000 00401000 00000000 78746341 Windows_Test+0x1027 kd> dps 00008002 00008002 ???????? 00008006 ???????? 0000800a ???????? 0000800e ???????? 00008012 ???????? Или я чего то недопонимаю...?
Параметры CreateWindowEx мне хорошо известны. И они разумеется не такие. Код (Text): HWND CreateWindowEx( DWORD dwExStyle, // extended window style LPCTSTR lpClassName, // pointer to registered class name LPCTSTR lpWindowName, // pointer to window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // handle to menu, or child-window identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // pointer to window-creation data ); Если ты заметил то она уже под отладчиком, но тратить день и разгадывать ребусы от microsoft, мне как бы не очень хочется.
Код (Text): W32KAPI HWND NtUserCreateWindowEx( IN DWORD dwExStyle, // extended window style IN PLARGE_STRING pstrClassName,// pointer to registered class name IN PLARGE_STRING pstrWindowName OPTIONAL, // pointer to window name IN DWORD dwStyle, // window style IN int x, // horizontal position of window IN int y, // vertical position of window IN int nWidth, // window width IN int nHeight, // window height IN HWND hwndParent, // handle to parent or owner window IN HMENU hmenu, // handle to menu, or child-window identifier IN HANDLE hModule, // handle to application instance IN LPVOID pParam, // pointer to window-creation data IN DWORD dwFlags); // хз И без отлабчика можно понять.
Я прошу прощения, но ты читал первый пост вообще? Перечитай ещё раз. Второй параметр не указатель. Этот прототип устарел.
Посмотрел отладчиком: второй параметр IN PLARGE_STRING pstrClassName,// pointer to registered class name Версия 5.1.2600.2180.
Не нашёл описания этой структуры; сделал сам: LARGE_STRING struct _Length ULONG ? MaximumLength ULONG ? Buffer PWSTR ? LARGE_STRING ends PLARGE_STRING typedef ptr LARGE_STRING
Вопервых: Код (Text): typedef struct _LARGE_STRING { ULONG Length; ULONG MaximumLength : 31; ULONG bAnsi : 1; KERNEL_PVOID Buffer; } LARGE_STRING, *PLARGE_STRING; Вовторых: в случае когда вызывается функция типа DialogBoxParam и тому подобные, туда не обязательно передаётся указатель, эта была загвоздка в моём случае. Втретьих: сейчас прототип выглядит не так, хотя бы потому что: Код (Text): user32!NtUserCreateWindowEx: 001b:77d517df b857110000 mov eax,1157h 001b:77d517e4 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300) 001b:77d517e9 ff12 call dword ptr [edx] 001b:77d517eb c23c00 ret 3Ch 001b:77d517ee 90 nop 001b:77d517ef 90 nop 001b:77d517f0 90 nop 001b:77d517f1 90 nop 001b:77d517f2 90 nop у неё 15 параметров, а не 13. Но видимо нормального прототипа действительно ни у кого нет, так что придётся искать самому.
Lord_De_Seis В CreateWindowEx второй параметр (pClassName) тоже декларируется как указатель, но, тем не менее, может быть атомом (ATOM).
Lord_De_Seis Во первых мне было пох на число параметров, я смотрел тока второй. Во вторых, когда второй параметр наконецто стал указателем, есть вообщето опциональные параметры. А вообще, чтобы узнать параметры сервиса, вызываемого из режима пользователя, надо применять ядерный отладчик !?
А у меня проблема с третим параметром.. Хочу, чтобы окно игры создавалась без caption'a. Kerberos'ом прошелся, выдало: Код (Text): CreateWindowExA(00000000, 01E7D5C0: "Valve001", 0012F9AC: "Counter-Strike", 84CA0000, 00000000, 00000000, 00000400, 00000300, 00000000, 00000000) returns: 000C0112 Хукаю NtUserCreateWindowEx: Код (Text): .if eax == 1157h ;NtUserCreateWindowEx mov eax,SERVICE_CALLSTACK.Param2[esi] mov ecx,[eax+8] .if byte ptr [ecx+0] == 'V' &&\ ;Valve001 byte ptr [ecx+2] == 'a' &&\ byte ptr [ecx+4] == 'l' &&\ byte ptr [ecx+14] == '1' ; до сюда мы доходим, я проверял.. mov eax,SERVICE_CALLSTACK.Param3[esi] mov ecx,[eax+8] ; тут у нас почему-то тоже название класса, вместо "Counter-Strike" .endif .endif Спрошивается, что за нафиг ?