fix: #19 the CBuffer causing server crash
This commit is contained in:
@@ -1,5 +1,61 @@
|
||||
#pragma once
|
||||
#include <Windows.h>
|
||||
#include <string>
|
||||
|
||||
// Buffer <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>.
|
||||
class Buffer {
|
||||
private:
|
||||
PBYTE buf;
|
||||
ULONG len;
|
||||
ULONG *ref;
|
||||
void AddRef() {
|
||||
(*ref)++;
|
||||
}
|
||||
void DelRef() {
|
||||
(*ref)--;
|
||||
}
|
||||
public:
|
||||
LPBYTE &Buf() {
|
||||
return buf;
|
||||
}
|
||||
~Buffer() {
|
||||
(*ref)--;
|
||||
if (*ref == 0) {
|
||||
if (buf!=NULL)
|
||||
{
|
||||
delete[] buf;
|
||||
buf = NULL;
|
||||
}
|
||||
delete ref;
|
||||
ref = NULL;
|
||||
}
|
||||
}
|
||||
Buffer():buf(NULL), len(0), ref(new ULONG(1)) {
|
||||
|
||||
}
|
||||
Buffer(const BYTE * b, int n):len(n), ref(new ULONG(1)){
|
||||
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;
|
||||
}
|
||||
char* c_str() const {
|
||||
return (char*)buf;
|
||||
}
|
||||
ULONG length()const {
|
||||
return len;
|
||||
}
|
||||
};
|
||||
|
||||
class CBuffer
|
||||
{
|
||||
@@ -7,21 +63,21 @@ public:
|
||||
CBuffer(void);
|
||||
~CBuffer(void);
|
||||
|
||||
ULONG GetBufferMaxLength() const;
|
||||
ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength);
|
||||
ULONG GetBufferLength() const; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>;
|
||||
ULONG DeAllocateBuffer(ULONG ulLength);
|
||||
ULONG GetBufferLength(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
||||
VOID ClearBuffer();
|
||||
ULONG ReAllocateBuffer(ULONG ulLength);
|
||||
BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength);
|
||||
PBYTE GetBuffer(ULONG ulPos=0) const;
|
||||
ULONG RemoveComletedBuffer(ULONG ulLength);
|
||||
VOID ReleaseMember();
|
||||
VOID InitMember();
|
||||
LPBYTE GetBuffer(ULONG ulPos);
|
||||
Buffer GetMyBuffer(ULONG ulPos);
|
||||
BYTE GetBYTE(ULONG ulPos);
|
||||
BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos);
|
||||
ULONG RemoveCompletedBuffer(ULONG ulLength);
|
||||
|
||||
protected:
|
||||
PBYTE m_Base;
|
||||
PBYTE m_Ptr;
|
||||
ULONG m_ulMaxLength;
|
||||
CRITICAL_SECTION m_cs;
|
||||
ULONG DeAllocateBuffer(ULONG ulLength); // ˽<><CBBD>
|
||||
ULONG ReAllocateBuffer(ULONG ulLength); // ˽<><CBBD>
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user