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; } }
相关文章推荐
- 移植了开源远程控制Gh0st3.6中的IOCP完成端口到dll(C++源码)
- gh0st 远程桌面控制源码分析
- 环形缓冲区类(C++源码
- ESP8266 WIFI ARDUINO单芯片 APP/微信远程控制继电器等 设备源码及说明
- 关于C++类库KYLib: 固定缓冲区的压缩/解压缩类源码
- Ring Buffer (circular Buffer)环形缓冲区简介(C++版本)
- java.nio.ByteBuffer字节缓冲区源码解析
- 供应P2P远程桌面控制软件,可二次开发,有调用源码
- C++语法基础--ostream,cout及其格式控制,缓冲区
- XP下双开3389远程控制的源码
- 远程桌面控制VC源码剖析
- socket远程控制(练手)___源码
- 运维职责,buffer和cache什么区别?机房防止服务器断电,远程控制卡
- Netty 出站缓冲区 ChannelOutboundBuffer 源码解析(isWritable 属性的重要性)
- 环形缓冲区类(C++源码)绝对可用
- suricata 源码分析之ringbuffer(环形缓冲区)
- c++缓冲区buffer
- java.nio.Buffer缓冲区源码解析
- C/C++轻松写基于UDP的远程控制
- VC++远程控制软件的通信架构与源码分析