0

我知道这个问题可以通过谷歌搜索来回答。但是我花了几个晚上来寻找尝试让我的应用程序与我的编程驱动程序连接。当我开始搜索时,我阅读了一些关于如何在用户模式和内核模式之间共享信息的技术,这些技术是:

• 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/WriteFileDeviceIoControl向/从驱动程序发送/接收数据。

对于ReadFile/WriteFile选项,您需要在驱动程序中实现IRP_MJ_READ/IRP_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 回答