You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
8.2 KiB
249 lines
8.2 KiB
/*++
|
|
|
|
Copyright (c) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
assign.cpp
|
|
|
|
Abstract:
|
|
|
|
WinDbg Extension Api
|
|
|
|
Environment:
|
|
|
|
User Mode.
|
|
|
|
Revision History:
|
|
|
|
Andre Vachon (andreva)
|
|
|
|
bugcheck analyzer.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "mapistuff.h"
|
|
|
|
|
|
DECLARE_API( assign )
|
|
{
|
|
ULONG Platform, MajorVer, MinorVer, SrvPack, StringUsed;
|
|
CHAR BuildString[100];
|
|
EXT_GET_FAILURE_ANALYSIS pfnGetAnalysis;
|
|
PDEBUG_FAILURE_ANALYSIS pAnalysis = NULL;
|
|
HANDLE hAssign;
|
|
CHAR Text[4096];
|
|
CHAR CorruptMods[1024];
|
|
HRESULT hRes = S_FALSE;
|
|
FA_ENTRY* Entry;
|
|
|
|
INIT_API();
|
|
|
|
g_ExtControl->GetSystemVersion(&Platform, &MajorVer, &MinorVer, NULL,
|
|
0, NULL, &SrvPack, &BuildString[0],
|
|
sizeof(BuildString), &StringUsed);
|
|
|
|
if (S_OK == g_ExtControl->GetExtensionFunction(0, "GetFailureAnalysis",
|
|
(FARPROC*)&pfnGetAnalysis))
|
|
{
|
|
(*pfnGetAnalysis)(Client, 0, &pAnalysis);
|
|
}
|
|
|
|
if (pAnalysis)
|
|
{
|
|
//
|
|
// If we are not doing assignment, just print the output
|
|
//
|
|
|
|
if (!*args)
|
|
{
|
|
ULONG i;
|
|
|
|
g_ExtControl->Output(1, "Analysis data structure output\n");
|
|
g_ExtControl->Output(1, "\n");
|
|
g_ExtControl->Output(1, "Failure code %08lx\n", pAnalysis->GetFailureCode());
|
|
|
|
Entry = pAnalysis->Get(DEBUG_FLR_FOLLOWUP_NAME);
|
|
g_ExtControl->Output(1, "Followup Name : %s\n", Entry ?
|
|
FA_ENTRY_DATA(PCHAR, Entry) : "<none>");
|
|
Entry = pAnalysis->Get(DEBUG_FLR_BUCKET_ID);
|
|
g_ExtControl->Output(1, "BucketId : %s\n", Entry ?
|
|
FA_ENTRY_DATA(PCHAR, Entry) : "<none>");
|
|
|
|
Entry = NULL;
|
|
while (Entry = pAnalysis->NextEntry(Entry)) {
|
|
|
|
g_ExtControl->Output(1,
|
|
"Type = %08lx - Size = %08lx\n",
|
|
Entry->Tag, Entry->DataSize);
|
|
}
|
|
|
|
hRes = S_OK;
|
|
}
|
|
|
|
if (!pAnalysis->Get(DEBUG_FLR_BUCKET_ID))
|
|
{
|
|
dprintf("missing bucket ID\n");
|
|
sprintf(Text, "%s\n", args);
|
|
//SendOffFailure("andreva",
|
|
// "bugcheck assignment failed - no bucket",
|
|
// Text);
|
|
}
|
|
else if (!pAnalysis->Get(DEBUG_FLR_FOLLOWUP_NAME))
|
|
{
|
|
dprintf("missing FollowUp\n");
|
|
sprintf(Text, "%s\n", args);
|
|
//SendOffFailure("andreva",
|
|
// "bugcheck assignment failed - no followup",
|
|
// Text);
|
|
}
|
|
else if (*args)
|
|
{
|
|
CHAR *rootDir;
|
|
CHAR *dumpPath;
|
|
CHAR *dumpFile;
|
|
CHAR *parg;
|
|
CHAR arg[MAX_PATH];
|
|
CHAR dump[MAX_PATH];
|
|
CHAR bucketDir[MAX_PATH];
|
|
CHAR newfile[MAX_PATH];
|
|
CHAR assignedTo[MAX_PATH];
|
|
CHAR followupdir[MAX_PATH];
|
|
|
|
strcpy(arg, args);
|
|
|
|
parg = rootDir = arg;
|
|
|
|
while (*parg && (*parg != ' ')) {parg++;}
|
|
while (*parg && (*parg == ' ')) {*parg++ = 0;}
|
|
dumpPath = parg;
|
|
|
|
while (*parg && (*parg != ' ')) {parg++;}
|
|
while (*parg && (*parg == ' ')) {*parg++ = 0;}
|
|
dumpFile = parg;
|
|
|
|
if (*rootDir && *dumpPath && *dumpFile)
|
|
{
|
|
sprintf(dump, "%s\\%s", dumpPath, dumpFile);
|
|
|
|
CreateDirectory(rootDir, NULL);
|
|
|
|
// create followup\bugcheck directory
|
|
|
|
if ((Entry = pAnalysis->Get(DEBUG_FLR_POOL_CORRUPTOR)) ||
|
|
(Entry = pAnalysis->Get(DEBUG_FLR_MEMORY_CORRUPTOR)))
|
|
{
|
|
sprintf(followupdir, "%s\\corruption-%s", rootDir,
|
|
FA_ENTRY_DATA(PCHAR, Entry));
|
|
}
|
|
else
|
|
{
|
|
sprintf(followupdir, "%s\\%s", rootDir,
|
|
FA_ENTRY_DATA(PCHAR,
|
|
pAnalysis->Get(DEBUG_FLR_FOLLOWUP_NAME)));
|
|
}
|
|
|
|
CreateDirectory(followupdir, NULL);
|
|
|
|
sprintf(bucketDir, "%s\\%s", followupdir,
|
|
FA_ENTRY_DATA(PCHAR,
|
|
pAnalysis->Get(DEBUG_FLR_BUCKET_ID)));
|
|
|
|
CreateDirectory(bucketDir, NULL);
|
|
|
|
sprintf(newfile, "%s\\%s", bucketDir, dumpFile);
|
|
|
|
dprintf("%s\n", newfile);
|
|
|
|
CopyFile(dump, newfile, 0);
|
|
|
|
//
|
|
// See if this succeeded correctly
|
|
// put a marker in the root if it did
|
|
//
|
|
|
|
hAssign = CreateFile(newfile,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if (hAssign != INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle(hAssign);
|
|
|
|
hRes = S_OK;
|
|
|
|
#if 0
|
|
//
|
|
// Check to see if this directory already has this failure
|
|
// assigned to someone.
|
|
//
|
|
|
|
hAssign = CreateFile(assignedTo,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if (hAssign == INVALID_HANDLE_VALUE)
|
|
{
|
|
hAssign = CreateFile(assignedTo,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
CHAR Title[1024];
|
|
|
|
sprintf(Title,
|
|
"Bugcheck %s",
|
|
FA_ENTRY_DATA(PCHAR,
|
|
pAnalysis->Get(DEBUG_FLR_BUCKET_ID)));
|
|
|
|
sprintf(Text,
|
|
"To debuger this dump file, run\n"
|
|
"\n"
|
|
"kd -z %s -y SRV*\\\\symbols\\symbols "
|
|
"-i SRV*\\\\symbols\\symbols\n"
|
|
"\n"
|
|
"If this failure should not have been assigned to "
|
|
"you, please send mail to \"dbg\"\n"
|
|
"If you can not debug this dump file, "
|
|
"please send mail to \"dbg\"\n"
|
|
"If you have any other issues with this dump file"
|
|
"please send mail to \"dbg\"\n"
|
|
"\n"
|
|
"We unfortunately do not know the origin of this "
|
|
" dump file.\n",
|
|
newfile);
|
|
|
|
SendOffFailure(FA_ENTRY_DATA(PCHAR, pAnalysis->Get(DEBUG_FLR_FOLLOWUP_NAME)),
|
|
Title,
|
|
Text);
|
|
}
|
|
|
|
if (hAssign != INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle(hAssign);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
pAnalysis->Release();
|
|
}
|
|
|
|
|
|
EXIT_API();
|
|
return hRes;
|
|
}
|