Windows 驱动开发
saloon_yuan
这个作者很懒,什么都没留下…
展开
-
IRP 处理流程
本文通过打开一个文件对象为例子,描述了一个带有两个I/O stack location的IRP的详细处理过程。当然一个IRP可以有多个I/O stack location,具体个数取决于将要处理该请求的驱动的层数。下图详细描述了驱动程序是如何通过使用I/O支持例程(IoXxx routines)来处理IRP以此来实现对相应文件的读写操作。1:I/O管理器调用文件系统驱动翻译 2012-05-11 15:57:42 · 7229 阅读 · 0 评论 -
驱动对象(DRIVER_OBJECT)
每一个驱动对象代表着一个已经装载的内核模式下的驱动, 指向驱动对象的指针是驱动程序中以下例程的输入参数之一: DriverEntry, AddDevice, Reinitialize(可选例程),Unload(可选例程)。驱动对象是一个半透明对象,驱动编写者必须熟悉它的某些成员对象,以实现驱动的初始化功能和卸载功能(如果该驱动能够卸载)。以下列出的是驱动对象中能被驱动访问的成员: 可访翻译 2012-05-14 13:19:26 · 5706 阅读 · 0 评论 -
设备对象(DEVICE_OBJECT)
DEVICE_OBJECT结构体是操作系统用来表示某个具体的设备对象,一个设备对象是一个逻辑上的,或者虚拟的,或者物理上的设备的具体抽象,驱动通过设备对象来处理I/O请求。typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG翻译 2012-05-16 13:17:41 · 5906 阅读 · 0 评论 -
设备堆栈实例
为了详细说明WDM设备对象以及这些设备对象是如何分层的。本文以针对USB硬件的驱动为例,看看设备对象是如何创建的。下图表明了设备对象是如何被一个驱动程序创建的。我们从最底下开始探讨,该设备栈中设备对象如下所示: 1:针对PCI 总线创建的PDO(PhysicDevice Object)和FDO (FunctionDevice Object)根总线驱动首先会枚举内部系翻译 2012-05-16 17:44:17 · 3733 阅读 · 0 评论 -
分配DMA缓冲区时LogicalAddress与PhysicalAddress的疑惑
DMA操作前需要分配物理地址连续的一个Buffer,AllocateCommonBuffer函数提供了这个功能,该函数原型如下:PVOID AllocateCommonBuffer( _In_ PDMA_ADAPTER DmaAdapter, _In_ ULONG Length, _Out_ PPHYSICAL_ADDRESS LogicalAddress, _I原创 2013-04-27 18:20:22 · 1915 阅读 · 0 评论 -
PCIe设备中断丢失与IRP取消
实际开发中遇到这样一个问题: 上层程序通过连续调用ReadFile读取设备上的数据,相应的IRP通过IoStartPacket进行串行化处理,每当前一个IRP完成后,调用IoStartNextPacket取出下一个IRP。。。如此周而复始,在硬件动作正常的情况下,这种处理方法不会有问题,但当硬件不可靠时,会发生有的IRP永远无法完成的情况。本例中,IRP的设置完成以及IoStart原创 2013-12-24 14:19:35 · 5420 阅读 · 0 评论