2019-01-05 20:21:43 +08:00
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#include "Buffer.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define U_PAGE_ALIGNMENT 3
|
|
|
|
|
|
#define F_PAGE_ALIGNMENT 3.0
|
2024-12-26 17:07:43 +08:00
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
CBuffer::CBuffer(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_ulMaxLength = 0;
|
|
|
|
|
|
|
|
|
|
|
|
m_Ptr = m_Base = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
InitializeCriticalSection(&m_cs);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CBuffer::~CBuffer(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_Base)
|
|
|
|
|
|
{
|
|
|
|
|
|
VirtualFree(m_Base, 0, MEM_RELEASE);
|
|
|
|
|
|
m_Base = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DeleteCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
m_Base = m_Ptr = NULL;
|
|
|
|
|
|
m_ulMaxLength = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
ULONG CBuffer::RemoveCompletedBuffer(ULONG ulLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
if (ulLength > m_ulMaxLength) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȱ<EFBFBD><C8B1>ڴ<EFBFBD><DAB4>ij<EFBFBD><C4B3>Ȼ<EFBFBD><C8BB><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (ulLength > (m_Ptr - m_Base)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD> <20><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȼ<EFBFBD><C8BB><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ulLength = m_Ptr - m_Base;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (ulLength)
|
|
|
|
|
|
{
|
2025-06-08 15:38:41 +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);
|
2024-12-26 17:07:43 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
return ulLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
if (ulLength > m_ulMaxLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-12-26 17:07:43 +08:00
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (ulLength > (m_Ptr - m_Base))
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ulLength = m_Ptr - m_Base;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (ulLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
CopyMemory(Buffer,m_Base,ulLength);
|
|
|
|
|
|
|
2024-12-26 17:07:43 +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
|
|
|
|
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return ulLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
// ˽<><CBBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
ULONG CBuffer::DeAllocateBuffer(ULONG ulLength)
|
|
|
|
|
|
{
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (ulLength < (m_Ptr - m_Base))
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
if (m_ulMaxLength <= ulNewMaxLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
|
|
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG ulv1 = m_Ptr - m_Base; //<2F><>ԭ<EFBFBD><D4AD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
CopyMemory(NewBase,m_Base,ulv1);
|
|
|
|
|
|
|
|
|
|
|
|
VirtualFree(m_Base,0,MEM_RELEASE);
|
|
|
|
|
|
|
|
|
|
|
|
m_Base = NewBase;
|
|
|
|
|
|
|
|
|
|
|
|
m_Ptr = m_Base + ulv1;
|
|
|
|
|
|
|
|
|
|
|
|
m_ulMaxLength = ulNewMaxLength;
|
|
|
|
|
|
|
|
|
|
|
|
return m_ulMaxLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (ReAllocateBuffer(ulLength + (m_Ptr - m_Base)) == -1)//10 +1 1024
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-08 15:38:41 +08:00
|
|
|
|
CopyMemory(m_Ptr,Buffer,ulLength);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
m_Ptr+=ulLength;
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
// ˽<><CBBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
ULONG CBuffer::ReAllocateBuffer(ULONG ulLength)
|
|
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
if (ulLength < m_ulMaxLength)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
|
|
|
|
|
PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
|
|
|
|
|
|
if (NewBase == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG ulv1 = m_Ptr - m_Base; //ԭ<>ȵ<EFBFBD><C8B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2024-12-26 17:07:43 +08:00
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
CopyMemory(NewBase,m_Base,ulv1);
|
|
|
|
|
|
|
|
|
|
|
|
if (m_Base)
|
|
|
|
|
|
{
|
|
|
|
|
|
VirtualFree(m_Base,0,MEM_RELEASE);
|
|
|
|
|
|
}
|
|
|
|
|
|
m_Base = NewBase;
|
|
|
|
|
|
m_Ptr = m_Base + ulv1; //1024
|
|
|
|
|
|
|
|
|
|
|
|
m_ulMaxLength = ulNewMaxLength; //2048
|
|
|
|
|
|
|
|
|
|
|
|
return m_ulMaxLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
VOID CBuffer::ClearBuffer()
|
|
|
|
|
|
{
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
|
|
|
|
m_Ptr = m_Base;
|
|
|
|
|
|
|
|
|
|
|
|
DeAllocateBuffer(1024);
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
ULONG CBuffer::GetBufferLength() // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
EnterCriticalSection(&m_cs);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
if (m_Base == NULL)
|
2024-12-26 17:07:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return 0;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
}
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG len = m_Ptr - m_Base;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
return len;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. ֻ<><D6BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>.
|
|
|
|
|
|
LPBYTE CBuffer::GetBuffer(ULONG ulPos)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
EnterCriticalSection(&m_cs);
|
2025-02-06 04:15:34 +08:00
|
|
|
|
if (m_Base==NULL || ulPos >= (m_Ptr - m_Base))
|
2024-12-26 17:07:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
LPBYTE result = m_Base + ulPos;
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 17:07:43 +08:00
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. <20><>ȡ<EFBFBD><C8A1><EFBFBD>棬<EFBFBD>õ<EFBFBD>Buffer<65><72><EFBFBD><EFBFBD>.
|
|
|
|
|
|
Buffer CBuffer::GetMyBuffer(ULONG ulPos)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
EnterCriticalSection(&m_cs);
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG len = m_Ptr - m_Base;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
if (m_Base == NULL || ulPos >= len)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return Buffer();
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2024-12-26 17:07:43 +08:00
|
|
|
|
Buffer result = Buffer(m_Base+ulPos, len - ulPos);
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ֵ.
|
|
|
|
|
|
BYTE CBuffer::GetBYTE(ULONG ulPos) {
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
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
|
|
|
|
{
|
2024-12-26 17:07:43 +08:00
|
|
|
|
LeaveCriticalSection(&m_cs);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
2024-12-26 17:07:43 +08:00
|
|
|
|
BYTE p = *(m_Base + ulPos);
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
|
|
|
|
|
|
return p;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2024-12-26 17:07:43 +08:00
|
|
|
|
|
|
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. <20><><EFBFBD><EFBFBD><EFBFBD>濽<EFBFBD><E6BFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>.
|
|
|
|
|
|
BOOL CBuffer::CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos) {
|
|
|
|
|
|
EnterCriticalSection(&m_cs);
|
2025-02-06 04:15:34 +08:00
|
|
|
|
ULONG len = m_Ptr - m_Base;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
if (m_Base == NULL || len - ulPos < nLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
memcpy(pDst, m_Base+ulPos, nLen);
|
|
|
|
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|