Leaked source code of windows server 2003
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.
 
 
 
 
 
 

369 lines
7.8 KiB

//
// smblock.h
//
#ifndef SMBLOCK_H
#define SMBLOCK_H
#include "private.h"
#include "cicmutex.h"
#define SZSHAREDFILEMAP __TEXT("SFM.")
#define SZSHAREDMUTEX __TEXT("MUTEX.")
class CSharedHeap9x;
//////////////////////////////////////////////////////////////////////////////
//
// instead of wsprintf
//
//////////////////////////////////////////////////////////////////////////////
#define ONEDWORDCCHFORSETNAME 9
__inline BOOL SetName(TCHAR *pszDst, UINT cchDst, const TCHAR *pszSrc, DWORD dw)
{
TCHAR *psz;
StringCchCopy(pszDst, cchDst, pszSrc);
psz = pszDst + lstrlen(pszDst);
if (cchDst < (UINT)(psz - pszDst)/sizeof(TCHAR) + ONEDWORDCCHFORSETNAME)
{
Assert(0);
return FALSE;
}
while (dw)
{
*psz = 'A' + ((char)dw & 0x0F);
dw >>= 4;
psz++;
}
*psz = '\0';
return TRUE;
}
__inline BOOL SetName2(TCHAR *pszDst, UINT cchDst, const TCHAR *pszSrc, DWORD dw, DWORD dw2, DWORD dw3 = 0)
{
TCHAR *psz;
StringCchCopy(pszDst, cchDst, pszSrc);
psz = pszDst + lstrlen(pszDst);
if (cchDst < (UINT)(psz - pszDst)/sizeof(TCHAR) +
ONEDWORDCCHFORSETNAME * 2 +
(dw3 ? ONEDWORDCCHFORSETNAME : 0))
{
Assert(0);
return FALSE;
}
while (dw)
{
*psz = 'A' + ((char)dw & 0x0F);
dw >>= 4;
psz++;
}
*psz = '.';
psz++;
while (dw2)
{
*psz = 'A' + ((char)dw2 & 0x0F);
dw2 >>= 4;
psz++;
}
if (dw3)
{
*psz = '.';
psz++;
while (dw3)
{
*psz = 'A' + ((char)dw3 & 0x0F);
dw3 >>= 4;
psz++;
}
}
*psz = '\0';
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
//
// func
//
//////////////////////////////////////////////////////////////////////////////
CSharedHeap *EnsureSharedHeap(SYSTHREAD *psfn);
void DestroySharedHeap(SYSTHREAD *psfn);
CSharedBlock *EnsureSharedBlockForThread(SYSTHREAD *psfn, DWORD dwThreadId);
void DestroySharedBlocks(SYSTHREAD *psfn);
//////////////////////////////////////////////////////////////////////////////
//
// CSharedBlock
//
//////////////////////////////////////////////////////////////////////////////
class CSharedBlock
{
public:
CSharedBlock(const char *pszPrefix, DWORD dwThread)
{
_pszPrefix = pszPrefix;
_dwThread = dwThread;
}
virtual ~CSharedBlock()
{
_mutex.Uninit();
}
virtual HRESULT Init(SECURITY_DESCRIPTOR *pSecDes,
ULONG ulSize,
ULONG ulCommitSize,
void *pvBase,
BOOL fCreate,
BOOL *pfAlreadyExists = NULL) = 0;
virtual HRESULT Commit(ULONG ulNewSize) = 0;
virtual HRESULT Reset() = 0;
void *GetBase() {return _pvBase;}
virtual void *GetPtr(ULONG ulOffset) = 0;
virtual void *GetPtrFromBlockId(ULONG ulBlockId) = 0;
virtual BOOL IsValidPtr(void *pv) = 0;
ULONG GetOffset(void *pv)
{
return (ULONG)((BYTE *)pv - (BYTE *)_pvBase);
}
ULONG GetCommitSize()
{
return _ulCommitSize;
}
ULONG GetInitCommitSize()
{
return _ulInitCommitSize;
}
DWORD GetThreadId()
{
return _dwThread;
}
CCicMutex *GetMutex()
{
return &_mutex;
}
protected:
void *_pvBase;
ULONG _ulCommitSize;
ULONG _ulInitCommitSize;
CCicMutex _mutex;
DWORD _dwThread;
const char *_pszPrefix;
};
//////////////////////////////////////////////////////////////////////////////
//
// CSharedBlockNT
//
//////////////////////////////////////////////////////////////////////////////
class CSharedBlockNT : public CSharedBlock
{
public:
CSharedBlockNT(const char *pszPrefix, DWORD dwThread, BOOL fUseUniqueName);
~CSharedBlockNT();
HRESULT Init(SECURITY_DESCRIPTOR *pSecDes,
ULONG ulSize,
ULONG ulCommitSize,
void *pvBase,
BOOL fCreate,
BOOL *pfAlreadyExists);
HRESULT Commit(ULONG ulNewSize);
HRESULT Reset();
void *GetPtrFromBlockId(ULONG ulBlockId);
void *GetPtr(ULONG ulOffset)
{
return (void *)(((BYTE *)_pvBase) + ulOffset);
}
BOOL IsValidPtr(void *pv)
{
if (pv < _pvBase)
return FALSE;
if (pv > (BYTE *)_pvBase + _ulCommitSize)
return FALSE;
return TRUE;
}
private:
HANDLE _hfm;
BOOL _fUseUniqueName;
};
//////////////////////////////////////////////////////////////////////////////
//
// CSharedBlock9x
//
//////////////////////////////////////////////////////////////////////////////
#ifndef _WIN64
class CSharedBlock9x : public CSharedBlock
{
public:
CSharedBlock9x(const char *pszPrefix, DWORD dwThread);
~CSharedBlock9x();
HRESULT Init(SECURITY_DESCRIPTOR *pSecDes,
ULONG ulSize,
ULONG ulCommitSize,
void *pvBase,
BOOL fCreate,
BOOL *pfAlreadyExists);
HRESULT Commit(ULONG ulNewSize);
HRESULT Reset();
void *GetPtrFromBlockId(ULONG ulOffset)
{
Assert(ulOffset >= 0x80000000);
return (void *)ulOffset;
}
void *GetPtr(ULONG ulOffset)
{
return (void *)(((BYTE *)_pvBase) + ulOffset);
}
private:
friend CSharedHeap9x;
BOOL IsValidPtr(void *pv)
{
if (!_hsheap || !pv)
return FALSE;
// return HeapValid(_hsheap, 0, pv);
return TRUE;
}
HANDLE _hsheap;
};
#endif // !_WIN64
//////////////////////////////////////////////////////////////////////////////
//
// CShraedHeap
//
//////////////////////////////////////////////////////////////////////////////
#define BLK_FREE 0x01
class CSharedHeap
{
public:
CSharedHeap(DWORD dwThread);
~CSharedHeap();
HRESULT Init(SECURITY_DESCRIPTOR *pSecDes,
ULONG ulSize,
ULONG ulCommitSize);
void *Alloc(ULONG ulSize);
#ifdef LATER
void *Realloc(void *pv, ULONG ulSize);
#endif
BOOL Free(void *pv);
ULONG GetBlockId(void *pv)
{
#ifndef _WIN64
if (!IsOnNT())
return (ULONG)pv;
#endif
return _psb->GetOffset(pv);
}
CSharedBlock *GetBlock()
{
return _psb;
}
static BOOL IsValidBlock(CSharedBlock *psb, void *pv);
typedef struct tag_HEAPHDR {
ULONG ulList;
ULONG ulSize;
} HEAPHDR;
private:
void InitHeap(ULONG ulInitSize);
typedef struct tag_BLOCKHDR {
ULONG ulPrev;
ULONG ulNext;
ULONG ulSize;
ULONG ulFlags;
ULONG u[4];
ULONG GetSize()
{
return ulSize;
}
void SetSize(ULONG ulNewSize)
{
Assert(!(ulNewSize & 0x001f));
ulSize = ulNewSize;
}
void SetFree(BOOL fFree)
{
if (fFree)
ulFlags |= BLK_FREE;
else
ulFlags &= ~BLK_FREE;
}
BOOL IsFree()
{
return (ulFlags & BLK_FREE) ? TRUE : FALSE;
}
void *GetPtr()
{
BYTE *pb = (BYTE *)this;
return pb + sizeof(tag_BLOCKHDR);
}
} BLOCKHDR;
void MergeFreeBlock(BLOCKHDR *pbhdr);
#ifdef DEBUG
void _dbg_HeapCheck();
#else
void _dbg_HeapCheck() {};
#endif
CSharedBlock *_psb;
DWORD _dwThread;
};
#endif // SMBLOCK_H