Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

535 lines
12 KiB

  1. /*++
  2. Copyright (c) 1997 Microsoft Corporation
  3. Module Name:
  4. log.c
  5. Abstract:
  6. Log debug information.
  7. Author:
  8. Geoffrey Guo (geoffguo) 27-Sep-2001 Created
  9. Revision History:
  10. <alias> <date> <comments>
  11. --*/
  12. #include "StdAfx.h"
  13. #include "clmt.h"
  14. void MyDbgPrint (LPWSTR lpwStr);
  15. BOOL g_bDbgPrintEnabled;
  16. DEBUGLEVEL g_DebugLevel;
  17. DWORD g_DebugArea;
  18. //Log file
  19. FILE *pLogFile;
  20. void
  21. DebugPrintfEx(
  22. DWORD dwDetail,
  23. LPWSTR pszFmt,
  24. ...
  25. )
  26. /*++
  27. Return: void
  28. Desc: This function prints debug spew in the debugger and log file.
  29. --*/
  30. {
  31. WCHAR szT[1024];
  32. va_list arglist;
  33. int len;
  34. DWORD dwLevel, dwArea;
  35. HRESULT hr;
  36. dwLevel = dwDetail & 0x0F;
  37. dwArea = dwDetail & 0xF0;
  38. if (dwLevel == dlNone ||
  39. (dwArea != g_DebugArea && g_DebugArea != DEBUG_ALL))
  40. return;
  41. va_start(arglist, pszFmt);
  42. // we do not need check the StringCbVPrintf return value,
  43. // we just print whatever szT size allowed, if more data there
  44. // it will be truncated
  45. hr = StringCbVPrintf(szT, ARRAYSIZE(szT), pszFmt, arglist);
  46. szT[1022] = 0;
  47. va_end(arglist);
  48. //
  49. // Make sure we have a '\n' at the end of the string
  50. //
  51. len = lstrlen(szT);
  52. if (szT[len - 1] != L'\n')
  53. {
  54. hr = StringCchCopy((LPTSTR)(szT + len), sizeof(szT)/sizeof(TCHAR)-len, L"\r\n");
  55. if (FAILED(hr))
  56. {
  57. //BUGBUG:what about if we fail here
  58. }
  59. }
  60. if (dwLevel <= (DWORD)g_DebugLevel) {
  61. switch (dwLevel) {
  62. case dlPrint:
  63. MyDbgPrint(L"[MSG] ");
  64. g_LogReport.dwMsgNum++;
  65. break;
  66. case dlFail:
  67. MyDbgPrint(L"[FAIL] ");
  68. g_LogReport.dwFailNum++;
  69. break;
  70. case dlError:
  71. MyDbgPrint(L"[ERROR] ");
  72. g_LogReport.dwErrNum++;
  73. break;
  74. case dlWarning:
  75. MyDbgPrint(L"[WARN] ");
  76. g_LogReport.dwWarNum++;
  77. break;
  78. case dlInfo:
  79. MyDbgPrint(L"[INFO] ");
  80. g_LogReport.dwInfNum++;
  81. break;
  82. }
  83. MyDbgPrint(szT);
  84. }
  85. }
  86. void
  87. MyDbgPrint (LPWSTR lpwStr)
  88. {
  89. if (g_bDbgPrintEnabled)
  90. OutputDebugString (lpwStr);
  91. if (pLogFile)
  92. {
  93. fputws (lpwStr, pLogFile);
  94. fflush (pLogFile);
  95. }
  96. }
  97. void
  98. SetDebugLevel (LPTSTR lpLevel)
  99. {
  100. switch (*lpLevel) {
  101. case L'1':
  102. g_DebugLevel = dlPrint;
  103. break;
  104. case L'2':
  105. g_DebugLevel = dlFail;
  106. break;
  107. case L'3':
  108. g_DebugLevel = dlError;
  109. break;
  110. case L'4':
  111. g_DebugLevel = dlWarning;
  112. break;
  113. case L'5':
  114. g_DebugLevel = dlInfo;
  115. break;
  116. case L'0':
  117. default:
  118. g_DebugLevel = dlNone;
  119. g_bDbgPrintEnabled = FALSE;
  120. break;
  121. }
  122. }
  123. HRESULT
  124. InitDebugSupport(DWORD dwMode)
  125. /*++
  126. Return:
  127. Desc: This function initializes g_bDbgPrintEnabled based on an env variable.
  128. --*/
  129. {
  130. DWORD dwNum;
  131. WCHAR wszEnvValue[MAX_PATH+1];
  132. WCHAR UnicodeFlag[2] = {0xFEFF, 0x0};
  133. HRESULT hr;
  134. dwNum = GetSystemWindowsDirectory(wszEnvValue,ARRAYSIZE(wszEnvValue));
  135. if (!dwNum ||(dwNum >= ARRAYSIZE(wszEnvValue)))
  136. {
  137. return E_FAIL;
  138. }
  139. hr = StringCbCat(wszEnvValue, sizeof(wszEnvValue), LOG_FILE_NAME);
  140. if (FAILED(hr))
  141. {
  142. return hr;
  143. }
  144. pLogFile = _wfopen (wszEnvValue, L"a+b");
  145. if (pLogFile)
  146. {
  147. fputws (UnicodeFlag, pLogFile);
  148. }
  149. else
  150. {
  151. return E_FAIL;
  152. }
  153. dwNum = GetEnvironmentVariableW(L"CLMT_DEBUG_LEVEL", wszEnvValue, 3);
  154. g_bDbgPrintEnabled = TRUE;
  155. g_DebugLevel = dlError;
  156. g_DebugArea = DEBUG_ALL;
  157. g_LogReport.dwMsgNum = 0;
  158. g_LogReport.dwFailNum = 0;
  159. g_LogReport.dwErrNum = 0;
  160. g_LogReport.dwWarNum = 0;
  161. g_LogReport.dwInfNum = 0;
  162. if (dwNum == 1)
  163. {
  164. SetDebugLevel(&wszEnvValue[0]);
  165. }
  166. else if (dwNum == 2)
  167. {
  168. switch (wszEnvValue[0]) {
  169. case L'A':
  170. case L'a':
  171. g_DebugArea = DEBUG_APPLICATION;
  172. break;
  173. case L'I':
  174. case L'i':
  175. g_DebugArea = DEBUG_INF_FILE;
  176. break;
  177. case L'P':
  178. case L'p':
  179. g_DebugArea = DEBUG_PROFILE;
  180. break;
  181. case L'R':
  182. case L'r':
  183. g_DebugArea = DEBUG_REGISTRY;
  184. break;
  185. case L'S':
  186. case L's':
  187. g_DebugArea = DEBUG_SHELL;
  188. break;
  189. default:
  190. g_DebugArea = DEBUG_ALL;
  191. break;
  192. }
  193. SetDebugLevel(&wszEnvValue[1]);
  194. }
  195. return S_OK;
  196. }
  197. void
  198. CloseDebug (void)
  199. {
  200. if (pLogFile)
  201. fclose (pLogFile);
  202. }
  203. //-----------------------------------------------------------------------
  204. //
  205. // Function: InitChangeLog
  206. //
  207. // Descrip: Initialize the change log file. The change log contains
  208. // the information about files, folders and services that
  209. // have been changed by CLMT. The log will be displayed to
  210. // user later.
  211. //
  212. // Returns: S_OK if function succeeded.
  213. // S_FALSE if source directory does not exist
  214. // else if error occured
  215. //
  216. // Notes: none
  217. //
  218. // History: 05/02/2002 rerkboos created
  219. //
  220. // Notes: none
  221. //
  222. //-----------------------------------------------------------------------
  223. HRESULT InitChangeLog(VOID)
  224. {
  225. #define TEXT_CHANGE_LOG_FILE TEXT("CLMTchg.log")
  226. HRESULT hr;
  227. WCHAR szWindir[MAX_PATH];
  228. HANDLE hFile;
  229. // Get CLMT backup directory
  230. if (GetSystemWindowsDirectory(szWindir, ARRAYSIZE(szWindir)) != 0)
  231. {
  232. hr = StringCchPrintf(g_szChangeLog,
  233. ARRAYSIZE(g_szChangeLog),
  234. TEXT("%s\\%s\\%s"),
  235. szWindir,
  236. CLMT_BACKUP_DIR,
  237. TEXT_CHANGE_LOG_FILE);
  238. if (SUCCEEDED(hr))
  239. {
  240. // Create a change log file, always overwrite the old one
  241. hFile = CreateFile(g_szChangeLog,
  242. GENERIC_WRITE,
  243. FILE_SHARE_READ,
  244. NULL,
  245. CREATE_ALWAYS,
  246. FILE_ATTRIBUTE_NORMAL,
  247. NULL);
  248. if (hFile != INVALID_HANDLE_VALUE)
  249. {
  250. CloseHandle(hFile);
  251. hr = S_OK;
  252. g_dwIndex = 0;
  253. }
  254. else
  255. {
  256. hr = HRESULT_FROM_WIN32(GetLastError());
  257. }
  258. }
  259. }
  260. else
  261. {
  262. hr = HRESULT_FROM_WIN32(GetLastError());
  263. }
  264. return hr;
  265. }
  266. //-----------------------------------------------------------------------
  267. //
  268. // Function: AddFileChangeLog
  269. //
  270. // Descrip: Add the File/Folder changes into Change log
  271. //
  272. // Returns: S_OK if function succeeded.
  273. // else if error occured
  274. //
  275. // Notes: none
  276. //
  277. // History: 05/02/2002 rerkboos created
  278. //
  279. // Notes: none
  280. //
  281. //-----------------------------------------------------------------------
  282. HRESULT AddFileChangeLog(
  283. DWORD dwType,
  284. LPCTSTR lpOldFile,
  285. LPCTSTR lpNewFile
  286. )
  287. {
  288. HRESULT hr;
  289. BOOL bRet;
  290. LPTSTR lpChangedItem;
  291. DWORD cchChangedItem;
  292. TCHAR szIndex[8];
  293. // Alloc enough memory for the change list
  294. cchChangedItem = lstrlen(lpOldFile) + lstrlen(lpNewFile) + 8;
  295. lpChangedItem = (LPWSTR) MEMALLOC(cchChangedItem * sizeof(TCHAR));
  296. if (lpChangedItem == NULL)
  297. {
  298. return E_OUTOFMEMORY;
  299. }
  300. hr = StringCchPrintf(lpChangedItem,
  301. cchChangedItem,
  302. TEXT("\"%s\", \"%s\""),
  303. lpOldFile,
  304. lpNewFile);
  305. if (SUCCEEDED(hr))
  306. {
  307. _ultot(g_dwIndex, szIndex, 10);
  308. switch (dwType)
  309. {
  310. case TYPE_FILE_MOVE:
  311. case TYPE_SFPFILE_MOVE:
  312. // Log the change into Change Log file
  313. bRet = WritePrivateProfileString(TEXT("Files"),
  314. szIndex,
  315. lpChangedItem,
  316. g_szChangeLog);
  317. break;
  318. case TYPE_DIR_MOVE:
  319. bRet = WritePrivateProfileString(TEXT("Directories"),
  320. szIndex,
  321. lpChangedItem,
  322. g_szChangeLog);
  323. break;
  324. }
  325. g_dwIndex++;
  326. }
  327. if (lpChangedItem)
  328. {
  329. MEMFREE(lpChangedItem);
  330. }
  331. return hr;
  332. }
  333. //-----------------------------------------------------------------------
  334. //
  335. // Function: AddServiceChangeLog
  336. //
  337. // Descrip: Add the Servicer changes into Change log
  338. //
  339. // Returns: S_OK if function succeeded.
  340. // else if error occured
  341. //
  342. // Notes: none
  343. //
  344. // History: 05/02/2002 rerkboos created
  345. //
  346. // Notes: none
  347. //
  348. //-----------------------------------------------------------------------
  349. HRESULT AddServiceChangeLog(
  350. LPCTSTR lpServiceName,
  351. DWORD dwBefore,
  352. DWORD dwAfter
  353. )
  354. {
  355. HRESULT hr = S_OK;
  356. BOOL bRet;
  357. TCHAR szBefore[12];
  358. TCHAR szAfter[12];
  359. LPWSTR lpChangedItem;
  360. DWORD cchChangedItem;
  361. _ultot(dwBefore, szBefore, 16);
  362. _ultot(dwAfter, szAfter, 16);
  363. cchChangedItem = 11 + 11 + 3;
  364. lpChangedItem = (LPWSTR) MEMALLOC(cchChangedItem * sizeof (TCHAR));
  365. if (lpChangedItem)
  366. {
  367. hr = StringCchPrintf(lpChangedItem,
  368. cchChangedItem,
  369. TEXT("0x%.8x, 0x%.8x"),
  370. dwBefore,
  371. dwAfter);
  372. if (SUCCEEDED(hr))
  373. {
  374. bRet = WritePrivateProfileString(TEXT("Services"),
  375. lpServiceName,
  376. lpChangedItem,
  377. g_szChangeLog);
  378. }
  379. MEMFREE(lpChangedItem);
  380. }
  381. return hr;
  382. }
  383. //-----------------------------------------------------------------------
  384. //
  385. // Function: AddUserNameChangeLog
  386. //
  387. // Descrip: Add the User name changes into Change log
  388. //
  389. // Returns: S_OK if function succeeded.
  390. // else if error occured
  391. //
  392. // Notes: none
  393. //
  394. // History: 05/02/2002 rerkboos created
  395. //
  396. // Notes: none
  397. //
  398. //-----------------------------------------------------------------------
  399. HRESULT AddUserNameChangeLog(
  400. LPCTSTR lpOldUserName,
  401. LPCTSTR lpNewUserName
  402. )
  403. {
  404. HRESULT hr = S_OK;
  405. BOOL bRet;
  406. bRet = WritePrivateProfileString(TEXT("UserName"),
  407. lpNewUserName,
  408. lpOldUserName,
  409. g_szChangeLog);
  410. if (!bRet)
  411. {
  412. hr = HRESULT_FROM_WIN32(GetLastError());
  413. }
  414. return hr;
  415. }
  416. //-----------------------------------------------------------------------
  417. //
  418. // Function: GetUserNameChangeLog
  419. //
  420. // Descrip: Get the User name changes from Change log
  421. //
  422. // Returns: TRUE if change log for new user name is found
  423. // FALSE, otherwise
  424. //
  425. // Notes: none
  426. //
  427. // History: 05/29/2002 rerkboos created
  428. //
  429. // Notes: none
  430. //
  431. //-----------------------------------------------------------------------
  432. BOOL GetUserNameChangeLog(
  433. LPCTSTR lpNewUserName,
  434. LPTSTR lpOldUserName,
  435. DWORD cchOldUserName
  436. )
  437. {
  438. BOOL bRet = FALSE;
  439. DWORD dwCopied;
  440. dwCopied = GetPrivateProfileString(TEXT("UserName"),
  441. lpNewUserName,
  442. TEXT(""),
  443. lpOldUserName,
  444. cchOldUserName,
  445. g_szChangeLog);
  446. if (dwCopied > 0)
  447. {
  448. bRet = TRUE;
  449. }
  450. return bRet;
  451. }