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是加载驱动的好工具。
第一章要点就这些了,也有点困了,第二章看完了,有空补上,第三章要继续更新。睡觉。