MemFileObject.cpp
上传用户:chaoyu
上传日期:2013-04-28
资源大小:18k
文件大小:2k
源码类别:

杀毒

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "MemFileObject.h"
  3. CMemFileObject::CMemFileObject(void)
  4. {
  5. m_eObjType = BO_MEM_FILE;
  6. m_hMapFile = NULL;
  7. m_pFile = NULL;
  8. }
  9. CMemFileObject::CMemFileObject(CMemFileObject& cMemFileObj)
  10. {
  11. m_eObjType = BO_MEM_FILE;
  12. m_hFile = INVALID_HANDLE_VALUE;
  13. m_dwObjSize = cMemFileObj.m_dwObjSize;
  14. m_strObjName= cMemFileObj.m_strObjName;
  15. m_hMapFile = NULL;
  16. m_pFile = NULL;
  17. }
  18. CMemFileObject::~CMemFileObject(void)
  19. {
  20. if(m_pFile)
  21. Close();
  22. }
  23. bool CMemFileObject::Open(bool bScan)
  24. {
  25. if(!CFileObject::Open(bScan))
  26. return false;
  27. DWORD dwProtect, dwDesiredAccess;
  28. if(bScan)
  29. {
  30. dwProtect = PAGE_READONLY;
  31. dwDesiredAccess = FILE_MAP_READ;
  32. }
  33. else
  34. {
  35. dwProtect = PAGE_READWRITE;
  36. dwDesiredAccess = FILE_MAP_WRITE;
  37. }
  38. // TODO: If clean virus enlarge the file size, we need calculate and change the dwMaximumSizeLow value.
  39. m_hMapFile = ::CreateFileMapping(m_hFile, NULL, dwProtect, 0, 0, NULL);
  40. if(m_hMapFile==NULL)
  41. {
  42. Close();
  43. return false;
  44. }
  45. m_pFile = static_cast<LPBYTE>( ::MapViewOfFile(m_hMapFile, dwDesiredAccess, 0, 0, NULL) );
  46. if(m_pFile==NULL)
  47. {
  48. Close();
  49. return false;
  50. }
  51. return true;
  52. }
  53. bool CMemFileObject::Close()
  54. {
  55. if(m_pFile)
  56. {
  57. ::UnmapViewOfFile(m_pFile);
  58. m_pFile = NULL;
  59. }
  60. if(m_hMapFile)
  61. {
  62. ::CloseHandle(m_hMapFile);
  63. m_hMapFile = NULL;
  64. }
  65. return CFileObject::Close();
  66. }
  67. bool CMemFileObject::Compare(IN INT nOffset, IN INT nSize, IN LPBYTE pSignature, IN BAV_SIGN_LOGIC_OPERATION eLogicOp)
  68. {
  69. return Compare(m_pFile+nOffset, nSize, pSignature, eLogicOp);
  70. }
  71. bool CMemFileObject::Compare(IN LPBYTE pData, IN INT nSize, IN LPBYTE pSignature, IN BAV_SIGN_LOGIC_OPERATION eLogicOp)
  72. {
  73. ASSERT(m_eObjType==BO_MEM_FILE);
  74. ASSERT(nSize<=MAX_SIGNATURE_LEN);
  75. if(!IsOpened())
  76. {
  77. ASSERT(false);
  78. return false;
  79. }
  80. // Signature position exceed the file size
  81. if(pData<m_pFile || pData>(m_pFile+m_dwObjSize))
  82. {
  83. // not match
  84. return false;
  85. }
  86. int nRet = memcmp(pData, pSignature, nSize);
  87. switch(eLogicOp)
  88. {
  89. case BL_EQUAL:
  90. return nRet==0;
  91. case BL_NOT_EQUAL:
  92. return nRet!=0;
  93. default:
  94. ASSERT(false);
  95. }
  96. return false;
  97. }
  98. bool CMemFileObject::IsOpened()
  99. {
  100. return m_pFile!=NULL;
  101. }
  102. LPBYTE CMemFileObject::GetBuffer()
  103. {
  104. ASSERT(IsOpened());
  105. return m_pFile;
  106. }