2012-04-05 48 views
0

我知道這個問題可以通過在谷歌搜索來解答。但是我花了很多時間尋找嘗試讓我的應用程序與我的編程驅動程序連接。 當我開始尋找我讀了一些技術如何共享用戶模式和內核模式和這些技術之間的信息是:將我的應用程序與內核連接的最佳方式是什麼?

•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; 
}; 

正如你看到的,司機也很簡單。卸載時輸出「驅動程序已加載」,卸載時輸出「驅動程序已卸載」。 我只想讓這個驅動程序能夠從用戶接收並打印它,使程序從驅動程序接收並打印出來。 我不想做代碼,我只想從你那裏引導我:我必須做什麼?什麼是最好的辦法呢?

非常感謝你

回答

2

最簡單方法是使用IoCreateSymbolicLink

然後從用戶模式程序調用CreateFile,用符號鏈接的名稱,請使用ReadFile/WriteFile或創造DriverEntry中的符號鏈接DeviceIoControl向/從驅動程序發送/接收數據。

對於ReadFile/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; 
} 
相關問題