驱动开发
文章平均质量分 93
记录自己学习驱动开发的艰辛历程
AnyStayIsJk
浪费时间的时候想想没有时间的时候 。。。。。。
展开
-
通过测试实例详细分析 IoMarkPending 的原理
使用IoMarkPending的原因及原理 为了使系统吞吐量最大化,I/O管理器希望驱动程序推迟其耗时IRP的完成。驱动程序通过在某个派遣例程中调用IoMarkIrpPending函数并返回STATUS_PENDING来表示完成操作被推迟。 I/O管理器在处理推迟完成时有下面类似的逻辑: Irp->UserEvent =pEvent;// don't do thisyou原创 2013-09-27 10:33:37 · 1451 阅读 · 0 评论 -
详细分析CONTAINING_RECORD宏
该宏的作用是:用结构成员中的ListEntry的地址(0x108)减去结构体成员ListEntry到首地址的距离(8)得到结构体首地址(0x100) pEntry中的值就是结构成员中的ListEntry的地址。即:0x108ListEntry0x108 结构成员中的ListEntry的地址,也是RemoveHeadList函数函数的原创 2013-09-27 10:10:23 · 961 阅读 · 0 评论 -
ListEntry 链表图解,及解析 InsertTailList & RemoveHeadList&RemoveEntryList函数
一:NPROT_INSERT_TAIL_LIST(&pOpenContext->PendedReads, &pIrp->Tail.Overlay.ListEntry); #define NPROT_INSERT_TAIL_LIST(_pList, _pEnt)InsertTailList(_pList, _pEnt) 二:pIrpEntry =pOpenContext->Pe原创 2013-09-27 10:15:11 · 4518 阅读 · 0 评论 -
StackSize & CurrentLocation & StackCount & IopfCallDriver内部设置当前堆栈单元的代码
StackSize:共几个IO空间:在每个设备对象中,有个StackSize子域,表明操作这个设备对象需要几层才能到达最下层的物理设备。(若共四个设备,最顶端的设备的StackSize = 4,最底下的设备的StackSize = 1 HighFiDO -> FDO -> LowFiDO ->PDO )CurrentLocation :IRP头中的CurrentLocation字原创 2013-09-27 10:46:20 · 1005 阅读 · 0 评论 -
驱动中设备符号名写法
/创建设备名称UNICODE_STRING devName;RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice"); //创建设备status =IoCreateDevice(pDriverObject,//驱动对象sizeof(DEVICE_EXTENSION),//自定义的扩展结构的大小&(UNICODE_原创 2013-09-27 10:48:06 · 1904 阅读 · 0 评论 -
嵌套的 CONTAINING_RECORD 宏
第一个CONTAINING_RECORD&NPORT_RECV_PACKET_RSVD得到了NPROT_RECT_PACKET_RSVD.link的地址,因为NPROT_RECT_PACKET_RSVD存于NDIS_PACKET.ProtocolReserved处,所以NPROT_RECT_PACKET_RSVD.link的地址就NDIS_PACKET结构中最后一个成员ProtocolReserv原创 2013-09-27 10:04:59 · 663 阅读 · 0 评论 -
应用层和驱动层的同步与异步的处理逻辑及底层实现
应用层的实现:1ReadFile、WriteFile、DeviceIoControl等,这些都有两种操作方式,一种是同步,一种是异步。操作设备的Win32API主要是这3个函数ReadFile、WriteFile、DeviceIoControl以DeviceIOControl为例,它的同步&异步操作如下:同步操作时,它的内部会创建一个IRP_MJ_DEV原创 2021-02-20 09:54:11 · 2559 阅读 · 0 评论