Leaked source code of windows server 2003
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.
 
 
 
 
 
 

208 lines
4.4 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
FatalEngine.cpp
Abstract:
This module encapsulates the routines that are needed only for
fatal error retrieval.
Author:
Abdullah Ustuner (AUstuner) 28-August-2002
--*/
#include "mca.h"
extern IWbemServices *gPIWbemServices;
extern IWbemLocator *gPIWbemLocator;
BOOL
MCAGetFatalError(
VOID
)
/*++
Routine Description:
This function queries WMI for a fatal error upon successful completion
of required initialization tasks. By using the enumerator provided by
WMI as a response to the query, the object list is parsed and for each
object the MCA Error Record is extracted. But in reality, there should be
just one MCA Error Record present.
Arguments:
none
Return Value:
TRUE - Successful.
FALSE - Unsuccessful.
--*/
{
BOOL isSuccess = TRUE;
HRESULT hResult = 0;
PUCHAR pErrorRecordBuffer = NULL;
INT errorRecordCount = 0;
IEnumWbemClassObject *pObjectEnumerator = NULL;
IWbemClassObject *apObjects[10];
ULONG uReturned = 0;
ULONG objectIndex = 0;
LPWSTR pQueryLanguage = L"WQL";
LPWSTR pQueryStatement = L"select * from MSMCAInfo_RawMCAData";
//
// Complete the required initialization tasks.
//
if (!MCAInitialize()) {
isSuccess = FALSE;
wprintf(L"ERROR: Initialization failed!\n");
goto CleanUp;
}
BSTR bQueryLanguage = SysAllocString(pQueryLanguage);
BSTR bQueryStatement = SysAllocString(pQueryStatement);
if (bQueryLanguage == NULL || bQueryStatement == NULL) {
isSuccess = FALSE;
wprintf(L"ERROR: Memory allocation for string failed!\n");
goto CleanUp;
}
//
// Query WMI for the fatal error record.
//
hResult = gPIWbemServices->ExecQuery(bQueryLanguage,
bQueryStatement,
0,
0,
&pObjectEnumerator
);
if (FAILED(hResult)) {
isSuccess = FALSE;
wprintf(L"ERROR: Fatal error querying failed!\n");
wprintf(L"ERROR: Result: 0x%x\n", hResult);
goto CleanUp;
}
//
// Now we will retrieve objects of type IWbemClassOject from this enumeration.
//
do {
//
// Retrieve objects until none is left in which case the final Next()
// will return WBEM_S_FALSE.
//
hResult = pObjectEnumerator->Next(WBEM_INFINITE,
10,
apObjects,
&uReturned
);
if (SUCCEEDED(hResult)) {
//
// Now extract the actual MCA error record from the objects.
//
for (objectIndex = 0; objectIndex < uReturned; objectIndex++) {
if (!MCAExtractErrorRecord(apObjects[objectIndex], &pErrorRecordBuffer)) {
isSuccess = FALSE;
wprintf(L"ERROR: Failed to get fatal error record data!\n");
goto CleanUp;
}
if (pErrorRecordBuffer) {
errorRecordCount++;
wprintf(L"INFO: Succesfully retrieved fatal cache error data.\n");
MCAPrintErrorRecord(pErrorRecordBuffer);
}
apObjects[objectIndex]->Release();
}
} else {
wprintf(L"ERROR: Couldn't retrieve WMI objects!\n");
goto CleanUp;
}
} while (hResult == WBEM_S_NO_ERROR);
if (errorRecordCount == 0) {
wprintf(L"INFO: No fatal error record was found!\n");
}
CleanUp:
//
// Release all WMI related objects.
//
if (pObjectEnumerator) {
pObjectEnumerator->Release();
}
if (gPIWbemLocator) {
gPIWbemLocator->Release();
}
if (gPIWbemServices) {
gPIWbemServices->Release();
}
if (bQueryLanguage != NULL) {
SysFreeString(bQueryLanguage);
}
if (bQueryStatement != NULL) {
SysFreeString(bQueryStatement);
}
return isSuccess;
}