標籤:windows 7 驅動開發
Windows 驅動開發基礎系列,轉載請標明出處:http://blog.csdn.net/ikerpeng/article/details/38821919
NT類型的驅動即不是隨插即用的驅動,主要包括3部分:DriverEntry函數,CreateDevice函數,DriverUnload函數.其實還有IRP派遣函數,但是這裡先不做介紹。
接下來詳細的說明一下。
系統啟動的時候,就建立了系統進程;驅動載入的時候,系統啟動一個新的線程,建立一個驅動對象。而當系統線程調用DriverEntry函數的時候,就實現了對驅動對象的初始化。
1. DriverEntry
extern “C”NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriver_Object,
IN PUNICODE_STRING pRegistryPath );
pDriver_Object:指向這個驅動對象。
pRegistryPath:指向裝置服務鍵的鍵名字串的指標。該字串的內容一般為\REGISTRY\MACHINE\SYSTEM\ControlSet\Services\[服務名]。
其中:IN 是參數的修飾詞,代表是 參數時輸入,同理,OUT表示存催的輸出,兩個可以同時用。
返回值是一個32位的LONG,也就是NTSTATUS型的資料。
2. CreateDevice
是通過IoCreateDevice建立的,形式如下:
NTSTATUS
IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize, //指定裝置擴充的大小
IN PUNICODE_STRING DeviceName OPTIONAL,//裝置對象的名字
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,//設定裝置對象的特徵
IN BOOLEAN Exclusive,//設定裝置對象是否在核心模式下使用,一般為TRUE
OUT PDEVICE_OBJECT *DeviceObject //指向新建立的裝置對象。
);
需要指出的是,即便是給出了裝置的名稱也只能是被核心模式下其他驅動所識別,要用使用者模式下面的應用程式識別就需要使用:符號連結的方法。也就是起一個別名的方式,就好像我們給硬碟取名叫“C盤”,就可以被其他的應用程式識別了。
這個函數是:
NTSTATUS
IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName,//別名(的地址)
IN PUNICODE_STRING DeviceName //這個裝置
);
在核心模式下,符號連結就是以”\??\”開頭的(或者“\DosDevice\”開頭的)。如C盤就是“\??\C:”。而在使用者模式下則是以“\\.\”開頭的,如C盤就是“\\.\C:”
3. DriverUnload
一般負責刪除掉DriverEntry裡面建立的裝置對象。同時也會刪掉建立的符號連結。具體的函數如下:
VOID
IoDeleteDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
IoDeleteSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName
);
Windows 驅動開發基礎(六)NT驅動的基本結構