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.

368 lines
9.1 KiB

  1. //---------------------------------------------------------------------------
  2. //
  3. // Copyright (c) Microsoft Corporation 1993-1994
  4. //
  5. // File: err.c
  6. //
  7. // This files contains all error handling routines.
  8. //
  9. // History:
  10. // 08-06-93 ScottH Transferred from twin code
  11. //
  12. //---------------------------------------------------------------------------
  13. ///////////////////////////////////////////////////// INCLUDES
  14. #include "brfprv.h" // common headers
  15. ///////////////////////////////////////////////////// TYPEDEFS
  16. ///////////////////////////////////////////////////// CONTROLLING DEFINES
  17. ///////////////////////////////////////////////////// DEFINES
  18. ///////////////////////////////////////////////////// MODULE DATA
  19. #ifdef DEBUG
  20. TCHAR const c_szNewline[] = TEXT("\r\n");
  21. TCHAR const c_szTrace[] = TEXT("t BRIEFCASE ");
  22. TCHAR const c_szDbg[] = TEXT("BRIEFCASE ");
  23. TCHAR const c_szAssertFailed[] = TEXT("BRIEFCASE Assertion failed in %s on line %d\r\n");
  24. struct _RIIDMAP
  25. {
  26. REFIID riid;
  27. LPCTSTR psz;
  28. } const c_rgriidmap[] = {
  29. { &IID_IUnknown, TEXT("IID_IUnknown") },
  30. { &IID_IBriefcaseStg, TEXT("IID_IBriefcaseStg") },
  31. { &IID_IEnumUnknown, TEXT("IID_IEnumUnknown") },
  32. { &IID_IShellBrowser, TEXT("IID_IShellBrowser") },
  33. { &IID_IShellView, TEXT("IID_IShellView") },
  34. { &IID_IContextMenu, TEXT("IID_IContextMenu") },
  35. { &IID_IShellFolder, TEXT("IID_IShellFolder") },
  36. { &IID_IShellExtInit, TEXT("IID_IShellExtInit") },
  37. { &IID_IShellPropSheetExt, TEXT("IID_IShellPropSheetExt") },
  38. { &IID_IPersistFolder, TEXT("IID_IPersistFolder") },
  39. { &IID_IExtractIcon, TEXT("IID_IExtractIcon") },
  40. { &IID_IShellDetails, TEXT("IID_IShellDetails") },
  41. { &IID_IDelayedRelease, TEXT("IID_IDelayedRelease") },
  42. { &IID_IShellLink, TEXT("IID_IShellLink") },
  43. };
  44. struct _SCODEMAP
  45. {
  46. SCODE sc;
  47. LPCTSTR psz;
  48. } const c_rgscodemap[] = {
  49. { S_OK, TEXT("S_OK") },
  50. { S_FALSE, TEXT("S_FALSE") },
  51. { E_UNEXPECTED, TEXT("E_UNEXPECTED") },
  52. { E_NOTIMPL, TEXT("E_NOTIMPL") },
  53. { E_OUTOFMEMORY, TEXT("E_OUTOFMEMORY") },
  54. { E_INVALIDARG, TEXT("E_INVALIDARG") },
  55. { E_NOINTERFACE, TEXT("E_NOINTERFACE") },
  56. { E_POINTER, TEXT("E_POINTER") },
  57. { E_HANDLE, TEXT("E_HANDLE") },
  58. { E_ABORT, TEXT("E_ABORT") },
  59. { E_FAIL, TEXT("E_FAIL") },
  60. { E_ACCESSDENIED, TEXT("E_ACCESSDENIED") },
  61. };
  62. #endif
  63. ///////////////////////////////////////////////////// PUBLIC FUNCTIONS
  64. #ifdef DEBUG
  65. /*----------------------------------------------------------
  66. Purpose: Return English reason for the debug break
  67. Returns: String
  68. Cond: --
  69. */
  70. LPCTSTR PRIVATE GetReasonString(
  71. UINT flag) // One of BF_ flags
  72. {
  73. LPCTSTR psz;
  74. if (IsFlagSet(flag, BF_ONOPEN))
  75. psz = TEXT("BREAK ON OPEN BRIEFCASE\r\n");
  76. else if (IsFlagSet(flag, BF_ONCLOSE))
  77. psz = TEXT("BREAK ON CLOSE BRIEFCASE\r\n");
  78. else if (IsFlagSet(flag, BF_ONRUNONCE))
  79. psz = TEXT("BREAK ON RunDLL_RunOnlyOnce\r\n");
  80. else if (IsFlagSet(flag, BF_ONVALIDATE))
  81. psz = TEXT("BREAK ON VALIDATION FAILURE\r\n");
  82. else if (IsFlagSet(flag, BF_ONTHREADATT))
  83. psz = TEXT("BREAK ON THREAD ATTACH\r\n");
  84. else if (IsFlagSet(flag, BF_ONTHREADDET))
  85. psz = TEXT("BREAK ON THREAD DETACH\r\n");
  86. else if (IsFlagSet(flag, BF_ONPROCESSATT))
  87. psz = TEXT("BREAK ON PROCESS ATTACH\r\n");
  88. else if (IsFlagSet(flag, BF_ONPROCESSDET))
  89. psz = TEXT("BREAK ON PROCESS DETACH\r\n");
  90. else
  91. psz = c_szNewline;
  92. return psz;
  93. }
  94. /*----------------------------------------------------------
  95. Purpose: Perform a debug break based on the flag
  96. Returns: --
  97. Cond: --
  98. */
  99. void PUBLIC DEBUG_BREAK(
  100. UINT flag) // One of BF_ flags
  101. {
  102. BOOL bBreak;
  103. LPCTSTR psz;
  104. ENTEREXCLUSIVE();
  105. {
  106. bBreak = IsFlagSet(g_uBreakFlags, flag);
  107. psz = GetReasonString(flag);
  108. }
  109. LEAVEEXCLUSIVE();
  110. if (bBreak)
  111. {
  112. TRACE_MSG(TF_ALWAYS, psz);
  113. DebugBreak();
  114. }
  115. }
  116. void PUBLIC BrfAssertFailed(
  117. LPCTSTR pszFile,
  118. int line)
  119. {
  120. LPCTSTR psz;
  121. TCHAR ach[256];
  122. UINT uBreakFlags;
  123. ENTEREXCLUSIVE();
  124. {
  125. uBreakFlags = g_uBreakFlags;
  126. }
  127. LEAVEEXCLUSIVE();
  128. // Strip off path info from filename string, if present.
  129. //
  130. for (psz = pszFile + lstrlen(pszFile); psz != pszFile; psz=CharPrev(pszFile, psz))
  131. {
  132. if ((CharPrev(pszFile, psz) != (psz-2)) && *(psz - 1) == TEXT('\\'))
  133. break;
  134. }
  135. wnsprintf(ach, ARRAYSIZE(ach), c_szAssertFailed, psz, line);
  136. OutputDebugString(ach);
  137. if (IsFlagSet(uBreakFlags, BF_ONVALIDATE))
  138. DebugBreak();
  139. }
  140. void CPUBLIC BrfAssertMsg(
  141. BOOL f,
  142. LPCTSTR pszMsg, ...)
  143. {
  144. TCHAR ach[MAXPATHLEN+40]; // Largest path plus extra
  145. if (!f)
  146. {
  147. lstrcpyn(ach, c_szTrace, ARRAYSIZE(ach));
  148. StringCchVPrintf(&ach[ARRAYSIZE(c_szTrace)-1], ARRAYSIZE(ach) - ARRAYSIZE(c_szTrace) + 1,
  149. pszMsg, (va_list)(&pszMsg + 1));
  150. OutputDebugString(ach);
  151. OutputDebugString(c_szNewline);
  152. }
  153. }
  154. void CPUBLIC BrfDebugMsg(
  155. UINT uFlag,
  156. LPCTSTR pszMsg, ...)
  157. {
  158. TCHAR ach[MAXPATHLEN+40]; // Largest path plus extra
  159. UINT uTraceFlags;
  160. ENTEREXCLUSIVE();
  161. {
  162. uTraceFlags = g_uTraceFlags;
  163. }
  164. LEAVEEXCLUSIVE();
  165. if (uFlag == TF_ALWAYS || IsFlagSet(uTraceFlags, uFlag))
  166. {
  167. lstrcpyn(ach, c_szTrace, ARRAYSIZE(ach));
  168. StringCchVPrintf(&ach[ARRAYSIZE(c_szTrace)-1], ARRAYSIZE(ach) - ARRAYSIZE(c_szTrace) + 1,
  169. pszMsg, (va_list)(&pszMsg + 1));
  170. OutputDebugString(ach);
  171. OutputDebugString(c_szNewline);
  172. }
  173. }
  174. /*----------------------------------------------------------
  175. Purpose: Returns the string form of an known interface ID.
  176. Returns: String ptr
  177. Cond: --
  178. */
  179. LPCTSTR PUBLIC Dbg_GetRiidName(
  180. REFIID riid)
  181. {
  182. int i;
  183. for (i = 0; i < ARRAYSIZE(c_rgriidmap); i++)
  184. {
  185. if (IsEqualIID(riid, c_rgriidmap[i].riid))
  186. return c_rgriidmap[i].psz;
  187. }
  188. return TEXT("Unknown riid");
  189. }
  190. /*----------------------------------------------------------
  191. Purpose: Returns the string form of an scode given an hresult.
  192. Returns: String ptr
  193. Cond: --
  194. */
  195. LPCTSTR PUBLIC Dbg_GetScode(
  196. HRESULT hres)
  197. {
  198. int i;
  199. SCODE sc;
  200. sc = GetScode(hres);
  201. for (i = 0; i < ARRAYSIZE(c_rgscodemap); i++)
  202. {
  203. if (sc == c_rgscodemap[i].sc)
  204. return c_rgscodemap[i].psz;
  205. }
  206. return TEXT("Unknown scode");
  207. }
  208. /*----------------------------------------------------------
  209. Purpose: Returns a string safe enough to print...and I don't
  210. mean swear words.
  211. Returns: String ptr
  212. Cond: --
  213. */
  214. LPCTSTR PUBLIC Dbg_SafeStr(
  215. LPCTSTR psz)
  216. {
  217. if (psz)
  218. return psz;
  219. else
  220. return TEXT("NULL");
  221. }
  222. /*----------------------------------------------------------
  223. Purpose: Returns a string safe enough to print given an IDataObject.
  224. Returns: String ptr
  225. Cond: --
  226. */
  227. LPCTSTR PUBLIC Dbg_DataObjStr(
  228. LPDATAOBJECT pdtobj,
  229. LPTSTR pszBuf,
  230. int cchMax)
  231. {
  232. if (pdtobj)
  233. {
  234. DataObj_QueryPath(pdtobj, pszBuf, cchMax);
  235. }
  236. else
  237. {
  238. lstrcpyn(pszBuf, TEXT("NULL"), cchMax);
  239. }
  240. return pszBuf;
  241. }
  242. #endif // DEBUG
  243. /*----------------------------------------------------------
  244. Purpose: This function maps the hresult to an hresult in the
  245. error table, and displays the corresponding string
  246. in a messagebox.
  247. Returns: return value of MessageBox
  248. Cond: --
  249. */
  250. int PUBLIC SEMsgBox(
  251. HWND hwnd,
  252. UINT idsCaption,
  253. HRESULT hres,
  254. PCSETBL pTable,
  255. UINT cArraySize) // Number of elements in table
  256. {
  257. PCSETBL p;
  258. PCSETBL pEnd;
  259. p = pTable;
  260. pEnd = &pTable[cArraySize-1];
  261. while (p != pEnd)
  262. {
  263. if (p->hres == hres)
  264. {
  265. return MsgBox(hwnd, MAKEINTRESOURCE(p->ids), MAKEINTRESOURCE(idsCaption),
  266. NULL, p->uStyle);
  267. }
  268. p++;
  269. }
  270. // Cover last entry
  271. if (p->hres == hres)
  272. {
  273. return MsgBox(hwnd, MAKEINTRESOURCE(p->ids), MAKEINTRESOURCE(idsCaption),
  274. NULL, p->uStyle);
  275. }
  276. return -1;
  277. }
  278. /*----------------------------------------------------------
  279. Purpose: Maps an hresult to a valid "official" hresult. This
  280. is necessary because the SYNCUI uses a FACILITY_TR
  281. which is only good for us, but unknown to the outside
  282. world.
  283. Returns: hresult
  284. Cond: --
  285. */
  286. HRESULT PUBLIC MapToOfficialHresult(
  287. HRESULT hres)
  288. {
  289. if (IS_ENGINE_ERROR(hres))
  290. {
  291. SCODE sc = GetScode(hres);
  292. if (E_TR_OUT_OF_MEMORY == sc)
  293. hres = ResultFromScode(E_OUTOFMEMORY);
  294. else
  295. hres = ResultFromScode(E_FAIL);
  296. }
  297. return hres;
  298. }