📄 peerregedittreeview.cpp
字号:
// PeerRegeditTreeView.cpp : implementation file
//
#include "stdafx.h"
#include "PeerYouC.h"
#include "PeerRegeditTreeView.h"
#include "peerregeditlistview.h"
#include "peermessagelistview.h"
#include "regeditaddkeydlg.h"
#include "MainFrm.h"
#include "command.h"
#include "peersocket.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView
IMPLEMENT_DYNCREATE(CPeerRegeditTreeView, CTreeView)
CPeerRegeditTreeView::CPeerRegeditTreeView()
{
}
CPeerRegeditTreeView::~CPeerRegeditTreeView()
{
}
BEGIN_MESSAGE_MAP(CPeerRegeditTreeView, CTreeView)
//{{AFX_MSG_MAP(CPeerRegeditTreeView)
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(ID_REGEDIT_KEY_ADD, OnRegeditKeyAdd)
ON_COMMAND(ID_REGEDIT_KEY_DEL, OnRegeditKeyDel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView drawing
void CPeerRegeditTreeView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView diagnostics
#ifdef _DEBUG
void CPeerRegeditTreeView::AssertValid() const
{
CTreeView::AssertValid();
}
void CPeerRegeditTreeView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView message handlers
int CPeerRegeditTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CTreeCtrl& tree=GetTreeCtrl();
tree.ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS|
TVS_HASBUTTONS);
if(!m_imagelist.Create( 16,16,ILC_MASK,3,1))
return -1;
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGCOMPUTER));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGDIRCLOSE));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGDIROPEN));
tree.SetImageList(&m_imagelist,TVSIL_NORMAL);
return 0;
}
void CPeerRegeditTreeView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CTreeView::OnLButtonDown(nFlags, point);
CTreeCtrl& tree=GetTreeCtrl();
HTREEITEM item,root;
UINT flag=TVHT_ONITEM|TVHT_ONITEMBUTTON ;
if(!(item=tree.HitTest(point,&flag)))
return;
if(!(root=tree.GetRootItem()))
{
return;
}
if(item!=root)
{
char masterkey[32];
char childkey[512];
WSAEVENT hevent=WSACreateEvent();
if(!hevent)
{
return;
}
SOCKET s;
COMMAND com;
REGEDIT reg;
DWORD ret;
if(!PeerCreateSocket(&s,PEER_STREAM))
{
return;
}
AfxGetApp()->DoWaitCursor(1);
CSplitterWnd* regsplitterwnd=(CSplitterWnd*)GetParent();
CPeerRegeditListView* listview=(CPeerRegeditListView*)regsplitterwnd->GetPane(0,1);
CListCtrl& list=listview->GetListCtrl();
if(flag&TVHT_ONITEM)
{
list.DeleteAllItems();
if(PeerConnectSocket(s,ADDRESS,7788))
{
memset(&com,0,sizeof(com));
com.CommandID=PEER_REGEDIT_ENUMVALUE;
com.DataSize=sizeof(reg);
memset(®,0,sizeof(reg));
MakeRegInfo(tree,item,reg);
if(strcmp(reg.sunkey,"SECURITY")==0)
{
WSACloseEvent(hevent);
closesocket(s);
AfxGetApp()->DoWaitCursor(0);
return;
}
strcpy(masterkey,reg.key);
strcpy(childkey,reg.sunkey);
LVITEM litem;
char regtype[100];
char regvalue[512];
if(PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
{
WSAResetEvent(hevent);
if(!PeerSendDataS(s,(char*)®,sizeof(reg),&ret,hevent))
{
WSACloseEvent(hevent);
closesocket(s);
AfxGetApp()->DoWaitCursor(0);
MESS(masterkey,childkey,"失败",0);
return;
}
while(PeerRecvDataS(s,(char*)®,sizeof(reg),&ret,hevent)&&ret==sizeof(reg))
{
WSAResetEvent(hevent);
int index=list.GetItemCount();
litem.cchTextMax=512;
int image;
if(reg.type==REG_BINARY||
reg.type==REG_DWORD||
reg.type==REG_RESOURCE_LIST||
reg.type==REG_LINK||
reg.type==REG_DWORD_BIG_ENDIAN||
reg.type==REG_FULL_RESOURCE_DESCRIPTOR
)
{
image=1;
}
else if(reg.type==REG_SZ||
reg.type==REG_EXPAND_SZ||
reg.type==REG_NONE||
REG_MULTI_SZ)
{
image=0;
}
else
image=3;
list.InsertItem(index,reg.value,image);
litem.mask=TVIF_TEXT|TVIF_IMAGE ;
litem.iItem=index;
litem.iSubItem=1;
litem.cchTextMax=512;
GetType(reg.type,regtype);
litem.pszText=regtype;
list.SetItem(&litem);
litem.iSubItem=2;
regvalue[0]=0;
if(reg.datalen>0)
memcpy((char*)regvalue,(char*)reg.data,reg.datalen);
SetType(reg.type,regvalue,reg.datalen);
litem.pszText=regvalue;
list.SetItem(&litem);
}
}
MESS(masterkey,childkey,"成功",0);
}
}
if(flag&TVHT_ONITEMBUTTON)
{
if(tree.GetItemState(item,TVIS_EXPANDED)&TVIS_EXPANDEDONCE)
return;
HTREEITEM delitem;
while((delitem=tree.GetChildItem(item)))
{
tree.DeleteItem(delitem);
}
if(PeerConnectSocket(s,ADDRESS,7788))
{
memset(&com,0,sizeof(com));
com.CommandID=PEER_REGEDIT_ENUMKEY;
com.DataSize=sizeof(reg);
memset(®,0,sizeof(reg));
MakeRegInfo(tree,item,reg);
if(strcmp(reg.sunkey,"SECURITY")==0)
{
WSACloseEvent(hevent);
closesocket(s);
AfxGetApp()->DoWaitCursor(0);
return;
}
strcpy(masterkey,reg.key);
strcpy(childkey,reg.sunkey);
if(PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
{
WSAResetEvent(hevent);
if(!PeerSendDataS(s,(char*)®,sizeof(reg),&ret,hevent)||ret!=sizeof(reg))
{
WSACloseEvent(hevent);
closesocket(s);
AfxGetApp()->DoWaitCursor(0);
MESS(masterkey,childkey,"失败",0);
return;
}
HTREEITEM insertitem;
while(PeerRecvDataS(s,(char*)®,sizeof(reg),&ret,hevent)&&ret==sizeof(reg))
{
WSAResetEvent(hevent);
insertitem=tree.InsertItem(reg.sunkey,1,2,item);
if(reg.havechild==1)
{
TVITEM childflag;
childflag.mask=TVIF_CHILDREN ;
childflag.cChildren=1;
childflag.hItem=insertitem;
tree.SetItem(&childflag);
}
}
tree.SortChildren(item);
tree.Expand(item,TVE_EXPAND);
}
MESS(masterkey,childkey,"成功",1);
}
}
AfxGetApp()->DoWaitCursor(0);
WSACloseEvent(hevent);
closesocket(s);
}
}
void CPeerRegeditTreeView::SetType(DWORD type, char *strType,DWORD len)
{
switch(type)
{
case REG_BINARY:
case REG_RESOURCE_LIST:
case REG_FULL_RESOURCE_DESCRIPTOR:
case REG_LINK:
char tmp[512];
char ch[3];
DWORD i;
tmp[0]=0;
if(len>170)
len=170;
for(i=0;i<len;i++)
{
BYTE ch1,ch2;
ch1=(BYTE)(strType[i])>>4;
ch2=(BYTE)(strType[i])&0x0f;
sprintf(ch,"%x%x ",ch1,ch2);
strcat(tmp,ch);
}
strcpy(strType,tmp);
break;
case REG_DWORD:
case REG_DWORD_BIG_ENDIAN:
DWORD word;
word=*(DWORD*)strType;
sprintf(strType,"0x%x(%u)",word,word);
break;
case REG_SZ:
case REG_EXPAND_SZ:
case REG_MULTI_SZ:
case REG_NONE:
break;
default:
strcpy(strType,"不能识别");
break;
}
}
void CPeerRegeditTreeView::GetType(DWORD type, char *strType)
{
switch(type)
{
case REG_BINARY:
strcpy(strType,"REG_BINARY");
break;
case REG_DWORD:
strcpy(strType,"REG_DWORD");
break;
case REG_DWORD_BIG_ENDIAN:
strcpy(strType,"REG_DWORD_BIG_ENDIAN");
break;
case REG_SZ:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -