|

6精币
#include<Windows.h>
#include<stdio.h>
#include <string>
#include <tlhelp32.h>
using namespace std;
#define IOCTL_GIO_MEMCPY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _cha询ImageLoad回调结构体
{
char 要cha询的驱动名[260];
int 驱动是否存在; // 1存在 0不存在
int ImageLoad回调是否存在;// 1存在 0不存在
} cha询ImageLoad回调结构体, * Pcha询ImageLoad回调结构体;
HANDLE OpenDevice(LPCWSTR devicePath) {
HANDLE hDevice = CreateFile(
devicePath, // 设备路径
GENERIC_WRITE | GENERIC_READ, // 读写权限
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享读写
NULL, // 安全属性
OPEN_EXISTING, // 打开现有文件
0, // 文件属性
NULL // 模板文件
);
if (hDevice == INVALID_HANDLE_VALUE) {
// 打开失败,输出错误信息
printf("打开失败\n");
}
return hDevice;
}
BOOL CallDeviceIoControlInternal(HANDLE hDevice, cha询ImageLoad回调结构体* info, DWORD ioctlCode) {
// 定义读取的字节数
DWORD retLen = 0;
// 调用 DeviceIoControl
BOOL success = DeviceIoControl(
hDevice, // 设备句柄
ioctlCode, // 控制码,需要定义 IOCTL_CODE //写0的话0环就写default或者0
info, // 输入缓冲区
sizeof(cha询ImageLoad回调结构体), // 输入缓冲区大小
info, // 输出缓冲区
sizeof(cha询ImageLoad回调结构体), // 输出缓冲区大小
&retLen, // 返回的字节数
NULL // 重叠结构,非异步操作使用 NULL
);
if (!success) {
printf("DeviceIoControl failed with error: %lu\n", GetLastError());
}
return success;
}
int main(int argc, char* argv[]) {
HANDLE hDevice = OpenDevice(L"\\??\\GIO");
if (hDevice == INVALID_HANDLE_VALUE) {
printf("设备打开失败,无法继续操作\n");
return 1;
}
cha询ImageLoad回调结构体 message = {0};
strncpy_s(message.要cha询的驱动名, sizeof(message.要cha询的驱动名), "ABCDE.sys", _TRUNCATE);
BOOL success = CallDeviceIoControlInternal(hDevice,&message, IOCTL_GIO_MEMCPY);
if (success) {
if (message.驱动是否存在==1) {
printf("要cha询的驱动存在\n");
if (message.ImageLoad回调是否存在==1) {
printf("回调存在\n");
}
else {
printf("回调不存在\n");
}
}
else {
printf("要cha询的驱动不存在\n");
}
}
else {
printf("DeviceIoControl failed.\n");
return -1;
}
CloseHandle(hDevice);
system("pause");
return 0;
}
|
|