核心線程
在驅動中生成的線程一般是系統線程。系統線程所在的程序名為“System”。
NTSTATUS
PsCreateSystemThread(
OUT PHANDLE ThreadHandle,
IN ULONG DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ProcessHandle OPTIONAL,
OUT PCLIENT_ID ClientId OPTIONAL,
IN PKSTART_ROUTINE StartRoutine,
IN PVOID StartContext);
線程的結束應該線上程中自己調用PsTerminateSystemThread來完成。此外得到的句柄也必須要用ZwClose來關閉。關閉句柄并不結束線程。
睡眠
#define DELAY_ONE_MICROSECOND (-10)
#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
VOID MySleep(LONG msec)
{
LARGE_INTEGER my_interval;
my_interval.QuadPart = DELAY_ONE_MILLISECOND;
my_interval.QuadPart *= msec;
KeDelayExecutionThread(KernelMode,0,&my_interval);
}
核心中的事件是一個資料結構。這個結構的指針可以當作一個參數傳入一個等待函數中。如果這個事件不被“設定”,則這個等待函數不會傳回,這個線程被阻塞。如果這個事件被“設定”,則等待結束,可以繼續下去。
事件不需要銷毀。
可以發現,關于事件的操作這一部分(如事件的重設,同步等),其原理和MFC中是很類似的,隻是MFC中封封裝了更好處理的API函數而已。
實際上等待線程結束并不一定要用事件。線程本身也可以當作一個事件來等待。
驅動與裝置和請求處理
#include <ntddk.h>
DriverEntry (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
NTSTATUS status = STATUS_UNSUCCESSFUL;
return status;
函數DriverEntry是每個驅動程式中必須的。如同Win32應用程式裡的WinMain。DriverEntry的第一個參數就是一個 DRIVER_OBJECT的指針。這個DRIVER_OBJECT結構就對應目前編寫的驅動程式。其記憶體是Windows系統已經配置設定的。
第二個參數RegistryPath是一個字元串。代表一個系統資料庫子鍵。這個子鍵是專門配置設定給這個驅動程式使用的。用于儲存驅動配置資訊到系統資料庫中。
DRIVER_OBJECT中含有分發函數指針。這些函數用來處理發到這個驅動的各種請求。Windows總是自己調用DRIVER_OBJECT下的分發函數來處理這些請求。是以編寫一個驅動程式,本質就是自己編寫這些處理請求的分發函數。
ULONG i;
for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;++i)
DriverObject->MajorFunctions[i] = MyDispatchFunction;
…
NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device,PIRP irp)
……
VOID MyDriverUnload(PDRIVER_OBJECT driver)
這個函數的位址設定到DriverObject->DriverUnload即可。
如果驅動程式要和應用程式之間通信,則應該生成裝置。此外還必須為裝置生成應用程式可以通路的符号連結。
“\\.\”意味後面是一個符号連結名。 目前生成裝置,請總是生成在\Device\目錄下。
應用程式為了和驅動通信,首先必須打開裝置。然後發送或者接收資訊。最後關閉它。這至少需要三個IRP:第一個是打開請求。第二個發送或者接收資訊。第三個是關閉請求。
應用層調用的API 驅動層收到的IRP主功能号
CreateFile IRP_MJ_CREATE
CloseHandle IRP_MJ_CLOSE
DeviceIoControl IRP_MJ_DEVICE_CONTROL
ReadFile IRP_MJ_READ
WriteFile IRP_MJ_WRITE
關于上述幾項内容的專題論述,請參見相關文檔。[5,6]
參考
[5] Windows驅動程式設計基礎教程.doc
[6] 天書夜讀-從彙編語言到windows核心程式設計(改)
[7] Windows DDK
[8] 天書夜讀——從彙編語言到Windows核心程式設計
<a href="http://download.csdn.net/source/2754275" target="_blank">http://download.csdn.net/source/2754275</a>
<a href="http://msdn.microsoft.com/en-us/library/ff557573%28VS.85%29.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ff557573%28VS.85%29.aspx</a>