1
我想获取有关某些进程句柄的小型转储信息。 我得到一个类型为MINIDUMP_HANDLE_DESCRIPTOR_2
的句柄列表,我正在尝试阅读关于可以通过ObjectInfoRva
访问的句柄的信息。用MiniDump获取句柄信息会导致ArgumentException
不过,我总是得到这样的例外:发生
System.ArgumentException的HResult = -2147024809消息=不 足够的缓冲区中的可用空间。来源= mscorlib程序
这是我的方法
public unsafe DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION ReadInfo(uint rva)
{
try
{
DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION result = default(DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION);
byte* baseOfView = null;
_safeMemoryMappedViewHandle.AcquirePointer(ref baseOfView);
IntPtr position = new IntPtr(baseOfView + rva);
result = _safeMemoryMappedViewHandle.Read<DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION>((ulong)position);
return result;
}
finally
{
_safeMemoryMappedViewHandle.ReleasePointer();
}
}
MINIDUMP_HANDLE_DESCRIPTOR_2
声明:
public struct MINIDUMP_HANDLE_DESCRIPTOR_2
{
public UInt64 Handle;
public uint TypeNameRva;
public uint ObjectNameRva;
public UInt32 Attributes;
public UInt32 GrantedAccess;
public UInt32 HandleCount;
public UInt32 PointerCount;
public uint ObjectInfoRva;
public UInt32 Reserved0;
}
的_safeMemoryMappedViewHandle
初始化 - 这就是如何我有摆在首位手柄名单。
我在做什么错?
微优化的代码并不能帮助你得到它的权利,很少有理由避免只是一个普通的FileStream。您可能没有正确地走MINIDUMP_DIRECTORY并且得到无效的RVA。 32位和64位微转储之间的差异可能是一个原因。或者得到一个普通的MINIDUMP_HANDLE_DESCRIPTOR,而不是扩展版本,所以在不存在的ObjectInfoRva上炸弹。无法从片段中看出来。添加更多的Debug.Assert(),以便在变成难以诊断的异常之前捕捉到错误的RVA。 –
我怎么知道我得到的rva是坏的?目前我只在x86上工作... –