随笔分类 -  Windows驱动开发

摘要:在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 = 阅读全文
posted @ 2012-03-14 21:43 KingsLanding 阅读(3386) 评论(0) 推荐(0) 编辑
摘要:首先在获得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 阅读全文
posted @ 2012-03-14 21:35 KingsLanding 阅读(3331) 评论(0) 推荐(0) 编辑
摘要:当要移除设备的时候,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 阅读全文
posted @ 2012-03-14 21:32 KingsLanding 阅读(1142) 评论(0) 推荐(0) 编辑
摘要: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( 阅读全文
posted @ 2012-03-14 21:31 KingsLanding 阅读(3377) 评论(0) 推荐(0) 编辑
摘要:PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们配置要求,并进行系统配置。所以,所有PCI设备必须实现配置空间,从而能实现参数自动配置,实现真正的即插即用。前面简单介绍了一下PCI设备的特性。现在来介绍一种方位PCI设备配置空间的常用方式:通过即插即用IRP获得PCI配置空间。在WDM驱动中,总线驱动会为每个设备提供一个PDO设备, 阅读全文
posted @ 2012-03-14 21:26 KingsLanding 阅读(6312) 评论(0) 推荐(0) 编辑
摘要:从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 阅读全文
posted @ 2012-03-14 21:14 KingsLanding 阅读(17613) 评论(0) 推荐(1) 编辑
摘要:现在来探讨一下比较重要的xxxAddDevice 例程。NTSTATUS xxxAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject)该函数用来创建设和添加新设备对象。其中DriverObject是由I/O管理器传来的驱动对象,也就是是Driver_Entry()函数中的那个驱动程序对象。PhysicalDeviceObject 代表设备堆栈底部的物理设备对象(由总线驱动创建,其实就是操作系统创建,一般被称为PDO)。xxxAddDevice函数的基本职责是创建一个设备对象并把它连接到以P 阅读全文
posted @ 2012-03-14 21:08 KingsLanding 阅读(2104) 评论(0) 推荐(0) 编辑
摘要:从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 阅读全文
posted @ 2012-03-14 20:53 KingsLanding 阅读(7947) 评论(1) 推荐(1) 编辑

点击右上角即可分享
微信分享提示