天天看點

2、從彙編語言到Windows核心程式設計筆記(2)

核心線程

在驅動中生成的線程一般是系統線程。系統線程所在的程序名為“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>

繼續閱讀