1.切换到资源状态
Caption | ID |
---|---|
打开驱动设备 | 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的支持库,或者是开发环境。