2010-10-15 3 views
1

Недавно я пытался использовать W32pServiceTable в своем драйвере. Я импортировал wink32.lib в ИСТОЧНИКОВ:DDK/WDM импорт 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. Но я уверен, что другие драйверы также могут ссылаться на эту библиотеку (но я не знаю, как это сделать). Я был бы очень благодарен, если бы вы могли помочь.

ответ

1

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

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

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

В простых словах - большинство компонентов и драйверов окон загружаются один раз для всей системы, в то время как такие вещи, как управление UI, GDI и т.д. - загружается за один сеанс.

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

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

+0

Большое спасибо, это очень полезно. Не могли бы вы рассказать мне больше об этом трюке, я имею в виду подсказку, чтобы я мог искать по этой теме (извините за мой английский). Кто-то сказал мне, что я не могу использовать win32 в Kernel. Я слышал, что есть лучшие способы сделать это (задокументировано), но использование win32k более захватывающее. – Vasilij

+0

Меня зовут Владислав, поэтому мой английский как ваш :) – valdo

+0

Трюк состоит в том, чтобы написать два драйвера: один драйвер GDI и один драйвер WDM. При инициализации драйвера GDI вы можете использовать «EngLoadImage» и «EngFindImageProcAddress», чтобы получить указатель на функцию драйвера WDM, чтобы они могли общаться. – valdo

Смежные вопросы