2012-04-05 10 views
0

私はこの質問がGoogleで検索して答えることができます知っている。しかし、私はプログラムされたドライバにアプリケーションを接続させようとするのに時間を費やしています。 私はユーザーモードとカーネルモードの間で情報を共有する方法にいくつかのテクニックを読んで、これらの技術である検索を開始:私のアプリケーションをカーネルに接続する最良の方法は何ですか?

I/Oを共有•

•同期と通知

を要求します共有メモリ

を扱うこのwhite paperは、これらのテクニックを説明します。しかし、私は混乱しています!どの技術が最高ですか? I/O要求の場合:まあ、私はそれを完全に理解できませんが、アプリケーションがI/O操作を要求するたびにデータを交換することについて(簡単に)知っています。このmsdn articleはI/O制御コード。

私は多くの複雑な記事を読んだことがありますが、ドライバーとのデータ交換を遅らせることなくプログラムを速く動かせるように私を導く道はわかりません。

私は質問しました:私のアプリケーションをカーネルに接続する最良の方法は何ですか? そして、私は"最善の方法"を意味します。 これは私のドライバコードです:

#include <ntddk.h> 

VOID 
Unload(
    IN PDRIVER_OBJECT DriverObject 
) 
{ 
    DbgPrint("Driver Unloaded"); 
}; 


NTSTATUS 
DriverEntry(
    IN PDRIVER_OBJECT DriverObject, 
    IN PUNICODE_STRING RegistryPathName 
) 
{ 
    DbgPrint("Driver Loaded"); 
    DriverObject->DriverUnload = Unload; 
    return STATUS_SUCCESS; 
}; 

ご覧のとおり、ドライバはシンプルです。ロード時には「Driver loaded」、アンロード時には「Driver unloaded」の出力以外は何もしないでください。 私は、このドライバをユーザーから受信して印刷できるようにし、ドライバからプログラムを受信して​​印刷できるようにします。 私はコードを作成する必要はありません、私はあなたから私を導くことを望む:私は何をしなければならないのですか?それを行う最善の方法は何ですか?

は非常に多くの

答えて

2

最も簡単な方法は、シンボリックリンクの名前を持つユーザーモードプログラム呼び出しCreateFileから次にIoCreateSymbolicLink

を使用してDriverEntryにシンボリックリンクを作成して、どちらかReadFile/WriteFileを使用することですありがとうございましたかDeviceIoControlは、ドライバとの間でデータを送受信します。

/WriteFileオプションの場合、ご使用のドライバにIRP_MJ_READ/IRP_MJ_WRITEの処理を実装する必要があります。

DeviceIoControlについては、IRP_MJ_DEVICE_CONTROLを処理する必要があります。

このテクニックは、カーネルモードとユーザーモードの両方のサンプルコードとともに、非常に良いarticleです。あなたの質問に関連する主要な部分をコピーしました:

//how to create symbolic link 

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) 
{ 
    UNICODE_STRING usDriverName, usDosDeviceName; 

    RtlInitUnicodeString(&usDriverName, L"\\Device\\Example"); 
    RtlInitUnicodeString(&usDosDeviceName, L"\\DosDevices\\Example"); 

    IoCreateDevice(pDriverObject, 0, &usDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject); 


    IoCreateSymbolicLink(&usDosDeviceName, &usDriverName); 
} 

//How to use from user mode 
int main() 
{ 

    hFile = CreateFile("\\\\.\\Example", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 

    //use ReadFile, WriteFile, or DeviceioControl here 

    return 0; 
} 
関連する問題