сорри за глуый вопрос, но что это за функция и что она делает? по-порядку: есть диалоговое виндоу, в нем листвью, листвью я сабклассю: OriginalListViewClassProc= (WNDPROC)(size_t)GetClassLongPtr(hListView, GWLP_WNDPROC); OriginalListViewClassProc= (WNDPROC)(size_t)GetWindowLongPtr(hListView, GWLP_WNDPROC); OriginalListViewClassProc= (WNDPROC)(size_t)SetWindowLongPtr(hListView, GWLP_WNDPROC, (LONG)(size_t)ListViewSubClassProc); так вот, первый вызов возвращает 0, второй - каждый раз разные значения, но все они начинаются на FFFF: 0FFFFXXXXh третий - то же, что и второй (слава богу)) естественно, если в ListViewSubClassProc() просто вызвать OriginalListViewClassProc(), она упадет, приходится юзать CallWindowProc так вот, вопросы: 1. что это за 0FFFFXXXXh и откуда CallWindowProc берет нужный адрес (в дебаге вообще ничего не поймешь, RtlActivateActivationContextUnsafeFast(), fs:18h итд) 2. откуда у окна оконная процедура, если она не зарегена в классе?
Если WndProc указывает не на старый обработчик, то он принимается за хендл. И из таблицы хендлов процесса извлекается уже реальный обработчик. Это у какого окна?
это что за хэндл за такой? а самому такие можно делать? ListView OriginalListViewClassProc= (WNDPROC)(size_t)GetClassLongPtr(hListView, GWLP_WNDPROC); OriginalListViewClassProc= (WNDPROC)(size_t)GetWindowLongPtr(hListView, GWLP_WNDPROC); первый вызов возвращает 0, второй - каждый раз разные значения, но все они начинаются на FFFF: 0FFFFXXXXh получается, что у класса оконная процедура не зарегена, откуда же она тогда взялась у самого окна?
Угу. Если (WndProc & 0xFFFF0000), тогда вызывается функция NtUserDereferenceWndProcHandle, которая и получает реальный wndproc. Хендл связан с внутренним CALLPROC-объектом. Код (Text): typedef struct _CALLPROC { struct _W32PROCESSINFO *pi; WNDPROC WndProc; UINT Unicode : 1; } CALLPROC, *PCALLPROC; Угу, только зачем. Вместо GWLP_WNDPROC надо GСLP_WNDPROC.
Хм. Нашёл другую структуру. Какая из них правильная проверять неохота. Код (Text): typedef struct _CALLPROCDATA { THRDESKHEAD head; struct _CALLPROCDATA *pcpdNext; ULONG_PTR pfnClientPrevious; WORD wType; } CALLPROCDATA, *PCALLPROCDATA;
ниче се... только не если (WndProc & 0xFFFF0000), а если (WndProc & 0xFFFF0000)==0xFFFF0000 ой.. ::embarrassed::