2016-01-30 96 views
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初始化 - 这就是如何我有摆在首位手柄名单。

我在做什么错?

+2

微优化的代码并不能帮助你得到它的权利,很少有理由避免只是一个普通的FileStream。您可能没有正确地走MINIDUMP_DIRECTORY并且得到无效的RVA。 32位和64位微转储之间的差异可能是一个原因。或者得到一个普通的MINIDUMP_HANDLE_DESCRIPTOR,而不是扩展版本,所以在不存在的ObjectInfoRva上炸弹。无法从片段中看出来。添加更多的Debug.Assert(),以便在变成难以诊断的异常之前捕捉到错误的RVA。 –

+1

我怎么知道我得到的rva是坏的?目前我只在x86上工作... –

回答

0

问题出在baseOfView指针 - 我没有正确计算。我需要设置相应的偏移量基本流地址...

这里是ReadInfo功能,最终为我工作的一个版本:

public unsafe DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION ReadInfo(uint rva, IntPtr streamPtr) 
{ 
    DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION result = new DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION(); 

    try 
    { 
     byte* baseOfView = null; 
     _safeMemoryMappedViewHandle.AcquirePointer(ref baseOfView); 
     ulong offset = (ulong)streamPtr - (ulong)baseOfView; 
     result = _safeMemoryMappedViewHandle.Read<DbgHelp.MINIDUMP_HANDLE_OBJECT_INFORMATION>(offset); 
    } 
    finally 
    { 
     _safeMemoryMappedViewHandle.ReleasePointer(); 
    } 

    return result; 
}