您的位置:首页 > 编程语言 > C语言/C++

C++Buffer缓冲区-Gh0st远程控制源码摘取

2017-07-27 21:05 309 查看
//缓冲器类
class Buffer
{
public:
Buffer(void);
virtual ~Buffer(void);
/*函数说明:
功能 : 清空缓冲区
参数 :
返回值:
时间 :2014/01/26*/
void ClearBuffer();
/*函数说明:
功能 : 删除缓冲区数据
参数 :
1.nSize : 删除的长度
返回值:
返回删除后的数据长度
时间 :2014/01/26*/
UINT Delete(UINT nSize);
/*函数说明:
功能 : 读字节数据
参数 :
1.pData : 读出的缓冲区
2.nSize :读出数据长度
返回值:
返回读出数据长度
时间 :2014/01/26*/
UINT Read(PBYTE pData, UINT nSize);
/*函数说明:
功能 : 写入字节数据
参数 :
1.pData : 写入的数据
2.nSize :数据长度
返回值:
成功则返回TRUE,否则返回FALSE.
时间 :2014/01/26*/
BOOL Write(PBYTE pData, UINT nSize);
/*函数说明:
功能 : 写入字符数据
参数 :
1.pData : 写入的数据
2.nSize :数据长度
返回值:
成功则返回TRUE,否则返回FALSE.
时间 :2014/01/26*/
BOOL Write(std::string& strData);
/*函数说明:
功能 : 获取缓冲区数据长度
参数 :
返回值:
成功则返回数据长度.
时间 :2014/01/26*/
UINT GetBufferLen();
//插入字节数据
BOOL Insert(PBYTE pData, UINT nSize);
//插入字符数据
BOOL Insert(std::string& strData);
//拷贝数据
void Copy(Buffer& buffer);
//获取数据
PBYTE GetBuffer(UINT nPos = 0);
protected:

PBYTE	m_pBase;  	//基地址
PBYTE	m_pPtr;     //偏移地址
UINT	m_nSize;    //长度
//内部方法
protected:
//重新分配
UINT ReAllocateBuffer(UINT nRequestedSize);
//解除分配
UINT DeAllocateBuffer(UINT nRequestedSize);
//获取内存大小
UINT GetMemSize();

};

//构造函数
Buffer::Buffer(void)
{
m_nSize = 0;
m_pPtr = m_pBase = NULL;
}
//析构函数
Buffer::~Buffer(void)
{
if (m_pBase)
VirtualFree(m_pBase, 0, MEM_RELEASE);		//释放内存
}

//写数据到缓冲区
BOOL Buffer::Write(PBYTE pData, UINT nSize)
{
//分配内存
ReAllocateBuffer(nSize + GetBufferLen());

CopyMemory(m_pPtr, pData, nSize);

m_pPtr += nSize;

return nSize;
}

//插入数据到缓冲区中
BOOL  Buffer::Insert(PBYTE pData, UINT nSize)
{
ReAllocateBuffer(nSize + GetBufferLen());

MoveMemory(m_pBase + nSize, m_pBase, GetMemSize() - nSize);
CopyMemory(m_pBase, pData, nSize);

m_pPtr += nSize;

return nSize;
}
//从缓冲区中读取数据和删除它读什么
UINT Buffer::Read(PBYTE pData, UINT nSize)
{

if (nSize > GetMemSize())
return 0;

// all that we have
if (nSize > GetBufferLen())
nSize = GetBufferLen();

if (nSize)
{

CopyMemory(pData, m_pBase, nSize);

MoveMemory(m_pBase, m_pBase + nSize, GetMemSize() - nSize);

m_pPtr -= nSize;
}

DeAllocateBuffer(GetBufferLen());

return nSize;
}
///返回phyical分配的内存缓冲区
UINT Buffer::GetMemSize()
{
return m_nSize;
}
//缓冲区的数据长度
UINT Buffer::GetBufferLen()
{
if (m_pBase == NULL)
return 0;

int nSize =
m_pPtr - m_pBase;				  //现有的长度
return nSize;
}

//重新分配缓冲区
UINT  Buffer::ReAllocateBuffer(UINT nRequestedSize)
{
if (nRequestedSize < GetMemSize())//如果需要分配的空间小于缓冲区已经申请的空间,返回;现有的空间可以满足
return 0;

// 分配新的大小
UINT nNewSize = (UINT)ceil(nRequestedSize / 1024.0) * 1024;

// 申请内存空间
PBYTE pNewBuffer = (PBYTE)VirtualAlloc(NULL,  //要分配的内存区域的地址  如果这个参数是NULL,系统将会决定分配内存区域的位置
nNewSize, //  分配的大小
MEM_COMMIT,  // 分配的类型  MEM_COMMIT为指定地址空间提交物理内存
PAGE_READWRITE); //该内存的初始保护属性PAGE_READWRITE应用程序可以读写该

UINT nBufferLen = GetBufferLen();//获取当前内存空间
//复制内存
CopyMemory(pNewBuffer,   //新分配的内存地址
m_pBase, //缓冲区源有数据地址
nBufferLen); //数据长度

if (m_pBase)
VirtualFree(m_pBase, 0, MEM_RELEASE);//释放源有的数据内存

//调整数据指针基地址
m_pBase = pNewBuffer;

//调整偏移地址 指向内存尾部
m_pPtr = m_pBase + nBufferLen;
//内存长度
m_nSize = nNewSize;

return m_nSize;
}
//解除分配
UINT  Buffer::DeAllocateBuffer(UINT nRequestedSize)
{
if (nRequestedSize < GetBufferLen())
return 0;

// 分配新的大小
UINT nNewSize = (UINT)ceil(nRequestedSize / 1024.0) * 1024;

if (nNewSize < GetMemSize()) //防止溢出
return 0;

// 申请内存空间
PBYTE pNewBuffer = (PBYTE)VirtualAlloc(NULL,//要分配的内存区域的地址  如果这个参数是NULL,系统将会决定分配内存区域的位置
nNewSize, //分配的大小
MEM_COMMIT, //分配的类型  MEM_COMMIT为指定地址空间提交物理内存
PAGE_READWRITE);//该内存的初始保护属性PAGE_READWRITE应用程序可以读写该

UINT nBufferLen = GetBufferLen();//获取当前内存空间
//复制内存
CopyMemory(pNewBuffer,  //新分配的内存地址
m_pBase,  //缓冲区源有数据地址
nBufferLen); ////数据长度

VirtualFree(m_pBase, 0, MEM_RELEASE); ////释放源有的数据内存

//调整数据指针基地址
m_pBase = pNewBuffer;

//调整偏移地址 指向内存尾部
m_pPtr = m_pBase + nBufferLen;
//内存长度
m_nSize = nNewSize;

return m_nSize;
}
//清除/重置缓冲
void  Buffer::ClearBuffer()
{
//调整内存指针到首部位
m_pPtr = m_pBase;

DeAllocateBuffer(1024);
}
//写一个字符串缓冲区的末尾
BOOL  Buffer::Write(std::string& strData)
{
int nSize = strData.size();
return Write((PBYTE)strData.c_str(), nSize);
}
//插入一个字符串缓冲区的开始
BOOL  Buffer::Insert(std::string& strData)
{
int nSize = strData.size();
return Insert((PBYTE)strData.c_str(), nSize);
}
//从一个缓冲对象复制到另一个地方
void  Buffer::Copy(Buffer& buffer)
{
int nReSize = buffer.GetMemSize();
int nSize = buffer.GetBufferLen();
ClearBuffer();
ReAllocateBuffer(nReSize);
m_pPtr = m_pBase + nSize;
CopyMemory(m_pBase, buffer.GetBuffer(), buffer.GetBufferLen());
}
//返回一个指向抵消由物理内存的指针
PBYTE  Buffer::GetBuffer(UINT nPos)
{
return m_pBase + nPos;
}
//从缓冲区中删除数据,并删除它
UINT  Buffer::Delete(UINT nSize)
{
//如果删除的长度大于缓冲区长度还删除啥
if (nSize > GetMemSize())
return 0;

// all that we have
if (nSize > GetBufferLen())
nSize = GetBufferLen();

if (nSize)
{

MoveMemory(m_pBase, m_pBase + nSize, GetMemSize() - nSize);

m_pPtr -= nSize;
}
DeAllocateBuffer(GetBufferLen());
return nSize;
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: