📄 addresslistdlg.cpp
字号:
// AddressListDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "GameMaster.h"
#include "AddressListDlg.h"
#include ".\addresslistdlg.h"
#include "ModifyDlg.h"
extern HANDLE hProcess;
extern PVOID m_pData;
extern int m_nLockHz; //锁定频率
// CAddressListDlg 对话框
IMPLEMENT_DYNAMIC(CAddressListDlg, CDialog)
//构造、析构函数
CAddressListDlg::CAddressListDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAddressListDlg::IDD, pParent)
{
dlgTitle = _T("");
isClosed = FALSE;
isLocked = FALSE;
hModifyThread = NULL;
hLockEvent = NULL;
}
CAddressListDlg::CAddressListDlg(CString strTitle,CWnd* pParent /*=NULL*/)
: dlgTitle(strTitle),CDialog(CAddressListDlg::IDD, pParent)
{
isClosed = FALSE;
isLocked = FALSE;
hModifyThread = NULL;
hLockEvent = NULL;
}
CAddressListDlg::~CAddressListDlg()
{
isClosed = TRUE;
if((hLockEvent != NULL) && (hModifyThread != NULL))
{
SetEvent(hLockEvent);
CloseHandle(hLockEvent);
hLockEvent = NULL;
}
CloseHandle(hModifyThread);
hModifyThread = NULL;
addressArray.RemoveAll();
}
void CAddressListDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
// DDX_Control(pDX, IDC_LIST_ADDRESS, m_addressList);
DDX_Control(pDX, IDC_LIST_ADDRESS, m_addressList);
}
BEGIN_MESSAGE_MAP(CAddressListDlg, CDialog)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_ADDRESS, OnNMDblclkListAddress)
END_MESSAGE_MAP()
// CAddressListDlg 消息处理程序
BOOL CAddressListDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_addressList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//设置属性整行选择 | 显示网格
m_addressList.InsertColumn(0,"地址",LVCFMT_IMAGE|LVCFMT_LEFT); //添加第0列,可以制定允许显示图标等属性
m_addressList.InsertColumn(1,"数值");//添加第1列
m_addressList.InsertColumn(2,"数据类型");//添加第2列
m_addressList.InsertColumn(3,"字长");//添加第3列
m_addressList.InsertColumn(4,"状态");//添加第4列
for(int i=0;i<5;i++)
{
m_addressList.SetColumnWidth(i, 80);//设置每列的宽度
}
return TRUE;
}
//列表控件双击响应
//在弹出的修改对话框中设定修改属性
void CAddressListDlg::OnNMDblclkListAddress(NMHDR *pNMHDR, LRESULT *pResult)
{
CString strAddress,strType;
long data;
DWORD length,type;
//获取列表当前选中位置
int index = m_addressList.GetSelectionMark();
//传递选中数据信息给修改对话框
strAddress = m_addressList.GetItemText(index,0);
strType = m_addressList.GetItemText(index,2);
type = addressArray.GetDataType(index);
if(strType == "整型")
data = (long)addressArray.GetData(index);
else
data = 0;
length = addressArray.GetDataLength(index);
CModifyDlg dlg(strAddress,type,data,isLocked,length);
if(dlg.DoModal() == IDOK)
{
DATA_STATE ds;
ds.isModified = TRUE;
ds.isLocked = dlg.m_bLock;
m_modifyData = dlg.m_mData;
isLocked = dlg.m_bLock;
dwAddress = addressArray[index].dwAddress;
addressArray.SetData(index,(PVOID)m_modifyData);
addressArray.SetState(index,ds);
addressArray.SetDataLength(index,dlg.dataLength);
Display();//重新显示修改过的信息
if(hLockEvent != NULL)
SetEvent(hLockEvent);
}
else
return ;
if(hLockEvent == NULL)
{
CloseHandle(hModifyThread);
hModifyThread = NULL;
}
if(hModifyThread == NULL)
{
hModifyThread = CreateThread(NULL,0,ModifyProc,this,0,NULL);
if(hModifyThread == NULL)
{
AfxMessageBox("修改失败!");
return ;
}
SetThreadPriority(hModifyThread,THREAD_PRIORITY_LOWEST);
}
if(isLocked && (hLockEvent == NULL))//若锁定,则设定锁定事件为有信号,让修改线程进行锁定
{
hLockEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
if(hLockEvent == NULL)
{
AfxMessageBox("锁定失败!");
return ;
}
}
*pResult = 0;
}
//修改线程回调函数
DWORD WINAPI CAddressListDlg::ModifyProc(LPVOID pParam)
{
CAddressListDlg *dlg = (CAddressListDlg*)pParam;
int mData;
DWORD dwAddress = dlg->dwAddress;
if(!(dlg->isClosed))//若收到关闭对话框,结束进程
{
mData = dlg->m_modifyData;
WriteProcessMemory(hProcess,LPVOID(dwAddress),&mData,sizeof(mData),NULL);
if((dlg->hLockEvent) != NULL)
{
while(!(dlg->isClosed))
{
WaitForSingleObject(dlg->hLockEvent,INFINITE);
mData = dlg->m_modifyData;
if(dlg->isClosed)
break;
WriteProcessMemory(hProcess,LPVOID(dwAddress),&mData,sizeof(mData),NULL);
if(dlg->isLocked)
SetEvent(dlg->hLockEvent);
else
{
CloseHandle(dlg->hLockEvent);
dlg->hLockEvent = NULL;
break;
}
Sleep(m_nLockHz);//根据锁定频率锁定
}
}
}
return 0;
}
//自定义操作
void CAddressListDlg::Display()
{
m_addressList.DeleteAllItems();
for(int i=0;i<addressArray.GetSize();i++)
AddLine(addressArray[i]);
}
DWORD CAddressListDlg::GetCurAddress()
{
int index = m_addressList.GetSelectionMark();
return addressArray.GetAddress(index);
}
//添加删除行
void CAddressListDlg::AddLine(DATA_ATTRIBUTE da)
{ int itemNum = m_addressList.GetItemCount();
CString strAddress;
strAddress.Format("0x%08x",da.dwAddress);
m_addressList.InsertItem(itemNum,strAddress);
CString strData;
if(da.dwDataType == 0)
{
strData.Format("%ld",(LONG)da.data);
m_addressList.SetItemText(itemNum,1,strData);
m_addressList.SetItemText(itemNum,2,"整型");
switch(da.dwDataLenth)
{
case DATA_LENTH_BYTE:
m_addressList.SetItemText(itemNum,3,"单字节(8位)");
break;
case DATA_LENTH_WORD:
m_addressList.SetItemText(itemNum,3,"双字节(16位)");
break;
case DATA_LENTH_DWORD:
m_addressList.SetItemText(itemNum,3,"四字节(32位)");
break;
}
}
else
{
strData = (PBYTE)da.data;
m_addressList.SetItemText(itemNum,1,strData);
m_addressList.SetItemText(itemNum,2,"字符串");
CString length;
length.Format("字符串长度(%ld)",da.dwDataLenth);
m_addressList.SetItemText(itemNum,3,length);
}
/*
switch(da.dwDataLenth)
{
case DATA_LENTH_BYTE:
m_addressList.SetItemText(itemNum,3,"单字节(8位)");
break;
case DATA_LENTH_WORD:
m_addressList.SetItemText(itemNum,3,"双字节(16位)");
break;
case DATA_LENTH_DWORD:
m_addressList.SetItemText(itemNum,3,"四字节(32位)");
break;
default:
CString length;
length.Format("字符串长度(%ld)",da.dwDataLenth);
m_addressList.SetItemText(itemNum,3,length);
break;
}
*/
if(!da.dsDataState.isModified)
m_addressList.SetItemText(itemNum,4,"未修改");
else
{
if(!da.dsDataState.isLocked)
m_addressList.SetItemText(itemNum,4,"修改(未锁定)");
else
m_addressList.SetItemText(itemNum,4,"修改(锁定)");
}
}
void CAddressListDlg::DeleteLine(int index)
{
m_addressList.DeleteItem(index);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -