【Window内核驱动开发】——通过符号链接获取真实设备
来源:互联网 发布:sql case when else 编辑:程序博客网 时间:2024/06/06 03:04
【我的】Window驱动开发——通过符号链接获取真实设备
作者:zcr214 时间:2016/5/5
我们想要把驱动绑定到指定的盘符,实际是绑定到它对应的真实设备卷,实际上windows用户看到的C盘D盘只是符号链接名,而真实设备通常是/Device/HarddiskVolume2,/Device/HarddiskVolume3等,符号链接名可以任意更改,但是真实设备卷却是不变的。而实际用户并不会知道哪个盘符对应哪个卷,所以需要我们通过符号链接来获取到真实设备卷。
1. 符号链接名与设备名
windows下的设备是以"\Device\[设备名]”形式命名的。例如磁盘分区的C盘,D盘的设备名称就是"\Device\HarddiskVolume2”,"\Device\HarddiskVolume3”。
当然也可以不指定设备名称,那么I/O管理器会自动分配一个数字作为设备的名称。例如"\Device\00000001",设备名并不容易记忆。
符号链接可以理解为设备的别名,更重要的是设备名,只能被内核模式下的其他驱动所识别,而别名可以被用户模式下的应用程序识别。“C:”就是一个符号链接名。而在驱动中,符号链接名是这样写的:
L”\\??\\c:” 对应 \??\c:
L”\\DosDevices\\HelloDDK” 对应 \DosDevices\HelloDDK
2. ZwOpenSymbolicLinkObject()打开符号链接对象
WDK提供了打开符号链接对象的接口函数ZwOpenSymbolicLinkObject(),其原型如下:
NTSTATUS
NTAPI
ZwOpenSymbolicLinkObject(
_Out_PHANDLE LinkHandle,
_In_ACCESS_MASK DesiredAccess,
_In_POBJECT_ATTRIBUTES ObjectAttributes
);
和之前讲的打开注册表对象类似,需要指定访问权限,初始化一个对象属性OBJECT_ATTRIBUTES,初始化的方式也同样使用
InitializeObjectAttributes(
&obj_attr,
SymbolicLinkName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
这里需要重点注意的是符号链接名,一定要初始化正确,并且是UNICODE_STRING类型,例如C盘,则初始化符号链接名为
UNICODE_STRINGSymbolicLinkName=RTL_CONSTANT_STRING("\\??\\c:");
如果是动态的,则一定要指派长度与Buffer真实长度一致。
完成obj_attr的初始化之后就可以打开符号链接对象了。
status=ZwOpenSymbolicLinkObject(&h,GENERIC_READ,&obj_attr);
如果成功,返回符号链接对象操作句柄。
3. ZwQuerySymbolicLinkObject()获取到设备目标
利用获取到的符号链接对象,获取真实设备名,保存于UNICDOE_STRING结构中,其原型如下:
NTSTATUS
NTAPI
ZwQuerySymbolicLinkObject(
_In_HANDLE LinkHandle,
_Inout_PUNICODE_STRING LinkTarget,
_Out_opt_PULONG ReturnedLength
);
LinkHandle是之前得到的操作句柄。
LinkTarget用于保存真实设备信息。
ReturnedLength保存长度。
当然在获取设备信息之前,需要初始化一个LinkTarget,并将其内容清空。
RtlZeroMemory(LinkTarget->Buffer,LinkTarget->MaximumLength);
status=ZwQuerySymbolicLinkObject(h,LinkTarget,NULL);
如果status为成功,那么设备信息已经获取到了,保存在LinkTarget中。
- 【Window内核驱动开发】——通过符号链接获取真实设备
- 驱动开发之符号链接和设备名称
- 驱动开发之符号链接和设备名称
- 驱动开发之符号链接和设备名称
- 驱动开发之符号链接和设备名称
- 驱动中通过设备链接名取得磁盘符号的方法
- Linux设备驱动&&内核开发
- Linux 驱动开发之内核模块开发(四)—— 符号表的导出
- Linux 驱动开发之内核模块开发(四)—— 符号表的导出
- Window XP驱动开发(十六) 驱动程序调用驱动程序(通过设备指针)
- linux驱动开发--导出内核符号
- linux驱动开发-内核符号表
- 【Window内核驱动开发】——内存映射的基本使用
- window 内核驱动开发环境配置
- 符号链接&设备名称
- 【windows内核驱动开发】文件系统微过滤驱动Minifilter——获取进程信息
- Linux 设备驱动开发 —— platform 设备驱动
- Linux 设备驱动开发 —— platform 设备驱动
- cookie应用显示当前与之前时间
- 浅析“远程对象调用”
- 地图整饰-框架与格网
- python单元测试练习
- PHP 对象-数组转换
- 【Window内核驱动开发】——通过符号链接获取真实设备
- NOIP2016全国信息学分区联赛提高组第二试 组合问题
- Spring事务传播机制和数据库隔离级别
- 开发技巧笔记
- PowerDesigner 反向生成
- Entity Framework 6 Code First系列3: 实体类M:N配置
- Linux下编译APM工具要求
- 查看APK的签名信息
- IOS开发之按虚拟键盘的return健隐藏键盘