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.
 
 
 
 
 
 

148 lines
4.1 KiB

// --------------------------------------------------------------------------------
// ByteBuff.cpp
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// Steven J. Bailey
// --------------------------------------------------------------------------------
#include "pch.hxx"
#include "bytebuff.h"
// --------------------------------------------------------------------------------
// CByteBuffer::CByteBuffer
// --------------------------------------------------------------------------------
CByteBuffer::CByteBuffer(LPBYTE pb /* =NULL */, ULONG cbAlloc /* =0 */, ULONG cb /* =0 */, ULONG i /* =0 */)
{
m_cRef = 1;
m_dwState = 0;
m_cbGrow = BYTEBUFF_GROW;
m_buffer.pb = pb;
m_buffer.pbStatic = pb;
m_buffer.cbAlloc = cbAlloc;
m_buffer.cb = cb;
m_buffer.i = i;
}
// --------------------------------------------------------------------------------
// CByteBuffer::CByteBuffer
// --------------------------------------------------------------------------------
void CByteBuffer::Init(LPBYTE pb, ULONG cbAlloc, ULONG cb, ULONG i)
{
m_buffer.pb = pb;
m_buffer.cb = cb;
m_buffer.i = i;
m_buffer.cbAlloc = cbAlloc;
m_buffer.pbStatic = pb;
}
// --------------------------------------------------------------------------------
// CByteBuffer::CByteBuffer
// --------------------------------------------------------------------------------
CByteBuffer::~CByteBuffer(void)
{
// Free memory if not equal to static
if (m_buffer.pb != m_buffer.pbStatic)
g_pMalloc->Free(m_buffer.pb);
}
// --------------------------------------------------------------------------------
// CByteBuffer::Release
// --------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CByteBuffer::Release(void)
{
if (0 != --m_cRef)
return m_cRef;
delete this;
return 0;
}
// --------------------------------------------------------------------------------
// CByteBuffer::_HrRealloc
// --------------------------------------------------------------------------------
HRESULT CByteBuffer::_HrRealloc(DWORD cbAlloc)
{
// Locals
HRESULT hr=S_OK;
LPBYTE pbAlloc=NULL;
// This should have been checked
Assert(cbAlloc > m_buffer.cbAlloc);
// Currently using static ?
if (m_buffer.pb == m_buffer.pbStatic)
{
// Allocate
CHECKALLOC(pbAlloc = (LPBYTE)g_pMalloc->Alloc(cbAlloc));
// Copy Data into pbAlloc
CopyMemory(pbAlloc, m_buffer.pb, min(cbAlloc, m_buffer.cb));
}
// Otherwise, realloc
else
{
// Reallocate
CHECKALLOC(pbAlloc = (LPBYTE)g_pMalloc->Realloc(m_buffer.pb, cbAlloc));
}
// Save pbAlloc
m_buffer.pb = pbAlloc;
// Save cbAlloc
m_buffer.cbAlloc = cbAlloc;
exit:
// Done
return hr;
}
// --------------------------------------------------------------------------------
// CByteBuffer::Append
// --------------------------------------------------------------------------------
HRESULT CByteBuffer::Append(LPBYTE pbData, ULONG cbData)
{
// Locals
HRESULT hr=S_OK;
// Get Bigger and need to allocate
if (m_buffer.cb + cbData > m_buffer.cbAlloc)
{
// Realloc
CHECKHR(hr = _HrRealloc(m_buffer.cb + cbData + m_cbGrow));
}
// Append the data
CopyMemory(m_buffer.pb + m_buffer.cb, pbData, cbData);
// Save Size
m_buffer.cb += cbData;
exit:
// Done
return hr;
}
// --------------------------------------------------------------------------------
// CByteBuffer::SetSize
// --------------------------------------------------------------------------------
HRESULT CByteBuffer::SetSize(DWORD cb)
{
// Locals
HRESULT hr=S_OK;
// Get Bigger and need to allocate
if (cb > m_buffer.cb && cb > m_buffer.cbAlloc)
{
// Realloc
CHECKHR(hr = _HrRealloc(cb + m_cbGrow));
}
// Save Size
m_buffer.cb = cb;
// Adjust Index
if (m_buffer.i > cb)
m_buffer.i = cb;
exit:
// Done
return hr;
}