Вопрос по передаче сообщений в Windows

Тема в разделе "WASM.WIN32", создана пользователем Celestia, 13 дек 2010.

Статус темы:
Закрыта.
  1. Celestia

    Celestia New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    8
    Здравствуйте!
    Я сейчас изучаю внутренние механизмы Windows, и возник вопрос:
    Вот к примеру, для того чтобы программа могла "общаться" с ядром существует библиотеки Winapi, которые в свою очередь связаны с kernel32.dll и win32k.sys и которые "общаются" с ядром через прерывание 2Eh. Мне не понятен обратный механизм: каким образом в программу передаются WM_, BM_ и прочие сообщения?
    А также, я предполагаю что в системе существуют некие дескрипторные таблицы в которых содержатся некие индексы процессов, по которым и происходит поиск нужного процесса для передачи ему сообщения?
    Да, и ещё, вот после передачи сообщения через 2Eh, куда оно попадает в ядре? Возможно существует что то типо конвейера команд?

    Буду рад любой помощи по этим вопросам, спасибо!

    PS.: 2Eh = sysenter в >win2k кажется )
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вам не все равно? эти механизмы слишком комплексные, чтобы их объяснить в двух словах... прочтите сначала рихтера, потом можно начинать более тяжелую литературу штудировать, если она вам нужно будет...
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Celestia
    Ой..

    Ну вот, напутали.
    программа общается с kernel32/user32/advapi32/etc.. (Win32 API).
    WinAPI общается с ntdll.dll Native API (user-mode) (для user32/gdi32 оба слоя WinAPI + NativeAPI лежат в этих длл вместе)
    Native API (user-mode) - это гейты в Native API (ядро), соответственно в ntoskrnl.exe или win32k.sys

    Конкретно для оконных сообщений, если не ошибаюсь, используется специальный механизм юзермодных каллбеков из ядра.
    А вообще такое еще позволяет APC.

    чего-чего?
    По-моему, наиболее логичный вариант: список окон, в каждом окне есть поле "процесс". (как на самом деле, не знаю, не интересовался)

    В обработчик этого прерывания (логично, да?) - KiSystemService.

    INT 2E это одна команда, а SYSENTER - совершенно другая. Первая уходит в KiSystemService, вторая - в KiFastCallEntry. Другое дело, что они потом сводятся в один обработчик, который выдирает из KTHREAD::ServiceTables[Index >> 12].ServiceTable[Index & 0xfff] адрес Nt* сервиса и вызывает.
     
  4. Celestia

    Celestia New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    8
    Great, большое спасибо )
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia

    вы начинаете работать с этим механизмом когда регистрируете класс окна написав свой winproc
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Rockphorr
    ты думаеш он это сто пудов не знал? он номане объяснил
     
  7. Celestia

    Celestia New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    8
    Что вы думаете по поводу вот этого? Это верно? http://osdev.ru/viewtopic.php?f=5&t=357
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если отвечает тов. SII, то, скорее всего, верно )
     
Статус темы:
Закрыта.