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.
 
 
 
 
 
 

133 lines
2.8 KiB

#ifndef _HEADERBUFFER_HXX_
#define _HEADERBUFFER_HXX_
#define BUFFER_MIN_SIZE 256
// disable warning on 0 sized array
#pragma warning( push )
#pragma warning( disable : 4200 )
struct BUFFER_LINK
{
BUFFER_LINK * _pNext;
DWORD _cbSize;
DWORD _cbOffset;
CHAR _pchBuffer[ 0 ];
};
#pragma warning( pop )
class IRTL_DLLEXP CHUNK_BUFFER
{
public:
CHUNK_BUFFER()
{
Initialize();
}
~CHUNK_BUFFER()
{
FreeAllAllocatedSpace();
}
VOID
FreeAllAllocatedSpace(
VOID
)
{
BUFFER_LINK * pCursor = _pBufferHead->_pNext;
BUFFER_LINK * pNext;
while( pCursor != NULL )
{
//
// always skip first block because it is not dynamically allocated
//
pNext = pCursor->_pNext;
LocalFree( pCursor );
pCursor = pNext;
}
Initialize();
}
HRESULT
AllocateSpace(
LPWSTR pszHeaderValue,
DWORD cchHeaderValue,
LPWSTR * ppszBuffer
);
HRESULT
AllocateSpace(
CHAR * pszHeaderValue,
DWORD cchHeaderValue,
CHAR * * ppszBuffer
);
HRESULT
AllocateSpace(
DWORD cbSize,
PWSTR * ppvBuffer
);
HRESULT
AllocateSpace(
DWORD cbSize,
PCHAR * ppvBuffer
);
HRESULT
AllocateSpace(
DWORD cbSize,
PVOID * ppvBuffer
);
DWORD
QueryHeapAllocCount(
VOID
)
/*++
Routine Description:
return number of allocations for chunk buffer that couldn't be handled
internally and had to go to heap
Arguments:
Return Value:
DWORD
--*/
{
return _dwHeapAllocCount;
}
private:
HRESULT
AddNewBlock(
DWORD cbSize
);
VOID
Initialize(
VOID
)
{
_dwHeapAllocCount = 0;
_pBufferHead = (BUFFER_LINK*) _rgInlineBuffer;
_pBufferHead->_pNext = NULL;
_pBufferHead->_cbSize = sizeof( _rgInlineBuffer ) - sizeof( BUFFER_LINK );
_pBufferHead->_cbOffset = 0;
_pBufferCurrent = _pBufferHead;
}
BUFFER_LINK * _pBufferHead;
BUFFER_LINK * _pBufferCurrent;
BYTE _rgInlineBuffer[ BUFFER_MIN_SIZE ];
DWORD _dwHeapAllocCount;
};
#endif