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文件進行安裝即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM