第一章 从两个最简单的驱动谈起

1、 驱动分为NT式驱动和WDM驱动,所谓NT式就是不支持即插即用的驱动,WDM是支持即插即用的驱动。区别有以下几方面,可能不全面,在学习过程中再补充:

(1)、NT式驱动包含头文件NTDDK.h,WDM驱动包含头文件WDM.h。

(2)、NT驱动没有DriverExtension->AddDevice,WDM驱动程序有。

(3)、NT驱动程序没有IRP_MJ_PNP,WDM驱动程序有。

平时如果只需要读写IO或者是Memory,则只需要编写NT驱动即可。

 

2、如果用C++来编写驱动则要用extern "C"修饰,其实是告诉编译器按章C语言编译方式编译驱动文件,否则在连接时会发生错误。

3、

#define PAGEDCODE code_seg("PAGE")

#define LOCKEDCODE code_seg()

#define INITCODE code_seg("INIT")

及对应对数据的修饰,是控制放在分页内存还是非分页内存中。 要细查MSDN。

INITCODE可以用来修饰DriverEntry,以为它在一次调用后就可以从内存卸载,不需要驻留内存。

在使用#pragma INITCODE 后有没有配对的,在例子上没发现。

 

代码区:++++++++++++++++++++++++++++++++++++

 

 

 

代码区:++++++++++++++++++++++++++++++++++++

4、NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)

这个函数是由IO管理器调用,DriverObject产生的详细过程是怎样的?pRegistryPath又是指那个注册表项,硬件键or服务键?

5、在例子中KdPrint用双括号,原因?

6、在创建设备后,NT驱动需要 pDevObj->Flags |= DO_BUFFER_IO; 而WDM实例中为pDevObj->Flags |= DO_BUFFER_IO, pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;

7、在编写resource文件中有5个部分

(1) 包含的头文件

(2)源文件

(3)编译后文件路径

(4)驱动类型 NT为DRIVER, WDM为WDM?

(5)驱动名称

代码区:++++++++++++++++++++++++++++++++++++

 

 

 

代码区:++++++++++++++++++++++++++++++++++++

8、NTSTATUS AddDevice(IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pPhysicalDeviceObject)

pDriverObject为驱动对象指针,pPhysicalDeviceObject为最底层的设备对象指针。

fdo功能设备对象是通过IOCreateDevice来取得的。

fdo的下一层设备对象是通过函数IOAttachmentDeviceToDeviceStack(fdo,pPhysicalDeviceObject)来返回的。IOCallDriver会用到这个值。

9、通常驱动处理PNP IRP做法是传到下层驱动程序去执行

IoskipCurrentStackLocation(Irp);

return IOCallDriver(pdx->NextStackDevice,Irp);

10、对IRP_MN_REMOVE_DEVICE的处理

(1)删除符号链接名

(2)把设备对象从设备堆栈中脱离出来,然后删除设备对象。

IODeleteSymbolicLink();

IoDetachDevice();

IoDeleteDevice(0;

11、对其它函数的调用可以用一下方式

pIrp->IoStatus = STATUS_SUCCESS;

pIrp->Information = 0;

IoCompleteRequest(pIrp, IO_NO_INCREMENT);

return STATUS_SUCCESS;

 

DriverMonitor和DriverStudio中带的EzDriverInstaller是加载驱动的好工具。

第一章要点就这些了,也有点困了,第二章看完了,有空补上,第三章要继续更新。睡觉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值