NT式驱动和WDM式驱动
剛開始學習驅動,沒什么基礎,對于好多名詞也不是很理解,感覺每天學的驅動都不一樣。。。。。。。今天看了書之后才知道,原來驅動分為NT式驅動和WDM式驅動兩種。大概總結一下它們之間的區別。
對于NT式驅動來說,主要的函數是DriverEntry函數,卸載函數,以及各個IRP的派遣函數,不支持即插即用功能,要導入的頭文件是ntddk.h.
其入口函數DriverEntry主要進行初始化工作,驅動加載時,系統進程創建新的線程,調用對象管理器,創建驅動對象。它創建設備對象是通過IoCreateDevice內核函數完成的。
NTSTATUS IoCreateDevice( _In_PDRIVER_OBJECT DriverObject, //指向驅動對象的指針 _In_ULONG DeviceExtensionSize, //設備擴展的大小 _In_opt_PUNICODE_STRING DeviceName, //設備對象名 _In_DEVICE_TYPE DeviceType, //設備對象類型 _In_ULONG DeviceCharacteristics,//設備對象特征 _In_BOOLEAN Exclusive, //是否在內核下使用 _Out_PDEVICE_OBJECT *DeviceObject //返回設備對象地址 );
卸載函數刪除創建的設備對象,還負責一些資源的回收。
而對于WDM式驅動來說,它支持即插即用功能要導入的頭文件為wdm.h.
這是Windows2000后加入的新的驅動模型,比NT式驅動更加復雜一些,完成一個設備操作,至少要兩個驅動設備共同完成,分別是物理設備對象(PDO)和功能設備對象(FDO),FDO會附加在PDO上。
WDM的入口函數也是DriverEntry,但創建設備對象的責任交給了AddDevice函數,而且必須加載IRP_MJ_PNP派遣回調函數。
而且在WDM驅動中,大部分卸載工作都不是由DriverUnload來處理,而是放在對IRP_MN_REMOVE_DEVICE的IRP的處理函數中處理。
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
KdPrint(("Enter DriverEntry\n"));
pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
pDriverObject->MajorFunction[IRP_MJ_CREATE] =
pDriverObject->MajorFunction[IRP_MJ_READ] =
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;
pDriverObject->DriverUnload = HelloWDMUnload;
KdPrint(("Leave DriverEntry\n"));
return STATUS_SUCCESS;
}
WDM式驅動不是按照服務來加載,安裝WDM式驅動需要一個inf文件。inf文件描述了WDM驅動程序的操作硬件設備的信息和驅動程序的一些信息。
可以直接右擊這個inf文件進行安裝即可。
總結
以上是生活随笔為你收集整理的NT式驱动和WDM式驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像处理一些常用的网站
- 下一篇: C#画图——Graphics