2

最近、ドライバーでW32pServiceTableを使用しようとしました。SOURCESに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を使用できることを読みました。しかし、他のドライバーもそのライブラリにリンクできると確信しています(ただし、方法はわかりません)。よろしくお願いします。

4

1 に答える 1

2

これは本当です。win32k.sysを使用できるのはGDIドライバーのみであり、その逆も同様です。GDIドライバーはwin32k.sysにのみ静的にリンクできます。

これは、ほとんどのWindows内部がグローバルメモリスペースにロードされるのに対し、win32k.sysはいわゆる「セッションスペース」にロードされるためです。いくつかの情報はここにあります:

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

簡単に言うと、ほとんどのWindowsコンポーネントとドライバーはシステム全体で1回ロードされますが、UI管理、GDIなどはセッションごとにロードされます。

実行時にGDIドライバーがntoskrnl関数へのポインターを取得して使用するというトリッキーな可能性があり、その逆もあります。WDMドライバーは、ある程度の努力を払ってwin32k関数を使用する場合があります(これは「現在の」セッションで機能します)。

とにかく、なぜwin32kにリンクしたいのですか?どのような機能が必要ですか?

于 2010-10-15T09:53:56.807 に答える