IRP的创建

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值