207 lines
5.4 KiB
C
207 lines
5.4 KiB
C
/*++
|
|
|
|
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
|
|
);
|
|
//
|
|
// Terminate the buffer
|
|
//
|
|
MessageBoxTitle[sizeof(MessageBoxTitle)/sizeof(WCHAR) - 1] = 0;
|
|
}
|
|
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;
|
|
}
|
|
}
|