搞明白IRP这个东东了
来源:互联网 发布:nba2konline数据库 编辑:程序博客网 时间:2024/04/29 07:02
按照ms的步骤走了一遍,搞明白了,整点笔记记录一下,别忘了。
IRP的结构:
1) Irp = IoAllocateIrp( IN CCHAR StackSize, IN BOOLEAN ChargeQuota);
分配一个IRP,看看ms是怎么做的吧:
a. ) packetSize = IoSizeOfIrp(StackSize);
#define IoSizeOfIrp( StackSize ) /
((USHORT) (sizeof( IRP ) + ((StackSize) * (sizeof( IO_STACK_LOCATION )))))
计算 IRP的大小,看来一个IRP包括IRP头本身和stack location × StackSize,
b.) irp = ExAllocatePoolWithTag(NonPagedPool, allocateSize, ' prI');
分别空间,并且是分配在非分页内存池中。
c) IopInitializeIrp(irp, allocateSize, StackSize);
初始化一个IRP。
#define IopInitializeIrp( Irp, PacketSize, StackSize ) { /
RtlZeroMemory( (Irp), (PacketSize) ); /
(Irp)->Type = (CSHORT) IO_TYPE_IRP; /
(Irp)->Size = (USHORT) ((PacketSize)); /
(Irp)->StackCount = (CCHAR) ((StackSize)); /
(Irp)->CurrentLocation = (CCHAR) ((StackSize) + 1); /
(Irp)->ApcEnvironment = KeGetCurrentApcEnvironment(); /
InitializeListHead (&(Irp)->ThreadListEntry); /
(Irp)->Tail.Overlay.CurrentStackLocation = /
((PIO_STACK_LOCATION) ((UCHAR *) (Irp) + /
sizeof( IRP ) + /
( (StackSize) * sizeof( IO_STACK_LOCATION )))); }
一个IRP初始化是 当前栈要+1,然后指到分配空间的最后,一个IRP初始化之后,在内存中应该是这个样子:
----------------
| |
|IRP头
|
|
|Tail.Overlay.CurrentStackLocation
| |
|
|------------
|
|
|
| |
|
|
|
| |
|
|
---------------- <----------------------|
2) PIO_STACK_LOCATION irpSp = IoGetNextIrpStackLocation(Irp);
#define IoGetNextIrpStackLocation( Irp ) (/
(Irp)->Tail.Overlay.CurrentStackLocation - 1 )
由于刚开始CurrentStackLocation 指向处于分配范围之外的地址,所以此处 -1 得到真正的第一个STACK_LOCATION
3) IoCallDriver(DeviceObject, Irp);
将IRP发送到目的驱动
这是IoCallDriver的部分实现
可以看到当calldriver时候,IoCallDriver 会将当前栈-1 ,同时将下一个STACK_LOCATION 最为当前栈单元,通过设备对象找到其关联的驱动对象,调用MJ函数,IoCallDriver 返回。
- 搞明白IRP这个东东了
- 搞明白IRP这个东东了
- 终于搞懂这个东东了 鼓励自己一下
- 搞明白Z顺序了。。
- 彻底弄明白IRP
- 终于明白这个LR寄存器了
- 弄了半天终于搞明白了,呵呵。
- 拼了整整一天,把这个问题给搞明白了
- 今天终于把iostream 与iostream.h搞明白了
- 终于通过测试搞明白operator delete了!
- 终于搞明白了传说中的setjmp,longjmp
- 终于把javamail android大概搞明白了
- C++变量的声明和定义 终于搞明白了
- 临近毕业了才搞明白pcap的一点用法
- 今天搞明白了内些传说中的硬件
- 新学习的指针终于搞明白了
- 一直搞不懂回调函数 今天终于明白了
- 终于彻底弄明白 IRP
- IT人生
- 让WindowsXP不再出现内存读写错误
- 我的计算机书籍收藏
- vsflexgrid控件的使用点滴
- LINQ To SQL中in和like的用法
- 搞明白IRP这个东东了
- Office & delphi
- 处理URL传递中文乱码问题
- 一位黑客风云人物的十年
- 看得出我是卧底吗?
- DDR2 SDRAM
- 随心所欲操作Enum枚举类型 (转贴)
- 从后台得到webshell
- 聪明反被聪明误