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.

474 lines
13 KiB

  1. #ifdef _DEBUG
  2. #ifndef WIN32_LEAN_AND_MEAN
  3. #define WIN32_LEAN_AND_MEAN
  4. #endif
  5. #include <windows.h>
  6. #include <windowsx.h>
  7. #include <stdio.h>
  8. #include <stdarg.h>
  9. #include "dbg.h"
  10. #include <stdio.h>
  11. static IsWinNT()
  12. {
  13. static OSVERSIONINFO os;
  14. if(os.dwOSVersionInfoSize == 0) {
  15. os.dwOSVersionInfoSize = sizeof(os);
  16. ::GetVersionEx(&os);
  17. }
  18. return (os.dwPlatformId == VER_PLATFORM_WIN32_NT);
  19. }
  20. //----------------------------------------------------------------
  21. //internal function prototype declare
  22. //----------------------------------------------------------------
  23. static LPSTR GetFileTitleStrA(LPSTR lpstrFilePath);
  24. static LPWSTR GetFileTitleStrW(LPWSTR lpstrFilePath);
  25. VOID _debugPrintfA (LPSTR lpstrFmt, ...);
  26. VOID _debugPrintfW (LPWSTR lpstrFmt, ...);
  27. //----------------------------------------------------------------
  28. // Global Data
  29. //----------------------------------------------------------------
  30. static LPFNDBGCALLBACKA g_lpfnDbgCBA;
  31. static LPFNDBGCALLBACKW g_lpfnDbgCBW;
  32. static BOOL g_fEnable=TRUE;
  33. inline VOID ODStrW(LPWSTR lpwstr)
  34. {
  35. if(g_fEnable) OutputDebugStringW(lpwstr);
  36. }
  37. inline VOID ODStrA(LPSTR lpstr)
  38. {
  39. if(g_fEnable) OutputDebugStringA(lpstr);
  40. }
  41. //////////////////////////////////////////////////////////////////
  42. // Function : _debugSetCallback
  43. // Type : VOID
  44. // Purpose :
  45. // Args :
  46. // : LPFNDBGCALLBACK lpfnDbgCallback
  47. // Return :
  48. // DATE : Tue Jan 06 12:42:36 1998
  49. //////////////////////////////////////////////////////////////////
  50. VOID _debugSetCallback(LPFNDBGCALLBACKA lpfnCBA, LPFNDBGCALLBACKW lpfnCBW)
  51. {
  52. g_lpfnDbgCBA = lpfnCBA;
  53. g_lpfnDbgCBW = lpfnCBW;
  54. return;
  55. }
  56. //////////////////////////////////////////////////////////////////
  57. // Function : _debugSwitchOutput
  58. // Type : VOID
  59. // Purpose :
  60. // Args :
  61. // : BOOL fOn
  62. // Return :
  63. // DATE : Fri Apr 03 17:35:55 1998
  64. // Author :
  65. //////////////////////////////////////////////////////////////////
  66. VOID _debugEnableOutput(BOOL fEnable)
  67. {
  68. g_fEnable = fEnable;
  69. }
  70. //////////////////////////////////////////////////////////////////
  71. // Function : _debugIsOutputEnable
  72. // Type : VOID
  73. // Purpose :
  74. // Args : None
  75. // Return :
  76. // DATE : Fri Apr 03 18:00:52 1998
  77. // Author :
  78. //////////////////////////////////////////////////////////////////
  79. BOOL _debugIsOutputEnable(VOID)
  80. {
  81. return g_fEnable;
  82. }
  83. //////////////////////////////////////////////////////////////////
  84. // Function : _debugOutStrA
  85. // Type : static VOID
  86. // Purpose :
  87. // Args :
  88. // : LPSTR lpstr
  89. // Return :
  90. // DATE : Tue Jan 06 12:29:39 1998
  91. //////////////////////////////////////////////////////////////////
  92. VOID _debugOutStrA(LPSTR lpstr)
  93. {
  94. static BOOL fIn;
  95. ODStrA(lpstr);
  96. #ifdef _CONSOLE
  97. printf(lpstr);
  98. #endif
  99. if(g_lpfnDbgCBA) {
  100. if(fIn) { return; }
  101. fIn = TRUE;
  102. (*g_lpfnDbgCBA)(lpstr);
  103. fIn = FALSE;
  104. }
  105. return;
  106. }
  107. //////////////////////////////////////////////////////////////////
  108. // Function : _debugOutStrW
  109. // Type : static VOID
  110. // Purpose :
  111. // Args :
  112. // : LPWSTR lpwstr
  113. // Return :
  114. // DATE : Tue Jan 06 12:30:07 1998
  115. //////////////////////////////////////////////////////////////////
  116. VOID _debugOutStrW(LPWSTR lpwstr)
  117. {
  118. static BOOL fIn;
  119. if(IsWinNT()) {
  120. ODStrW(lpwstr);
  121. }
  122. else {
  123. static CHAR szBuf[1024];
  124. ::WideCharToMultiByte(932, WC_COMPOSITECHECK, lpwstr, -1, szBuf, sizeof(szBuf), 0, 0);
  125. ODStrA(szBuf);
  126. }
  127. #ifdef _CONSOLE
  128. static CHAR szBuf[1024];
  129. ::WideCharToMultiByte(932, WC_COMPOSITECHECK, lpwstr, -1, szBuf, sizeof(szBuf), 0, 0);
  130. printf(szBuf);
  131. #endif
  132. if(g_lpfnDbgCBW) {
  133. if(fIn) { return; }
  134. fIn = TRUE;
  135. (*g_lpfnDbgCBW)(lpwstr);
  136. fIn = FALSE;
  137. }
  138. return;
  139. }
  140. ////////////////////////////////////////////////////////
  141. // Function: _debugA
  142. // Type : VOID
  143. // Purpose :
  144. // Args :
  145. // : LPSTR lpstrFile
  146. // : INT lineNo
  147. // : LPTSR lpstrMsg
  148. // Return :
  149. // DATE :
  150. /////////////////////////////////////////////////////////
  151. VOID _debugA(LPSTR lpstrFile,
  152. INT lineNo,
  153. LPSTR lpstrMsg)
  154. {
  155. _debugPrintfA("(%12s:%4d) %s",
  156. GetFileTitleStrA(lpstrFile),
  157. lineNo,
  158. lpstrMsg);
  159. return;
  160. }
  161. //////////////////////////////////////////////////////////////////
  162. // Function : _debugW
  163. // Type : VOID
  164. // Purpose :
  165. // Args :
  166. // : LPWSTR lpstrFile
  167. // : INT lineNo
  168. // : LPWSTR lpstrMsg
  169. // Return :
  170. // DATE : Mon Jan 05 15:10:41 1998
  171. //////////////////////////////////////////////////////////////////
  172. VOID _debugW(LPWSTR lpstrFile,
  173. INT lineNo,
  174. LPWSTR lpstrMsg)
  175. {
  176. _debugPrintfW(L"(%12s:%4d) %s",
  177. GetFileTitleStrW(lpstrFile),
  178. lineNo,
  179. lpstrMsg);
  180. return;
  181. }
  182. //////////////////////////////////////////////////////////////////
  183. // Function : _debugVaStrA
  184. // Type : LPSTR
  185. // Purpose :
  186. // Args :
  187. // : LPSTR lpstrFmt
  188. // : ...
  189. // Return :
  190. // DATE : Mon Jan 05 15:09:53 1998
  191. //////////////////////////////////////////////////////////////////
  192. LPSTR _debugVaStrA(LPSTR lpstrFmt, ...)
  193. {
  194. static CHAR chBuf[512];
  195. va_list ap;
  196. va_start(ap, lpstrFmt);
  197. wvsprintfA(chBuf, lpstrFmt, ap);
  198. va_end(ap);
  199. return chBuf;
  200. }
  201. ////////////////////////////////////////////////////////
  202. // Function : _debugVaStrW
  203. // Type : LPWSTR
  204. // Purpose :
  205. // Args :
  206. // : LPWSTR lpstrFmt
  207. // Return :
  208. // DATE :
  209. /////////////////////////////////////////////////////////
  210. LPWSTR _debugVaStrW(LPWSTR lpstrFmt, ...)
  211. {
  212. static WCHAR wchBuf[512];
  213. va_list ap;
  214. va_start(ap, lpstrFmt);
  215. vswprintf(wchBuf, lpstrFmt, ap); //Use C-RunTime Library for Win95
  216. va_end(ap);
  217. return wchBuf;
  218. }
  219. ////////////////////////////////////////////////////////
  220. // Function: _debugPrintfA
  221. // Type : VOID
  222. // Purpose : variable args version of OutputDebugStringA
  223. // Args :
  224. // : LPSTR lpstrFmt
  225. // : ...
  226. // Return :
  227. // DATE :
  228. /////////////////////////////////////////////////////////
  229. VOID _debugPrintfA(LPSTR lpstrFmt, ...)
  230. {
  231. static CHAR szBuf[512];
  232. va_list ap;
  233. va_start(ap, lpstrFmt);
  234. wvsprintfA(szBuf, lpstrFmt, ap);
  235. va_end(ap);
  236. _debugOutStrA(szBuf);
  237. return;
  238. }
  239. //////////////////////////////////////////////////////////////////
  240. // Function : _debugPrintfW
  241. // Type : VOID
  242. // Purpose :
  243. // Args :
  244. // : LPWSTR lpstrFmt
  245. // : ...
  246. // Return :
  247. // DATE : Mon Jan 05 15:11:24 1998
  248. //////////////////////////////////////////////////////////////////
  249. VOID _debugPrintfW(LPWSTR lpstrFmt, ...)
  250. {
  251. static WCHAR wchBuf[512];
  252. va_list ap;
  253. va_start(ap, lpstrFmt);
  254. vswprintf(wchBuf, lpstrFmt, ap); //Use C-RunTime Library for Win95
  255. va_end(ap);
  256. _debugOutStrW(wchBuf);
  257. return;
  258. }
  259. //////////////////////////////////////////////////////////////////
  260. // Function : _debugMulti2Wide
  261. // Type : LPWSTR
  262. // Purpose : return Unicode string from MBCS string
  263. // Args :
  264. // : LPSTR lpstr
  265. // Return :
  266. // DATE : Mon Jan 05 15:10:48 1998
  267. //////////////////////////////////////////////////////////////////
  268. LPWSTR _debugMulti2Wide(LPSTR lpstr)
  269. {
  270. static WCHAR wchBuf[512];
  271. MultiByteToWideChar(CP_ACP,
  272. MB_PRECOMPOSED,
  273. lpstr, -1,
  274. (WCHAR*)wchBuf, sizeof(wchBuf)/sizeof(WCHAR) );
  275. return wchBuf;
  276. }
  277. //////////////////////////////////////////////////////////////////
  278. // Function : _debugGetWinClass
  279. // Type : LPSTR
  280. // Purpose : Get Windows class name string
  281. // ANSI version only.
  282. // Args :
  283. // : HWND hwnd
  284. // Return :
  285. // DATE : Mon Jan 05 15:08:43 1998
  286. //////////////////////////////////////////////////////////////////
  287. LPSTR _debugGetWinClass(HWND hwnd)
  288. {
  289. #ifdef _CONSOLE
  290. return NULL;
  291. #endif
  292. static CHAR szBuf[256];
  293. szBuf[0]=(char)0x00;
  294. GetClassNameA(hwnd, szBuf, sizeof(szBuf));
  295. return szBuf;
  296. }
  297. //////////////////////////////////////////////////////////////////
  298. // Function : _debugGetWinText
  299. // Type : LPSTR
  300. // Purpose : Get Windows text(title) string
  301. // Args :
  302. // : HWND hwnd
  303. // Return :
  304. // DATE : Mon Jan 05 15:09:08 1998
  305. //////////////////////////////////////////////////////////////////
  306. LPSTR _debugGetWinText(HWND hwnd)
  307. {
  308. #ifdef _CONSOLE
  309. return NULL;
  310. #endif
  311. static CHAR szBuf[256];
  312. szBuf[0]=(char)0x00;
  313. GetWindowTextA(hwnd, szBuf, sizeof(szBuf));
  314. return szBuf;
  315. }
  316. //////////////////////////////////////////////////////////////////
  317. // Function : _debugMsgBoxA
  318. // Type : VOID
  319. // Purpose :
  320. // Args :
  321. // : LPSTR lpstrFile
  322. // : INT lineNo
  323. // : LPSTR lpstr
  324. // Return :
  325. // DATE : Thu Jan 08 12:31:03 1998
  326. //////////////////////////////////////////////////////////////////
  327. VOID _debugMsgBoxA(LPSTR lpstrFile, INT lineNo, LPSTR lpstrMsg)
  328. {
  329. #ifdef _CONSOLE
  330. return;
  331. #endif
  332. char szTmp[512];
  333. wsprintf(szTmp, "Debug Message Box (File: %s, Line: %4d)",
  334. GetFileTitleStrA(lpstrFile),
  335. lineNo);
  336. MessageBoxA(GetActiveWindow(), lpstrMsg, szTmp, MB_OK);
  337. }
  338. VOID _debugAssert(LPSTR lpstrFile, INT lineNo, BOOL fOk, LPSTR lpstrMsg)
  339. {
  340. if(fOk) {
  341. return;
  342. }
  343. char szTmp[512];
  344. wsprintf(szTmp, "ASSERT (File: %s, Line: %4d)",
  345. GetFileTitleStrA(lpstrFile),
  346. lineNo);
  347. MessageBoxA(GetActiveWindow(), lpstrMsg, szTmp, MB_OK);
  348. DebugBreak();
  349. }
  350. //////////////////////////////////////////////////////////////////
  351. // Function : _debugGetErrorString
  352. // Type : LPSTR
  353. // Purpose : Convert Error(Got from GetLastError()) value to ERROR Message String
  354. // Args :
  355. // : INT errorCode
  356. // Return :
  357. // DATE : Mon Jan 05 16:43:34 1998
  358. //////////////////////////////////////////////////////////////////
  359. LPSTR _debugGetErrorString(INT errorCode)
  360. {
  361. static CHAR szBuf[512];
  362. INT count;
  363. szBuf[0] = (CHAR)0x00;
  364. count = wsprintf(szBuf, "[0x%08x]:", errorCode);
  365. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
  366. NULL,
  367. errorCode,
  368. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  369. szBuf+count,
  370. sizeof(szBuf)-1-count,
  371. NULL );
  372. if(*(szBuf + count) != (CHAR)0x00) {
  373. int nLen = lstrlenA(szBuf);
  374. if((nLen - count) > 1) {
  375. szBuf[nLen - 1] = (CHAR)0x00;
  376. }
  377. }
  378. return szBuf;
  379. }
  380. //////////////////////////////////////////////////////////////////
  381. // Function : GetFileTitleStrA
  382. // Type : static LPSTR
  383. // Purpose : Return File name string(remove folder)
  384. // Args :
  385. // : LPSTR lpstrFilePath
  386. // Return :
  387. // DATE : Mon Jan 05 13:34:22 1998
  388. //////////////////////////////////////////////////////////////////
  389. static LPSTR GetFileTitleStrA(LPSTR lpstrFilePath)
  390. {
  391. static CHAR szBuf[2];
  392. CHAR *pLast, *pTemp;
  393. if(!lpstrFilePath) {
  394. szBuf[0] = (CHAR)0x00;
  395. return szBuf;
  396. }
  397. pLast = lpstrFilePath + (lstrlenA(lpstrFilePath) - 1);
  398. for(pTemp = CharPrevA(lpstrFilePath, pLast);
  399. (pTemp != lpstrFilePath) &&
  400. (*pTemp != '\\') &&
  401. (*pTemp != (CHAR)0x00);
  402. pTemp = CharPrevA(lpstrFilePath, pTemp)) {
  403. ;
  404. }
  405. if(*pTemp == '\\') {
  406. return pTemp+1;
  407. }
  408. return lpstrFilePath;
  409. }
  410. //////////////////////////////////////////////////////////////////
  411. // Function : GetFileTitleStrW
  412. // Type : static LPWSTR
  413. // Purpose :
  414. // Args :
  415. // : LPWSTR lpstrFilePath
  416. // Return :
  417. // DATE : Mon Jan 05 13:38:19 1998
  418. //////////////////////////////////////////////////////////////////
  419. static LPWSTR GetFileTitleStrW(LPWSTR lpstrFilePath)
  420. {
  421. static WCHAR szBuf[2];
  422. WCHAR *pLast, *pTemp;
  423. if(!lpstrFilePath) {
  424. szBuf[0] = (CHAR)0x00;
  425. return szBuf;
  426. }
  427. pLast = lpstrFilePath + (lstrlenW(lpstrFilePath) - 1);
  428. for(pTemp = pLast-1;
  429. (pTemp != lpstrFilePath) &&
  430. (*pTemp != L'\\') &&
  431. (*pTemp != (WCHAR)0x0000);
  432. pTemp--) {
  433. ;
  434. }
  435. if(*pTemp == L'\\') {
  436. return pTemp+1;
  437. }
  438. return lpstrFilePath;
  439. }
  440. #endif //_DEBUG