DDK / WDM импортирует wink32.lib в драйвер

Недавно я пытался использовать W32pServiceTable в своем драйвере. Я импортировал wink32.lib в ИСТОЧНИКИ:

TARGETNAME=exp
TARGETTYPE=DRIVER
TARGETLIB=$(DDK_LIB_PATH)\win32k.lib
SOURCES=Experimental.cpp
MSC_WARNING_LEVEL=/W3

И я заявляю в исходном файле:

extern PDWORD W32pServiceTable;

Но я получаю неразрешенный символ. Я читал, что только драйверы GDI могут использовать wink32.lib. Но я почти уверен, что другие драйверы также могут ссылаться на эту библиотеку (но я не знаю как). Буду очень признателен, если Вы поможете.


person Vasilij    schedule 15.10.2010    source источник


Ответы (1)


Это правда. Только драйверы GDI могут использовать win32k.sys, и наоборот - драйверы GDI могут быть статически связаны только с win32k.sys.

Причина этого в том, что большинство внутренних компонентов Windows загружаются в глобальное пространство памяти, тогда как win32k.sys загружается в так называемое «пространство сеанса». Некоторая информация здесь:

http://www.tar.hu/wininternals/ch07lev1sec4.html

Проще говоря, большинство компонентов и драйверов Windows загружаются один раз для всей системы, тогда как такие вещи, как управление пользовательским интерфейсом, GDI и т. Д., Загружаются за сеанс.

Существует сложная возможность во время выполнения для драйверов GDI получить указатели на функции ntoskrnl и использовать их, и наоборот - драйверы WDM с некоторыми усилиями могут использовать функции win32k (которые будут работать для «текущего» сеанса).

В любом случае, зачем вам ссылаться на win32k? Какой функционал вам нужен?

person valdo    schedule 15.10.2010
comment
Большое спасибо, это очень помогло. Не могли бы вы рассказать мне что-нибудь об этом трюке, я имею в виду подсказку, чтобы я мог искать по этой теме (извините за мой английский). Кто-то сказал мне, что я не могу использовать win32 в ядре. Я слышал, что есть способы сделать это лучше (задокументированные), но использование win32k более увлекательно. - person Vasilij; 15.10.2010
comment
Меня зовут Владислав, поэтому мой английский такой же, как и у вас :) - person valdo; 15.10.2010
comment
Уловка состоит в том, чтобы написать два драйвера: один драйвер GDI и один драйвер WDM. При инициализации драйвера GDI вы можете использовать EngLoadImage и EngFindImageProcAddress, чтобы получить указатель на функцию драйвера WDM, чтобы они могли взаимодействовать. - person valdo; 15.10.2010
comment
Хех :) Спасибо за совет. Если они общаются, они могут обмениваться данными. Вот и ответ. Ценить :) - person Vasilij; 16.10.2010
comment
Но будьте осторожны: во время выполнения win32k и драйвер GDI могут загружаться несколько раз, они также могут быть выгружены в любой момент. Так что вы должны подумать, действительно ли вам действительно нужен доступ к функциям win32k из драйвера WDM. С другой стороны, использование функций драйвера WDM от GDI кажется безопасным. - person valdo; 16.10.2010