2025-04-06 19:35:20 +08:00
|
|
|
|
#ifdef _WIN32
|
2019-01-05 20:21:43 +08:00
|
|
|
|
#include "StdAfx.h"
|
2025-04-06 19:35:20 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
#include "Buffer.h"
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define U_PAGE_ALIGNMENT 3
|
|
|
|
|
|
#define F_PAGE_ALIGNMENT 3.0
|
2019-01-10 19:35:03 +08:00
|
|
|
|
|
|
|
|
|
|
CBuffer::CBuffer()
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_ulMaxLength = 0;
|
|
|
|
|
|
|
|
|
|
|
|
m_Ptr = m_Base = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CBuffer::~CBuffer(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_Base)
|
|
|
|
|
|
{
|
2025-04-06 19:35:20 +08:00
|
|
|
|
MVirtualFree(m_Base, 0, MEM_RELEASE);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
m_Base = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_Base = m_Ptr = NULL;
|
|
|
|
|
|
m_ulMaxLength = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength)
|
|
|
|
|
|
{
|
2024-12-28 17:14:31 +08:00
|
|
|
|
if (ulLength > m_ulMaxLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG len = m_Ptr - m_Base;
|
2024-12-28 17:14:31 +08:00
|
|
|
|
if (ulLength > len)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-28 17:14:31 +08:00
|
|
|
|
ulLength = len;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (ulLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
CopyMemory(Buffer,m_Base,ulLength);
|
|
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
m_Ptr -= ulLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
DeAllocateBuffer(m_Ptr - m_Base);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
return ulLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
// <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С
|
|
|
|
|
|
VOID CBuffer::DeAllocateBuffer(ULONG ulLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
int len = m_Ptr - m_Base;
|
2024-12-28 17:14:31 +08:00
|
|
|
|
if (ulLength < len)
|
|
|
|
|
|
return;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG ulNewMaxLength = ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
if (m_ulMaxLength <= ulNewMaxLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-28 17:14:31 +08:00
|
|
|
|
return;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2025-04-06 19:35:20 +08:00
|
|
|
|
PBYTE NewBase = (PBYTE) MVirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (NewBase == NULL)
|
2024-12-28 17:14:31 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
CopyMemory(NewBase,m_Base,len);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-04-06 19:35:20 +08:00
|
|
|
|
MVirtualFree(m_Base,0,MEM_RELEASE);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
m_Base = NewBase;
|
|
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
m_Ptr = m_Base + len;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
m_ulMaxLength = ulNewMaxLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength)
|
|
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (ReAllocateBuffer(ulLength + (m_Ptr - m_Base)) == FALSE)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-28 17:14:31 +08:00
|
|
|
|
return FALSE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
CopyMemory(m_Ptr, Buffer, ulLength);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
m_Ptr+=ulLength;
|
2024-12-28 17:14:31 +08:00
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>泤<EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>·<EFBFBD><C2B7><EFBFBD>
|
|
|
|
|
|
BOOL CBuffer::ReAllocateBuffer(ULONG ulLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-28 17:14:31 +08:00
|
|
|
|
if (ulLength < m_ulMaxLength)
|
|
|
|
|
|
return TRUE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG ulNewMaxLength = ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
2025-04-06 19:35:20 +08:00
|
|
|
|
PBYTE NewBase = (PBYTE) MVirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
if (NewBase == NULL)
|
|
|
|
|
|
{
|
2024-12-28 17:14:31 +08:00
|
|
|
|
return FALSE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG len = m_Ptr - m_Base;
|
2024-12-28 17:14:31 +08:00
|
|
|
|
CopyMemory(NewBase, m_Base, len);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
if (m_Base)
|
|
|
|
|
|
{
|
2025-04-06 19:35:20 +08:00
|
|
|
|
MVirtualFree(m_Base,0,MEM_RELEASE);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
m_Base = NewBase;
|
2024-12-28 17:14:31 +08:00
|
|
|
|
m_Ptr = m_Base + len;
|
|
|
|
|
|
m_ulMaxLength = ulNewMaxLength;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
return TRUE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VOID CBuffer::ClearBuffer()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Ptr = m_Base;
|
|
|
|
|
|
|
|
|
|
|
|
DeAllocateBuffer(1024);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-28 17:14:31 +08:00
|
|
|
|
ULONG CBuffer::GetBufferLength() const
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
return m_Ptr - m_Base;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-12 20:27:14 +08:00
|
|
|
|
void CBuffer::Skip(ULONG ulPos) {
|
|
|
|
|
|
if (ulPos == 0)
|
|
|
|
|
|
return;
|
|
|
|
|
|
MoveMemory(m_Base, m_Base + ulPos, m_ulMaxLength - ulPos);
|
|
|
|
|
|
m_Ptr -= ulPos;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-01-18 17:37:15 +08:00
|
|
|
|
PBYTE CBuffer::GetBuffer(ULONG ulPos) const
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (m_Base==NULL || ulPos>=(m_Ptr - m_Base))
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
return m_Base+ulPos;
|
|
|
|
|
|
}
|