驱动程序:
#include <ntddk.h>
// 驱动程序入口点函数声明
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
// 驱动程序卸载函数声明
VOID DriverUnload(PDRIVER_OBJECT DriverObject);
// 处理设备打开请求的函数声明
NTSTATUS DispatchCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
// 处理设备关闭请求的函数声明
NTSTATUS DispatchClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
// 驱动程序入口点函数
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(RegistryPath); // 未使用的参数
// 设置驱动程序卸载函数
DriverObject->DriverUnload = DriverUnload;
// 设置IRP_MJ_CREATE处理函数
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
// 设置IRP_MJ_CLOSE处理函数
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
// 定义设备名称
UNICODE_STRING deviceName = RTL_CONSTANT_STRING(L"\\Device\\MyHandleDevice");
// 定义符号链接名称
UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\DosDevices\\MyHandleDevice");
// 创建设备对象
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS status = IoCreateDevice(DriverObject, 0, &deviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject);
// 检查设备对象创建是否成功
if (NT_SUCCESS(status)) {
// 创建符号链接
status = IoCreateSymbolicLink(&symLink, &deviceName);
if (!NT_SUCCESS(status)) {
// 如果创建符号链接失败,删除设备对象
IoDeleteDevice(DeviceObject);
}
}
// 返回状态
return status;
}
// 驱动程序卸载函数
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
// 定义符号链接名称
UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\DosDevices\\MyHandleDevice");
// 删除符号链接
IoDeleteSymbolicLink(&symLink);
// 删除设备对象
IoDeleteDevice(DriverObject->DeviceObject);
}
// 处理设备打开请求的函数
NTSTATUS DispatchCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
UNREFERENCED_PARAMETER(DeviceObject); // 未使用的参数
// 设置IRP状态为成功
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
// 完成IRP请求
IoCompleteRequest(Irp, IO_NO_INCREMENT);
// 返回成功状态
return STATUS_SUCCESS;
}
// 处理设备关闭请求的函数
NTSTATUS DispatchClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
UNREFERENCED_PARAMETER(DeviceObject); // 未使用的参数
// 设置IRP状态为成功
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
// 完成IRP请求
IoCompleteRequest(Irp, IO_NO_INCREMENT);
// 返回成功状态
return STATUS_SUCCESS;
}
用户程序:
#include <windows.h> // 包含Windows API的头文件,提供了Windows操作系统的各种函数和定义
#include <iostream> // 包含C++标准输入输出流库的头文件,用于输入和输出操作
int main() // 定义程序的主函数,程序从这里开始执行
{
// 定义一个句柄变量 hDevice,用于存储设备句柄
HANDLE hDevice = CreateFile(
L"\\\\.\\MyHandleDevice", // 设备的符号链接名称
GENERIC_READ | GENERIC_WRITE, // 请求的访问权限,读和写
0, // 共享模式,0表示不共享
NULL, // 安全属性,NULL表示使用默认安全属性
OPEN_EXISTING, // 创建方式,表示打开已存在的设备
0, // 文件属性和标志,0表示没有额外的属性和标志
NULL); // 模板文件句柄,NULL表示没有模板文件
// 检查设备句柄是否有效
if (hDevice == INVALID_HANDLE_VALUE) {
// 如果设备句柄无效,输出错误信息
std::cerr << "Failed to open device. Error: " << GetLastError() << std::endl;
// 等待用户输入以暂停程序
std::cin.get();
// 返回错误代码
return 1;
}
// 输出设备打开成功的信息
std::cout << "Device opened successfully." << std::endl;
// 在这里可以执行与设备句柄相关的操作
// 关闭设备句柄
CloseHandle(hDevice);
// 输出设备关闭成功的信息
std::cout << "Device closed successfully." << std::endl;
// 等待用户输入以暂停程序
std::cout << "Press any key to exit..." << std::endl;
std::cin.get();
// 返回成功代码
return 0;
}
如果输出
Device opened successfully.
Device closed successfully.
证明驱动安装成功,驱动和用户程序交互成功。
否则驱动安装或与用户层交互失败。