2011-01-30 13 views
7

私は、Win7 DDKでカーネルドライバの例の1つを試しています。私はコンパイルを変更して、* .sysファイルをビルドすることができます。私はINF(デバイスマネージャーまたはdevconを使用)またはService Control Managerを直接使用してインストールすることもできます。私は次の変更を行い、更新された* .sysファイルを生成すると、この新しいファイルと現在停止しているドライバ(私はServcie Control Manager 'stop'と 'delete service'などを試してみました)との間に競合があるようです。再起動すると、新しいドライバをインストールして正常に実行できます。同様に、デバイスマネージャでアンインストールを選択すると、Windowsは再起動を促します。再起動せずにカーネルドライバをアンロードすることはできますか?

カーネルドライバのインクリメンタルな変更を簡単にテストするにはどうすればいいですか? ありがとう

+0

一般に、これは可能です。少なくとも、API関数を介してドライバをインストールするときは可能です。 INFファイルを使用してインストールされたドライバで可能かどうかは不明です。 –

答えて

4

開始するには良い場所かもしれません:http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

DEVCONは、再起動を求められた場合、あなたはDDKのコードでは、デバッグはなぜそれが尋ねると、問題を掘り下げていますを見ることができること方法だけでなく。

+0

@ J.Strouse:役に立つかもしれない、ありがとう。 –

3

はい。 sc stop <driver name>はドライバを停止する必要があります。ドライバが特定のPnP devnodeに関連付けられている場合は、devnodeが削除された後にアンロードする必要があります。セットアップAPIのログを見ると

+0

@ラリー:それは関連付けられていませんが、IOTCRLの単なる単純なセットではありません。 –

+0

愚かな質問:ドライバーのディスパッチでドライバーのアンロードエントリーポイントを設定しましたか? –

3

ドライバをアンロードできるようにするには、ドライバがアンロードされるたびに基本的に実行される機能を設定する必要があります。割り当てられたバッファや他のリソースを解放するコードを置きます"ドライバーのライフサイクル中に。ここでは例のコードは次のとおりです。

VOID Unload(IN PDRIVER_OBJECT pDriverObject) { 
       //do whatever you like here 
       //this deletes the device 
     IoDeleteDevice(pDriverObject->DeviceObject); 


    return; 
} 

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING regPath) { 


    //initialize your driver and the major function array 

//set the unload function 
    pDriverObject->DriverUnload = &Unload; 
} 
1

は、このコードをコンパイルしてみ署名、およびロード:

#include <ntddk.h>  
VOID OnUnload(IN PDRIVER_OBJECT driverObjectA) { 
    DbgPrint("Unload\n"); 
} 
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObjectA, PUNICODE_STRING RegistryPath){ 
    DbgPrint("DriverEntry\n"); 
    driverObjectA->DriverUnload = OnUnload; 
return STATUS_SUCCESS; 
} 

その後DebugViewをダウンロードし、それを解凍し、管理者としてそれを実行した後、下の「カーネルをキャプチャ」 「キャプチャ」メニュー項目。ダウンロードして、解凍し、OSR Driver Loaderを実行し、ドライバを登録して、 "Start Service"を登録します。 DbgViewに "DriverEntry"ログメッセージが表示されます。今度はOSRドライバ・ローダーで「サービス停止」を実行し、アンロード・メッセージを確認します。うまくいけば、それはあなたを得ることができます。

関連する問題