dbutil.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 3k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "priv.h"
  2. //***   dbutil.cpp -- debug helpers
  3. // DESCRIPTION
  4. //  this file has the shared-source 'master' implementation.  it is
  5. // #included in each DLL that uses it.
  6. //  clients do something like:
  7. //      #include "priv.h"   // for types, ASSERT, DM_*, DF_*, etc.
  8. //      #include "../lib/dbutil.cpp"
  9. #ifdef DEBUG // {
  10. #define SZ_DEBUGINI         "ccshell.ini"
  11. #define SZ_DEBUGSECTION     "shelldbg"
  12. #define SZ_MODULE           "SHELLDBG"
  13. #define DECLARE_DEBUG
  14. #include <debug.h>
  15. #if ( _X86_)
  16. #if 0
  17. // (These are deliberately CHAR)
  18. CHAR const FAR c_szNull[] = "";
  19. CHAR const FAR c_szZero[] = "0";
  20. CHAR const FAR c_szIniKeyBreakFlags[] = "BreakFlags";
  21. CHAR const FAR c_szIniKeyTraceFlags[] = "TraceFlags";
  22. CHAR const FAR c_szIniKeyFuncTraceFlags[] = "FuncTraceFlags";
  23. CHAR const FAR c_szIniKeyDumpFlags[] = "DumpFlags";
  24. CHAR const FAR c_szIniKeyProtoFlags[] = "Prototype";
  25. #endif
  26. // warning: these macros assume we have an ebp-linked chain.  for debug we do.
  27. #define BP_GETOLDBP(pbp)    (*((int *)(pbp) + 0))
  28. #define BP_GETRET(pbp)      (*((int *)(pbp) + 1))
  29. //***   DBGetStackBack -- walk stack frame
  30. // #if 0 w/ sanity checks #endif
  31. // ENTRY/EXIT
  32. //  pfp         INOUT ptr to frame ptr (IN:starting, OUT:ending)
  33. //  pstkback    OUT:fp/ret pairs, IN:optional size/addr pairs for sanity check
  34. //  nstkback    ARRAYSIZE(pstckback)
  35. //  #if 0
  36. //  ncheck      # of IN pstkback size/addr sanity-check pairs
  37. //  #endif
  38. //  n           (return) # of frames successfully walked
  39. // DESCRIPTION
  40. //  fills in OUT pstckback w/ backtrace info for nstckback frames.
  41. //  #if 0
  42. //  if ncheck > 0, makes sure that initial backtrace entries are in the
  43. //  range of the function specified by the IN size/addr pairs in pstkback.
  44. //  #endif
  45. // NOTES
  46. //  BUGBUG not sure if we return the right pfp' value (untested)
  47. int DBGetStackBack(int *pfp, struct DBstkback *pstkback, int nstkback /*,int nchk*/)
  48. {
  49.     int fp = *pfp;
  50.     int ret;
  51.     int i = 0;
  52.     __try {
  53.         for (; i < nstkback; i++, pstkback++) {
  54.             ret = BP_GETRET(fp);
  55. #if 0
  56.             if (i < ncheck && pstkback->ret != 0) {
  57.                 ASSERT(pstkback->fp == 0 || pstkback->fp == -1 || pstkback->fp <= 512);
  58.                 if (!(pstkback->ret <= ret && ret <= pstkback->ret + pstkback->fp)) {
  59.                     // constraint violated
  60.                     break;
  61.                 }
  62.             }
  63. #endif
  64.             fp = BP_GETOLDBP(fp);
  65.             pstkback->ret = ret;
  66.             pstkback->fp = fp;
  67.         }
  68.     }
  69.     __except(EXCEPTION_EXECUTE_HANDLER) {
  70.         TraceMsg(TF_ALWAYS, "atm: GPF");
  71.         // just use last 'ret' we had
  72.     }
  73.     *pfp = fp;
  74.     return i;
  75. }
  76. #endif
  77. //***   SearchDW -- scan for DWORD in buffer
  78. // ENTRY/EXIT
  79. //  pdwBuf  buffer
  80. //  cbBuf   size of buffer in *bytes* (*not* DWORDs)
  81. //  dwVal   DWORD we're looking for
  82. //  dOff    (return) byte offset in buffer; o.w. -1 if not found
  83. //
  84. int SearchDW(DWORD *pdwBuf, int cbBuf, DWORD dwVal)
  85. {
  86.     int dOff;
  87.     for (dOff = 0; dOff < cbBuf; dOff += SIZEOF(DWORD), pdwBuf++) {
  88.         if (*pdwBuf == dwVal)
  89.             return dOff;
  90.     }
  91.     return -1;
  92. }
  93. #endif // }