- 自己在编写驱动程序的时候 遇到一些疑问: IoBuildSynchronousFsdRequest 和IoBuildAsynchronousFsdRequest之间创建的同步异步IRP有什么区别?
- 为什么这两个函数只能创建几种IRP?调用IoAllocateIrp后 初始化IRP时哪些域是要填充的 哪些是不要填充的?
- 偏偏书上讲的都很模糊 驱动新手 一切只能自己动手。
- 先来看下 IoBuildSynchronousFsdRequest
- .text:004191D6 _IoBuildSynchronousFsdRequest@28 proc near
- .text:004191D6 ; CODE XREF: HalExamineMBR(x,x,x,x)+70p
- .text:004191D6 ; IopShutdownBaseFileSystems(x)+7Ap ...
- .text:004191D6
- .text:004191D6 MajorFunction = dword ptr 8
- .text:004191D6 DeviceObject = dword ptr 0Ch
- .text:004191D6 Buffer = dword ptr 10h
- .text:004191D6 Length = dword ptr 14h
- .text:004191D6 StartingOffset = dword ptr 18h
- .text:004191D6 Event = dword ptr 1Ch
- .text:004191D6 IoStatusBlock = dword ptr 20h
- .text:004191D6
- .text:004191D6 mov edi, edi
- .text:004191D8 push ebp
- .text:004191D9 mov ebp, esp
- .text:004191DB push edi
- .text:004191DC push [ebp+IoStatusBlock] ; IoStatusBlock
- .text:004191DF push [ebp+StartingOffset] ; StartingOffset
- .text:004191E2 push [ebp+Length] ; Length
- .text:004191E5 push [ebp+Buffer] ; Buffer
- .text:004191E8 push [ebp+DeviceObject] ; DeviceObject
- .text:004191EB push [ebp+MajorFunction] ; MajorFunction
- .text:004191EE call _IoBuildAsynchronousFsdRequest@24 ; 创建同步IRP 实质上还是创建异步IRP
- .text:004191F3 mov edi, eax ; pIrp送EDI 检验IRP是否创建成功
- .text:004191F5 test edi, edi ; pIrp
- .text:004191F7 jz short loc_41922D
- .text:004191F9 mov eax, [ebp+Event] ; event
- .text:004191FC push ebx
- .text:004191FD push esi
- .text:004191FE mov cl, 1
- .text:00419200 mov [edi+2Ch], eax ; pIrp->UserEvent = event
- .text:00419203 call ds:__imp_@KfRaiseIrql@4 ; movzx edx,cl
- .text:00419203 ; movzx ecx,byte ptr [edx-7F92EDA8h]
- .text:00419203 ; mov eax,dword ptr ds:[FFFE0080h];TPR寄存器中当前任务优先级送eax
- .text:00419203 ; mov dword ptr ds:[0FFFE0080h],ecx;装入新的任务优先级
- .text:00419203 ; shr eax,4;任务优先级/16
- .text:00419203 ; movzx eax,byte ptr [eax-7F923F78h]返回优先级
- .text:00419203 ; ret 中断级和任务优先级的换算 还要依靠806D1258和806DC088这两个地方的表或者结构
- .text:00419203 ; 对任务优先级不甚明白 以后有时间再仔细看看
- .text:00419203 ;
- .text:00419209 mov edx, [edi+50h] ; pIrp->Tail.overlay.Thread
- .text:00419209 ; edx值为ETHREAD的指针
- .text:0041920C add edx, 210h ; ÐREAD.IrpList
- .text:0041920C ; edx值为ETHREAD.IrpList的指针
IRP的创建
最新推荐文章于 2021-04-15 17:55:43 发布
本文探讨了在驱动程序开发中,IoBuildSynchronousFsdRequest和IoBuildAsynchronousFsdRequest创建的同步异步IRP之间的区别。尽管同步IRP在内部调用了异步IRP的创建函数,主要区别在于同步IRP与线程的关联。同步IRP填充了IRP的UserEvent域,而在编写驱动时,有时也需要手动填充这个域以跟踪异步IRP的完成。文章通过代码分析解释了IRP的分配、缓冲区处理以及不同MajorFunction的处理方式。
摘要由CSDN通过智能技术生成