2019-01-05 20:21:43 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
#include <Windows.h>
|
2024-12-26 17:07:43 +08:00
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
// Buffer <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>.
|
|
|
|
|
|
class Buffer {
|
|
|
|
|
|
private:
|
|
|
|
|
|
PBYTE buf;
|
|
|
|
|
|
ULONG len;
|
2025-06-08 15:38:41 +08:00
|
|
|
|
ULONG padding;
|
|
|
|
|
|
std::string md5;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
ULONG *ref;
|
|
|
|
|
|
void AddRef() {
|
|
|
|
|
|
(*ref)++;
|
|
|
|
|
|
}
|
|
|
|
|
|
void DelRef() {
|
|
|
|
|
|
(*ref)--;
|
|
|
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
|
|
|
LPBYTE &Buf() {
|
|
|
|
|
|
return buf;
|
|
|
|
|
|
}
|
|
|
|
|
|
~Buffer() {
|
2024-12-31 03:11:26 +08:00
|
|
|
|
DelRef();
|
2024-12-26 17:07:43 +08:00
|
|
|
|
if (*ref == 0) {
|
|
|
|
|
|
if (buf!=NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
delete[] buf;
|
|
|
|
|
|
buf = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
delete ref;
|
|
|
|
|
|
ref = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-08 15:38:41 +08:00
|
|
|
|
Buffer():buf(NULL), len(0), ref(new ULONG(1)), padding(0) {
|
2024-12-26 17:07:43 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2025-06-08 15:38:41 +08:00
|
|
|
|
Buffer(const BYTE * b, int n, int padding=0, const std::string& md5="") :
|
|
|
|
|
|
len(n), ref(new ULONG(1)), padding(padding), md5(md5){
|
2024-12-26 17:07:43 +08:00
|
|
|
|
buf = new BYTE[n];
|
|
|
|
|
|
memcpy(buf, b, n);
|
|
|
|
|
|
}
|
|
|
|
|
|
Buffer(Buffer& o) {
|
|
|
|
|
|
o.AddRef();
|
|
|
|
|
|
buf = o.buf;
|
|
|
|
|
|
len = o.len;
|
|
|
|
|
|
ref = o.ref;
|
|
|
|
|
|
}
|
|
|
|
|
|
Buffer operator =(Buffer &o) {
|
|
|
|
|
|
o.AddRef();
|
|
|
|
|
|
buf = o.buf;
|
|
|
|
|
|
len = o.len;
|
|
|
|
|
|
ref = o.ref;
|
2024-12-31 03:11:26 +08:00
|
|
|
|
return *this;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
char* c_str() const {
|
|
|
|
|
|
return (char*)buf;
|
|
|
|
|
|
}
|
2025-06-08 15:38:41 +08:00
|
|
|
|
ULONG length(bool noPadding=false)const {
|
|
|
|
|
|
return noPadding ? len - padding : len;
|
|
|
|
|
|
}
|
|
|
|
|
|
std::string MD5() const {
|
|
|
|
|
|
return md5;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
};
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
class CBuffer
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CBuffer(void);
|
|
|
|
|
|
~CBuffer(void);
|
|
|
|
|
|
|
2019-01-10 19:35:03 +08:00
|
|
|
|
ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength);
|
2024-12-26 17:07:43 +08:00
|
|
|
|
ULONG GetBufferLength(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2025-06-08 15:38:41 +08:00
|
|
|
|
ULONG GetBufferLen() { return GetBufferLength(); }
|
2019-01-10 19:35:03 +08:00
|
|
|
|
VOID ClearBuffer();
|
|
|
|
|
|
BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength);
|
2025-07-12 20:27:14 +08:00
|
|
|
|
BOOL Write(PBYTE Buffer, ULONG ulLength) {
|
|
|
|
|
|
return WriteBuffer(Buffer, ulLength);
|
|
|
|
|
|
}
|
|
|
|
|
|
BOOL WriteBuffer(CBuffer& buf) {
|
|
|
|
|
|
return WriteBuffer(buf.GetBuffer(), buf.GetBufferLen());
|
|
|
|
|
|
}
|
2025-06-08 15:38:41 +08:00
|
|
|
|
LPBYTE GetBuffer(ULONG ulPos=0);
|
2024-12-26 17:07:43 +08:00
|
|
|
|
Buffer GetMyBuffer(ULONG ulPos);
|
|
|
|
|
|
BYTE GetBYTE(ULONG ulPos);
|
|
|
|
|
|
BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos);
|
|
|
|
|
|
ULONG RemoveCompletedBuffer(ULONG ulLength);
|
2025-08-10 17:15:32 +08:00
|
|
|
|
std::string Skip(ULONG ulPos);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
PBYTE m_Base;
|
|
|
|
|
|
PBYTE m_Ptr;
|
|
|
|
|
|
ULONG m_ulMaxLength;
|
|
|
|
|
|
CRITICAL_SECTION m_cs;
|
2024-12-26 17:07:43 +08:00
|
|
|
|
ULONG DeAllocateBuffer(ULONG ulLength); // ˽<><CBBD>
|
|
|
|
|
|
ULONG ReAllocateBuffer(ULONG ulLength); // ˽<><CBBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
};
|