关于调用栈一个函数ObpPushStackInfo
2018-01-08 16:42
1501 查看
kd> !obtrace 0xfa96f700(对象地址) Object: fa96f700 Image: cmd.exe Sequence (+/-) Stack -------- ----- --------------------------------------------------- 2421d +1 nt!ObCreateObject+180 nt!NtCreateEvent+92 nt!KiFastCallEntry+104 nt!ZwCreateEvent+11 win32k!UserThreadCallout+6f win32k!W32pThreadCallout+38 nt!PsConvertToGuiThread+174 nt!KiBBTUnexpectedRange+c 2421e -1 nt!ObfDereferenceObject+19 nt!NtCreateEvent+d4 nt!KiFastCallEntry+104 nt!ZwCreateEvent+11 win32k!UserThreadCallout+6f win32k!W32pThreadCallout+38 nt!PsConvertToGuiThread+174 nt!KiBBTUnexpectedRange+c .......(还有)
!obtrace这个命令cmd,exe调用栈上的信息。sequence指操作的先后顺序。+表示 (a reference operation)—不知道怎么翻译好。-表示 (a dereferenc operation)。—(前面的来自 ddk)
USHOR 4000 T RtlCaptureStackBackTrace( //捕捉栈回溯信息 __in ULONG FramesToSkip,//要跳过几个(栈)结构 __in ULONG FramesToCapture,//要捕捉几个结构 __out_ecount(FramesToCapture) PVOID *BackTrace,//用来保存信息的数组 __out_opt PULONG BackTraceHash ); VOID ObpPushStackInfo(IN PVOID Object, UNKNOWN1,UNKNOWN2,ULONG Tag) { PVOID BackTrace[15]; memset(BackTrace,0,15*sizeof(PVOID)); if(KeAreInterruptsEnabled()) //je ox7d { if(KeGetCurrentIrql()<=DISPATCH_LEVEL) //0X2b ja 0x7d { if(RtlCaptureStackBackTrace(1,10h,BackTrace,0)>=1) //0x35 jb 0x7d { InterlockedIncr(&ObpStackSequence); //0x4a if(TRUE==MmCanThreadFault()) //jne 0x78 先'暂停'线程,然后'push'相关信息,不然会有新的调用信息产生使获取的数据不准确 { ObpPushRefDerefInfo(Object,UNKNOW1,UNKNOW2,2,BackTrace,Tag); //0x71 jmp 7d } else { ObpDeferPushRefDerefInfo(Object,UNKNOWN1,UNKNOW2,2,BackTrace,Tag); } } } } return ; //0x7d } BOOLEAN MmCanThreadFault() { //KeGetCurrentThread() 0X284 在Ethread结构里,它的第一个成员是Kthread if((KeGetCurrentIrql()<=DISPATCH_LEVEL)&&!(Ethread->SameThreadPassiveFlags&4) &&(KeGetCurrentThread()!=MiWorkingSetThread)&&!(Ethread->SameThreadApcFlags&(0f01f8h) &&!(Ethread->SameThreadApcFlags&(0ffc0h)) { return TRUE; } else { return FALSE; } }
相关文章推荐
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 一个有意思的关于函数指针用在vector里的模型
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于hook设置函数如何支持多核CPU的一个说明
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- linux下打印函数调用栈(stack backtrace in Linux)
- CodeProject - 在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- C语言关于函数、数组的一个事例【关于选手评分的问题】
- 关于hook设置函数如何支持多核CPU的一个说明
- 关于List的一个小问题——remove()函数
- [Win32]一个调试器的实现(十一)显示函数调用栈
- 一个关于js所有函数都报错的问题
- 关于tostring()函数拼接的一个误区
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于strlen函数的一个问题
- 收藏——在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- 关于函数指针的一个问题
- 关于函数调用的loop的一个问题
- 关于一个项目的函数的思考,及项目的规划
- 关于C++中getline()函数的一个陷阱