Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/**********************************************************************/ /** 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__
|