windows-nt/Source/XPSP1/NT/net/mmc/wins/memmngr.h
2020-09-26 16:20:57 +08:00

98 lines
2.5 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
/**********************************************************************/
/*
memmngr.cpp
memory manager for the WINS db object
FILE HISTORY:
Oct 13 1997 EricDav Created
*/
#ifndef _MEMMNGR_H
#define _MEMMNGR_H
#include "afxmt.h"
// the format of the record name is as follows:
// Byte Description
// 0 - 15 are for the name
// 16 reserved, must be 0
// 17 internal flags, the two low bits store the RECTYPE
// defined in WINSINTF_RECTYPE_E
// The upper 4 bits are reserved for internal use
// 18 WINS flags (active, static, tombstoned)
// 19 NameLength
// 20 Static Record Type, WINSDB_UNIQUe etc
// byte 15 is assumed to be the type
typedef enum _WINSDB_INTERNAL
{
WINSDB_INTERNAL_LONG_NAME = 0x40,
WINSDB_INTERNAL_DELETED = 0x80
} WINSDB_INTERNAL;
typedef struct _WinsDBRecord
{
char szRecordName [21];
DWORD dwExpiration;
DWORD_PTR dwIpAdd;
LARGE_INTEGER liVersion;
DWORD dwOwner;
} WinsDBRecord, * LPWINSDBRECORD;
#define IS_WINREC_LONGNAME(wRecord) ((wRecord)->dwNameLen > 16)
#define IS_DBREC_LONGNAME(wdbRecord) ((wdbRecord)->szRecordName[17] & WINSDB_INTERNAL_LONG_NAME)
#define RECORDS_PER_BLOCK 4080
#define RECORD_SIZE sizeof(WinsDBRecord) // bytes
#define BLOCK_SIZE RECORDS_PER_BLOCK * RECORD_SIZE
typedef CArray<HGLOBAL, HGLOBAL> BlockArray;
class CMemoryManager
{
public:
CMemoryManager();
~CMemoryManager();
private:
BlockArray m_BlockArray;
public:
BlockArray* GetBlockArray()
{
return &m_BlockArray;
};
// Free's up all memory and pre-allocates one block
HRESULT Initialize();
// Free's up all memory
HRESULT Reset();
// verifies the given HROW is valid
BOOL IsValidHRow(HROW hrow);
// allocates a new block of memory
HRESULT Allocate();
// adds the record in the internal structure format
HRESULT AddData(const WinsRecord & wRecord, LPHROW phrow);
HRESULT GetData(HROW hrow, LPWINSRECORD pWinsRecord);
HRESULT Delete(HROW hrow);
private:
LPWINSDBRECORD m_hrowCurrent;
CCriticalSection m_cs;
HANDLE m_hHeap;
};
extern void WinsRecordToWinsDbRecord(HANDLE hHeap, const WinsRecord & wRecord, const LPWINSDBRECORD pRec);
extern void WinsDbRecordToWinsRecord(const LPWINSDBRECORD pDbRec, LPWINSRECORD pWRec);
#endif //_MEMMNGR__