0

この質問は、Google で検索することで解決できることを知っています。しかし、プログラムされたドライバーにアプリケーションを接続するために、夜をかけて検索しました。検索を開始すると、ユーザーモードとカーネルモードの間で情報を共有する方法に関するいくつかのテクニックを読みました。これらのテクニックは次のとおりです。

• I/O リクエスト

• 同期と通知

• 共有ハンドル

• 共有メモリ

このホワイト ペーパーでは、これらの手法について説明します。しかし、私は混乱しています!!! どのテクニックが一番いいですか???I/O 要求の場合: ええと...、私はそれを完全には理解していませんが、アプリケーションが I/O 操作を要求するたびにデータを交換することについて (簡単に) 知っていることと、このmsdn の記事では 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」を出力する以外は何もしません。私が欲しいのは、このドライバーがユーザーから受信して印刷できるようにし、プログラムがドライバーから受信して印刷できるようにすることだけです。私はコードを作成したくありません。あなたから私を導きたいだけです。私は何をしなければなりませんか? それを行う最良の方法は何ですか?

どうもありがとうございます

4

1 に答える 1

3

最も簡単な方法は、DriverEntryでシンボリックリンクを作成することです。IoCreateSymbolicLink

CreateFile次に、シンボリックリンクの名前を使用してユーザーモードプログラムを呼び出し、 ReadFile/WriteFileまたはを使用DeviceIoControlしてドライバーとの間でデータを送受信します。

ReadFile/オプションの場合、ドライバーに/処理WriteFileを実装する必要があります。IRP_MJ_READIRP_MJ_WRITE

DeviceIoControlあなたのために処理する必要がありますIRP_MJ_DEVICE_CONTROL

これは、カーネルモードとユーザーモードの両方のサンプルコードを使用して、この手法を示す非常に優れた記事です。私はあなたの質問に関連する主要な部分をそこからコピーしました:

//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;
}
于 2012-04-05T23:22:37.967 に答える