首页
社区
课程
招聘
未解决 [求助]关于驱动通信的问题【已解决】
发表于: 2020-10-28 05:07 2134

未解决 [求助]关于驱动通信的问题【已解决】

2020-10-28 05:07
2134

小白初学驱动,在网上找的驱动通信的例子,自己稍微修改下,加载后IoCreateDevice和IoCreateSymbolicLink显示都成功,但应用层通过“\\.\MyDevice11”来连接,使用工具和自己用CreateFile都连接失败,错误码是找不到路径,折腾一晚上不知道怎么回事,对比网上其它类似的代码好像参数没啥问题啊,到底怎么回事。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <ntifs.h>
#include <ntddk.h>
 
//////////////////// 驱动通信回调 /////////////////////////
NTSTATUS IrpDeviceControlProc(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
    PIO_STACK_LOCATION  Stack;
    ULONG uIoControlCode;
    ULONG IoControlCode = 0;
    NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
    // 设置临时变量的值
    PIO_STACK_LOCATION  IoStackLocation = IoGetCurrentIrpStackLocation(pIrp);
    IoControlCode = IoStackLocation->Parameters.DeviceIoControl.IoControlCode;
 
    switch (IoControlCode)
    {
    case IRP_MJ_CREATE: {
        DbgPrint("IRP_MJ_CREATE触发\n");
        break;
        }
    case IRP_MJ_CLOSE: {
        DbgPrint("IRP_MJ_CLOSE触发\n");
        break;
        }
    case IRP_MJ_DEVICE_CONTROL: {
        DbgPrint("IRP_MJ_DEVICE_CONTROL触发\n");
        break;
        }
    }
    pIrp->IoStatus.Status = status;
    //    pIrp->IoStatus.Information = uWriteLength;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    return status;
}
 
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
    pIrp->IoStatus.Status = STATUS_SUCCESS;
    //DbgPrint("DispatchClose执行成功\n");
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}
 
NTSTATUS Dispatchcreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
    pIrp->IoStatus.Status = STATUS_SUCCESS;
    //DbgPrint("Dispatchcreate执行成功\n");
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}
 
//////////////////// 安装驱动通信 /////////////////////////
NTSTATUS InitializeDevice(PDRIVER_OBJECT DriverObject)
{
    //定义IO名称
#define DEVICE_NAME             L"\\Device\\MyDevice11"
#define DOS_DEVICES_LINK_NAME   L"\\DosDevices\\MyDevice11"
//#define DEVICE_WIN32_NAME       L"\\\\.\\MyDevice11"
 
    //创建IO对象
    NTSTATUS status = STATUS_SUCCESS;                                                                     //返回状态码
    //UNICODE_STRING deviceName =  RTL_CONSTANT_STRING(DEVICE_NAME);                                         //设备名称
   // UNICODE_STRING dosDeviceName = RTL_CONSTANT_STRING(DOS_DEVICES_LINK_NAME);                            //Dos名称
    UNICODE_STRING deviceName, dosDeviceName = { 0 };
    RtlInitUnicodeString(&deviceName, DEVICE_NAME);
    RtlInitUnicodeString(&dosDeviceName, DOS_DEVICES_LINK_NAME);
 
    PDEVICE_OBJECT deviceObject = NULL;                                                                   //设备句柄
    status = IoCreateDevice(DriverObject, 0, &deviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject);  //创建设备
    if (!NT_SUCCESS(status)){
        DbgPrint("IoCreateDevice  失败:%08x\n", status);
        return status;
    }
    DriverObject->Flags |= DO_BUFFERED_IO;                                                                 //定义通信类型:读写操作使用缓冲方式(系统复制缓冲区)访问用户模式数据
    status = IoCreateSymbolicLink(&dosDeviceName, &deviceName);                                            //创建符号链接
    if (!NT_SUCCESS(status))
    {
        IoDeleteDevice(deviceObject);
        DbgPrint("IoCreateSymbolicLink 失败:%08x\n", status);
        return status;
    }
    //DriverObject->MajorFunction[IRP_MJ_CREATE] = Dispatchcreate;
    //DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IrpDeviceControlProc;
    return status;
}
//////////////////// 卸载驱动通信 /////////////////////////
VOID UnloadDevice(PDRIVER_OBJECT driverObject)
{
    UNICODE_STRING dosDeviceName = { 0 };
    RtlInitUnicodeString(&dosDeviceName, DOS_DEVICES_LINK_NAME);
    PDEVICE_OBJECT  DeleteDeviceObject = NULL;
    IoDeleteSymbolicLink(&dosDeviceName);
    DeleteDeviceObject = driverObject->DeviceObject;
    IoDeleteDevice(DeleteDeviceObject);
}
 
//////////////////// 驱动卸载 /////////////////////////
VOID Unload(PDRIVER_OBJECT driverObject)
{
    UnloadDevice(driverObject);
    DbgPrint("驱动卸载成功\n");
}
 
//////////////////// 驱动加载 /////////////////////////
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING registryPath)
{
    InitializeDevice(driverObject);//安装驱动通信
 
 
    driverObject->DriverUnload = Unload;
    return STATUS_SUCCESS;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-10-28 11:43 被大佬求关照编辑 ,原因: 因为用的网上工具使用的ANSI码导致的,自己新建个解决了
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 8
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你调用程序是管理员程序运行没?
2020-10-28 14:59
0
雪    币: 6
活跃值: (546)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
zhongguo1987 你调用程序是管理员程序运行没?
因为用的网上工具使用的ANSI码导致的,自己新建个解决了
2020-10-29 01:13
0
游客
登录 | 注册 方可回帖
返回
//