2010-10-15 15 views
1

Récemment, j'essayais d'utiliser W32pServiceTable dans mon pilote. Je ne wink32.lib importé dans SOURCES:DDK/WDM importer wink32.lib dans le pilote

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

Et je déclare dans le fichier source:

extern PDWORD W32pServiceTable; 

Mais je reçois sans solution symbole. J'ai lu, que seuls les pilotes GDI peuvent utiliser wink32.lib. Mais je suis à peu près sûr que d'autres pilotes peuvent également lier à cette bibliothèque (mais je ne sais pas comment). Je serais très reconnaissant si vous pouviez aider.

Répondre

1

Cela est vrai. Seuls les pilotes GDI peuvent utiliser win32k.sys et vice versa. Les pilotes GDI peuvent être liés statiquement à win32k.sys.

La raison en est que la plupart des composants internes Windows sont chargés dans l'espace mémoire global, tandis que win32k.sys est chargé dans ce que l'on appelle "l'espace de session". Quelques infos ici:

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

En mots simples - la plupart des composants Windows et les pilotes sont chargés une fois pour l'ensemble du système, alors que des choses comme la gestion de l'interface utilisateur, GDI, etc - sont chargés par session. Il existe une possibilité délicate pour les pilotes GDI d'obtenir des pointeurs vers les fonctions ntoskrnl et de les utiliser, et inversement - les pilotes WDM peuvent utiliser les fonctions win32k (cela fonctionnera pour la session 'courante').

Quoi qu'il en soit, pourquoi voudriez-vous lier à win32k? De quelle fonctionnalité avez-vous besoin?

+0

Merci beaucoup, c'est très utile. Pourriez-vous me dire quelque chose de plus sur ce truc, je veux dire un indice afin que je puisse chercher sur ce sujet (désolé pour mon anglais). Quelqu'un m'a dit que je ne peux pas utiliser win32 dans le noyau. J'ai entendu dire qu'il y avait de meilleures façons de le faire (documenté), mais utiliser win32k est plus excitant. – Vasilij

+0

Mon nom est Vladislav, donc mon anglais est comme le tien :) – valdo

+0

L'astuce est en fait d'écrire deux pilotes: un pilote GDI et un pilote WDM. Dans l'initialisation du pilote GDI, vous pouvez utiliser 'EngLoadImage' et 'EngFindImageProcAddress' pour obtenir un pointeur sur la fonction du pilote WDM, afin qu'ils puissent communiquer. – valdo