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

 
  
//缓冲器类  
	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;
	   }
	 }


 
 

你可能感兴趣的:(C++)