diff options
Diffstat (limited to 'private/sdktools/instaler/error.c')
-rw-r--r-- | private/sdktools/instaler/error.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/private/sdktools/instaler/error.c b/private/sdktools/instaler/error.c new file mode 100644 index 000000000..2241d8642 --- /dev/null +++ b/private/sdktools/instaler/error.c @@ -0,0 +1,202 @@ +/*++ + +Copyright (c) 1992 Microsoft Corporation + +Module Name: + + error.c + +Abstract: + + Error handle module for the INSTALER program + +Author: + + Steve Wood (stevewo) 09-Aug-1994 + +Revision History: + +--*/ + +#include "instaler.h" + +VOID +TraceDisplay( + const char *FormatString, + ... + ) +{ + va_list arglist; + + va_start( arglist, FormatString ); + vprintf( FormatString, arglist ); + if (InstalerLogFile) { + vfprintf( InstalerLogFile, FormatString, arglist ); + } + va_end( arglist ); + fflush( stdout ); + return; +} + +VOID +CDECL +DeclareError( + UINT ErrorCode, + UINT SupplementalErrorCode, + ... + ) +{ + va_list arglist; + HMODULE ModuleHandle; + DWORD Flags, Size; + WCHAR MessageBuffer[ 512 ]; + + va_start( arglist, SupplementalErrorCode ); + + if ((ErrorCode & 0x0FFF0000) >> 16 == FACILITY_APPLICATION) { + ModuleHandle = InstalerModuleHandle; + Flags = FORMAT_MESSAGE_FROM_HMODULE; + } + else + if ((ErrorCode & 0x0FFF0000) == FACILITY_NT) { + ErrorCode ^= FACILITY_NT; + ModuleHandle = ModuleInfo[ NTDLL_MODULE_INDEX ].ModuleHandle; + Flags = FORMAT_MESSAGE_FROM_HMODULE; + } + else { + ModuleHandle = NULL; + Flags = FORMAT_MESSAGE_FROM_SYSTEM; + } + + Size = FormatMessage( Flags, + (LPCVOID)ModuleHandle, + ErrorCode, + 0, + MessageBuffer, + sizeof( MessageBuffer ) / sizeof( WCHAR ), + &arglist + ); + va_end( arglist ); + + if (Size != 0) { + printf( "INSTALER: %ws", MessageBuffer ); + } + else { + printf( "INSTALER: Unable to get message text for %08x\n", ErrorCode ); + } + + if (ModuleHandle == InstalerModuleHandle && + SupplementalErrorCode != 0 && + SupplementalErrorCode != ERROR_GEN_FAILURE && + SupplementalErrorCode != STATUS_UNSUCCESSFUL + ) { + if ((SupplementalErrorCode & 0x0FFF0000) == FACILITY_NT) { + SupplementalErrorCode ^= FACILITY_NT; + ModuleHandle = ModuleInfo[ NTDLL_MODULE_INDEX ].ModuleHandle; + Flags = FORMAT_MESSAGE_FROM_HMODULE; + } + else { + ModuleHandle = NULL; + Flags = FORMAT_MESSAGE_FROM_SYSTEM; + } + Size = FormatMessage( Flags, + (LPCVOID)ModuleHandle, + SupplementalErrorCode, + 0, + MessageBuffer, + sizeof( MessageBuffer ) / sizeof( WCHAR ), + NULL + ); + if (Size != 0) { + while (Size != 0 && MessageBuffer[ Size ] <= L' ') { + MessageBuffer[ Size ] = UNICODE_NULL; + Size -= 1; + } + + printf( " '%ws'\n", MessageBuffer ); + } + else { + printf( "INSTALER: Unable to get message text for %08x\n", SupplementalErrorCode ); + } + } + + + + return; +} + +WCHAR MessageBoxTitle[ MAX_PATH ]; + + +UINT +CDECL +AskUser( + UINT MessageBoxFlags, + UINT MessageId, + UINT NumberOfArguments, + ... + ) +{ + va_list arglist; + HMODULE ModuleHandle; + DWORD Flags, Size; + WCHAR MessageBuffer[ 512 ]; + PWSTR s; + ULONG Args[ 24 ]; + PULONG p; + + if (MessageBoxTitle[ 0 ] == UNICODE_NULL) { + Args[ 0 ] = (ULONG)InstallationName; + Args[ 1 ] = 0; + Size = FormatMessageW( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY, + (LPCVOID)InstalerModuleHandle, + INSTALER_ASKUSER_TITLE, + 0, + MessageBoxTitle, + sizeof( MessageBoxTitle ) / sizeof( WCHAR ), + (va_list *)Args + ); + if (Size == 0) { + _snwprintf( MessageBoxTitle, + sizeof( MessageBoxTitle ) / sizeof( WCHAR ), + L"Application Installation Monitor Program - %ws", + InstallationName + ); + } + else { + if ((s = wcschr( MessageBoxTitle, L'\r' )) || + (s = wcschr( MessageBoxTitle, L'\n' )) + ) { + *s = UNICODE_NULL; + } + } + } + + va_start( arglist, NumberOfArguments ); + p = Args; + while (NumberOfArguments--) { + *p++ = va_arg( arglist, ULONG ); + } + *p++ = 0; + va_end( arglist ); + + Size = FormatMessageW( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY, + (LPCVOID)InstalerModuleHandle, + MessageId, + 0, + MessageBuffer, + sizeof( MessageBuffer ) / sizeof( WCHAR ), + (va_list *)Args + ); + + if (Size != 0) { + return MessageBox( NULL, + MessageBuffer, + MessageBoxTitle, + MB_SETFOREGROUND | MessageBoxFlags + ); + } + else { + return IDOK; + } +} |