windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/roswell/heap.h

97 lines
2.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#ifndef __A51_HEAP__H_
#define __A51_HEAP__H_
#include <lock.h>
#include <absfile.h>
typedef DWORD TOffset;
#define ROSWELL_INVALID_OFFSET -1
struct CRecordInfo
{
DWORD m_dwIndex;
TOffset m_nOffset;
CRecordInfo(DWORD dwIndex, TOffset nOffset)
: m_dwIndex(dwIndex), m_nOffset(nOffset)
{}
};
class CFileHeap
{
public:
CFileHeap()
: m_bInit(FALSE),
// m_hTimerQueue(NULL), m_hTrimRequest(NULL),
m_pMainFile(NULL), m_pFreeFile(NULL)
{}
virtual ~CFileHeap();
long Initialize(CAbstractFileSource* pSource,
LPCWSTR wszFileNameBase);
long Uninitialize();
long Allocate(DWORD dwLength, TOffset* pnOffset);
long FreeAllocation(TOffset nOffset, DWORD dwLength);
long ReadBytes(TOffset nOffset, BYTE* pBuffer, DWORD dwLength);
long WriteBytes(TOffset nOffset, BYTE* pBuffer, DWORD dwLength);
long InvalidateCache();
public:
DWORD GetFileLength();
long FindNextFree(TOffset nCurrentOffset, TOffset* pnNextFreeOffset,
DWORD* pdwNextFreeLength);
protected:
BOOL m_bInit;
CCritSec m_cs;
CAbstractFile* m_pMainFile;
CAbstractFile* m_pFreeFile;
public:
typedef std::multimap<DWORD, CRecordInfo> TFreeMap;
typedef TFreeMap::iterator TFreeIterator;
typedef TFreeMap::value_type TFreeValue;
typedef std::map<TOffset, DWORD> TFreeOffsetMap;
typedef TFreeOffsetMap::iterator TFreeOffsetIterator;
typedef TFreeOffsetMap::value_type TFreeOffsetValue;
// for the dump utility
TFreeOffsetMap& GetFreeOffsetMap() {return m_mapFreeOffset;}
protected:
TFreeMap m_mapFree;
TFreeOffsetMap m_mapFreeOffset;
// HANDLE m_hTimerQueue;
// HANDLE m_hTrimRequest;
protected:
DWORD GetFreeListRecordSize();
TFreeOffsetIterator GetOffsetIteratorFromFree(TFreeIterator itFree);
TFreeIterator GetFreeIteratorFromOffset(TFreeOffsetIterator itOffset);
long InsertFreeBlock(TOffset nOffset, DWORD dwLength);
long EraseFreeBlockByFreeIt(TFreeIterator itFree);
long EraseFreeBlockByOffsetIt(TFreeOffsetIterator itFreeOffset);
long EraseFreeBlock(TFreeIterator itFree, TFreeOffsetIterator itOffset);
long ReplaceFreeBlockByFreeIt(TFreeIterator itFree, TOffset nOffset,
DWORD dwSize);
long ReplaceFreeBlockByOffsetIt(TFreeOffsetIterator itFreeOffset,
TOffset nOffset, DWORD dwSize);
long ReplaceFreeBlock(TFreeIterator itFree, TFreeOffsetIterator itOffset,
TOffset nOffset, DWORD dwSize);
long WriteAllocationRecordToDisk(const CRecordInfo& Info, DWORD dwSize);
long WriteToFreeFile(TOffset nOffset, BYTE* pBuffer, DWORD dwLength);
long ReadFromFreeFile(TOffset nOffset, BYTE* pBuffer, DWORD dwLength);
long ReadFreeList();
};
#endif