err.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 9k
Category:

Windows Kernel

Development Platform:

Visual C++

  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. #pragma data_seg(DATASEG_READONLY)
  21. TCHAR const  c_szNewline[] = TEXT("rn");
  22. TCHAR const  c_szTrace[] = TEXT("t BRIEFCASE  ");
  23. TCHAR const  c_szDbg[] = TEXT("BRIEFCASE  ");
  24. TCHAR const  c_szAssertFailed[] = TEXT("BRIEFCASE  Assertion failed in %s on line %drn");
  25. struct _RIIDMAP
  26.     {
  27.     REFIID  riid;
  28.     LPCTSTR  psz;
  29.     } const c_rgriidmap[] = {
  30.         { &IID_IUnknown,        TEXT("IID_IUnknown") },
  31.         { &IID_IBriefcaseStg,   TEXT("IID_IBriefcaseStg") },
  32.         { &IID_IEnumUnknown,    TEXT("IID_IEnumUnknown") },
  33.         { &IID_IShellBrowser,   TEXT("IID_IShellBrowser") },
  34.         { &IID_IShellView,      TEXT("IID_IShellView") },
  35.         { &IID_IContextMenu,    TEXT("IID_IContextMenu") },
  36.         { &IID_IShellFolder,    TEXT("IID_IShellFolder") },
  37.         { &IID_IShellExtInit,   TEXT("IID_IShellExtInit") },
  38.         { &IID_IShellPropSheetExt, TEXT("IID_IShellPropSheetExt") },
  39.         { &IID_IPersistFolder,  TEXT("IID_IPersistFolder") },
  40.         { &IID_IExtractIcon,    TEXT("IID_IExtractIcon") },
  41.         { &IID_IShellDetails,   TEXT("IID_IShellDetails") },
  42.         { &IID_IDelayedRelease, TEXT("IID_IDelayedRelease") },
  43.         { &IID_IShellLink,      TEXT("IID_IShellLink") },
  44.         };
  45. struct _SCODEMAP
  46.     {
  47.     SCODE  sc;
  48.     LPCTSTR psz;
  49.     } const c_rgscodemap[] = {
  50.         { S_OK,             TEXT("S_OK") },
  51.         { S_FALSE,          TEXT("S_FALSE") },
  52.         { E_UNEXPECTED,     TEXT("E_UNEXPECTED") },
  53.         { E_NOTIMPL,        TEXT("E_NOTIMPL") },
  54.         { E_OUTOFMEMORY,    TEXT("E_OUTOFMEMORY") },
  55.         { E_INVALIDARG,     TEXT("E_INVALIDARG") },
  56.         { E_NOINTERFACE,    TEXT("E_NOINTERFACE") },
  57.         { E_POINTER,        TEXT("E_POINTER") },
  58.         { E_HANDLE,         TEXT("E_HANDLE") },
  59.         { E_ABORT,          TEXT("E_ABORT") },
  60.         { E_FAIL,           TEXT("E_FAIL") },
  61.         { E_ACCESSDENIED,   TEXT("E_ACCESSDENIED") },
  62.         };
  63. #pragma data_seg()
  64. #endif
  65. /////////////////////////////////////////////////////  PUBLIC FUNCTIONS
  66. #ifdef DEBUG
  67. /*----------------------------------------------------------
  68. Purpose: Return English reason for the debug break
  69. Returns: String
  70. Cond:    --
  71. */
  72. LPCTSTR PRIVATE GetReasonString(
  73.     UINT flag)      // One of BF_ flags
  74.     {
  75.     LPCTSTR psz;
  76.     if (IsFlagSet(flag, BF_ONOPEN))
  77.         psz = TEXT("BREAK ON OPEN BRIEFCASErn");
  78.     else if (IsFlagSet(flag, BF_ONCLOSE))
  79.         psz = TEXT("BREAK ON CLOSE BRIEFCASErn");
  80.     else if (IsFlagSet(flag, BF_ONRUNONCE))
  81.         psz = TEXT("BREAK ON RunDLL_RunOnlyOncern");
  82.     else if (IsFlagSet(flag, BF_ONVALIDATE))
  83.         psz = TEXT("BREAK ON VALIDATION FAILURErn");
  84.     else if (IsFlagSet(flag, BF_ONTHREADATT))
  85.         psz = TEXT("BREAK ON THREAD ATTACHrn");
  86.     else if (IsFlagSet(flag, BF_ONTHREADDET))
  87.         psz = TEXT("BREAK ON THREAD DETACHrn");
  88.     else if (IsFlagSet(flag, BF_ONPROCESSATT))
  89.         psz = TEXT("BREAK ON PROCESS ATTACHrn");
  90.     else if (IsFlagSet(flag, BF_ONPROCESSDET))
  91.         psz = TEXT("BREAK ON PROCESS DETACHrn");
  92.     else
  93.         psz = c_szNewline;
  94.     return psz;
  95.     }
  96. /*----------------------------------------------------------
  97. Purpose: Perform a debug break based on the flag
  98. Returns: --
  99. Cond:    --
  100. */
  101. void PUBLIC DEBUG_BREAK(
  102.     UINT flag)      // One of BF_ flags
  103.     {
  104.     BOOL bBreak;
  105.     LPCTSTR psz;
  106.     ENTEREXCLUSIVE()
  107.         {
  108.         bBreak = IsFlagSet(g_uBreakFlags, flag);
  109.         psz = GetReasonString(flag);
  110.         }
  111.     LEAVEEXCLUSIVE()
  112.     if (bBreak)
  113.         {
  114.         TRACE_MSG(TF_ALWAYS, psz);
  115.         DebugBreak();
  116.         }
  117.     }
  118. void PUBLIC BrfAssertFailed(
  119.     LPCTSTR pszFile, 
  120.     int line)
  121.     {
  122.     LPCTSTR psz;
  123.     TCHAR ach[256];
  124.     UINT uBreakFlags;
  125.     ENTEREXCLUSIVE()
  126.         {
  127.         uBreakFlags = g_uBreakFlags;
  128.         }
  129.     LEAVEEXCLUSIVE()
  130.     // Strip off path info from filename string, if present.
  131.     //
  132.     for (psz = pszFile + lstrlen(pszFile); psz != pszFile; psz=CharPrev(pszFile, psz))
  133.         {
  134.         if ((CharPrev(pszFile, psz) != (psz-2)) && *(psz - 1) == TEXT('\'))
  135.             break;
  136.         }
  137.     wsprintf(ach, c_szAssertFailed, psz, line);
  138.     OutputDebugString(ach);
  139.     
  140.     if (IsFlagSet(uBreakFlags, BF_ONVALIDATE))
  141.         DebugBreak();
  142.     }
  143. void CPUBLIC BrfAssertMsg(
  144.     BOOL f, 
  145.     LPCTSTR pszMsg, ...)
  146.     {
  147.     TCHAR ach[MAXPATHLEN+40];    // Largest path plus extra
  148.     if (!f)
  149.         {
  150.         lstrcpy(ach, c_szTrace);
  151.         wvsprintf(&ach[ARRAYSIZE(c_szTrace)-1], pszMsg, (va_list)(&pszMsg + 1));
  152.         OutputDebugString(ach);
  153.         OutputDebugString(c_szNewline);
  154.         }
  155.     }
  156. void CPUBLIC BrfDebugMsg(
  157.     UINT uFlag, 
  158.     LPCTSTR pszMsg, ...)
  159.     {
  160.     TCHAR ach[MAXPATHLEN+40];    // Largest path plus extra
  161.     UINT uTraceFlags;
  162.     ENTEREXCLUSIVE()
  163.         {
  164.         uTraceFlags = g_uTraceFlags;
  165.         }
  166.     LEAVEEXCLUSIVE()
  167.     if (uFlag == TF_ALWAYS || IsFlagSet(uTraceFlags, uFlag))
  168.         {
  169.         lstrcpy(ach, c_szTrace);
  170.         wvsprintf(&ach[ARRAYSIZE(c_szTrace)-1], pszMsg, (va_list)(&pszMsg + 1));
  171.         OutputDebugString(ach);
  172.         OutputDebugString(c_szNewline);
  173.         }
  174.     }
  175. /*----------------------------------------------------------
  176. Purpose: Returns the string form of an known interface ID.
  177. Returns: String ptr
  178. Cond:    --
  179. */
  180. LPCTSTR PUBLIC Dbg_GetRiidName(
  181.     REFIID riid)
  182.     {
  183.     int i;
  184.     for (i = 0; i < ARRAYSIZE(c_rgriidmap); i++)
  185.         {
  186.         if (IsEqualIID(riid, c_rgriidmap[i].riid))
  187.             return c_rgriidmap[i].psz;
  188.         }
  189.     return TEXT("Unknown riid");
  190.     }
  191. /*----------------------------------------------------------
  192. Purpose: Returns the string form of an scode given an hresult.
  193. Returns: String ptr
  194. Cond:    --
  195. */
  196. LPCTSTR PUBLIC Dbg_GetScode(
  197.     HRESULT hres)
  198.     {
  199.     int i;
  200.     SCODE sc;
  201.     sc = GetScode(hres);
  202.     for (i = 0; i < ARRAYSIZE(c_rgscodemap); i++)
  203.         {
  204.         if (sc == c_rgscodemap[i].sc)
  205.             return c_rgscodemap[i].psz;
  206.         }
  207.     return TEXT("Unknown scode");
  208.     }
  209. /*----------------------------------------------------------
  210. Purpose: Returns a string safe enough to print...and I don't
  211.          mean swear words.
  212. Returns: String ptr
  213. Cond:    --
  214. */
  215. LPCTSTR PUBLIC Dbg_SafeStr(
  216.     LPCTSTR psz)
  217.     {
  218.     if (psz)
  219.         return psz;
  220.     else
  221.         return TEXT("NULL");
  222.     }
  223. /*----------------------------------------------------------
  224. Purpose: Returns a string safe enough to print given an IDataObject.
  225. Returns: String ptr
  226. Cond:    --
  227. */
  228. LPCTSTR PUBLIC Dbg_DataObjStr(
  229.     LPDATAOBJECT pdtobj,
  230.     LPTSTR pszBuf)
  231.     {
  232.     if (pdtobj)
  233.         {
  234.         DataObj_QueryPath(pdtobj, pszBuf);
  235.         }
  236.     else
  237.         {
  238.         lstrcpy(pszBuf, TEXT("NULL"));
  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.     }