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

PlugIns编程

开发平台:

Visual C++

  1. #include "functionwrapper.h"
  2. ///
  3. /// Helpers
  4. ///
  5. #define CP_OBJECT(r) 
  6. _fnc = r._fnc; 
  7. _cc = r._cc; 
  8. _pmSize = r._pmSize;
  9. ///
  10. /// Constructors/Destructors
  11. ///
  12. NktFunctionWrapper::NktFunctionWrapper()
  13. {
  14. _pmSize = 0;
  15. _fnc = NULL;
  16. _cc = bad_cc_;
  17. }
  18. NktFunctionWrapper::NktFunctionWrapper(const void* fnc, int cc, USHORT pmSize)
  19. {
  20. _fnc = fnc;
  21. _cc = static_cast<NktCallingConvention>(cc);
  22. _pmSize = pmSize;
  23. }
  24. NktFunctionWrapper::NktFunctionWrapper(const NktFunctionWrapper& cp)
  25. CP_OBJECT(cp);
  26. }
  27. NktFunctionWrapper& NktFunctionWrapper::operator=(const NktFunctionWrapper& cp)
  28. {
  29. CP_OBJECT(cp);
  30. return *this;
  31. }
  32. ///
  33. /// Getters
  34. ///
  35. const void* NktFunctionWrapper::GetAddress() const
  36. {
  37. return _fnc;
  38. }
  39. int NktFunctionWrapper::GetCallConvention() const
  40. {
  41. return _cc;
  42. }
  43. USHORT NktFunctionWrapper::GetParamSize() const
  44. {
  45. return _pmSize;
  46. }
  47. USHORT NktFunctionWrapper::GetCallerCleanSize() const
  48. {
  49. USHORT ret = 0;
  50. switch(_cc)
  51. {
  52. //case thiscall_com_:
  53. case safecall_:
  54. case stdcall_:
  55. case syscall_:
  56. case thiscall_ms_:
  57. case fastcall_:
  58. //ret = 0;
  59. break;
  60. case cdecl_:
  61. case thiscall_:
  62. case pascal_:
  63. ret = _pmSize;
  64. break;
  65. default:
  66. NODEFAULT;
  67. }
  68. //FIXME {
  69. #pragma message("FIXME: clean size adjusted to REGISTER_SIZE")
  70. if (ret % REGISTER_SIZE)
  71. {
  72. ret /= REGISTER_SIZE;
  73. ret *= REGISTER_SIZE + 1;
  74. }
  75. //FIXME }
  76. return ret;
  77. }
  78. USHORT NktFunctionWrapper::GetCalleeCleanSize() const
  79. {
  80. USHORT ret = 0;
  81. switch(_cc)
  82. {
  83. //case thiscall_com_:
  84. case safecall_:
  85. case stdcall_:
  86. case syscall_:
  87. ret = _pmSize;
  88. break;
  89. case thiscall_ms_:
  90. ret = _pmSize - REGISTER_SIZE;
  91. break;
  92. case fastcall_:
  93. ret = (_pmSize > (REGISTER_SIZE << 1))? _pmSize-(REGISTER_SIZE << 1) : 0;
  94. break;
  95. case cdecl_:
  96. case thiscall_:
  97. case pascal_:
  98. //ret = 0;
  99. break;
  100. default:
  101. NODEFAULT;
  102. }
  103. //FIXME {
  104. #pragma message("FIXME: clean size adjusted to REGISTER_SIZE")
  105. if (ret % REGISTER_SIZE)
  106. {
  107. ret /= REGISTER_SIZE;
  108. ret *= REGISTER_SIZE + 1;
  109. }
  110. //FIXME }
  111. return ret;
  112. }
  113. USHORT NktFunctionWrapper::GetStackParamSize() const
  114. {
  115. USHORT ret = _pmSize;
  116. int dec = (_cc == fastcall_)? 2 : (_cc == thiscall_ms_)? 1 : 0;
  117. while (dec > 0 && ret >= REGISTER_SIZE)
  118. {
  119. ret -= REGISTER_SIZE;
  120. --dec;
  121. }
  122. return ret;
  123. }
  124. ///
  125. /// FunctionWrapper::isValid
  126. ///
  127. bool NktFunctionWrapper::isValid() const
  128. {
  129. return (_fnc != NULL) && (_cc != bad_cc_);
  130. }