博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[内核驱动] DOS路径转化为NT路径
阅读量:6504 次
发布时间:2019-06-24

本文共 2058 字,大约阅读时间需要 6 分钟。

转载:

最近在做一个文件过滤驱动程序,禁止访问指定目录或文件。想要从R3给R0发命令和想要禁止访问的路径,达到控制驱动的效果。 

但是在R3下习惯使用DOS路径,就是显示磁盘分区的符号链接的路径,比如C:,D:\,但是在R0下一般拿到的都是设备名,卷名,类似于\Device\HarddiskVolume1\,这就代表这个计算机里的第一个分区也就是C盘,D盘之类的,那么在R3下与R0通讯,发送路径名时就需要转换。

一开始不了解的时候自己做了一个对应的表,类似于C盘对应\Device\HarddiskVolume1这种, 后来感觉会出问题,如果这个驱动在虚拟机上跑,大部分人一般虚拟机不分区,也就是只有一个C盘,然后系统会默认添加一个DVD光驱盘,这时肯定是添加D盘了,那如果后来又分了一个区比如是E盘,那么在我的表里面C D E分别对应 \Device\HarddiskVolume1,\Device\HarddiskVolume2 ,\Device\HarddiskVolume3,这时问题就来了,在这个计算机E盘对应的是\Device\HarddiskVolume2。而D盘对应的是\Device\CdRom0 ,如果按我的表来转换会出问题。

后来在网上查到了几个路径转换的函数,不知道他们面对的场景是不是跟我不一样,我拿来直接用转换有问题,没办法只能看了看内部实现,发现其实就一个重要的函数QueryDosDevice(),用这个函数可以查询盘符对应的卷名,那就很简单了,只需要截取字符串C: 然后调用函数返回\Device\HarddiskVolume1,再拼接上就OK了,相信大家稍微花点心思都可以写出来。

注意一下A B盘是没有的,过滤一下,这个问题我在网上查了一下,说是在电脑出现的早期,还没有硬盘和光驱,人们把应用程序和文件都存放在软盘上,就连启动电脑也主要靠软驱。当时,一台电脑通常会安装两个软驱,即3.5英寸和5.25英寸的两个软驱,他们就是所谓的“A盘”与“B盘”。后来硬盘产生后它们自然就被淘汰了。这里过滤一下。

然后还有一点就是控制面板的计算机管理那里是可以改磁盘的符号链接的,比如把C盘改成Y盘,但是它的设备名始终是唯一的,所以不影响结果。

#include 
#include
#include
using namespace std;BOOL DeviceDosPathToNtPath(wchar_t* pDosPath, wchar_t* pNtPath){ static TCHAR DriveStr[MAX_PATH] = { 0 }; static TCHAR DevName[MAX_PATH] = { 0 }; TCHAR Drive[3]; INT cchDevName; INT i = 0; //检查参数 if (IsBadReadPtr(pDosPath, 1) != 0)return FALSE; if (IsBadWritePtr(pNtPath, 1) != 0)return FALSE; if (!lstrcmpi(pDosPath, _T("A:\\")) || !lstrcmpi(pDosPath, _T("B:\\"))) return FALSE; Drive[0] = pDosPath[i]; Drive[1] = pDosPath[i + 1]; Drive[2] = '\0'; if (!QueryDosDevice(Drive, DevName, MAX_PATH))//查询设备名,这里是重点 return FALSE; cchDevName = lstrlen(DevName); lstrcpy(pNtPath, DevName);//复制设备名 lstrcat(pNtPath, pDosPath + 2);//复制路径 return TRUE;}int main(){ wchar_t* pDospath=L"C:\\Users\\Administrator\\Desktop\\test.txt";//盘符一定要指定一个存在的,比如你输入"K盘" ,这样转换会不成功 wchar_t Ntpath[MAX_PATH]; DeviceDosPathToNtPath(pDospath,Ntpath); wprintf(L"NT : %s\n",Ntpath); getchar(); return 0;}

运行结果:

存在的盘符:

不存在的盘符:

 

你可能感兴趣的文章
ArcGIS帮助文档VS帮助文档不能复制图片的解决方法
查看>>
如何使用C#关键字const,readonly,static
查看>>
使用VS2013分析DMP文件
查看>>
用户管理 之 Linux 用户管理工具介绍
查看>>
JVM原理讲解和调优
查看>>
Microsoft's Office - ATC Shanghai
查看>>
在python中使用zookeeper管理你的应用集群
查看>>
小论面向对象编程方法
查看>>
七周七数据库
查看>>
BZOJ 2821 作诗(Poetize)(分块)
查看>>
一起谈.NET技术,在Mono 2.8上部署ASP.NET MVC 2
查看>>
Silver“.NET研究”light 游戏开发小技巧:透明背景的Silverlight程序
查看>>
Eclipse开发Android应用程序入“.NET研究”门:重装上阵
查看>>
通用权限管理系统组件 (GPM - General Permissions Manager) 中实现大数据的高效分页显示...
查看>>
乐观锁悲观锁应用
查看>>
几款网络测试工具总结
查看>>
IdHTTP处理HTTP 302遇到的问题
查看>>
宽容,是创新的土壤
查看>>
ACM算法相关资料
查看>>
Directx11教程(14) D3D11管线(3)
查看>>