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
}
Example #4
0
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;
}
Example #6
0
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;
}