内部实现
UdmpView是使用Windows SDK中的MiniDump系列API而开发的。使用这些API读取数据流之前,应该先使用文件访问API打开文件,然后映射到当前进程的内容空间中。例如,以下是UdmpView程序用来执行打开操作的Open方法的源代码:
HRESULT CMdmpParser::Open(LPCTSTR lpszFileName,HWND hWndStreamList)
{
PMINIDUMP_HEADER pMdpHeader;
char szSignature[sizeof(ULONG32)+1];
m_hDumpFile=CreateFile(lpszFileName,
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(m_hDumpFile==INVALID_HANDLE_VALUE)
{
OutMsg(_T("Failed to CreateFile(%s) for 0x%x"),
lpszFileName,GetLastError());
return E_FAIL;
}
m_hDumpMapFile=CreateFileMapping(m_hDumpFile,
NULL, PAGE_READONLY, 0, 0, NULL);
if(m_hDumpMapFile==NULL)
{
OutMsg(_T("Failed to CreateFileMapping(0x%x) for 0x%x"),
m_hDumpFile,GetLastError());
return E_FAIL;
}
m_pBaseofDump=MapViewOfFile(m_hDumpMapFile, FILE_MAP_READ, 0, 0, 0);
if(m_pBaseofDump==NULL)
{
OutMsg( _T("Failed to MapViewOfFile(0x%x) for 0x%x"),
m_hDumpMapFile,GetLastError() );
return E_FAIL;
}
pMdpHeader=(PMINIDUMP_HEADER)m_pBaseofDump;
if(pMdpHeader->Signature!=MINIDUMP_SIGNATURE)
{
OutMsg(_T("File [%s] is not a valid user dump [0x%x]."),
lpszFileName,pMdpHeader->Signature);
Close();
return E_FAIL;
}
GetFileSizeEx(m_hDumpFile,(PLARGE_INTEGER)&m_ulFileSize);
OutMsg(_T("File [%s] is mapped to 0x%x successfuly, size=%I64u"),
lpszFileName,m_pBaseofDump,m_ulFileSize);
strncpy(szSignature,(const char *)&(pMdpHeader->Signature),sizeof(ULONG32));
szSignature[sizeof(ULONG32)]=0;
OutMsg(_T("Header: Signature=%s(0x%x), Version=0x%x, Streams=%u,DirRva=0x%x"),
szSignature,pMdpHeader->Signature,
pMdpHeader->Version,
pMdpHeader->NumberOfStreams,
pMdpHeader->StreamDirectoryRva);
OutMsg(_T("Header: CheckSum=0x%x, Stamp=0x%x, Flags=0x%x"),
pMdpHeader->CheckSum,
pMdpHeader->TimeDateStamp,
pMdpHeader->Flags);
this->FillStreamList(hWndStreamList);
return S_OK;
}
主要用途
使用WinDBG和Visual Studio 2005这样的现成工具都可以打开和分析转储文件。但是使用这些工具无法直接观察转出文件的内容,比如知道转储文件中到底有哪些数据流,每个数据流到底包含什么样的信息。而UdmpView可以弥补这个不足。第二,当我们编写代码来产生转储文件(使用MiniDumpWriteDumpStream)时,那么使用本工具可以很方便的查看写入的内容。另外,本工具可以帮助我们学习转储文件格式和了解转储文件API工作方法。
|