AsmCode.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 "AsmCode.h"
  18. #ifdef _DEBUG
  19. #define INIT_OP INT3
  20. #else
  21. #define INIT_OP NOP
  22. #endif
  23. ///
  24. /// Constructors / Destructors
  25. ///
  26. NktAsmCode::NktAsmCode(const unsigned int size)
  27. _size = size;
  28. _code = NULL;
  29. _refCount = new size_t;
  30. *_refCount = 1;
  31. if (_size)
  32. _code = (asmcode*)VirtualAlloc(NULL, sizeof(asmcode)*size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  33. if (!_code)
  34. _size = 0;
  35. else
  36. memset(_code, INIT_OP, sizeof(asmcode)*size);
  37. }
  38. NktAsmCode::NktAsmCode(const NktAsmCode& cp)
  39. {
  40. _size = cp._size;
  41. _code = cp._code;
  42. _refCount = cp._refCount;
  43. InterlockedIncrement((LONG*)_refCount);
  44. }
  45. NktAsmCode::~NktAsmCode()
  46. {
  47. if (!_code || !_refCount)
  48. return;
  49. if (InterlockedDecrement((LONG*)_refCount))
  50. return;
  51. VirtualFree(_code, 0, MEM_RELEASE);
  52. _code = NULL;
  53. _size = 0;
  54. delete _refCount;
  55. _refCount = NULL;
  56. }
  57. ///
  58. /// Address
  59. ///
  60. DV_PTR NktAsmCode::GetAddress() const
  61. {
  62. return (DV_PTR) _code;
  63. }
  64. ///
  65. /// Size
  66. ///
  67. SIZE_T NktAsmCode::GetSize() const
  68. {
  69. return _size;
  70. }