设备名和符号链接名

以前总是对符号链接不太明白,今天看到了一篇文章,讲的很好,记录一下。

-------------------------------------------------------------------------------------------------

UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
NTSTATUS status=IoCreateDevice(pDriverObject,
                               sizeof(DEVICE_EXTENSION),
                                &(UNICODE_STRING)devName,
                                FILE_DEVICE_UNKNOWN,
                                0,TRUE,
                                &pDevObj);

UNICODE_STRING symLinkName;
RtlInitUnicodeString(&devName,L"\\??\\HelloDDK");

status = IoCreateSymbolicLink(&symLinkName,&devName);

-------------------------------------------------------------------------------------------------

windows下的设备是以"\Device\[设备名]”形式命名的。例如磁盘分区的c盘,d盘的设备名称就是

"\Device\HarddiskVolume1”,"\Device\HarddiskVolume2”, 当然也可以不指定设备名称。如果

IoCreateDevice中没有指定设备名称,那么I/O管理器会自动分配一个数字作为设备的名称。

例如"\Device\00000001"。

\Device\[设备名],不容易记忆,通常符号链接可以理解为设备的别名,更重要的是设备名,

只能被内核模式下的其他驱动所识别,而别名可以被用户模式下的应用程序识别,例如c盘,

就是名为"c:"的符号链接,其真正的设备对象是"\Device\HarddiskVolume1”,所以在写驱动

时候,一般我们创建符号链接,即使驱动中没有用到,这也算是一个好的习惯吧。

驱动中符号链接名是这样写的

L"\\??\\HelloDDK"--->\??\HelloDDK

L"\\DosDevices\\HelloDDK"--->\DosDevices\HelloDDK

在应用程序中,符号链接名:

L"\\\\.\\HelloDDK"-->\\.\HelloDDK

winobj和DeviceTree可以用来查看这些信息。

<think>好的,用户的问题是关于在Windows中使用C语言实现随机设备符号链接与驱动通信的功能。我需要先理解这些概念以及它们在Windows驱动开发中的具体应用。 首先,设备是驱动在系统中注册的称,应用程序通过这个称来访问驱动。而符号链接则是设备的一个别,通常更友好,方便应用程序使用。随机设备可能是为了安全考虑,避免固定的称被恶意程序利用。因此,用户的需求可能涉及到如何生成随机的设备符号链接,并确保应用程序能通过这些称与驱动通信。 接下来,我需要回顾Windows驱动开发的基本流程。驱动通常需要创建一个设备对象,并注册符号链接。在用户态,应用程序可以通过CreateFile打开设备,使用DeviceIoControl进行通信。但如何生成随机称呢?在驱动层,可能需要使用特定的函数来生成随机字符串作为设备符号链接。 然后,考虑如何用C语言实现这些步骤。驱动部分需要使用Windows Driver Kit(WDK),涉及DriverEntry例程、设备创建、符号链接管理等。用户态程序则需要调用相应的API,如CreateFile,并处理随机生成的符号链接。这里可能需要动态获取符号链接,或者在驱动应用程序之间共享某种随机生成的标识符。 还需要注意安全性问题,随机称可以防止简单的枚举攻击,但需要确保生成足够的随机性。同时,符号链接的创建删除需要在驱动加载卸载时正确管理,避免资源泄漏。 另外,参考提供的引用中,尤其是引用[2]提到的unlocked_ioctl在kernel 3.0之后被移除,但Windows驱动开发可能使用不同的接口,比如IOCTL。需要确认Windows驱动中控制命令的处理方法,可能涉及到IRP_MJ_DEVICE_CONTROL的处理。 最后,整理实现步骤,包括驱动端的设备创建、符号链接生成,用户程序的通信方法,并给出示例代码框架。同时,验证这些步骤是否符合Windows驱动开发的最佳实践,以及如何处理可能的错误情况,比如称冲突或生成失败。</think>在Windows系统中使用C语言实现随机设备符号链接与驱动通信,需要遵循以下技术路线: ### 一、驱动端实现步骤 1. **生成随机设备** ```c WCHAR deviceNameBuffer[64]; RtlStringCbPrintfW(deviceNameBuffer, sizeof(deviceNameBuffer), L"\\Device\\RandomDevice_%08x", RtlRandomEx(&seed)); // 使用RtlRandomEx生成随机数[^2] ``` 2. **创建设备对象** ```c UNICODE_STRING deviceName; RtlInitUnicodeString(&deviceName, deviceNameBuffer); IoCreateDevice(DriverObject, 0, &deviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject); ``` 3. **创建随机符号链接** ```c WCHAR symLinkBuffer[64]; RtlStringCbPrintfW(symLinkBuffer, sizeof(symLinkBuffer), L"\\DosDevices\\RandSymLink_%08x", RtlRandomEx(&seed)); UNICODE_STRING symLinkName; RtlInitUnicodeString(&symLinkName, symLinkBuffer); IoCreateSymbolicLink(&symLinkName, &deviceName); ``` ### 二、应用层通信方法 1. **动态获取符号链接** 需要建立应用层与驱动层的命约定,例如: - 通过注册表传递符号链接 - 使用固定前缀+通配符枚举设备 ```c HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_MYDRIVER, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); ``` 2. **建立通信通道** ```c HANDLE hDevice = CreateFile(symLinkName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ``` 3. **发送控制命令** ```c DeviceIoControl(hDevice, IOCTL_MYDRIVER_COMMAND, inputBuffer, inputSize, outputBuffer, outputSize, &bytesReturned, NULL); ``` ### 三、关键安全措施 1. 使用`RtlRandomEx`替代标准库rand函数,确保更强的随机性[^3] 2. 设备对象设置安全描述符 ```c PSECURITY_DESCRIPTOR sd; ConvertStringSecurityDescriptorToSecurityDescriptor( L"D:P(A;;GA;;;SY)(A;;GA;;;BA)", SDDL_REVISION_1, &sd, NULL); pDeviceObject->SecurityDescriptor = sd; ``` ### 四、完整开发流程示例 1. 驱动加载时生成随机设备符号链接 2. 通过事件日志或注册表传递符号链接信息 3. 应用程序动态获取符号链接 4. 建立安全通信通道 5. 完成交互后驱动自动清理符号链接
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值