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.

485 lines
12 KiB

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