www.pudn.com > BAV.v2.rar > MemFileObject.cpp, change:2005-08-20,size:2371b
#include "StdAfx.h"
#include "MemFileObject.h"
CMemFileObject::CMemFileObject(void)
{
m_eObjType = BO_MEM_FILE;
m_hMapFile = NULL;
m_pFile = NULL;
}
CMemFileObject::CMemFileObject(CMemFileObject& cMemFileObj)
{
m_eObjType = BO_MEM_FILE;
m_hFile = INVALID_HANDLE_VALUE;
m_dwObjSize = cMemFileObj.m_dwObjSize;
m_strObjName= cMemFileObj.m_strObjName;
m_hMapFile = NULL;
m_pFile = NULL;
}
CMemFileObject::~CMemFileObject(void)
{
if(m_pFile)
Close();
}
bool CMemFileObject::Open(bool bScan)
{
if(!CFileObject::Open(bScan))
return false;
DWORD dwProtect, dwDesiredAccess;
if(bScan)
{
dwProtect = PAGE_READONLY;
dwDesiredAccess = FILE_MAP_READ;
}
else
{
dwProtect = PAGE_READWRITE;
dwDesiredAccess = FILE_MAP_WRITE;
}
// TODO: If clean virus enlarge the file size, we need calculate and change the dwMaximumSizeLow value.
m_hMapFile = ::CreateFileMapping(m_hFile, NULL, dwProtect, 0, 0, NULL);
if(m_hMapFile==NULL)
{
Close();
return false;
}
m_pFile = static_cast<LPBYTE>( ::MapViewOfFile(m_hMapFile, dwDesiredAccess, 0, 0, NULL) );
if(m_pFile==NULL)
{
Close();
return false;
}
return true;
}
bool CMemFileObject::Close()
{
if(m_pFile)
{
::UnmapViewOfFile(m_pFile);
m_pFile = NULL;
}
if(m_hMapFile)
{
::CloseHandle(m_hMapFile);
m_hMapFile = NULL;
}
return CFileObject::Close();
}
bool CMemFileObject::Compare(IN INT nOffset, IN INT nSize, IN LPBYTE pSignature, IN BAV_SIGN_LOGIC_OPERATION eLogicOp)
{
return Compare(m_pFile+nOffset, nSize, pSignature, eLogicOp);
}
bool CMemFileObject::Compare(IN LPBYTE pData, IN INT nSize, IN LPBYTE pSignature, IN BAV_SIGN_LOGIC_OPERATION eLogicOp)
{
ASSERT(m_eObjType==BO_MEM_FILE);
ASSERT(nSize=MAX_SIGNATURE_LEN);
if(!IsOpened())
{
ASSERT(false);
return false;
}
// Signature position exceed the file size
if(pData<m_pFile || pData>(m_pFile+m_dwObjSize))
{
// not match
return false;
}
int nRet = memcmp(pData, pSignature, nSize);
switch(eLogicOp)
{
case BL_EQUAL:
return nRet==0;
case BL_NOT_EQUAL:
return nRet!=0;
default:
ASSERT(false);
}
return false;
}
bool CMemFileObject::IsOpened()
{
return m_pFile!=NULL;
}
LPBYTE CMemFileObject::GetBuffer()
{
ASSERT(IsOpened());
return m_pFile;
}