CallWindowProc

Тема в разделе "WASM.WIN32", создана пользователем Nouzui, 16 дек 2006.

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    сорри за глуый вопрос, но что это за функция и что она делает?
    по-порядку: есть диалоговое виндоу, в нем листвью, листвью я сабклассю:

    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. откуда у окна оконная процедура, если она не зарегена в классе?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Если WndProc указывает не на старый обработчик, то он принимается за хендл. И из таблицы хендлов процесса извлекается уже реальный обработчик.
    Это у какого окна?
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    это что за хэндл за такой?
    а самому такие можно делать?

    ListView

    OriginalListViewClassProc= (WNDPROC)(size_t)GetClassLongPtr(hListView, GWLP_WNDPROC);
    OriginalListViewClassProc= (WNDPROC)(size_t)GetWindowLongPtr(hListView, GWLP_WNDPROC);

    первый вызов возвращает 0, второй - каждый раз разные значения, но все они начинаются на FFFF: 0FFFFXXXXh

    получается, что у класса оконная процедура не зарегена, откуда же она тогда взялась у самого окна?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Угу.
    Если (WndProc & 0xFFFF0000), тогда вызывается функция NtUserDereferenceWndProcHandle, которая и получает реальный wndproc. Хендл связан с внутренним CALLPROC-объектом.
    Код (Text):
    1. typedef struct _CALLPROC
    2. {
    3.     struct _W32PROCESSINFO *pi;
    4.     WNDPROC WndProc;
    5.     UINT Unicode : 1;
    6. } CALLPROC, *PCALLPROC;
    Угу, только зачем.
    Вместо GWLP_WNDPROC надо GСLP_WNDPROC.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Хм. Нашёл другую структуру. Какая из них правильная проверять неохота.
    Код (Text):
    1. typedef struct _CALLPROCDATA {
    2.     THRDESKHEAD     head;
    3.     struct _CALLPROCDATA *pcpdNext;
    4.     ULONG_PTR        pfnClientPrevious;
    5.     WORD            wType;
    6. } CALLPROCDATA, *PCALLPROCDATA;
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ниче се...
    только не если (WndProc & 0xFFFF0000), а если (WndProc & 0xFFFF0000)==0xFFFF0000

    ой.. ::embarrassed::