查看: 698|回复: 3

[原创] [驱动开发教程]2.3.创建设备对象

[复制链接]

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

发表于 2022-7-11 09:49:33 | 显示全部楼层 |阅读模式
本帖最后由 YFSafe 于 2022-8-13 22:41 编辑

我们还有许多初始化的工作需要在DriverEntry函数中进行.目前我们还没有一个设备对象,因此还无法打开一个句柄从而达到驱动程序.我们的软件驱动程序只需要一个设备对象和一个符号链接指向它,这样我们就能从用户模式得到驱动程序的句柄了.
创建一个设备对象需要调用IoCreateDevice API.此函数的声明如下:
[C++] 纯文本查看 复制代码
NTSTATUS IoCreateDevice( 
        PDRIVER_OBJECT DriverObject, 
        ULONG DeviceExtensionSize, 
        PUNICODE_STRING DeviceName, 
        DEVICE_TYPE DeviceType, 
        ULONG DeviceCharacteristics, 
        BOOLEAN Exclusive, 
        PDEVICE_OBJECT *DeviceObject);

参数描述如下:
————DriverObject:驱动程序对象指针,就是DriverEntry传进来的那个.
————DeviceExtensionSize:填0.
————DeviceName:设备名称.
————DeviceType:我们需要使用FILE_DEVICE_UNKNOWN.
————DeviceCharacteristics:太麻烦了,直接写0就行.
————Exclusive:是否允许多个文件对象打开同一设备.多数时候应该使用FALSE.
————DeviceObject:返回的设备对象指针.


在调用IoCreateDevice之前,我们必须先创建一个UNICODE_STRING来存放内部设备名:
[C++] 纯文本查看 复制代码
UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\SetPriority");



现在我们可以调用IoCreateDevice了:)
[C++] 纯文本查看 复制代码
PDEVICE_OBJECT DeviceObject; 
NTSTATUS status = IoCreateDevice( 
       DriverObject, 
       0, 
       &devName, 
       FILE_DEVICE_UNKNOWN, 
       0, 
       FALSE, 
       &DeviceObject); 
if(!NT_SUCCESS(status)) 
{ 
    DbgPrint("CreateDevice Failed!!!"); 
    return status; 
}



如果一切正常,我们就拥有了一个指向一个设备对象的指针.下一步是通过提供符号链接使设备能够被来自用户模式的调用者访问.下面的代码创建了一个符号链接并将它与我们的设备连接起来.
[C++] 纯文本查看 复制代码
UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\?\\SetPriority"); 
status = IoCreateSymbolicLink(&symLink,&devName); 
if(!NT_SUCCESS(status)) 
{ 
    DbgPrint("Create symLink Failed!!!"); 
    IoDeleteDevice(DeviceObject); 
    return status; 
}



请注意,如果创建失败了,我们需要将迄今为止做过的所有事情恢复原状.在这里就需要用IoDeleteDevice销毁我们创建了的设备对象.
如果DriverEntry返回了任何失败的状态值,Unload例程都不会被调用.
在设备对象和符号链接都创建好后,DriverEntry就可以返回成功,且我们的驱动程序已经准备好接受请求了!
在继续之前,我们不能忘记驱动程序的Unload例程.假设DriverEntry返回成功,Unload例程就需要把在DriverEntry中完成的所有内容全部复原.在这个驱动程序中,我们只做了两件事:创建设备对象与符号链接.因此,我们在Unload例程中将他们复原.
[C++] 纯文本查看 复制代码
void DriverUnload(PDRIVER_OBJECT DriverObject) 
{ 
    UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\?\\SetPriority"); 
    IoDeleteSymbolicLink(&symLink); 
    IoDeleteDevice(DriverObject->DeviceObject); 
}



本节到此结束,下一节开始动工客户端程序了.


附:到现在的完整源代码
[C++] 纯文本查看 复制代码
#include <ntifs.h>
 
void DriverUnload(PDRIVER_OBJECT DriverObject);
NTSTATUS SetPriorityCreateClose(PDEVICE_OBJECT DeviceObject,PIRP Irp);
 
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    DriverObject->DriverUnload = DriverUnload;
    DriverObject->MajorFunction[IRP_MJ_CREATE] = SetPriorityCreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = SetPriorityCreateClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SetPriorityDeviceControl;
    UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\SetPriority");
    PDEVICE_OBJECT DeviceObject;
    NTSTATUS status = IoCreateDevice(
       DriverObject,
       0,
       &devName,
       FILE_DEVICE_UNKNOWN,
       0,
       FALSE,
       &DeviceObject);
    if(!NT_SUCCESS(status))
    {
        DbgPrint("CreateDevice Failed!!!");
        return status;
    }
    UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\?\\SetPriority");
    status = IoCreateSymbolicLink(&symLink,&devName);
    if(!NT_SUCCESS(status))
    {
        DbgPrint("Create symLink Failed!!!");
        IoDeleteDevice(DeviceObject);
        return status;
    }
    return STATUS_SUCCESS;
}

void DriverUnload(PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\?\\SetPriority");
    IoDeleteSymbolicLink(&symLink);
    IoDeleteDevice(DriverObject->DeviceObject);
}

评分

参与人数 1经验 +11 分享 +1 收起 理由
剑指巅峰 + 11 + 1 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

发表于 2022-7-11 17:26:54 | 显示全部楼层

装一个呗,网上不是有按装包吗

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2022-7-11 22:51:47 | 显示全部楼层

加我qq吧,我教你(13249649963)
YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2022-7-12 19:16:09 | 显示全部楼层
zhangzhixiao 发表于 2022-7-12 08:22
《没有搜索到结果》
要不你加我?
1026683992

加了,过一下
YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表