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.

620 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. StringCbVPrintfA(chBuf, sizeof(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. StringCbVPrintfW(wchBuf, sizeof(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. StringCbVPrintfA(szBuf, sizeof(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. StringCbVPrintfW(wchBuf, sizeof(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. StringCbPrintfA(szTmp, sizeof(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. StringCbPrintfA(szTmp, sizeof(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. StringCbPrintfA(szBuf, sizeof(szBuf), "[0x%08x]:", errorCode);
  378. count = lstrlenA(szBuf);
  379. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
  380. NULL,
  381. errorCode,
  382. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  383. szBuf+count,
  384. sizeof(szBuf)-1-count,
  385. NULL );
  386. if(*(szBuf + count) != (CHAR)0x00) {
  387. int nLen = lstrlenA(szBuf);
  388. if((nLen - count) > 1) {
  389. szBuf[nLen - 1] = (CHAR)0x00;
  390. }
  391. }
  392. return szBuf;
  393. }
  394. //////////////////////////////////////////////////////////////////
  395. // Function : GetFileTitleStrA
  396. // Type : static LPSTR
  397. // Purpose : Return File name string(remove folder)
  398. // Args :
  399. // : LPSTR lpstrFilePath
  400. // Return :
  401. // DATE : Mon Jan 05 13:34:22 1998
  402. //////////////////////////////////////////////////////////////////
  403. static LPSTR GetFileTitleStrA(LPSTR lpstrFilePath)
  404. {
  405. static CHAR szBuf[2];
  406. CHAR *pLast, *pTemp;
  407. if(!lpstrFilePath) {
  408. szBuf[0] = (CHAR)0x00;
  409. return szBuf;
  410. }
  411. pLast = lpstrFilePath + (lstrlenA(lpstrFilePath) - 1);
  412. for(pTemp = CharPrevA(lpstrFilePath, pLast);
  413. (pTemp != lpstrFilePath) &&
  414. (*pTemp != '\\') &&
  415. (*pTemp != (CHAR)0x00);
  416. pTemp = CharPrevA(lpstrFilePath, pTemp)) {
  417. ;
  418. }
  419. if(*pTemp == '\\') {
  420. return pTemp+1;
  421. }
  422. return lpstrFilePath;
  423. }
  424. //////////////////////////////////////////////////////////////////
  425. // Function : GetFileTitleStrW
  426. // Type : static LPWSTR
  427. // Purpose :
  428. // Args :
  429. // : LPWSTR lpstrFilePath
  430. // Return :
  431. // DATE : Mon Jan 05 13:38:19 1998
  432. //////////////////////////////////////////////////////////////////
  433. static LPWSTR GetFileTitleStrW(LPWSTR lpstrFilePath)
  434. {
  435. static WCHAR szBuf[2];
  436. WCHAR *pLast, *pTemp;
  437. if(!lpstrFilePath) {
  438. szBuf[0] = (CHAR)0x00;
  439. return szBuf;
  440. }
  441. pLast = lpstrFilePath + (lstrlenW(lpstrFilePath) - 1);
  442. for(pTemp = pLast-1;
  443. (pTemp != lpstrFilePath) &&
  444. (*pTemp != L'\\') &&
  445. (*pTemp != (WCHAR)0x0000);
  446. pTemp--) {
  447. ;
  448. }
  449. if(*pTemp == L'\\') {
  450. return pTemp+1;
  451. }
  452. return lpstrFilePath;
  453. }
  454. #define DEFID(a) {a, #a}
  455. typedef struct idStr {
  456. INT code;
  457. LPSTR lpstr;
  458. }IDSTR;
  459. IDSTR rpcError[]={
  460. DEFID(RPC_S_INVALID_STRING_BINDING),
  461. DEFID(RPC_S_WRONG_KIND_OF_BINDING),
  462. DEFID(RPC_S_INVALID_BINDING),
  463. DEFID(RPC_S_PROTSEQ_NOT_SUPPORTED),
  464. DEFID(RPC_S_INVALID_RPC_PROTSEQ),
  465. DEFID(RPC_S_INVALID_STRING_UUID),
  466. DEFID(RPC_S_INVALID_ENDPOINT_FORMAT),
  467. DEFID(RPC_S_INVALID_NET_ADDR),
  468. DEFID(RPC_S_NO_ENDPOINT_FOUND),
  469. DEFID(RPC_S_INVALID_TIMEOUT),
  470. DEFID(RPC_S_OBJECT_NOT_FOUND),
  471. DEFID(RPC_S_ALREADY_REGISTERED),
  472. DEFID(RPC_S_TYPE_ALREADY_REGISTERED),
  473. DEFID(RPC_S_ALREADY_LISTENING),
  474. DEFID(RPC_S_NO_PROTSEQS_REGISTERED),
  475. DEFID(RPC_S_NOT_LISTENING),
  476. DEFID(RPC_S_UNKNOWN_MGR_TYPE),
  477. DEFID(RPC_S_UNKNOWN_IF),
  478. DEFID(RPC_S_NO_BINDINGS),
  479. DEFID(RPC_S_NO_PROTSEQS),
  480. DEFID(RPC_S_CANT_CREATE_ENDPOINT),
  481. DEFID(RPC_S_OUT_OF_RESOURCES),
  482. DEFID(RPC_S_SERVER_UNAVAILABLE),
  483. DEFID(RPC_S_SERVER_TOO_BUSY),
  484. DEFID(RPC_S_INVALID_NETWORK_OPTIONS),
  485. DEFID(RPC_S_NO_CALL_ACTIVE),
  486. DEFID(RPC_S_CALL_FAILED),
  487. DEFID(RPC_S_CALL_FAILED_DNE),
  488. DEFID(RPC_S_PROTOCOL_ERROR),
  489. DEFID(RPC_S_UNSUPPORTED_TRANS_SYN),
  490. DEFID(RPC_S_UNSUPPORTED_TYPE),
  491. DEFID(RPC_S_INVALID_TAG),
  492. DEFID(RPC_S_INVALID_BOUND),
  493. DEFID(RPC_S_NO_ENTRY_NAME),
  494. DEFID(RPC_S_INVALID_NAME_SYNTAX),
  495. DEFID(RPC_S_UNSUPPORTED_NAME_SYNTAX),
  496. DEFID(RPC_S_UUID_NO_ADDRESS),
  497. DEFID(RPC_S_DUPLICATE_ENDPOINT),
  498. DEFID(RPC_S_UNKNOWN_AUTHN_TYPE),
  499. DEFID(RPC_S_MAX_CALLS_TOO_SMALL),
  500. DEFID(RPC_S_STRING_TOO_LONG),
  501. DEFID(RPC_S_PROTSEQ_NOT_FOUND),
  502. DEFID(RPC_S_PROCNUM_OUT_OF_RANGE),
  503. DEFID(RPC_S_BINDING_HAS_NO_AUTH),
  504. DEFID(RPC_S_UNKNOWN_AUTHN_SERVICE),
  505. DEFID(RPC_S_UNKNOWN_AUTHN_LEVEL),
  506. DEFID(RPC_S_INVALID_AUTH_IDENTITY),
  507. DEFID(RPC_S_UNKNOWN_AUTHZ_SERVICE),
  508. DEFID(EPT_S_INVALID_ENTRY),
  509. DEFID(EPT_S_CANT_PERFORM_OP),
  510. DEFID(EPT_S_NOT_REGISTERED),
  511. DEFID(RPC_S_NOTHING_TO_EXPORT),
  512. DEFID(RPC_S_INCOMPLETE_NAME),
  513. DEFID(RPC_S_INVALID_VERS_OPTION),
  514. DEFID(RPC_S_NO_MORE_MEMBERS),
  515. DEFID(RPC_S_NOT_ALL_OBJS_UNEXPORTED),
  516. DEFID(RPC_S_INTERFACE_NOT_FOUND),
  517. DEFID(RPC_S_ENTRY_ALREADY_EXISTS),
  518. DEFID(RPC_S_ENTRY_NOT_FOUND),
  519. DEFID(RPC_S_NAME_SERVICE_UNAVAILABLE),
  520. DEFID(RPC_S_INVALID_NAF_ID),
  521. DEFID(RPC_S_CANNOT_SUPPORT),
  522. DEFID(RPC_S_NO_CONTEXT_AVAILABLE),
  523. DEFID(RPC_S_INTERNAL_ERROR),
  524. DEFID(RPC_S_ZERO_DIVIDE),
  525. DEFID(RPC_S_ADDRESS_ERROR),
  526. DEFID(RPC_S_FP_DIV_ZERO),
  527. DEFID(RPC_S_FP_UNDERFLOW),
  528. DEFID(RPC_S_FP_OVERFLOW),
  529. DEFID(RPC_X_NO_MORE_ENTRIES),
  530. DEFID(RPC_X_SS_CHAR_TRANS_OPEN_FAIL),
  531. DEFID(RPC_X_SS_CHAR_TRANS_SHORT_FILE),
  532. DEFID(RPC_X_SS_IN_NULL_CONTEXT),
  533. DEFID(RPC_X_SS_CONTEXT_DAMAGED),
  534. DEFID(RPC_X_SS_HANDLES_MISMATCH),
  535. DEFID(RPC_X_SS_CANNOT_GET_CALL_HANDLE),
  536. DEFID(RPC_X_NULL_REF_POINTER),
  537. DEFID(RPC_X_ENUM_VALUE_OUT_OF_RANGE),
  538. DEFID(RPC_X_BYTE_COUNT_TOO_SMALL),
  539. DEFID(RPC_X_BAD_STUB_DATA),
  540. DEFID(ERROR_INVALID_USER_BUFFER),
  541. DEFID(ERROR_UNRECOGNIZED_MEDIA),
  542. DEFID(ERROR_NO_TRUST_LSA_SECRET),
  543. DEFID(ERROR_NO_TRUST_SAM_ACCOUNT),
  544. DEFID(ERROR_TRUSTED_DOMAIN_FAILURE),
  545. DEFID(ERROR_TRUSTED_RELATIONSHIP_FAILURE),
  546. DEFID(ERROR_TRUST_FAILURE),
  547. DEFID(RPC_S_CALL_IN_PROGRESS),
  548. };
  549. LPSTR _padDbgGetRPCError(INT code)
  550. {
  551. INT i;
  552. for(i = 0; i < sizeof(rpcError)/sizeof(rpcError[0]); i++) {
  553. if(rpcError[i].code == code) {
  554. return rpcError[i].lpstr;
  555. }
  556. }
  557. static char szBuf[]="";
  558. return szBuf;
  559. }
  560. INT _padDbgShowError(HRESULT hr, LPSTR lpstrFunc)
  561. {
  562. char szBuf[256];
  563. char szMsg[1024];
  564. FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
  565. NULL,
  566. hr,
  567. 0,
  568. szBuf,
  569. 256,
  570. NULL);
  571. szBuf[lstrlenA(szBuf)-1] = (char)0x00;
  572. StringCbPrintfA(szMsg, sizeof(szMsg), "!!%s: hr[0x%08x] code[%d][%x][%s][%s]",
  573. lpstrFunc ? lpstrFunc : "UnknownFunc",
  574. hr,
  575. HRESULT_CODE(hr),
  576. HRESULT_CODE(hr),
  577. _padDbgGetErrorString(HRESULT_CODE(hr)),
  578. szBuf);
  579. DBG(("%s\n", szMsg));
  580. return 0;
  581. }
  582. #endif //_DEBUG