windows-nt/Source/XPSP1/NT/base/ntsetup/setuplog/x.c

372 lines
8.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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);
}