//======================================================================= // // Copyright (c) 2001 Microsoft Corporation. All Rights Reserved. // // File: debug.cpp // // Creator: PeterWi // // Purpose: debug functions // //======================================================================= #include "pch.h" #pragma hdrstop #ifdef DBG #define UNLEN 256 #define TYPE_KEY TEXT("DebugType") #define LOGFILE 1 #define DEBUGGEROUT 2 void WriteLogFile(LPCSTR s); /////////////////////////////////////////////////////////////////////////////// // // Function : WuAUTrace // In : Variable number of arguments // Comments : If DEBUGGEROUT is defined, uses OutputDebugString to write // debug messages. If LOGFILEOUT is defined, uses WriteLogFile // to write to a file. The filename is founf in the registry // /////////////////////////////////////////////////////////////////////////////// void _cdecl WUAUTrace(char* pszFormat, ...) { USES_IU_CONVERSION; CHAR szBuf[1024+1]; va_list ArgList; static DWORD dwType = 3; TCHAR szTimeString[80]; SYSTEMTIME timeNow; CHAR szTemp[1040]; LPSTR szTmp = NULL; if (! dwType || //on the second run this will be 0, 1 or 2 NULL == pszFormat) { return; } va_start(ArgList, pszFormat); (void)StringCchVPrintfExA(szBuf, ARRAYSIZE(szBuf), NULL, NULL, MISTSAFE_STRING_FLAGS, pszFormat, ArgList); va_end(ArgList); if (dwType == 3) //first time { if ((FAILED(GetRegDWordValue(TYPE_KEY, &dwType))) || (!dwType)) { dwType = 0; return; //no debug msg if no key or key==0 } } GetLocalTime(&timeNow); if(SUCCEEDED(SystemTime2String(timeNow, szTimeString, ARRAYSIZE(szTimeString)))) { szTmp = T2A(szTimeString); } (void)StringCchPrintfExA( szTemp, ARRAYSIZE(szTemp), NULL, NULL, MISTSAFE_STRING_FLAGS, "%lx %s : %s\r\n", GetCurrentThreadId(), NULL == szTmp ? "" : szTmp, szBuf); if (dwType==LOGFILE) { WriteLogFile(szTemp); } else { OutputDebugStringA(szTemp); } } /////////////////////////////////////////////////////////////////////////////// // // Function : CreateOrOpenDebugFile // Out : File Handle to open debug file. Must be closed by caller // Returns : TRUE for success, FALSE for failure // Comments : Creates a file "WinDir\wupd\username\wupdlog.txt" // /////////////////////////////////////////////////////////////////////////////// BOOL CreateOrOpenDebugFile(HANDLE& hFile) { TCHAR szDir[MAX_PATH+1], szUser[UNLEN+1]; DWORD dwNameLen = ARRAYSIZE(szUser), dwErr; const TCHAR szWUPDDir[] = _T("wupd"); const TCHAR szLogFileName[] = _T("wupdlog.txt"); const TCHAR szWUDir[] = _T("C:\\Program Files\\WindowsUpdate"); if (FAILED(PathCchCombine( szDir, ARRAYSIZE(szDir), _T('\0') == g_szWUDir[0] ? szWUDir : g_szWUDir, szWUPDDir))) { return FALSE; } if (! CreateDirectory(szDir, NULL)) { dwErr = GetLastError(); if ((dwErr != ERROR_ALREADY_EXISTS) && (dwErr != ERROR_FILE_EXISTS)) { return FALSE; } } if (! GetUserName(szUser, &dwNameLen)) { const TCHAR szDefault[] = _T("default"); (void)StringCchCopyEx(szUser, ARRAYSIZE(szUser), szDefault, NULL, NULL, MISTSAFE_STRING_FLAGS); } if (FAILED(PathCchAppend(szDir, ARRAYSIZE(szDir), szUser))) { return FALSE; } if (! CreateDirectory(szDir, NULL)) { dwErr = GetLastError(); if ((dwErr != ERROR_ALREADY_EXISTS) && (dwErr != ERROR_FILE_EXISTS)) { return FALSE; } } if (FAILED(PathCchAppend(szDir, ARRAYSIZE(szDir), szLogFileName))) { return FALSE; } // We now have directory "drive:program files\windowsupdate\username\" if ((hFile = CreateFile(szDir, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE) { return FALSE; } return TRUE; } /////////////////////////////////////////////////////////////////////////////// // // Function : WriteLogFile // In : Variable number of arguments // Comments : If DEBUGGEROUT is defined, uses OutputDebugString to write // debug messages. If LOGFILEOUT is defined, uses WriteLogFile // to write to a file. The filename is found in the registry // If for some reason the reg value for filename is "", we // simply don't log. // Courtesy : darshats // /////////////////////////////////////////////////////////////////////////////// void WriteLogFile(LPCSTR s) { DWORD dwCurrSize = 0, cbWritten = 0; DWORD cbToWrite = lstrlenA(s); HANDLE hFile; if (!CreateOrOpenDebugFile(hFile)) return; dwCurrSize = GetFileSize(hFile, NULL); SetFilePointer(hFile, dwCurrSize, NULL, FILE_BEGIN); (void) WriteFile(hFile, s, cbToWrite, &cbWritten, NULL); CloseHandle(hFile); } #endif // DBG