372 lines
8.4 KiB
C
372 lines
8.4 KiB
C
#include "setuplog.h"
|
|
#include <wtypes.h> // to define HRESULT for richedit.h
|
|
#include <richedit.h>
|
|
#include <malloc.h>
|
|
#include <assert.h>
|
|
#pragma hdrstop
|
|
|
|
SETUPLOG_CONTEXT SetuplogContext;
|
|
PSETUPLOG_CONTEXT Context;
|
|
|
|
LPCTSTR pszAppName = TEXT("ViewLog"); // class name
|
|
HANDLE hModule; // handle of this instance
|
|
HANDLE hRichedDLL; // DLL used for rich edit
|
|
HANDLE hWndMain; // handle to main window
|
|
|
|
|
|
VOID
|
|
ReportError (
|
|
IN LogSeverity Severity,
|
|
...
|
|
);
|
|
|
|
static PVOID
|
|
pOpenFileCallback(
|
|
IN LPCTSTR Filename,
|
|
IN BOOL WipeLogFile
|
|
)
|
|
{
|
|
WCHAR CompleteFilename[MAX_PATH];
|
|
HANDLE hFile;
|
|
|
|
//
|
|
// Form the pathname of the logfile.
|
|
//
|
|
GetWindowsDirectory(CompleteFilename,MAX_PATH);
|
|
ConcatenatePaths(CompleteFilename,Filename,MAX_PATH,NULL);
|
|
|
|
//
|
|
// If we're wiping the logfile clean, attempt to delete
|
|
// what's there.
|
|
//
|
|
if(WipeLogFile) {
|
|
SetFileAttributes(CompleteFilename,FILE_ATTRIBUTE_NORMAL);
|
|
DeleteFile(CompleteFilename);
|
|
}
|
|
|
|
//
|
|
// Open existing file or create a new one.
|
|
//
|
|
hFile = CreateFile(
|
|
CompleteFilename,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_ALWAYS,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL
|
|
);
|
|
|
|
return (PVOID)hFile;
|
|
}
|
|
|
|
|
|
static BOOL
|
|
pWriteFile (
|
|
IN PVOID LogFile,
|
|
IN LPCTSTR Buffer
|
|
)
|
|
{
|
|
PCSTR AnsiBuffer;
|
|
BOOL Status;
|
|
DWORD BytesWritten;
|
|
|
|
if(AnsiBuffer = UnicodeToAnsi (Buffer)) {
|
|
Status = WriteFile (
|
|
LogFile,
|
|
AnsiBuffer,
|
|
lstrlenA(AnsiBuffer),
|
|
&BytesWritten,
|
|
NULL
|
|
);
|
|
MyFree (AnsiBuffer);
|
|
} else {
|
|
Status = FALSE;
|
|
}
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
InitializeSetupLog(
|
|
IN PSETUPLOG_CONTEXT Context
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize the setup action log. This file is a textual description
|
|
of actions performed during setup.
|
|
|
|
The log file is called setuplog.txt and it exists in the windows dir.
|
|
|
|
Arguments:
|
|
|
|
WipeLogFile - if TRUE, any existing log file is deleted before logging
|
|
begins.
|
|
|
|
Return Value:
|
|
|
|
Boolean value indicating whether initialization was sucessful.
|
|
|
|
--*/
|
|
|
|
{
|
|
UINT i;
|
|
|
|
Context->OpenFile = pOpenFileCallback;
|
|
Context->CloseFile = CloseHandle;
|
|
Context->AllocMem = malloc;
|
|
Context->FreeMem = free;
|
|
Context->Format = RetrieveAndFormatMessageV;
|
|
Context->Write = pWriteFile;
|
|
|
|
//
|
|
// Initialize the log severity descriptions.
|
|
//
|
|
Context->SeverityDescriptions[0] = TEXT("Information");
|
|
Context->SeverityDescriptions[1] = TEXT("Warning");
|
|
Context->SeverityDescriptions[2] = TEXT("Error");
|
|
Context->SeverityDescriptions[3] = TEXT("Fatal Error");
|
|
|
|
SetuplogInitialize (Context, TRUE);
|
|
SetuplogError(
|
|
LogSevInformation,
|
|
TEXT("This is the beginning of the Setup Log.\r\n"),
|
|
0,0,0);
|
|
}
|
|
|
|
static VOID
|
|
CreateLog (
|
|
)
|
|
{
|
|
#if 0
|
|
InitializeSetupActionLog(TRUE);
|
|
LogItem(LogSevInformation, L"STO test: Information\r\n");
|
|
LogItem(LogSevWarning, L"STO test: Warning\r\n");
|
|
LogItem(LogSevError, L"STO test: Error\r\n");
|
|
LogItem(LogSevFatalError, L"STO test: Fatal Error\r\n");
|
|
LogItem0(LogSevError,MSG_LOG_INF_CORRUPT,L"INF File Name");
|
|
LogItem1(LogSevWarning,MSG_LOG_PRINTUPG_FAILED,MSG_LOG_X_RETURNED_WINERR,
|
|
L"GetPrinterDriverDirectory",(DWORD)123);
|
|
LogItem2(
|
|
LogSevWarning,
|
|
MSG_LOG_CREATESVC_FAIL,
|
|
L"Service Name",
|
|
MSG_LOG_X_RETURNED_WINERR,
|
|
L"OpenSCManager",
|
|
(DWORD) 123
|
|
);
|
|
LogItem3(
|
|
LogSevError,
|
|
MSG_LOG_SAVEHIVE_FAIL,
|
|
L"Subkey",
|
|
L"Filename",
|
|
MSG_LOG_X_RETURNED_WINERR,
|
|
L"RegSaveKey",
|
|
(LONG) 123
|
|
);
|
|
ReportError (LogSevError,MSG_LOG_INF_CORRUPT,L"INF File Name",0,0);
|
|
ReportError (LogSevWarning,MSG_LOG_PRINTUPG_FAILED,0,
|
|
MSG_LOG_X_RETURNED_WINERR,
|
|
L"GetPrinterDriverDirectory",(DWORD)123,0,0);
|
|
ReportError (
|
|
LogSevWarning,
|
|
MSG_LOG_CREATESVC_FAIL,
|
|
L"Service Name",0,
|
|
MSG_LOG_X_RETURNED_WINERR,
|
|
L"OpenSCManager",
|
|
(DWORD) 123,0,0
|
|
);
|
|
ReportError (
|
|
LogSevError,
|
|
MSG_LOG_SAVEHIVE_FAIL,
|
|
L"Subkey",
|
|
L"Filename",0,
|
|
MSG_LOG_X_RETURNED_WINERR,
|
|
L"RegSaveKey",
|
|
(LONG) 123,0,0
|
|
);
|
|
ReportError (LogSevError, MSG_LOG_OPTIONAL_COMPONENT_ERROR, 0,
|
|
ERROR_NOT_ENOUGH_MEMORY, 0,0);
|
|
ReportError (LogSevError, MSG_LOG_CANT_OPEN_INF,
|
|
L"optional.inf", 0,0);
|
|
ReportError (LogSevError, MSG_LOG_BAD_SECTION, L"SectionName",
|
|
L"InfFileName", 0, 5, 0,0);
|
|
ReportError (LogSevError, MSG_LOG_OC_REGISTRY_ERROR, L"RegKeyName", 0,
|
|
5, 0,0);
|
|
TerminateSetupActionLog();
|
|
#endif
|
|
|
|
Context = &SetuplogContext;
|
|
InitializeSetupLog (Context);
|
|
#if 0 // MSG_* not defined
|
|
SetuplogError(
|
|
LogSevError,
|
|
SETUPLOG_USE_MESSAGEID,
|
|
MSG_LOG_CANT_OPEN_INF,
|
|
L"optional.inf",
|
|
0,0);
|
|
ReportError(
|
|
LogSevError,
|
|
SETUPLOG_USE_MESSAGEID,
|
|
MSG_LOG_OC_REGISTRY_ERROR,
|
|
L"RegKeyName", 0,
|
|
SETUPLOG_USE_MESSAGEID,
|
|
5, 0,0);
|
|
#endif
|
|
SetuplogError(
|
|
LogSevInformation,
|
|
L"This is a string info message.\r\n",
|
|
0,0,0);
|
|
SetuplogError(
|
|
LogSevWarning,
|
|
L"This is a string warning message.\r\n",
|
|
0,0,0);
|
|
ReportError(
|
|
LogSevError,
|
|
L"This is a reported string error message.\r\n", 0,0,0);
|
|
ReportError(
|
|
LogSevError,
|
|
L"This is a reported string error message %1.\r\n", 0,0,
|
|
L"with an embedded message",0,0,0);
|
|
ReportError(
|
|
LogSevError,
|
|
L"This is a reported string error message %1.\r\n", 0,0,
|
|
L"with an embedded message %1", 0,0,
|
|
L"in an embedded message",0,0,0);
|
|
SetuplogTerminate();
|
|
}
|
|
|
|
|
|
|
|
LONG
|
|
MainWndProc (
|
|
IN HWND hwnd,
|
|
IN UINT message,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
{
|
|
HDC hdc;
|
|
PAINTSTRUCT ps;
|
|
RECT rect;
|
|
|
|
switch (message) {
|
|
|
|
case WM_CREATE:
|
|
#if 0
|
|
ViewSetupActionLog (hwnd, NULL, NULL);
|
|
ViewSetupActionLog (hwnd, L"d:\\WinNt40\\SetUpLog.TXT", L"My Heading");
|
|
ViewSetupActionLog (hwnd, L"MyFile", NULL);
|
|
#endif
|
|
PostQuitMessage (0);
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
hdc = BeginPaint (hwnd, &ps);
|
|
GetClientRect (hwnd, &rect);
|
|
DrawText (hdc, L"Hello, Windows!", -1, &rect,
|
|
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
|
|
EndPaint (hwnd, &ps);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
PostQuitMessage (0);
|
|
break;
|
|
|
|
default:
|
|
return DefWindowProc (hwnd, message, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static BOOL
|
|
InitMainWindow (
|
|
)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
//
|
|
// Initialize the window class.
|
|
//
|
|
|
|
hModule = GetModuleHandle (NULL);
|
|
|
|
if (TRUE || FindWindow (pszAppName, NULL) == NULL) {
|
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
wc.lpfnWndProc = MainWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = (HINSTANCE) hModule;
|
|
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
|
|
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
|
|
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
wc.lpszMenuName = pszAppName;
|
|
wc.lpszClassName = pszAppName;
|
|
|
|
if (!RegisterClass (&wc)) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Create the window and display it.
|
|
//
|
|
hWndMain = CreateWindow (
|
|
pszAppName,
|
|
L"The Hello Program",
|
|
WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, 0,
|
|
CW_USEDEFAULT, 0,
|
|
NULL, NULL,
|
|
(HINSTANCE) hModule,
|
|
NULL
|
|
);
|
|
if (!hWndMain) {
|
|
return FALSE;
|
|
}
|
|
|
|
ShowWindow (hWndMain, SW_SHOWNORMAL);
|
|
UpdateWindow (hWndMain);
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
INT WINAPI WinMain(
|
|
HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
INT nCmdShow)
|
|
|
|
{
|
|
MSG msg;
|
|
|
|
CreateLog ();
|
|
|
|
// Initialize everything
|
|
//
|
|
if (!InitMainWindow ()) {
|
|
assert(FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
// Process messages
|
|
//
|
|
while (GetMessage (&msg, NULL, 0, 0)) {
|
|
TranslateMessage (&msg);
|
|
DispatchMessage (&msg);
|
|
}
|
|
|
|
return (msg.wParam);
|
|
}
|
|
|