Здравствуйте! Я сейчас изучаю внутренние механизмы Windows, и возник вопрос: Вот к примеру, для того чтобы программа могла "общаться" с ядром существует библиотеки Winapi, которые в свою очередь связаны с kernel32.dll и win32k.sys и которые "общаются" с ядром через прерывание 2Eh. Мне не понятен обратный механизм: каким образом в программу передаются WM_, BM_ и прочие сообщения? А также, я предполагаю что в системе существуют некие дескрипторные таблицы в которых содержатся некие индексы процессов, по которым и происходит поиск нужного процесса для передачи ему сообщения? Да, и ещё, вот после передачи сообщения через 2Eh, куда оно попадает в ядре? Возможно существует что то типо конвейера команд? Буду рад любой помощи по этим вопросам, спасибо! PS.: 2Eh = sysenter в >win2k кажется )
вам не все равно? эти механизмы слишком комплексные, чтобы их объяснить в двух словах... прочтите сначала рихтера, потом можно начинать более тяжелую литературу штудировать, если она вам нужно будет...
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* сервиса и вызывает.