P3 Windows驱动程序分为两类,一类是不支持即插即用功能的NT式驱动程序,另一类是支持即插即用功能的WDM式驱动程序。
P4 NT式驱动程序要导入的头文件是NTDDK.h,而WDM式的驱动程序要导入的头文件是WDM.h。
P5 因为这里采用C++语言编写,如果直接包含NTDDK.h,函数的符号表会导入错误,所以需要加入extern "C",这样可以保证符号表正确导入。
DriverEntry函数由内核中的I/O管理器负责调用。
P6 KdPrint其实是一个宏,在调试版本(Checked版)中,会用DbgPrint代替。而在发行版(Free版)中,则不执行任何操作,其功能类似于MFC中的TRACE宏。
P8 驱动程序虽然有了设备名称,但是这种设备名称只能在内核态可见,而对于应用程序是不可见的。因此,驱动需要暴露一个符号链接,应用程序可以通过这个符号链接来访问设备。
P14 NT式驱动程序类似于Windows服务程序,以服务的形式加载在系统中。
P18 AddDevice回调函数的作用是创建设备对象,而且这个回调函数是由PNP(即插即用)管理器调用的。
在WDM驱动程序中,大部分的卸载工作是在对IRP_MN_REMOVE_DEVICE这个IRP的处理函数中进行的。
P20,22 PAGED_CODE是一个DDK提供的宏,只在Checked版中有效。用PAGED_CODE宏确保该例程运行在低于APC_LEVEL的中断优先级的级别上。
P25 inf文件描述了WDM驱动程序的操作硬件设备的信息和驱动程序的一些信息。
注:
P20中的 static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp)={……}表示声明了一个指针数组,数组中的每一个元素都是一个指向函数的指针,函数又两个参数,函数的返回值是NTSTATUS状态值。
P21 fcnname[]数组中的这些IRP是在wdm.h中定义好的。
暂时不明白的地方:P4中的data_seg("INIT")是啥意思?P5中什么叫符号表导入?