宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

刚开始学习驱动,没什么基础,对于好多名词也不是很理解,感觉每天学的驱动都不一样。。。。。。。今天看了书之后才知道,原来驱动分为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文件进行安装即可。