您的当前位置:首页正文

MFC入门到精通1-创建项目

2024-11-20 来源:个人技术集锦

开发环境搭建

一个简单的demo

1.切换到资源状态

CaptionID
打开驱动设备IDC_BUTTON_CREATE
关闭驱动设备IDC_BUTTON_CLOSE
写数据IDC_BUTTON_IO_WRITE
读数据IDC_BUTTON_IO_READ
添加进程保护IDC_BUTTON_ADD
卸载进程保护IDC_BUTTON_REMOVE


按钮对齐快捷方式

双击打开驱动设备按钮进入代码行

//打开驱动设备对象
HANDLE DeviceHandle = NULL;
void CMFCApplicationDlg::OnBnClickedButtonCreate()
{
	// TODO: 在此添加控件通知处理程序代码
	DeviceHandle = CreateFileW(
		L"\\??\\MyDriver",
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
}

双击关闭驱动设备按钮进入代码行

void CMFCApplicationDlg::OnBnClickedButtonClose()
{
	// TODO: 在此添加控件通知处理程序代码
	CloseHandle(DeviceHandle);//IRP_MJ_CLOSE
}

双击写数据按钮进入代码行

#include <winioctl.h>
#define IOTEST CTL_CODE(FILE_DEVICE_UNKNOWN,0X800,METHOD_BUFFERED,FILE_ANY_ACCESS)

void CMFCApplicationDlg::OnBnClickedButtonIoWrite()
{
	// TODO: 在此添加控件通知处理程序代码
	DWORD dwRetSize = 0;//返回字节数
	typedef struct TINPUT_BUF
	{
		DWORD m_arg1;
		DWORD m_arg2;
		DWORD m_arg3;
		DWORD m_arg4;
		DWORD m_arg5;
		DWORD m_arg6;
	}TINPUT_BUF;
	//结构
	TINPUT_BUF inBuf = { 1,2,3,4,5,0x6ABC666 };
	//数组示例
	DWORD OutBuf[6] = { 0 };//输出缓冲区
	DeviceIoControl(
		DeviceHandle,//CreateFile打开驱动设备 返回的句柄
		IOTEST,//控制码 CTL_CODE
		&inBuf,//输入缓冲区指针
		sizeof(inBuf),//输入缓冲区大小
		&OutBuf,//返回缓冲区
		sizeof(OutBuf),//返回缓冲区大小
		&dwRetSize, //返回字节数
		NULL);

	//打印返回参数
	CString csStr;
	csStr.Format(L"EXE: 接收驱动层返回的参数(%x,%x,%x,%x,%x,%x  dwRetSize=%d", OutBuf[0], OutBuf[1], OutBuf[2], OutBuf[3], OutBuf[4], OutBuf[5], dwRetSize);
	OutputDebugStringW(csStr);
}

双击添加进程保护

	// TODO: 在此添加控件通知处理程序代码
	//添加保护
	UpdateData(TRUE);//窗口数据更新到变量
	DWORD dwRetSize = 0;//返回字节数
	char buftest[256];
	sprintf_s(buftest, "yjx:EXE R3 读写测试 控制码=%X\n", IO_READ_WRITE_TEST);
	OutputDebugStringA(buftest);
	//int 传入数据[3] = { 3,7,8 };
	UINT32  传入数据 = m_PID;// { 3, 6, 5 };
	//数组示例
	int OutBuf = 0;
	DeviceIoControl(
		DeviceHandle,//CreateFile打开驱动设备 返回的句柄
		IO_添加受保护的PID,//控制码 CTL_CODE
		&传入数据,//输入缓冲区指针
		sizeof(传入数据),//输入缓冲区大小
		&OutBuf,//输出缓冲区
		sizeof(OutBuf),//返回缓冲区大小
		&dwRetSize, //返回字节数
		NULL);

双击移除进程保护

//移出保护
	UpdateData(TRUE);//窗口数据更新到变量
	DWORD dwRetSize = 0;//返回字节数
	char buftest[256];
	sprintf_s(buftest, "yjx:EXE R3 读写测试 控制码=%X\n", IO_READ_WRITE_TEST);
	OutputDebugStringA(buftest);
	//int 传入数据[3] = { 3,7,8 };
	UINT32  传入数据 = m_PID;// { 3, 6, 5 };
	//数组示例
	int OutBuf = 0;
	DeviceIoControl(
		DeviceHandle,//CreateFile打开驱动设备 返回的句柄
		IO_删除受保护的PID,//控制码 CTL_CODE
		&传入数据,//输入缓冲区指针
		sizeof(传入数据),//输入缓冲区大小
		&OutBuf,//输出缓冲区
		sizeof(OutBuf),//返回缓冲区大小
		&dwRetSize, //返回字节数
		NULL);

静态编译会自动把MFC的库编译进去,不然的话会在目标系统上跑不起来。如果目标系统没有2017的支持库,或者是开发环境。



显示全文