摘要:
老规矩发一篇英语学习笔记词类转换动词转换为名词: 1. 目前我国各地对各种消费品的需求量已大大增加 There is a big increase in number for all kinds of consumer goods in every part of our country. 2. 火箭已经用来探索宇宙 Rockets have found application for exploration of the universe. 3. 他们已经认识到越来越需要使某些经济部分工业化 they also realized the growing need and necessity 阅读全文
摘要:
在Driver_Entry()关联了一个处理IRP_MJ_DEVICE_CONTROL类型IRP的MajorFunction,xxxControl用于处理上层与驱动通信的数据。上层应用程序可以通过DeviceIoContro()与驱动程序进行通信。pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =xxxControl;xxxControl函数的框架可定义为:NTSTATUS xxxControl(PDEVICE_OBJECT fdo, PIRP pIrp){ PAGED_CODE(); PDEVICE_EXTENSION pdx = 阅读全文
摘要:
首先在获得PCI配置空间资源的时候,就要获得中断资源,根据CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Type 域来区分需要获得什么样的中断资源的时候,如果Type类型为:CmResourceTypeInterrupt,此时需要将中断资源从CM_PARTIAL_RESOURCE_DESCRIPTOR中取出:irql = (KIRQL) resource->u.Interrupt.Level; //中断级别 vector = resource->u.Interrupt.Vector; // 中断向量 affinity = resource->u.Int 阅读全文
摘要:
当要移除设备的时候,IO管理器发送IRP_MN_REMOVE_DEVICE 类型的IRP包,这是一个即插即用型的IRP包。通过调用即插即用例程来处理。由于在Driver_Entry()函数中,将即插即用的函数和处理Pnp的MajorFunction进行了绑定,即:pDriverObject->MajorFunction[IRP_MJ_PNP] =xxxPnp;NTSTATUS xxxPnp(IN PDEVICE_OBJECT fdo,IN PIRP Irp){ …}该函数前面都已经提到过,通过调用下面函数来完成:NTSTATUS HandleRemoveDevice(PDEVICE_EX 阅读全文
摘要:
1. ExAllocatePool()函数说明:ExAllocatePool allocates pool memory of the specified type and returns a pointer to the allocatedblock.函数定义:PVOID ExAllocatePool( __in POOL_TYPE PoolType, __in SIZE_T NumberOfBytes);代码中用来分配设备描述DMA adepter设备的特性(DEVICE_DESCRIPTION),作为参数传递给IoGetDmaAdapter()函数。在调用IoGetDmaAdapter( 阅读全文
摘要:
PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们配置要求,并进行系统配置。所以,所有PCI设备必须实现配置空间,从而能实现参数自动配置,实现真正的即插即用。前面简单介绍了一下PCI设备的特性。现在来介绍一种方位PCI设备配置空间的常用方式:通过即插即用IRP获得PCI配置空间。在WDM驱动中,总线驱动会为每个设备提供一个PDO设备, 阅读全文
摘要:
从IRP说起IRP(I/O request package)是操作系统内核的一个数据结构。应用程序与驱动程序进行通信需要通过IRP包。当上层应用程序需要与驱动通信的时候,通过调用一定的API函数,IO管理器针对不同的API产生不同的IRP,IRP被传递到驱动内部不同的分发函数进行处理。对于不会处理的IRP包需要提供一个默认的分发函数来处理。现在我们来看一下IRP的结构:typedef struct _IRP { … PMDL MdlAddress; ULONG Flags; union {struct _IRP *MasterIrp;… PVOID SystemBuffer; } Associ 阅读全文
摘要:
现在来探讨一下比较重要的xxxAddDevice 例程。NTSTATUS xxxAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject)该函数用来创建设和添加新设备对象。其中DriverObject是由I/O管理器传来的驱动对象,也就是是Driver_Entry()函数中的那个驱动程序对象。PhysicalDeviceObject 代表设备堆栈底部的物理设备对象(由总线驱动创建,其实就是操作系统创建,一般被称为PDO)。xxxAddDevice函数的基本职责是创建一个设备对象并把它连接到以P 阅读全文
摘要:
从DriverEntry()说起 做过C语言开发的都知道程序是从main()函数开始执行。在进行Windows驱动程序开发的时候没有main()函数作为函数入口,取而代之的是DriverEntry().DriverEntry()的原型如下:extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)前面的extern “C”大概的意思就是调用C编译器对函数进行编译,实现C++和C的混合编程。DriverEntry()函数中的第一个参数为:PDR 阅读全文