|
|
//-----------------------------------------------------------------------
// @doc
//
// @module convert crash dump to triage dump for crash dump utilities
//
// Copyright 1999 Microsoft Corporation. All Rights Reserved
//
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <tchar.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
BOOL DoConversion( LPSTR szInputDumpFile, // full or kernel dump
HANDLE OutputDumpFile // triage dump file
);
void Usage() { fprintf(stderr, "dmpmgr -s symbol_path -i input_dump_file -o output_dump_file\n"); fprintf(stderr, "\tinput dump file is full or kernel crash dump.\n"); fprintf(stderr, "\toutput is triage crash dump.\n"); fprintf(stderr, "\tsymbol path -- must have symbols for ntoskrnl.exe.\n\n"); }
ULONG Extra[11]; ULONG Base[500]; UCHAR Output[4000];
int WINAPIV main( int argc, PTSTR argv[ ], PTSTR envp[] ) {
char *szInputDumpFile = NULL; char *szOutputTriageDumpFile = NULL; char *szIniFile = NULL; BOOL fVerbose = 0; BOOL fExamine = 0; BOOL fBuildIniFile = 0; int iarg; HANDLE fileHandle; HANDLE fileHandleIn; UCHAR Buffer[8192]; PUCHAR ptmp; ULONG cbRead; ULONG i;
for(iarg = 1; iarg < argc; iarg++) { if (argv[iarg][0] == '/' || argv[iarg][0] == '-') { if (_tcslen(argv[iarg]) < 2) { Usage(); exit(-1); }
switch(argv[iarg][1]) { default: Usage(); exit(-1);
case 'i': case 'I': szInputDumpFile = argv[++iarg]; break;
case 'o': case 'O': szOutputTriageDumpFile = argv[++iarg]; break; } } else { Usage(); exit(-1); } }
if (szInputDumpFile == NULL || szOutputTriageDumpFile == NULL) { Usage(); exit(-1); }
fileHandleIn = CreateFileA(szInputDumpFile, GENERIC_READ, 0, NULL, FILE_OPEN_IF, FILE_ATTRIBUTE_NORMAL, NULL);
if (fileHandleIn == INVALID_HANDLE_VALUE) { fprintf(stderr, "can not open input file\n"); exit(-1); }
if (!ReadFile(fileHandleIn, Buffer, sizeof(Buffer), &cbRead, NULL)) { fprintf(stderr, "can not read input file\n"); exit(-1); }
ptmp = Buffer;
for (i=0; i<11; i++) {
ptmp = strstr(ptmp, "kd> x"); ptmp = strstr(ptmp, "\n"); ptmp++; sscanf(ptmp, "%08lx", &Extra[i]); }
ptmp = strstr(ptmp, "kd> dd");
for (i=0; i<40; i++) {
ptmp = strstr(ptmp, "\n"); ptmp++; sscanf(ptmp, "%08lx %08lx %08lx %08lx %08lx", &Base[i*10], &Base[i*10 + 1], &Base[i*10 + 2], &Base[i*10 + 3], &Base[i*10 + 4]); }
sprintf(Output, "KDDEBUGGER_DATA64 %s = {" "{0}, 0x%08lx, 0x%08lx, 0, 0, 0, 0, 0, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x00000000, 0x00000000,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx,\n" "0x%08lx, 0x%08lx, 0x%08lx};\n\n\n", szInputDumpFile, Base[13], Base[21], Base[33], Base[41], Base[43], Base[51], Base[53], Base[61], Base[63], Base[71], Base[73], Base[81], Base[83], Base[91], Base[93], Base[101], Base[103], Base[111], Base[113], Base[121], Base[123], Base[131], Base[133], Base[141], Base[143], Base[151], Base[153], Base[161], Base[163], Base[171], Base[173], Base[181], Base[183], Base[191], Base[193], Base[201], Base[203], Base[211], Base[213], Base[221], Base[223], Base[231], Base[233], Base[241], Base[243], Base[251], Base[253], Base[261], Base[263], Base[271], Base[273], Base[281], Base[283], Base[291], Base[293], Base[301], Base[303], Base[311], Base[313], Base[321], Extra[0], Extra[1], Extra[2], Extra[3], Extra[4], Extra[5], Extra[6], Extra[7], Extra[8], Extra[9], Extra[10]);
//
// Create the minidump file
//
fileHandle = CreateFileA(szOutputTriageDumpFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (fileHandle == INVALID_HANDLE_VALUE) { exit(-1); }
WriteFile(fileHandle, Output, strlen(Output), &cbRead, NULL);
CloseHandle(fileHandle);
exit(-1); }
|