驱动程序与用户程序的交互

驱动程序:

#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.

证明驱动安装成功,驱动和用户程序交互成功。

否则驱动安装或与用户层交互失败。

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值