#include "setuplog.h" #include // to define HRESULT for richedit.h #include #include #include #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); }