⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addresslistdlg.cpp

📁 游戏修改器 大家可以看看呵呵 老牌子的 但是可能别人已经发过了
💻 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 + -