MI_Result GetCimMIError(MI_Result result , _Outptr_result_maybenull_ MI_Instance **cimErrorDetails, _In_ MI_Uint32 errorStringId ) { Intlstr intlstr = Intlstr_Null; GetResourceString(errorStringId, &intlstr); MI_Utilities_CimErrorFromErrorCode( (MI_Uint32)result, MI_RESULT_TYPE_MI, intlstr.str, cimErrorDetails); strncpy(g_currentError, intlstr.str, 5000); DSC_EventWriteCIMError(intlstr.str,(MI_Uint32)result); if( intlstr.str) Intlstr_Free(intlstr); return result; }
MI_Result AppendWMIError1ParamID( _Inout_ MI_Instance *cimErrorDetails, _In_ MI_Uint32 errorStringId ) { MI_Result r = MI_RESULT_OK; Intlstr intlstr = Intlstr_Null; GetResourceString(errorStringId, &intlstr); if( intlstr.str ) { r = AppendWMIError1Param(cimErrorDetails, MI_T("%s %s"), intlstr.str); Intlstr_Free(intlstr); } return r; }
MI_Result GetCimWin32Error(MI_Uint32 result , _Outptr_result_maybenull_ MI_Instance **cimErrorDetails, _In_ MI_Uint32 errorStringId ) { Intlstr intlstr = Intlstr_Null; GetResourceString(errorStringId, &intlstr); MI_Utilities_CimErrorFromErrorCode( (MI_Uint32)result, MI_RESULT_TYPE_WIN32, intlstr.str, cimErrorDetails); strncpy(g_currentError, intlstr.str, 5000); DSC_EventWriteCIMError(intlstr.str,(MI_Uint32)result); if( intlstr.str) Intlstr_Free(intlstr); #if defined(_MSC_VER) return MIResultFromHRESULT(HRESULT_FROM_WIN32(result)); #else return MI_RESULT_FAILED; #endif }
int RunInProcCompiler( _In_ const wstring& processPath, _In_ const list<wstring> args, _Out_ vector<BYTE>& stdOut, _Out_ vector<BYTE>& stdErr) { SECURITY_ATTRIBUTES attr; attr.nLength = sizeof(SECURITY_ATTRIBUTES); attr.bInheritHandle = TRUE; attr.lpSecurityDescriptor = NULL; // Get stdin to pass to csc.exe auto stdIn = GetStdHandle(STD_INPUT_HANDLE); // Create handles for the child to write to and the parent to read from HANDLE stdOutRead; HANDLE stdOutWrite; HANDLE stdErrRead; HANDLE stdErrWrite; HANDLE inDup; auto thisHandle = GetCurrentProcess(); DuplicateHandle( thisHandle, stdIn, thisHandle, &inDup, 0, TRUE, DUPLICATE_SAME_ACCESS); if (!CreatePipe(&stdOutRead, &stdOutWrite, &attr, 0)) { FailWithGetLastError(GetResourceString(IDS_ConnectToInProcCompilerFailed)); } if (!CreatePipe(&stdErrRead, &stdErrWrite, &attr, 0)) { FailWithGetLastError(GetResourceString(IDS_ConnectToInProcCompilerFailed)); } // Mark the read end of the pipes non-inheritable if (!SetHandleInformation(stdOutRead, HANDLE_FLAG_INHERIT, 0)) { FailWithGetLastError(GetResourceString(IDS_ConnectToInProcCompilerFailed)); } if (!SetHandleInformation(stdErrRead, HANDLE_FLAG_INHERIT, 0)) { FailWithGetLastError(GetResourceString(IDS_ConnectToInProcCompilerFailed)); } PROCESS_INFORMATION procInfo = {}; STARTUPINFO startInfo = {}; BOOL success = FALSE; startInfo.cb = sizeof(STARTUPINFO); startInfo.hStdOutput = stdOutWrite; startInfo.hStdInput = inDup; startInfo.hStdError = stdErrWrite; startInfo.dwFlags |= STARTF_USESTDHANDLES; // Assemble the command line wstringstream argsBuf; // Quote the exe path in case there are spaces argsBuf << '"'; argsBuf << processPath; argsBuf << '"'; // Space seperate every argument for (auto arg : args) { argsBuf << ' '; argsBuf << arg; } auto argsString = argsBuf.str(); auto argsCpy = make_unique<wchar_t[]>(argsString.size() + 1); wcscpy_s(argsCpy.get(), argsString.size() + 1, argsString.c_str()); // Create the child process. success = CreateProcess(NULL, argsCpy.get(), // command line NULL, // process security attributes NULL, // primary thread security attributes TRUE, // handles are inherited NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, NULL, // use parent's environment NULL, // use parent's current directory &startInfo, // STARTUPINFO pointer &procInfo); // receives PROCESS_INFORMATION CloseHandle(stdOutWrite); CloseHandle(inDup); CloseHandle(stdErrWrite); if (success) { // Read stdout and stderr from the process ReadOutput(stdOutRead, stdOut); ReadOutput(stdErrRead, stdErr); // Wait for the process to exit and return the exit code LogFormatted(IDS_CreatedProcess, procInfo.dwProcessId); WaitForSingleObject(procInfo.hProcess, INFINITE); DWORD exitCode = -1; GetExitCodeProcess(procInfo.hProcess, &exitCode); // Cleanup CloseHandle(procInfo.hProcess); CloseHandle(procInfo.hThread); CloseHandle(stdOutRead); CloseHandle(stdErrRead); return exitCode; } else { CloseHandle(stdOutRead); CloseHandle(stdErrRead); FailWithGetLastError(GetResourceString(IDS_CreatingProcess)); // Unreachable return -1; } }
MI_Boolean IsMatchedKeyProperties( _In_ MI_Instance* instance0, _In_ MI_Instance* instance1, _Outptr_result_maybenull_z_ MI_Char** keywords, _Out_ MI_Result* miResult, _Outptr_result_maybenull_ MI_Instance **extendedError) { MI_Uint32 i, j; MI_Result result0, result1; MI_Value value0, value1; MI_Type type0, type1; Intlstr intlstr = Intlstr_Null; MI_Char* tempKeywords = NULL; MI_Char* tempKeywordsBackup = NULL; size_t length; MI_PropertyDecl** properties; if (extendedError == NULL) { return MI_RESULT_INVALID_PARAMETER; } *extendedError = NULL; // Explicitly set *extendedError to NULL as _Outptr_ requires setting this at least once. *miResult = MI_RESULT_OK; *keywords = NULL; properties = (MI_PropertyDecl**)instance0->classDecl->properties; for (i = 0; i < instance0->classDecl->numProperties; i++) { for (j = 0; j < properties[i]->numQualifiers; j++) { if (Tcscasecmp(properties[i]->qualifiers[j]->name, MI_T("Key")) == 0) { result0 = DSC_MI_Instance_GetElement(instance0, properties[i]->name, &value0, &type0, NULL, NULL); result1 = DSC_MI_Instance_GetElement(instance1, properties[i]->name, &value1, &type1, NULL, NULL); if (result0 == MI_RESULT_OK && result1 == MI_RESULT_OK && type0 == type1 && IsSameMiValue(&value0, &value1, type0)) { // key is the same, building keywords list. length = Tcslen(properties[i]->name) + 1; if (tempKeywords == NULL) { // the first keyword. tempKeywords = (MI_Char*)DSC_malloc(length * sizeof (MI_Char), NitsHere()); if (tempKeywords == NULL) { *miResult = CreateMemoryError(extendedError); return MI_TRUE; } memcpy(tempKeywords, properties[i]->name, length * sizeof(MI_Char) ); } else { // the second or more keywords. if (intlstr.str == NULL) { // create separator string once. GetResourceString(ID_CA_COMMA_SEPARATOR, &intlstr); if (intlstr.str == NULL) { *miResult = CreateMemoryError(extendedError); DSC_free(tempKeywords); return MI_TRUE; } } length += Tcslen(tempKeywords) + Tcslen(intlstr.str); tempKeywordsBackup = tempKeywords; tempKeywords = (MI_Char*)DSC_realloc(tempKeywordsBackup, length * sizeof (MI_Char), NitsHere()); if (tempKeywords == NULL) { *miResult = CreateMemoryError(extendedError); DSC_free(tempKeywordsBackup); Intlstr_Free(intlstr); return MI_TRUE; } Stprintf(tempKeywords, length, MI_T("%T%T"), intlstr.str, properties[i]->name); } } else { if (tempKeywords) { DSC_free(tempKeywords); } if (intlstr.str) { Intlstr_Free(intlstr); } if(result0 != MI_RESULT_OK) { *miResult = result0; } else if(result1 != MI_RESULT_OK) { *miResult = result1; } return MI_FALSE; } break; } } } if (intlstr.str) { Intlstr_Free(intlstr); } // at least one key was found, and all matched. if (tempKeywords) { *keywords = tempKeywords; return MI_TRUE; } return MI_FALSE; }
char * GetModulesString(uint32_t dwError) { uint16_t low = (uint16_t)(dwError & 0xFFFF); uint16_t hei = (uint16_t)(dwError >> 16); static char szString[512]; uint32_t id = IDS_ERR_UNKNOWN; switch(hei) { case PUMA_MODULE_RSTR: switch(low) { case 9: // "User break", прервано пользователем case 1: // "No error", id = IDS_ERR_NO; break; case 2: // "Not enough memory", не хватает памяти id = IDS_ERR_NO_MEMORY; break; case 3: // "Not implement", не поддерживаемая ф-ия id = IDS_ERR_NOTIMPLEMENT; break; case 4: // "Null poiner assigned", нулевой указатель case 5: // "Bad value of argument", некорректный аргумент case 6: // "Internal error", грубая внутренняя ошибка case 7: // "Tools: No place in the kit", нет места во внутреннем буфере break; case 8: // "Can't load recog tables", нет нужной таблицы распознавания или словаря id = IDS_ERR_NOTABLE; break; } break; case PUMA_MODULE_REXC: switch(low) { case 1: // "No error", id = IDS_ERR_NO; break; case 18: // "Not enough memory", не хватает памяти case 2: // "Not enough memory", не хватает памяти id = IDS_ERR_NO_MEMORY; break; case 3: // "Not inmpement", не поддерживаемая ф-ия id = IDS_ERR_NOTIMPLEMENT; break; case 4: // "Internal error - call developer", грубая внутренняя ошибка case 5: // "Can't open DumpFile", устарело case 6: // "DumpFile writing error", устарело case 7: // "External CallBack error", устарело case 8: // "Bad Parameters of call", конфликт параметров вызова case 12: // "Can't import", ошибка импорта case 13: // "Can't export", ошибка экспорта case 17: // "Already init", уже проинициализировано break; /* case 19: // "Can't get orientation", нельзя определить ориентацию страницы id = IDS_ERR_CANNOTGETORIENTATION; break; */ case 20: //"Bad image information" противоречивая инф. в ВМР break; case 9: // "Empty Page", пустая страница id = IDS_ERR_EMPTYPAGE; break; case 10: //"Can't init eventual-library", не инициализируется эвентуальная библиотека (нет таблицы: // case 15: // "Can't init language", ошибка загрузки таблиц эвент case 16: // "Can't init networks", ошиба загрузки нейронной сети id = IDS_ERR_NOTABLE; break; case 11: //"Different versions of REXC and CCOM", расхождение версий id = IDS_ERR_DIFVERSION; break; case 14: // "Language not exist", не поддерживаемый язык id = IDS_ERR_UNKNOWN_LANGUAGE; break; } break; case PUMA_MODULE_CCOM: switch(low) { case 1: // "No error", id = IDS_ERR_NO; break; case 2: // "Not enough memory", не хватает памяти id = IDS_ERR_NO_MEMORY; break; case 3: // "Not implement", не поддерживаемая ф-ия id = IDS_ERR_NOTIMPLEMENT; break; case 4: // "Null poiner assigned", нулевой указатель case 5: // "Bad value of argument" некорректный аргумент break; } break; case PUMA_MODULE_CSTR: switch(low) { case 1: // "No error", id = IDS_ERR_NO; break; case 2: // "Not enough memory", не хватает памяти id = IDS_ERR_NO_MEMORY; break; case 3: // "Not implement", не поддерживаемая ф-ия id = IDS_ERR_NOTIMPLEMENT; break; case 4: // "Null poiner assigned", нулевой указатель case 5: // "Bad value of argument", некорректный аргумент case 6: // "Assigned Line is absent", нет указанной строки case 7: // "Can't rewrite used Line", существует строка с укзанными параметрами (при создании: // case 8: // "Structure of line has become rotten", строка испорчена (при лечении: // case 9: // "Internal error", грубая внутренняя алгоритмическая ошибка case 10: // "Can't convert to raster" нельзя конвертировать (добавить: // компоненту в растр break; } break; case PUMA_MODULE_RLINE: break; case PUMA_MODULE_RLTABLE: break; case PUMA_MODULE_CPAGE: switch(low) { case 0:// ошибок нет id = IDS_ERR_NO; break; case 1:// не реализовано id = IDS_ERR_NOTIMPLEMENT; break; case 2:// нет памяти id = IDS_ERR_NO_MEMORY; break; case 3:// внутренняя ошибка case 6:// внутренняя ошибка break; case 4:// ошибка чтения файла id = IDS_ERR_FILEREAD; break; case 5:// ошибка записи файла id = IDS_ERR_FILEWRITE; break; case 7:// несоответсвие версий id = IDS_ERR_DIFVERSION; break; } break; case PUMA_MODULE_RBLOCK: switch (low) { case 0: //IDS_ERR_NO: ошибок нет id = IDS_ERR_NO; break; case 1: // IDS_ERR_NOTIMPLEMENT Функция не реализована. id = IDS_ERR_NOTIMPLEMENT; break; case 2: // IDS_ERR_NO_MEMORY Не хватает оперативной памяти. id = IDS_ERR_NO_MEMORY; break; case 4: //IDS_ERR_EMPTYPAGE: пустая страница id = IDS_ERR_EMPTYPAGE; break; } break; case PUMA_MODULE_CFIO: break; case PUMA_MODULE_CIMAGE: switch(low) { case 0 : // IDS_CIMAGE_ERR_NO Ошибок нет. id = IDS_ERR_NO; break; case 1 : // IDS_CIMAGE_ERR_NOTIMPLEMENT Функция не реализована. id = IDS_ERR_NOTIMPLEMENT; break; case 2 : // IDS_CIMAGE_ERR_NO_MEMORY Не хватает оперативной памяти. id = IDS_ERR_NO_MEMORY; break; case 3 : // IDS_CIMAGE_DLL_NOT_INITIALISING Модуль не инициализирован case 4 : // IDS_CIMAGE_INVALID_IMAGE_NAME Ошибка в имени картинки case 5 : // IDS_CIMAGE_INVALID_IMAGE_INFO Ошибка в параметрах картинки case 6 : // IDS_CIMAGE_INVALID_IMAGE_DATA Ошибка в растре картинки case 7 : // IDS_CIMAGE_INVALID_IMAGES_CONTAINER Вунтренняя ошибка контейнера case 8 : // IDS_CIMAGE_NO_IMAGE_FOUND Картинка не найlена case 9 : // IDS_CIMAGE_INVALID_DIB Ошибка в DIB или неизвестный формат DIB case 10 : // IDS_CIMAGE_DIB_FORMAT_NOT_SUPPORTED Данный формат DIB не поддерживается этим контейнером case 11 : // IDS_CIMAGE_UNABLE_COPY_DIB Не удается копировать DIB case 12 : // IDS_CIMAGE_INVALID_FRAME_SIZE Неверный размер области изображения case 13 : // IDS_CIMAGE_NO_SUPPORT_DIB_FORMAT_FOR_THIS_ACTION Данную операцию с данным DIB произвести пока невозможно case 14 : // IDS_CIMAGE_DIB_AND_FRAME_COLORS_CONFLICT Несоответствие размеров пикселов case 15 : // IDS_CIMAGE_UNABLE_REPLACE_DIB Не удается заменить часть картинки DIB case 16 : // IDS_CIMAGE_UNABLE_USE_IMPORT_CALLBACK Ошибка во внешних калбэках case 17 : // IDS_CIMAGE_CALLBACK_NO_PRESENT Нет внешних калбэков case 18 : // IDS_CIMAGE_INVALID_PARAMETR Фигня в параметрах case 19 : // IDS_CIMAGE_IMAGE_NAME_REPEATED Картинка с таким именем уже есть break; } break; case PUMA_MODULE_RFRMT: break; case PUMA_MODULE_RSL: break; case PUMA_MODULE_SLINEDOT: break; case PUMA_MODULE_RIMAGE: switch(low) { case 0 : // IDS_RIMAGE_ERR_NO Ошибок пока не обнаружено id = IDS_ERR_NO; break; case 1 : // IDS_RIMAGE_DLL_NOT_INITIALISING Компонент не инициализирован case 2 : // IDS_RIMAGE_ERR_NOTIMPLEMENT Данный модуль не является источником сей ошибки break; case 3 : // IDS_RIMAGE_ERR_NO_MEMORY Не хватает памяти id = IDS_ERR_NO_MEMORY; break; case 32 : // IDS_RIMAGE_NOTSUPPORTED_INDEX_COLOR Индексированыне цвета не могут быть бинаризованы по Кронроду id = IDS_ERR_UNSUPPORTED_IMAGE_FORMAT; break; case 4 : // IDS_RIMAGE_NO_IMAGE_FOUND Не могу открыть картинку case 5 : // IDS_RIMAGE_UNDER_CONSTRUCTION Данная функция находится в стадии переработки case 6 : // IDS_RIMAGE_INVALID_EXTERNAL_DIB Ошибка в DIB case 7 : // IDS_RIMAGE_INVALID_FUNCTION_PARAMETR Функции передан инвалид case 8 : // IDS_RIMAGE_DIB_COMPRESSION_NOT_SUPPORTED Сжатые DIB пока не поддерживаем case 9 : // IDS_RIMAGE_DIB_JPEG_NOT_SUPPORTED DIB версии 5 со JPEG каритнкой не поддерживается case 10 : // IDS_RIMAGE_INTERNAL_MODULE_ERROR Внутренняя ошибка контейнера case 11 : // IDS_RIMAGE_ONLY_ONE_DIB Один DIB уже обрабатывается! case 12 : // IDS_RIMAGE_UNABLE_WRITE_DIB Немогу записать DIB в CIMAGE case 13 : // IDS_RIMAGE_DIB_NOT_ATTACHED Невозможно получить информацию из заголовка DIB case 14 : // IDS_RIMAGE_CANNOT_CREATE_NEW_DIB Немогу созоать новый DIB case 15 : // IDS_RIMAGE_NOT_OPENED Исходный DIB не был открыт case 16 : // IDS_RIMAGE_PREPARE_TO_CREATE Нечем создать новый DIB case 17 : // IDS_RIMAGE_CANNOT_SET_DIB Немогу передать картинки для обработки break; case 18 : // IDS_RIMAGE_CANT_BINARYZE Не могу бинаризовать картинку id = IDS_ERR_UNSUPPORTED_IMAGE_FORMAT; break; case 19 : // IDS_RIMAGE_CANNOT_INVERT_IMAGE Не могу инвертировать картинку case 20 : // IDS_RIMAGE_DIB_CANT_TO_BE_BINARISED Такие картинки не бинаризуются case 21 : // IDS_RIMAGE_DIB_OUT_FORMAT_NOT_BINARISED Выходной формат DIB для бинаризаии не подходит case 22 : // IDS_RIMAGE_OUTCOME_DIB_NOT_LINK_TO_INCOME Выходной DIB не соответствует исходному по размерам case 23 : // IDS_RIMAGE_CANT_TURN_DIB Неудается повернуть картинку case 24 : // IDS_RIMAGE_CIMAGE_MEMORY_ERROR Ошибка контейнера CIMAGE при освобождении памяти case 25 : // IDS_RIMAGE_CANNOT_ROTATE_IMAGE Дововорот картинки не завершен case 26 : // IDS_RIMAGE_CANNT_SAVE_OUTCOMING_DIB Полученный результат не удалось сохранитть в контейнере Cimage case 27 : // IDS_RIMAGE_ANGLE_LEAST_MINIMUM Слишком малый угол для доворота case 28 : // IDS_RIMAGE_ANGLE_GREAT_MAXIMUM Слишком большой угол для доворота case 29 : // IDS_RIMAGE_EXIT_BY_USER Отменено вызывающим модулем case 30 : // IDS_RIMAGE_UNKNOWN_ERROR Непридвиденная ошибка. Вероятно её источник в другом модуле. case 31 : // IDS_RIMAGE_ZERO_NUMERATOR_OR_DENUMERATOR Один из двух - нумератор или денумератор - нулевой break; } break; case PUMA_MODULE_RPSTR: break; case PUMA_MODULE_RPIC: switch(low) { case 0 : // IDS_CIMAGE_ERR_NO Ошибок нет. id = IDS_ERR_NO; break; case 1 : // IDS_CIMAGE_ERR_NOTIMPLEMENT Функция не реализована. id = IDS_ERR_NOTIMPLEMENT; break; case 2 : // IDS_CIMAGE_ERR_NO_MEMORY Не хватает оперативной памяти. id = IDS_ERR_NO_MEMORY; break; } break; case PUMA_MODULE_RANALFRM: /*switch(low) { case 0 : // IDS_CIMAGE_ERR_NO Ошибок нет. id = IDS_ERR_NO; break; case 1 : // IDS_CIMAGE_ERR_NOTIMPLEMENT Функция не реализована. id = IDS_ERR_NOTIMPLEMENT; break; case 2 : // IDS_CIMAGE_ERR_NO_MEMORY Не хватает оперативной памяти. id = IDS_ERR_NO_MEMORY; break; }*/ break; case PUMA_MODULE_CED: break; case PUMA_MODULE_ROUT: break; case PUMA_MODULE_RSTUFF: break; case PUMA_MODULE_RVERLINE: break; case PUMA_MODULE_RCORRKEGL: break; case PUMA_MODULE_RNORM: switch (low) { case 0:// ошибок нет id = IDS_ERR_NO; break; case 3: // "Not inmpement", не поддерживаемая ф-ия id = IDS_ERR_NOTIMPLEMENT; break; case 19: // "Can't get orientation", нельзя определить ориентацию страницы id = IDS_ERR_CANNOTGETORIENTATION; break; } break; case PUMA_MODULE_RRECCOM: switch (low) { case 0:// ошибок нет id = IDS_ERR_NO; break; case 3: // "Not inmpement", не поддерживаемая ф-ия id = IDS_ERR_NOTIMPLEMENT; break; } break; } sprintf(szString," %s ",GetResourceString(id)); return szString; }
MI_Result ScheduleRestart( _Outptr_result_maybenull_ MI_Instance **cimErrorDetails) { MI_Uint32 dwError = ERROR_SUCCESS; HANDLE hToken; MI_Boolean bRevertToSelf = MI_FALSE; Intlstr intlstr = Intlstr_Null; MI_Result result = MI_RESULT_OK; if (cimErrorDetails == NULL) { return MI_RESULT_INVALID_PARAMETER; } *cimErrorDetails = NULL; // Explicitly set *cimErrorDetails to NULL as _Outptr_ requires setting this at least once. DSC_EventWriteMessageScheduleReboot(); GetResourceString(ID_LCMHELPER_SHUTDOWN_MESSAGE, &intlstr); if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken)) { if (GetLastError() == ERROR_NO_TOKEN) { SetLastError(ERROR_SUCCESS); if (!ImpersonateSelf(SecurityImpersonation)) { return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_THREADIMPERSONATION_FAILED); } if (!OpenThreadToken(GetCurrentThread(), TOKEN_IMPERSONATE | TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken)) { RevertToSelf(); return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_THREADIMPERSONATION_FAILED); } bRevertToSelf = MI_TRUE; } else { return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_THREADIMPERSONATION_FAILED); } } result = EnableShutdownPrivilege(hToken, cimErrorDetails); if (result != MI_RESULT_OK) { if (bRevertToSelf) { RevertToSelf(); } return result; } #ifdef _PREFAST_ #pragma prefast (push) #pragma prefast (disable: 28159) //This is needed to reconfigure windows server to finish configuring the system by DSC. #endif /* _PREFAST_ */ dwError = InitiateSystemShutdownEx(NULL, (MI_Char*)intlstr.str, DSC_REBOOT_GRACEPERIOD, TRUE, TRUE, SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_MAINTENANCE | SHTDN_REASON_FLAG_PLANNED); #ifdef _PREFAST_ #pragma prefast (pop) #endif /* _PREFAST_ */ if (bRevertToSelf) { RevertToSelf(); } if (intlstr.str ) { Intlstr_Free(intlstr); } if (!dwError) { return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_SHUTDOWN_FAILED); } return MI_RESULT_OK; }