Trampoline.cpp
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:2k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. /*
  2. *
  3. *  This file is
  4. *    Copyright (C) 2006-2008 Nektra S.A.
  5. *  
  6. *  This program is free software; you can redistribute it and/or modify
  7. *  it under the terms of the GNU Lesser General Public License as published by
  8. *  the Free Software Foundation; either version 2, or (at your option)
  9. *  any later version.
  10. *  
  11. *  This program is distributed in the hope that it will be useful,
  12. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. *  GNU General Public License for more details.
  15. *  
  16. */
  17. #include "Trampoline.h"
  18. ///
  19. /// Constructors / Destructor
  20. ///
  21. NktTrampoline::NktTrampoline(const NktTrampoline& cp)
  22. : NktVirtualCode(cp) 
  23. _activeCallCount = cp._activeCallCount; 
  24. _cleanSize = cp._cleanSize;
  25. _tag = cp._tag;
  26. }
  27. NktTrampoline::NktTrampoline(unsigned short cleanSize)
  28. _cleanSize = cleanSize;
  29. _activeCallCount = 0; 
  30. _tag = 0;
  31. }
  32. ///
  33. /// CTrampoline::Tag:
  34. ///
  35. INT_PTR NktTrampoline::GetTag() const
  36. return _tag;
  37. }
  38. void NktTrampoline::SetTag(INT_PTR tag)
  39. {
  40. _tag = tag;
  41. }
  42. ///
  43. /// CTrampoline::GetActiveCallCount
  44. ///
  45. UINT NktTrampoline::GetActiveCallCount() const
  46. {
  47. return _activeCallCount;
  48. }
  49. ///
  50. /// CTrampoline::GetCleanSize
  51. ///
  52. USHORT NktTrampoline::GetCleanSize() const
  53. {
  54. return _cleanSize;
  55. }
  56. ///
  57. /// CTrampoline::Initialize
  58. ///
  59. void NktTrampoline::Initialize(const NktFunctionWrapper& handler, LPCVOID pThis)
  60. {
  61. _ASSERT(!_pivot);
  62. //Increase counter
  63. Append(LOCK); Append(INC_MEM, (UINT)&_activeCallCount);
  64. //Save registers + flags
  65. Append(PUSHAD);
  66. Append(PUSHFD);
  67. //Save TEB address
  68. Append(MOV_EAX_FS, TEB_OFFSET);
  69. //Save LastError
  70. Append((asmcodew)0x408b, (unsigned char)0x34); // ASM: mov eax, [eax+34h]
  71. Append(PUSH_EAX);
  72. //Save ESP in EDX
  73. //FIXME: A function that do not preserve EDX could smash our stack.
  74. //FIX?: Read ESP from pushed registers.
  75. Append(MOV_EDX_ESP);
  76. //Save Tag
  77. Append(PUSH_INM, (UINT)_tag);
  78. //Create call to Handler
  79. NktUtils::CreateCall(handler, *this, pThis);
  80. //Restore UPDATED registers + flags + lastError + stack
  81. Append(POP_EDX);
  82. Append(MOV_EAX_FS, TEB_OFFSET);
  83. Append(ADD_EAX, TEB_LASTERROR);
  84. Append(MOV_EAX_PTR_EDX);
  85. Append(POPFD);
  86. Append(POPAD);
  87. //Decrease counter
  88. Append(LOCK); Append(DEC_MEM, (UINT)&_activeCallCount);
  89. //Clear stack and return
  90. (_cleanSize)? Append(RET_CLEAN, _cleanSize) : Append(RET);
  91. }