有没有人能告诉我windows内置任务管理器使用什么API来转储我选择的进程?
如果我是对的,它不是MiniDumpWriteDump。如果不是这样,那又会怎样?非常感谢!
简而言之,它使用MiniDumpWriteDump
。
细节(跳过一些不必要的细节):
在Windows 7版本中,当你想转储一个进程时,任务管理器中的一些包装函数可执行文件会随着进程ID和可执行文件名称一起被调用,例如foo.exe
。
使用OpenProcess
获取进程句柄,并将其存储在使用HeapAlloc
在堆中分配的某个结构中。
它使用GetTempPathW
在一些本地变量中获取临时目录,附加可执行文件名,例如foo.exe
,使用PathAppendW
,并使用PathRemoveExtension
删除扩展名,成为foo
而不使用.exe
,然后使用PathAddExtensionW
添加新的扩展名,并调用PathYetAnotherMakeUniqueName
检查路径是否未使用或生成新路径,如foo(2).DMP
。最后,它使用CreateFile
获取文件的句柄。
它使用DuplicateHandle
复制句柄并将其存储在该结构中,并创建一个新线程,并将该结构作为参数传递给线程函数。
线程使用参数MiniDumpWriteDump
调用,DumpType
设置为0x1826
:
MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModules | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo
只有一个办法,MiniDumpWriteDump()就是办法。
您可以自己轻松地看到这一点,运行dumpbin.exe /imports c:windowssystem32taskmgr.exe
查看它使用的函数。您将看到它从DbgHelp.dll中导入MiniDumpWriteDump。这也是为什么DbgHelp.dll现在随Windows一起发布的原因。