zoukankan      html  css  js  c++  java
  • 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文件进行安装即可。

  • 相关阅读:
    笔记:国际化
    【推荐系统】知乎live入门3.召回
    【推荐系统】知乎live入门2.细节补充
    【推荐系统】知乎live入门1.推荐概览与框架
    【推荐系统】知乎live入门
    【学习总结】SQL学习总结-总
    【问题解决方案】git clone失败的分析和解决
    【问题解决方案】GitHub上克隆项目到本地
    【JAVA】eclipse里代码整个前移或者后移的快捷键
    【JAVA】Java 异常中e的getMessage()和toString()方法的异同
  • 原文地址:https://www.cnblogs.com/kekoukele987/p/7403475.html
Copyright © 2011-2022 走看看