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.

619 lines
16 KiB

  1. //////////////////////////////////////////////////////////////////
  2. // File : cpaddbg.cpp
  3. // Purpose :
  4. //
  5. //
  6. // Date : Fri Feb 19 22:03:56 1999
  7. // Author :
  8. //
  9. // Copyright(c) 1995-1998, Microsoft Corp. All rights reserved
  10. //////////////////////////////////////////////////////////////////
  11. #ifdef _DEBUG
  12. #ifndef WIN32_LEAN_AND_MEAN
  13. #define WIN32_LEAN_AND_MEAN
  14. #endif
  15. #include <windows.h>
  16. #include <stdarg.h>
  17. #include "cpaddbg.h"
  18. #include <stdio.h>
  19. static IsWinNT()
  20. {
  21. static OSVERSIONINFO os;
  22. if(os.dwOSVersionInfoSize == 0) {
  23. os.dwOSVersionInfoSize = sizeof(os);
  24. ::GetVersionEx(&os);
  25. }
  26. return (os.dwPlatformId == VER_PLATFORM_WIN32_NT);
  27. }
  28. //----------------------------------------------------------------
  29. //internal function prototype declare
  30. //----------------------------------------------------------------
  31. static LPSTR GetFileTitleStrA(LPSTR lpstrFilePath);
  32. static LPWSTR GetFileTitleStrW(LPWSTR lpstrFilePath);
  33. VOID _padDbgPrintfA (LPSTR lpstrFmt, ...);
  34. VOID _padDbgPrintfW (LPWSTR lpstrFmt, ...);
  35. #define SZPREFIX "IME:cpad:"
  36. #define WSZPREFIX L"IME:cpad:"
  37. //----------------------------------------------------------------
  38. // Global Data
  39. //----------------------------------------------------------------
  40. static LPFNDBGCALLBACKA g_lpfnDbgCBA=NULL;
  41. static LPFNDBGCALLBACKW g_lpfnDbgCBW=NULL;
  42. //static BOOL g_fEnable=FALSE;
  43. static BOOL g_fEnable=TRUE;
  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 : _padDbgSetCallback
  54. // Type : VOID
  55. // Purpose :
  56. // Args :
  57. // : LPFNDBGCALLBACK lpfnDbgCallback
  58. // Return :
  59. // DATE : Tue Jan 06 12:42:36 1998
  60. //////////////////////////////////////////////////////////////////
  61. VOID _padDbgSetCallback(LPFNDBGCALLBACKA lpfnCBA, LPFNDBGCALLBACKW lpfnCBW)
  62. {
  63. g_lpfnDbgCBA = lpfnCBA;
  64. g_lpfnDbgCBW = lpfnCBW;
  65. return;
  66. }
  67. //////////////////////////////////////////////////////////////////
  68. // Function : _padDbgSwitchOutput
  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 _padDbgEnableOutput(BOOL fEnable)
  78. {
  79. g_fEnable = fEnable;
  80. }
  81. //////////////////////////////////////////////////////////////////
  82. // Function : _padDbgIsOutputEnable
  83. // Type : VOID
  84. // Purpose :
  85. // Args : None
  86. // Return :
  87. // DATE : Fri Apr 03 18:00:52 1998
  88. // Author :
  89. //////////////////////////////////////////////////////////////////
  90. BOOL _padDbgIsOutputEnable(VOID)
  91. {
  92. return g_fEnable;
  93. }
  94. //////////////////////////////////////////////////////////////////
  95. // Function : _padDbgOutStrA
  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 _padDbgOutStrA(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 : _padDbgOutStrW
  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 _padDbgOutStrW(LPWSTR lpwstr)
  128. {
  129. static BOOL fIn;
  130. if(IsWinNT()) {
  131. ODStrW(lpwstr);
  132. }
  133. else {
  134. static CHAR szBuf[1024];
  135. ::WideCharToMultiByte(CP_ACP, 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: _padDbgA
  153. // Type : VOID
  154. // Purpose :
  155. // Args :
  156. // : LPSTR lpstrFile
  157. // : INT lineNo
  158. // : LPTSR lpstrMsg
  159. // Return :
  160. // DATE :
  161. /////////////////////////////////////////////////////////
  162. VOID _padDbgA(LPSTR lpstrFile,
  163. INT lineNo,
  164. LPSTR lpstrMsg)
  165. {
  166. _padDbgPrintfA("%s(%12s:%4d) %s",
  167. SZPREFIX,
  168. GetFileTitleStrA(lpstrFile),
  169. lineNo,
  170. lpstrMsg);
  171. return;
  172. }
  173. //////////////////////////////////////////////////////////////////
  174. // Function : _padDbgW
  175. // Type : VOID
  176. // Purpose :
  177. // Args :
  178. // : LPWSTR lpstrFile
  179. // : INT lineNo
  180. // : LPWSTR lpstrMsg
  181. // Return :
  182. // DATE : Mon Jan 05 15:10:41 1998
  183. //////////////////////////////////////////////////////////////////
  184. VOID _padDbgW(LPWSTR lpstrFile,
  185. INT lineNo,
  186. LPWSTR lpstrMsg)
  187. {
  188. _padDbgPrintfW(L"%s(%10s:%4d) %s",
  189. WSZPREFIX,
  190. GetFileTitleStrW(lpstrFile),
  191. lineNo,
  192. lpstrMsg);
  193. return;
  194. }
  195. //////////////////////////////////////////////////////////////////
  196. // Function : _padDbgVaStrA
  197. // Type : LPSTR
  198. // Purpose :
  199. // Args :
  200. // : LPSTR lpstrFmt
  201. // : ...
  202. // Return :
  203. // DATE : Mon Jan 05 15:09:53 1998
  204. //////////////////////////////////////////////////////////////////
  205. LPSTR _padDbgVaStrA(LPSTR lpstrFmt, ...)
  206. {
  207. static CHAR chBuf[512];
  208. va_list ap;
  209. va_start(ap, lpstrFmt);
  210. wvsprintfA(chBuf, lpstrFmt, ap);
  211. va_end(ap);
  212. return chBuf;
  213. }
  214. ////////////////////////////////////////////////////////
  215. // Function : _padDbgVaStrW
  216. // Type : LPWSTR
  217. // Purpose :
  218. // Args :
  219. // : LPWSTR lpstrFmt
  220. // Return :
  221. // DATE :
  222. /////////////////////////////////////////////////////////
  223. LPWSTR _padDbgVaStrW(LPWSTR lpstrFmt, ...)
  224. {
  225. static WCHAR wchBuf[512];
  226. va_list ap;
  227. va_start(ap, lpstrFmt);
  228. vswprintf(wchBuf, lpstrFmt, ap); //Use C-RunTime Library for Win95
  229. va_end(ap);
  230. return wchBuf;
  231. }
  232. ////////////////////////////////////////////////////////
  233. // Function: _padDbgPrintfA
  234. // Type : VOID
  235. // Purpose : variable args version of OutputDebugStringA
  236. // Args :
  237. // : LPSTR lpstrFmt
  238. // : ...
  239. // Return :
  240. // DATE :
  241. /////////////////////////////////////////////////////////
  242. VOID _padDbgPrintfA(LPSTR lpstrFmt, ...)
  243. {
  244. static CHAR szBuf[512];
  245. va_list ap;
  246. va_start(ap, lpstrFmt);
  247. wvsprintfA(szBuf, lpstrFmt, ap);
  248. va_end(ap);
  249. _padDbgOutStrA(szBuf);
  250. return;
  251. }
  252. //////////////////////////////////////////////////////////////////
  253. // Function : _padDbgPrintfW
  254. // Type : VOID
  255. // Purpose :
  256. // Args :
  257. // : LPWSTR lpstrFmt
  258. // : ...
  259. // Return :
  260. // DATE : Mon Jan 05 15:11:24 1998
  261. //////////////////////////////////////////////////////////////////
  262. VOID _padDbgPrintfW(LPWSTR lpstrFmt, ...)
  263. {
  264. static WCHAR wchBuf[512];
  265. va_list ap;
  266. va_start(ap, lpstrFmt);
  267. vswprintf(wchBuf, lpstrFmt, ap); //Use C-RunTime Library for Win95
  268. va_end(ap);
  269. _padDbgOutStrW(wchBuf);
  270. return;
  271. }
  272. //////////////////////////////////////////////////////////////////
  273. // Function : _padDbgMulti2Wide
  274. // Type : LPWSTR
  275. // Purpose : return Unicode string from MBCS string
  276. // Args :
  277. // : LPSTR lpstr
  278. // Return :
  279. // DATE : Mon Jan 05 15:10:48 1998
  280. //////////////////////////////////////////////////////////////////
  281. LPWSTR _padDbgMulti2Wide(LPSTR lpstr)
  282. {
  283. static WCHAR wchBuf[512];
  284. MultiByteToWideChar(CP_ACP,
  285. MB_PRECOMPOSED,
  286. lpstr, -1,
  287. (WCHAR*)wchBuf, sizeof(wchBuf)/sizeof(WCHAR) );
  288. return wchBuf;
  289. }
  290. //////////////////////////////////////////////////////////////////
  291. // Function : _padDbgGetWinClass
  292. // Type : LPSTR
  293. // Purpose : Get Windows class name string
  294. // ANSI version only.
  295. // Args :
  296. // : HWND hwnd
  297. // Return :
  298. // DATE : Mon Jan 05 15:08:43 1998
  299. //////////////////////////////////////////////////////////////////
  300. LPSTR _padDbgGetWinClass(HWND hwnd)
  301. {
  302. #ifdef _CONSOLE
  303. return NULL;
  304. #endif
  305. static CHAR szBuf[256];
  306. szBuf[0]=(char)0x00;
  307. GetClassNameA(hwnd, szBuf, sizeof(szBuf));
  308. return szBuf;
  309. }
  310. //////////////////////////////////////////////////////////////////
  311. // Function : _padDbgGetWinText
  312. // Type : LPSTR
  313. // Purpose : Get Windows text(title) string
  314. // Args :
  315. // : HWND hwnd
  316. // Return :
  317. // DATE : Mon Jan 05 15:09:08 1998
  318. //////////////////////////////////////////////////////////////////
  319. LPSTR _padDbgGetWinText(HWND hwnd)
  320. {
  321. #ifdef _CONSOLE
  322. return NULL;
  323. #endif
  324. static CHAR szBuf[256];
  325. szBuf[0]=(char)0x00;
  326. GetWindowTextA(hwnd, szBuf, sizeof(szBuf));
  327. return szBuf;
  328. }
  329. //////////////////////////////////////////////////////////////////
  330. // Function : _padDbgMsgBoxA
  331. // Type : VOID
  332. // Purpose :
  333. // Args :
  334. // : LPSTR lpstrFile
  335. // : INT lineNo
  336. // : LPSTR lpstr
  337. // Return :
  338. // DATE : Thu Jan 08 12:31:03 1998
  339. //////////////////////////////////////////////////////////////////
  340. VOID _padDbgMsgBoxA(LPSTR lpstrFile, INT lineNo, LPSTR lpstrMsg)
  341. {
  342. #ifdef _CONSOLE
  343. return;
  344. #endif
  345. char szTmp[512];
  346. wsprintfA(szTmp, "Debug Message Box (File: %s, Line: %4d)",
  347. GetFileTitleStrA(lpstrFile),
  348. lineNo);
  349. MessageBoxA(GetActiveWindow(), lpstrMsg, szTmp, MB_OK);
  350. }
  351. VOID _padDbgAssert(LPSTR lpstrFile, INT lineNo, BOOL fOk, LPSTR lpstrMsg)
  352. {
  353. if(fOk) {
  354. return;
  355. }
  356. char szTmp[512];
  357. wsprintfA(szTmp, "ASSERT (File: %s, Line: %4d)",
  358. GetFileTitleStrA(lpstrFile),
  359. lineNo);
  360. MessageBoxA(GetActiveWindow(), lpstrMsg, szTmp, MB_OK);
  361. DebugBreak();
  362. }
  363. //////////////////////////////////////////////////////////////////
  364. // Function : _padDbgGetErrorString
  365. // Type : LPSTR
  366. // Purpose : Convert Error(Got from GetLastError()) value to ERROR Message String
  367. // Args :
  368. // : INT errorCode
  369. // Return :
  370. // DATE : Mon Jan 05 16:43:34 1998
  371. //////////////////////////////////////////////////////////////////
  372. LPSTR _padDbgGetErrorString(INT errorCode)
  373. {
  374. static CHAR szBuf[512];
  375. INT count;
  376. szBuf[0] = (CHAR)0x00;
  377. count = wsprintfA(szBuf, "[0x%08x]:", errorCode);
  378. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
  379. NULL,
  380. errorCode,
  381. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  382. szBuf+count,
  383. sizeof(szBuf)-1-count,
  384. NULL );
  385. if(*(szBuf + count) != (CHAR)0x00) {
  386. int nLen = lstrlenA(szBuf);
  387. if((nLen - count) > 1) {
  388. szBuf[nLen - 1] = (CHAR)0x00;
  389. }
  390. }
  391. return szBuf;
  392. }
  393. //////////////////////////////////////////////////////////////////
  394. // Function : GetFileTitleStrA
  395. // Type : static LPSTR
  396. // Purpose : Return File name string(remove folder)
  397. // Args :
  398. // : LPSTR lpstrFilePath
  399. // Return :
  400. // DATE : Mon Jan 05 13:34:22 1998
  401. //////////////////////////////////////////////////////////////////
  402. static LPSTR GetFileTitleStrA(LPSTR lpstrFilePath)
  403. {
  404. static CHAR szBuf[2];
  405. CHAR *pLast, *pTemp;
  406. if(!lpstrFilePath) {
  407. szBuf[0] = (CHAR)0x00;
  408. return szBuf;
  409. }
  410. pLast = lpstrFilePath + (lstrlenA(lpstrFilePath) - 1);
  411. for(pTemp = CharPrevA(lpstrFilePath, pLast);
  412. (pTemp != lpstrFilePath) &&
  413. (*pTemp != '\\') &&
  414. (*pTemp != (CHAR)0x00);
  415. pTemp = CharPrevA(lpstrFilePath, pTemp)) {
  416. ;
  417. }
  418. if(*pTemp == '\\') {
  419. return pTemp+1;
  420. }
  421. return lpstrFilePath;
  422. }
  423. //////////////////////////////////////////////////////////////////
  424. // Function : GetFileTitleStrW
  425. // Type : static LPWSTR
  426. // Purpose :
  427. // Args :
  428. // : LPWSTR lpstrFilePath
  429. // Return :
  430. // DATE : Mon Jan 05 13:38:19 1998
  431. //////////////////////////////////////////////////////////////////
  432. static LPWSTR GetFileTitleStrW(LPWSTR lpstrFilePath)
  433. {
  434. static WCHAR szBuf[2];
  435. WCHAR *pLast, *pTemp;
  436. if(!lpstrFilePath) {
  437. szBuf[0] = (CHAR)0x00;
  438. return szBuf;
  439. }
  440. pLast = lpstrFilePath + (lstrlenW(lpstrFilePath) - 1);
  441. for(pTemp = pLast-1;
  442. (pTemp != lpstrFilePath) &&
  443. (*pTemp != L'\\') &&
  444. (*pTemp != (WCHAR)0x0000);
  445. pTemp--) {
  446. ;
  447. }
  448. if(*pTemp == L'\\') {
  449. return pTemp+1;
  450. }
  451. return lpstrFilePath;
  452. }
  453. #define DEFID(a) {a, #a}
  454. typedef struct idStr {
  455. INT code;
  456. LPSTR lpstr;
  457. }IDSTR;
  458. IDSTR rpcError[]={
  459. DEFID(RPC_S_INVALID_STRING_BINDING),
  460. DEFID(RPC_S_WRONG_KIND_OF_BINDING),
  461. DEFID(RPC_S_INVALID_BINDING),
  462. DEFID(RPC_S_PROTSEQ_NOT_SUPPORTED),
  463. DEFID(RPC_S_INVALID_RPC_PROTSEQ),
  464. DEFID(RPC_S_INVALID_STRING_UUID),
  465. DEFID(RPC_S_INVALID_ENDPOINT_FORMAT),
  466. DEFID(RPC_S_INVALID_NET_ADDR),
  467. DEFID(RPC_S_NO_ENDPOINT_FOUND),
  468. DEFID(RPC_S_INVALID_TIMEOUT),
  469. DEFID(RPC_S_OBJECT_NOT_FOUND),
  470. DEFID(RPC_S_ALREADY_REGISTERED),
  471. DEFID(RPC_S_TYPE_ALREADY_REGISTERED),
  472. DEFID(RPC_S_ALREADY_LISTENING),
  473. DEFID(RPC_S_NO_PROTSEQS_REGISTERED),
  474. DEFID(RPC_S_NOT_LISTENING),
  475. DEFID(RPC_S_UNKNOWN_MGR_TYPE),
  476. DEFID(RPC_S_UNKNOWN_IF),
  477. DEFID(RPC_S_NO_BINDINGS),
  478. DEFID(RPC_S_NO_PROTSEQS),
  479. DEFID(RPC_S_CANT_CREATE_ENDPOINT),
  480. DEFID(RPC_S_OUT_OF_RESOURCES),
  481. DEFID(RPC_S_SERVER_UNAVAILABLE),
  482. DEFID(RPC_S_SERVER_TOO_BUSY),
  483. DEFID(RPC_S_INVALID_NETWORK_OPTIONS),
  484. DEFID(RPC_S_NO_CALL_ACTIVE),
  485. DEFID(RPC_S_CALL_FAILED),
  486. DEFID(RPC_S_CALL_FAILED_DNE),
  487. DEFID(RPC_S_PROTOCOL_ERROR),
  488. DEFID(RPC_S_UNSUPPORTED_TRANS_SYN),
  489. DEFID(RPC_S_UNSUPPORTED_TYPE),
  490. DEFID(RPC_S_INVALID_TAG),
  491. DEFID(RPC_S_INVALID_BOUND),
  492. DEFID(RPC_S_NO_ENTRY_NAME),
  493. DEFID(RPC_S_INVALID_NAME_SYNTAX),
  494. DEFID(RPC_S_UNSUPPORTED_NAME_SYNTAX),
  495. DEFID(RPC_S_UUID_NO_ADDRESS),
  496. DEFID(RPC_S_DUPLICATE_ENDPOINT),
  497. DEFID(RPC_S_UNKNOWN_AUTHN_TYPE),
  498. DEFID(RPC_S_MAX_CALLS_TOO_SMALL),
  499. DEFID(RPC_S_STRING_TOO_LONG),
  500. DEFID(RPC_S_PROTSEQ_NOT_FOUND),
  501. DEFID(RPC_S_PROCNUM_OUT_OF_RANGE),
  502. DEFID(RPC_S_BINDING_HAS_NO_AUTH),
  503. DEFID(RPC_S_UNKNOWN_AUTHN_SERVICE),
  504. DEFID(RPC_S_UNKNOWN_AUTHN_LEVEL),
  505. DEFID(RPC_S_INVALID_AUTH_IDENTITY),
  506. DEFID(RPC_S_UNKNOWN_AUTHZ_SERVICE),
  507. DEFID(EPT_S_INVALID_ENTRY),
  508. DEFID(EPT_S_CANT_PERFORM_OP),
  509. DEFID(EPT_S_NOT_REGISTERED),
  510. DEFID(RPC_S_NOTHING_TO_EXPORT),
  511. DEFID(RPC_S_INCOMPLETE_NAME),
  512. DEFID(RPC_S_INVALID_VERS_OPTION),
  513. DEFID(RPC_S_NO_MORE_MEMBERS),
  514. DEFID(RPC_S_NOT_ALL_OBJS_UNEXPORTED),
  515. DEFID(RPC_S_INTERFACE_NOT_FOUND),
  516. DEFID(RPC_S_ENTRY_ALREADY_EXISTS),
  517. DEFID(RPC_S_ENTRY_NOT_FOUND),
  518. DEFID(RPC_S_NAME_SERVICE_UNAVAILABLE),
  519. DEFID(RPC_S_INVALID_NAF_ID),
  520. DEFID(RPC_S_CANNOT_SUPPORT),
  521. DEFID(RPC_S_NO_CONTEXT_AVAILABLE),
  522. DEFID(RPC_S_INTERNAL_ERROR),
  523. DEFID(RPC_S_ZERO_DIVIDE),
  524. DEFID(RPC_S_ADDRESS_ERROR),
  525. DEFID(RPC_S_FP_DIV_ZERO),
  526. DEFID(RPC_S_FP_UNDERFLOW),
  527. DEFID(RPC_S_FP_OVERFLOW),
  528. DEFID(RPC_X_NO_MORE_ENTRIES),
  529. DEFID(RPC_X_SS_CHAR_TRANS_OPEN_FAIL),
  530. DEFID(RPC_X_SS_CHAR_TRANS_SHORT_FILE),
  531. DEFID(RPC_X_SS_IN_NULL_CONTEXT),
  532. DEFID(RPC_X_SS_CONTEXT_DAMAGED),
  533. DEFID(RPC_X_SS_HANDLES_MISMATCH),
  534. DEFID(RPC_X_SS_CANNOT_GET_CALL_HANDLE),
  535. DEFID(RPC_X_NULL_REF_POINTER),
  536. DEFID(RPC_X_ENUM_VALUE_OUT_OF_RANGE),
  537. DEFID(RPC_X_BYTE_COUNT_TOO_SMALL),
  538. DEFID(RPC_X_BAD_STUB_DATA),
  539. DEFID(ERROR_INVALID_USER_BUFFER),
  540. DEFID(ERROR_UNRECOGNIZED_MEDIA),
  541. DEFID(ERROR_NO_TRUST_LSA_SECRET),
  542. DEFID(ERROR_NO_TRUST_SAM_ACCOUNT),
  543. DEFID(ERROR_TRUSTED_DOMAIN_FAILURE),
  544. DEFID(ERROR_TRUSTED_RELATIONSHIP_FAILURE),
  545. DEFID(ERROR_TRUST_FAILURE),
  546. DEFID(RPC_S_CALL_IN_PROGRESS),
  547. };
  548. LPSTR _padDbgGetRPCError(INT code)
  549. {
  550. INT i;
  551. for(i = 0; i < sizeof(rpcError)/sizeof(rpcError[0]); i++) {
  552. if(rpcError[i].code == code) {
  553. return rpcError[i].lpstr;
  554. }
  555. }
  556. static char szBuf[]="";
  557. return szBuf;
  558. }
  559. INT _padDbgShowError(HRESULT hr, LPSTR lpstrFunc)
  560. {
  561. char szBuf[256];
  562. char szMsg[1024];
  563. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
  564. NULL,
  565. hr,
  566. 0,
  567. szBuf,
  568. 256,
  569. NULL);
  570. szBuf[lstrlenA(szBuf)-1] = (char)0x00;
  571. wsprintfA(szMsg, "!!%s: hr[0x%08x] code[%d][%x][%s][%s]",
  572. lpstrFunc ? lpstrFunc : "UnknownFunc",
  573. hr,
  574. HRESULT_CODE(hr),
  575. HRESULT_CODE(hr),
  576. _padDbgGetErrorString(HRESULT_CODE(hr)),
  577. szBuf);
  578. DBG(("%s\n", szMsg));
  579. return 0;
  580. }
  581. #endif //_DEBUG