转载:http://blog.csdn.net/qq_33504040/article/details/78468278

最近在做一个文件过滤驱动程序,禁止访问指定目录或文件。想要从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 <iostream>
#include <windows.h>
#include <tchar.h>
using namespace std; BOOL DeviceDosPathToNtPath(wchar_t* pDosPath, wchar_t* pNtPath)
{
static TCHAR DriveStr[MAX_PATH] = { };
static TCHAR DevName[MAX_PATH] = { };
TCHAR Drive[];
INT cchDevName;
INT i = ;
//检查参数
if (IsBadReadPtr(pDosPath, ) != )return FALSE;
if (IsBadWritePtr(pNtPath, ) != )return FALSE; if (!lstrcmpi(pDosPath, _T("A:\\")) || !lstrcmpi(pDosPath, _T("B:\\")))
return FALSE; Drive[] = pDosPath[i];
Drive[] = pDosPath[i + ];
Drive[] = '\0';
if (!QueryDosDevice(Drive, DevName, MAX_PATH))//查询设备名,这里是重点
return FALSE;
cchDevName = lstrlen(DevName);
lstrcpy(pNtPath, DevName);//复制设备名
lstrcat(pNtPath, pDosPath + );//复制路径
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 ;
}

运行结果:

存在的盘符:

不存在的盘符:

[内核驱动] DOS路径转化为NT路径的更多相关文章

  1. 内核驱动编译之Makefile shell pwd路径问题

    一般我们在写Makefile的时候为了获取到当前Makefile所在的文件夹路径,会使用TopDIR ?= $(shell pwd)来定义,后续的文件路径都是基于此TopDIR基础上使用. 今天在移植 ...

  2. NT路径,DOS路径和Device路径互相转换

    项目中遇到的比较奇葩的问题,从网上找到一份源码,https://blog.csdn.net/qq125096885/article/details/70766206 稍微整理了下,VS可以直接编译 # ...

  3. linux内核驱动模型

    linux内核驱动模型,以2.6.32内核为例.(一边写一边看的,有点乱.) 1.以内核对象为基础.用kobject表示,相当于其它对象的基类,是构建linux驱动模型的关键.具有相同类型的内核对象构 ...

  4. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...

  5. Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux  opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2 ...

  6. linux内核驱动——从helloworld开始

    学习编程第一个都是学习hello world程序,学习内核驱动自然也不例外,我也是!本文整理了网上的一些资料以及加上自己的一些心得体会,希望对初学者有帮助,可别小看这个简单的hello world,本 ...

  7. Windows内核驱动中操作文件

    本页主题:如何在windows内核驱动中对文件操作,实现对文件的拷贝.粘贴.删除.查询信息等,这是很常用也是很简单的方法. 部分内容参考:http://www.cppblog.com/aurain/a ...

  8. Windows内核驱动开发:HelloWorld

    测试信息 Dev Machine: Windows Version: 2004 (19041.264) WDK Version: 10.0.19041.1 SDK Version: 10.0.1904 ...

  9. TCP数据接收及快速路径和慢速路径

    概述 tcp握手完成后,收到数据包后,调用路径为tcp_v4_rcv->tcp_v4_do_rcv->tcp_rcv_established在tcp_rcv_established中处理T ...

随机推荐

  1. numpy&pandas笔记

    1.基础属性: array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵 print('number of dim:',array.ndim) # 维度 # numbe ...

  2. C#项目中关于多个程序集下App.config文件的问题

    在项目中我们会经常用到App.config文件,有的是自动生成的,比如引用webservice.wcf服务时生成:也有手动建立的配置文件直接默认名就为app.config.这些配置有的保存当前程序集用 ...

  3. 关于windows中80端口被占用

    很奇怪,windows7系统中的80端口被pid 为4 的system进程监听. 尝试关闭IIS功能,并在这期间进行过多次重启,均无效. 后来依照这篇文件解决的:https://www.jianshu ...

  4. 软工网络15团队作业4——Alpha阶段敏捷冲刺1.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺1.0 1. 各个成员在 Alpha 阶段认领的任务,以及整个项目预期的任务量(使用整数表示,与项目预估的总工作小时数一致.比如项目A预估需120小时才 ...

  5. 06 str() bytes() 编码转换

    x = str() #创建字符串#转换成字符串,字节,编码 m = bytes()#创建字节#转换成字节,字符串,要编程什么编码类型的字节 a = "李露" b1 = bytes( ...

  6. 什么是Satoshi?和比特币中本聪有什么关系?

    Satoshi Nakamoto(中本聪)是发起比特币和原始比特币客户端创建者.不过,我经常听到“Satoshi ”这个词,好像它是一个货币单位. 什么是Satoshi呢?Satoshi是0.0000 ...

  7. CentOS7使用yum命令安装Java1.8

    CentOS7使用yum命令安装Java1.8 首先更新已安装的包:#yum update查看系统当前的java版本:#java -version==================== CentOS ...

  8. Codeforces 456A - Laptops

    题目链接:http://codeforces.com/problemset/problem/456/A One day Dima and Alex had an argument about the ...

  9. JustOj 1910: 人见人爱A+B

    [提交][状态][讨论版] 题目描述 北大的acm上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱.   ...

  10. linux系统电视盒子到底是什么

    经常看到各种大神说今天刷了什么linux系统可以干嘛干嘛了,刷了乌班图可以干嘛干嘛了,但是身为一个小白,对这种名词都是一知半解.所以这边给大家科普一下,什么是linux系统?电视盒子刷了这个可以干啥? ...