阅读:3122回复:5
IRP消息处理的一个问题(IRP_MJ_DEVICE_CONTROL)
大家都知道,IRP响应函数(DriverObject->MajorFuction)的原型都接收两个参数:
(PDEVICE_OBJECT pDeviceObject , PIRP irp) 我在网上查了一下IRP结构的定义如下: typedef struct _IRP { +00: SHORT Type; +02: WORD Size; +04: PMDL MdlAddress; +08: ULONG Flags; +0C: ULONG AssociatedIrp; +10: LIST_ENTRY ThreadListEntry; +18: IO_STATUS_BLOCK IoStatus; +20: CHAR RequestorMode; +21: UCHAR PendingReturned; +22: CHAR StackCount; +23: CHAR CurrentLocation; +24: UCHAR Cancel; +25: UCHAR CancelIrql; +26: CHAR ApcEnvironment; +27: UCHAR AllocationFlags; +2B: PIO_STATUS_BLOCK UserIosb; +30: PKEVENT UserEvent; +34: UINT64 Overlay; +3C: PVOID CancelRoutine; +40: PVOID UserBuffer; +44: ULONG Tail; } IRP, *PIRP; 从而,一个IRP结构是00x44个字节,但是,我看了一个驱动中一个函数的汇编码是这样: //参数PDEVICE_OBJECT,PIRP mov edi,edi ;//肯定没关系,不管它 push ebp mov ebp,esp ;这是常规套路 sub esp,0c ;为局部变量分配空间,不管 push ebx mov ebx,[ebp+0Ch] ;//得到的是第2个参数 push esi ;保存原始值 mov esi,[ebx+60h] ;==========我的问题就在这儿 ..... 在上面的代码中,取得第2个参数之后,就是得到了IRP结构的首地址,可是,根据前面的统计,一个IRP结构最大只有0x48字节长,可是它怎么在下面访问偏移0x60处的数据呢? 谢谢 |
|
沙发#
发布于:2008-09-12 18:31
结构里套有其它结构的.你应该用windbg的-r参数,就能看到原来还有很多隐藏看不到的东西.
|
|
|
板凳#
发布于:2008-09-16 11:05
引用第1楼kgdiwss于2008-09-12 18:31发表的 : 是的,的确是可以看到更多隐藏看不到的东西,可那只是伸展了子元素。可以看到的是,IRP结构里面的子元素大部分都是指针,所以并不影响啊,我的原贴上的偏移不知道是哪儿有问题? 我直接在驱动原文件中试过用sizeof(IRP),结果是0x70,而我算得的是0x48不知道问题出在哪儿? |
|
地板#
发布于:2008-09-16 12:25
0: kd> dt nt!_IRP -r
+0x000 Type : Int2B +0x002 Size : Uint2B +0x004 MdlAddress : Ptr32 _MDL +0x000 Next : Ptr32 _MDL +0x000 Next : Ptr32 _MDL +0x004 Size : Int2B +0x006 MdlFlags : Int2B +0x008 Process : Ptr32 _EPROCESS +0x00c MappedSystemVa : Ptr32 Void +0x010 StartVa : Ptr32 Void +0x014 ByteCount : Uint4B +0x018 ByteOffset : Uint4B +0x004 Size : Int2B +0x006 MdlFlags : Int2B +0x008 Process : Ptr32 _EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER +0x078 ExitTime : _LARGE_INTEGER +0x080 RundownProtect : _EX_RUNDOWN_REF +0x084 UniqueProcessId : Ptr32 Void +0x088 ActiveProcessLinks : _LIST_ENTRY +0x090 QuotaUsage : [3] Uint4B +0x09c QuotaPeak : [3] Uint4B +0x0a8 CommitCharge : Uint4B +0x0ac PeakVirtualSize : Uint4B +0x0b0 VirtualSize : Uint4B +0x0b4 SessionProcessLinks : _LIST_ENTRY +0x0bc DebugPort : Ptr32 Void +0x0c0 ExceptionPort : Ptr32 Void +0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE +0x0c8 Token : _EX_FAST_REF +0x0cc WorkingSetLock : _FAST_MUTEX +0x0ec WorkingSetPage : Uint4B +0x0f0 AddressCreationLock : _FAST_MUTEX +0x110 HyperSpaceLock : Uint4B +0x114 ForkInProgress : Ptr32 _ETHREAD +0x118 HardwareTrigger : Uint4B +0x11c VadRoot : Ptr32 Void +0x120 VadHint : Ptr32 Void +0x124 CloneRoot : Ptr32 Void +0x128 NumberOfPrivatePages : Uint4B +0x12c NumberOfLockedPages : Uint4B +0x130 Win32Process : Ptr32 Void +0x134 Job : Ptr32 _EJOB +0x138 SectionObject : Ptr32 Void +0x13c SectionBaseAddress : Ptr32 Void +0x140 QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK +0x144 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY +0x148 Win32WindowStation : Ptr32 Void +0x14c InheritedFromUniqueProcessId : Ptr32 Void +0x150 LdtInformation : Ptr32 Void +0x154 VadFreeHint : Ptr32 Void +0x158 VdmObjects : Ptr32 Void +0x15c DeviceMap : Ptr32 Void +0x160 PhysicalVadList : _LIST_ENTRY +0x168 PageDirectoryPte : _HARDWARE_PTE +0x168 Filler : Uint8B +0x170 Session : Ptr32 Void +0x174 ImageFileName : [16] UChar +0x184 JobLinks : _LIST_ENTRY +0x18c LockedPagesList : Ptr32 Void +0x190 ThreadListHead : _LIST_ENTRY +0x198 SecurityPort : Ptr32 Void +0x19c PaeTop : Ptr32 Void +0x1a0 ActiveThreads : Uint4B +0x1a4 GrantedAccess : Uint4B +0x1a8 DefaultHardErrorProcessing : Uint4B +0x1ac LastThreadExitStatus : Int4B +0x1b0 Peb : Ptr32 _PEB +0x1b4 PrefetchTrace : _EX_FAST_REF +0x1b8 ReadOperationCount : _LARGE_INTEGER +0x1c0 WriteOperationCount : _LARGE_INTEGER +0x1c8 OtherOperationCount : _LARGE_INTEGER +0x1d0 ReadTransferCount : _LARGE_INTEGER +0x1d8 WriteTransferCount : _LARGE_INTEGER +0x1e0 OtherTransferCount : _LARGE_INTEGER +0x1e8 CommitChargeLimit : Uint4B +0x1ec CommitChargePeak : Uint4B +0x1f0 AweInfo : Ptr32 Void +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO +0x1f8 Vm : _MMSUPPORT +0x238 LastFaultCount : Uint4B +0x23c ModifiedPageCount : Uint4B +0x240 NumberOfVads : Uint4B +0x244 JobStatus : Uint4B +0x248 Flags : Uint4B +0x248 CreateReported : Pos 0, 1 Bit +0x248 NoDebugInherit : Pos 1, 1 Bit +0x248 ProcessExiting : Pos 2, 1 Bit +0x248 ProcessDelete : Pos 3, 1 Bit +0x248 Wow64SplitPages : Pos 4, 1 Bit +0x248 VmDeleted : Pos 5, 1 Bit +0x248 OutswapEnabled : Pos 6, 1 Bit +0x248 Outswapped : Pos 7, 1 Bit +0x248 ForkFailed : Pos 8, 1 Bit +0x248 HasPhysicalVad : Pos 9, 1 Bit +0x248 AddressSpaceInitialized : Pos 10, 2 Bits +0x248 SetTimerResolution : Pos 12, 1 Bit +0x248 BreakOnTermination : Pos 13, 1 Bit +0x248 SessionCreationUnderway : Pos 14, 1 Bit +0x248 WriteWatch : Pos 15, 1 Bit +0x248 ProcessInSession : Pos 16, 1 Bit +0x248 OverrideAddressSpace : Pos 17, 1 Bit +0x248 HasAddressSpace : Pos 18, 1 Bit +0x248 LaunchPrefetched : Pos 19, 1 Bit +0x248 InjectInpageErrors : Pos 20, 1 Bit +0x248 VmTopDown : Pos 21, 1 Bit +0x248 Unused3 : Pos 22, 1 Bit +0x248 Unused4 : Pos 23, 1 Bit +0x248 VdmAllowed : Pos 24, 1 Bit +0x248 Unused : Pos 25, 5 Bits +0x248 Unused1 : Pos 30, 1 Bit +0x248 Unused2 : Pos 31, 1 Bit +0x24c ExitStatus : Int4B +0x250 NextPageColor : Uint2B +0x252 SubSystemMinorVersion : UChar +0x253 SubSystemMajorVersion : UChar +0x252 SubSystemVersion : Uint2B +0x254 PriorityClass : UChar +0x255 WorkingSetAcquiredUnsafe : UChar +0x258 Cookie : Uint4B +0x00c MappedSystemVa : Ptr32 Void +0x010 StartVa : Ptr32 Void +0x014 ByteCount : Uint4B +0x018 ByteOffset : Uint4B +0x008 Flags : Uint4B +0x00c AssociatedIrp : __unnamed +0x000 MasterIrp : Ptr32 _IRP +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 MdlAddress : Ptr32 _MDL +0x008 Flags : Uint4B +0x00c AssociatedIrp : __unnamed +0x010 ThreadListEntry : _LIST_ENTRY +0x018 IoStatus : _IO_STATUS_BLOCK +0x020 RequestorMode : Char +0x021 PendingReturned : UChar +0x022 StackCount : Char +0x023 CurrentLocation : Char +0x024 Cancel : UChar +0x025 CancelIrql : UChar +0x026 ApcEnvironment : Char +0x027 AllocationFlags : UChar +0x028 UserIosb : Ptr32 _IO_STATUS_BLOCK +0x02c UserEvent : Ptr32 _KEVENT +0x030 Overlay : __unnamed +0x038 CancelRoutine : Ptr32 void +0x03c UserBuffer : Ptr32 Void +0x040 Tail : __unnamed +0x000 IrpCount : Int4B +0x000 SystemBuffer : Ptr32 Void +0x010 ThreadListEntry : _LIST_ENTRY +0x000 Flink : Ptr32 _LIST_ENTRY +0x000 Flink : Ptr32 _LIST_ENTRY +0x004 Blink : Ptr32 _LIST_ENTRY +0x004 Blink : Ptr32 _LIST_ENTRY +0x000 Flink : Ptr32 _LIST_ENTRY +0x004 Blink : Ptr32 _LIST_ENTRY +0x018 IoStatus : _IO_STATUS_BLOCK +0x000 Status : Int4B +0x000 Pointer : Ptr32 Void +0x004 Information : Uint4B +0x020 RequestorMode : Char +0x021 PendingReturned : UChar +0x022 StackCount : Char +0x023 CurrentLocation : Char +0x024 Cancel : UChar +0x025 CancelIrql : UChar +0x026 ApcEnvironment : Char +0x027 AllocationFlags : UChar +0x028 UserIosb : Ptr32 _IO_STATUS_BLOCK +0x000 Status : Int4B +0x000 Pointer : Ptr32 Void +0x004 Information : Uint4B +0x02c UserEvent : Ptr32 _KEVENT +0x000 Header : _DISPATCHER_HEADER +0x000 Type : UChar +0x001 Absolute : UChar +0x002 Size : UChar +0x003 Inserted : UChar +0x004 SignalState : Int4B +0x008 WaitListHead : _LIST_ENTRY +0x030 Overlay : __unnamed +0x000 AsynchronousParameters : __unnamed +0x000 UserApcRoutine : Ptr32 void +0x004 UserApcContext : Ptr32 Void +0x000 AllocationSize : _LARGE_INTEGER +0x000 LowPart : Uint4B +0x004 HighPart : Int4B +0x000 u : __unnamed +0x000 QuadPart : Int8B +0x038 CancelRoutine : Ptr32 void +0x03c UserBuffer : Ptr32 Void +0x040 Tail : __unnamed +0x000 Overlay : __unnamed +0x000 DeviceQueueEntry : _KDEVICE_QUEUE_ENTRY +0x000 DriverContext : [4] Ptr32 Void +0x010 Thread : Ptr32 _ETHREAD +0x014 AuxiliaryBuffer : Ptr32 Char +0x018 ListEntry : _LIST_ENTRY +0x020 CurrentStackLocation : Ptr32 _IO_STACK_LOCATION +0x020 PacketType : Uint4B +0x024 OriginalFileObject : Ptr32 _FILE_OBJECT +0x000 Apc : _KAPC +0x000 Type : Int2B +0x002 Size : Int2B +0x004 Spare0 : Uint4B +0x008 Thread : Ptr32 _KTHREAD +0x00c ApcListEntry : _LIST_ENTRY +0x014 KernelRoutine : Ptr32 void +0x018 RundownRoutine : Ptr32 void +0x01c NormalRoutine : Ptr32 void +0x020 NormalContext : Ptr32 Void +0x024 SystemArgument1 : Ptr32 Void +0x028 SystemArgument2 : Ptr32 Void +0x02c ApcStateIndex : Char +0x02d ApcMode : Char +0x02e Inserted : UChar +0x000 CompletionKey : Ptr32 Void #define IoGetCurrentIrpStackLocation( Irp ) ( (Irp)->Tail.Overlay.CurrentStackLocation ) |
|
|
地下室#
发布于:2008-09-18 17:07
谢谢,我知道我的问题出在什么地方了
|
|
5楼#
发布于:2008-09-18 20:46
?? 为什么呢?
|
|