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.

101 lines
2.9 KiB

  1. //
  2. // Created by TiborL 06/01/97
  3. //
  4. #include "windows.h"
  5. #include "ehassert.h"
  6. #include "ehdata.h" // Declarations of all types used for EH
  7. #include "ehstate.h"
  8. #include "eh.h"
  9. #include "ehhooks.h"
  10. #include "trnsctrl.h"
  11. #pragma hdrstop
  12. __ehstate_t __StateFromIp(
  13. FuncInfo *pFuncInfo,
  14. DispatcherContext *pDC,
  15. __int64 Ip
  16. ) {
  17. unsigned int index; // loop control variable
  18. unsigned int nIPMapEntry; // # of IpMapEntry; must be > 0
  19. DASSERT(pFuncInfo != NULL);
  20. nIPMapEntry = FUNC_NIPMAPENT(*pFuncInfo);
  21. DASSERT(FUNC_IPMAP(*pFuncInfo, pDC->ImageBase) != NULL);
  22. for (index = 0; index < nIPMapEntry; index++) {
  23. IptoStateMapEntry *pIPtoStateMap = FUNC_PIPTOSTATE(*pFuncInfo, index, pDC->ImageBase);
  24. if( Ip < (pDC->ImageBase + pIPtoStateMap->Ip) ) {
  25. break;
  26. }
  27. }
  28. if (index == 0) {
  29. // We are at the first entry, could be an error
  30. return EH_EMPTY_STATE;
  31. }
  32. // We over-shot one iteration; return state from the previous slot
  33. return FUNC_IPTOSTATE(*pFuncInfo, index - 1, pDC->ImageBase).State;
  34. }
  35. __ehstate_t __StateFromControlPc(
  36. FuncInfo *pFuncInfo,
  37. DispatcherContext *pDC
  38. ) {
  39. return __StateFromIp(pFuncInfo, pDC, pDC->ControlPc);
  40. }
  41. //
  42. // This routine is a replacement for the corresponding macro in 'ehdata.h'
  43. //
  44. __ehstate_t __GetCurrentState(
  45. EHRegistrationNode *pFrame,
  46. DispatcherContext *pDC,
  47. FuncInfo *pFuncInfo
  48. ) {
  49. if( UNWINDSTATE(pFrame->MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) == -2 ) {
  50. return __StateFromControlPc(pFuncInfo, pDC);
  51. }
  52. else {
  53. return UNWINDSTATE(pFrame->MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo));
  54. }
  55. }
  56. VOID __SetState(
  57. EHRegistrationNode *pRN,
  58. DispatcherContext *pDC,
  59. FuncInfo *pFuncInfo,
  60. __ehstate_t newState
  61. ){
  62. UNWINDSTATE(pRN->MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) = newState;
  63. }
  64. VOID __SetUnwindTryBlock(
  65. EHRegistrationNode *pRN,
  66. DispatcherContext *pDC,
  67. FuncInfo *pFuncInfo,
  68. INT curState
  69. ){
  70. EHRegistrationNode EstablisherFramePointers;
  71. _GetEstablisherFrame(pRN, pDC, pFuncInfo, &EstablisherFramePointers);
  72. if( curState > UNWINDTRYBLOCK(EstablisherFramePointers.MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) ) {
  73. UNWINDTRYBLOCK(EstablisherFramePointers.MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) = curState;
  74. }
  75. }
  76. INT __GetUnwindTryBlock(
  77. EHRegistrationNode *pRN,
  78. DispatcherContext *pDC,
  79. FuncInfo *pFuncInfo
  80. ){
  81. EHRegistrationNode EstablisherFramePointers;
  82. _GetEstablisherFrame(pRN, pDC, pFuncInfo, &EstablisherFramePointers);
  83. return UNWINDTRYBLOCK(EstablisherFramePointers.MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo));
  84. }