NT路径,DOS路径和Device路径互相转换
项目中遇到的比较奇葩的问题,从网上找到一份源码,https://blog.csdn.net/qq125096885/article/details/70766206
稍微整理了下,VS可以直接编译
#include "stdafx.h"
#include <windows.h>
#include <iostream> #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth #define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106L) //删除指针
#define SafeDeletePoint(pData) { if(pData){delete pData;pData=NULL;} } //删除数组
#define SafeDeleteArraySize(pData) { if(pData){delete []pData;pData=NULL;} } typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWCH Buffer;
} UNICODE_STRING; typedef UNICODE_STRING *PUNICODE_STRING; typedef struct _RTL_BUFFER {
PWCHAR Buffer;
PWCHAR StaticBuffer;
SIZE_T Size;
SIZE_T StaticSize;
SIZE_T ReservedForAllocatedSize; // for future doubling
PVOID ReservedForIMalloc; // for future pluggable growth
} RTL_BUFFER, *PRTL_BUFFER; typedef struct _RTL_UNICODE_STRING_BUFFER {
UNICODE_STRING String;
RTL_BUFFER ByteBuffer;
WCHAR MinimumStaticBufferForTerminalNul[sizeof(WCHAR)];
} RTL_UNICODE_STRING_BUFFER, *PRTL_UNICODE_STRING_BUFFER; //DOS路径转换NT路径 C:\\WINDOWS\\system32\\drivers -- \\??\\C:\\WINDOWS\\system32\\drivers
NTSTATUS DosPathToNtPath(wchar_t* pDosPath, PUNICODE_STRING pNtPath)
{
//定义变量
NTSTATUS Status = STATUS_UNSUCCESSFUL;
typedef BOOLEAN(__stdcall *fnRtlDosPathNameToNtPathName_U)(PCWSTR DosFileName, PUNICODE_STRING NtFileName, PWSTR *FilePart, PVOID Reserved);
static fnRtlDosPathNameToNtPathName_U RtlDosPathNameToNtPathName_U = (fnRtlDosPathNameToNtPathName_U)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "RtlDosPathNameToNtPathName_U"); //参数效验
if (IsBadReadPtr(pDosPath, ) != )return NULL;
if (RtlDosPathNameToNtPathName_U == NULL)return NULL; if (RtlDosPathNameToNtPathName_U(pDosPath, pNtPath, NULL, NULL))
{
Status = STATUS_SUCCESS;
}
return Status;
} //NT路径转换DOS路径 \\??\\C:\\WINDOWS\\system32\\drivers -- C:\\WINDOWS\\system32\\drivers
NTSTATUS NtPathToDosPath(PUNICODE_STRING pNtPath, wchar_t* pszDosPath)
{
//定义变量
NTSTATUS Status = STATUS_UNSUCCESSFUL;
RTL_UNICODE_STRING_BUFFER DosPath = { };
wchar_t* ByteDosPathBuffer = NULL;
wchar_t* ByteNtPathBuffer = NULL; typedef NTSTATUS(__stdcall *fnRtlNtPathNameToDosPathName)(ULONG Flags, PRTL_UNICODE_STRING_BUFFER Path, PULONG Disposition, PWSTR* FilePart);
static fnRtlNtPathNameToDosPathName RtlNtPathNameToDosPathName = (fnRtlNtPathNameToDosPathName)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "RtlNtPathNameToDosPathName"); //参数效验
if (IsBadReadPtr(pNtPath, ) != )return Status;
if (IsBadWritePtr(pszDosPath, ) != )return Status;
if (RtlNtPathNameToDosPathName == NULL)return Status; ByteDosPathBuffer = (wchar_t*)new char[pNtPath->Length + sizeof(wchar_t)];
ByteNtPathBuffer = (wchar_t*)new char[pNtPath->Length + sizeof(wchar_t)];
if (ByteDosPathBuffer == NULL || ByteNtPathBuffer == NULL) return Status; RtlZeroMemory(ByteDosPathBuffer, pNtPath->Length + sizeof(wchar_t));
RtlZeroMemory(ByteNtPathBuffer, pNtPath->Length + sizeof(wchar_t));
RtlCopyMemory(ByteDosPathBuffer, pNtPath->Buffer, pNtPath->Length);
RtlCopyMemory(ByteNtPathBuffer, pNtPath->Buffer, pNtPath->Length); DosPath.ByteBuffer.Buffer = ByteDosPathBuffer;
DosPath.ByteBuffer.StaticBuffer = ByteNtPathBuffer;
DosPath.String.Buffer = pNtPath->Buffer;
DosPath.String.Length = pNtPath->Length;
DosPath.String.MaximumLength = pNtPath->Length;
DosPath.ByteBuffer.Size = pNtPath->Length;
DosPath.ByteBuffer.StaticSize = pNtPath->Length; Status = RtlNtPathNameToDosPathName(, &DosPath, NULL, NULL);
if (NT_SUCCESS(Status))
{
if (_wcsnicmp(pNtPath->Buffer, ByteDosPathBuffer, pNtPath->Length) == )
{
Status = STATUS_UNSUCCESSFUL;
}
else
{
RtlCopyMemory(pszDosPath, ByteDosPathBuffer, wcslen(ByteDosPathBuffer) * sizeof(wchar_t));
}
}
else
{
//wprintf(L"GetLastError=%i\n", pRtlNtStatusToDosError(Status));
Status = STATUS_UNSUCCESSFUL;
} SafeDeleteArraySize(ByteDosPathBuffer);
SafeDeleteArraySize(ByteNtPathBuffer);
return Status;
} //\\Device\\HarddiskVolume1\x86.sys c:\x86.sys
BOOL DeviceDosPathToNtPath(wchar_t* pszDosPath, wchar_t* pszNtPath)
{
static TCHAR szDriveStr[MAX_PATH] = { };
static TCHAR szDevName[MAX_PATH] = { };
TCHAR szDrive[];
INT cchDevName;
INT i; //检查参数
if (IsBadReadPtr(pszDosPath, ) != )return FALSE;
if (IsBadWritePtr(pszNtPath, ) != )return FALSE; //获取本地磁盘字符串
ZeroMemory(szDriveStr, ARRAYSIZE(szDriveStr));
ZeroMemory(szDevName, ARRAYSIZE(szDevName));
if (GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
{
for (i = ; szDriveStr[i]; i += )
{
if (!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))
continue; szDrive[] = szDriveStr[i];
szDrive[] = szDriveStr[i + ];
szDrive[] = '\0';
if (!QueryDosDevice(szDrive, szDevName, MAX_PATH))//查询 Dos 设备名
return FALSE; cchDevName = lstrlen(szDevName);
if (_tcsnicmp(pszDosPath, szDevName, cchDevName) == )//命中
{
lstrcpy(pszNtPath, szDrive);//复制驱动器
lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径 return TRUE;
}
}
} lstrcpy(pszNtPath, pszDosPath); return FALSE;
} NTSTATUS RtlInitUnicodeString(OUT PUNICODE_STRING DestinationString, IN PCWSTR SourceString)
{ #define ARGUMENT_PRESENT(ArgumentPointer) (\
(CHAR *)((ULONG_PTR)(ArgumentPointer)) != (CHAR *)(NULL) ) SIZE_T Length;
DestinationString->Length = ;
DestinationString->MaximumLength = ;
DestinationString->Buffer = (PWSTR)SourceString;
if (ARGUMENT_PRESENT(SourceString))
{
Length = wcslen(SourceString); // We are actually limited to 32765 characters since we want to store a meaningful
// MaximumLength also.
if (Length > (UNICODE_STRING_MAX_CHARS - )) {
return STATUS_NAME_TOO_LONG;
} Length *= sizeof(WCHAR); DestinationString->Length = (USHORT)Length;
DestinationString->MaximumLength = (USHORT)(Length + sizeof(WCHAR));
} return STATUS_SUCCESS;
} int main()
{
NTSTATUS status;
wchar_t szWindowsDirectory[MAX_PATH] = { };
wchar_t DosPathBuffer[MAX_PATH] = { };
wchar_t szNtPath[MAX_PATH] = { };
UNICODE_STRING strBuff = { };
std::wstring dosPath = L"C:\\WINDOWS\\system32\\drivers";
std::wstring devicePath = L"\\Device\\HarddiskVolume4\\123.txt";
PUNICODE_STRING pNtPath = new UNICODE_STRING; GetWindowsDirectory(szWindowsDirectory, ARRAYSIZE(szWindowsDirectory)); status = DosPathToNtPath((wchar_t*)dosPath.c_str(), pNtPath);
if (NT_SUCCESS(status))
{
status = NtPathToDosPath(pNtPath, DosPathBuffer);
SafeDeletePoint(pNtPath);
} DeviceDosPathToNtPath((wchar_t*)devicePath.c_str(), szNtPath);
RtlInitUnicodeString(&strBuff, szNtPath); getchar();
return ; system("pause");
return ;
}
NT路径,DOS路径和Device路径互相转换的更多相关文章
- PHP获取当期前运行文件的路径,名字,服务器路径
<?phpecho "显示脚本文件的相对路径和文件名:\"".$_SERVER["PHP_SELF"]."\"<br& ...
- multipath多路径实验02-配置多路径软件
multipath多路径实验02-配置多路径软件 在上一篇文章<multipath多路径实验01-构建iSCSI模拟环境>,我构建了iSCSI的模拟环境,在文章最后,已经成功配置并在主机上 ...
- C#、ASP.NET获取当前应用程序的绝对路径,获取程序工作路径 (转帖)
C#.ASP.NET获取当前应用程序的绝对路径,获取程序工作路径 ============================================ 使用 Application.Start ...
- asp.net 文件复制或删除用相对路径,File.Copy中用相对路径,巧用相对路径复制文件
再复制文件 File.Copy(Server.MapPath("被复制的文件相对路径"), Server.MapPath("目的位置相对路径"), true); ...
- C#路径中获取文件全路径、目录、扩展名、文件名称
C#路径中获取文件全路径.目录.扩展名.文件名称常用函数 需要引用System.IO 直接可以调用Path的静态方法 class Program { static void Main(string[] ...
- 最简单的cmd命令行取得系统路径和python的安装路径(适用于winxp.win7和win10)
@echo off::pip install seleniumpython -c"import sys;print(sys.prefix)" >temp.txtfor /f ...
- servlet路径映射中的完全路径匹配、目录匹配、扩展名匹配
在servlet路径映射中,关于url-pattern的配置有三种,分别是完全路径匹配.目录匹配.扩展名匹配 其优先级分别为:完全路径匹配>目录匹配>扩展名匹配: 一.三种路径印射的区别 ...
- 修改redis 持久化路径和日志 路径 ,修改kafka日志路径
redis修改持久化路径和日志路径 vim redis.conf logfile /data/redis_cache/logs/redis.log #日志路径 dir /data/redis_cach ...
- Spring boot 默认静态资源路径与手动配置访问路径的方法
这篇文章主要介绍了Spring boot 默认静态资源路径与手动配置访问路径的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在application.propertis中配置 ##端口号 ...
- 默认情况下eth0网卡配置文件路径及客户端DNS的路径
默认情况下eth0网卡配置文件路径及客户端DNS的路径? eth0 网卡配置文件路径如下: /etc/sysconfig/network-scripts/ifcfg-eth0 客户端DNS的路径如下: ...
随机推荐
- windows 安装zookeeper
1 .下载 java sdk 和zookeeper 安装包 因为zookeeper是依赖java sdk,运行zookeeper先要,安装javaSDK . 2.安装zookeeper,zookee ...
- SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确
最近在查询SQL时遇到SQL文件错误,可能是文件数据已损坏.解决过程分享给大家. 问题描述 消息 824,级别 24,状态 2,第 1 行SQL Server 检测到基于一致性的逻辑 I/O 错误 p ...
- echarts切换tab时,第一个图表显示,第二个图表不显示的解决办法
首先这种情况,我在网上看到了好多人问,确实也有正解,但是只是说出了其错误出现的原因,并没有给出解决方法. 我也是深受其害,所以呢,在这里记录一下,分享给还在困扰着的你们,迅速找出解决办法. 首先,我先 ...
- Java的Random类详解
Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显示传入一个long型整数的种子. Random类比Math类的rando ...
- Redis集群架构
Redis集群概述 集群的核心意义只有一个:保证一个节点出现了问题之后,其他的节点可以继续提供服务使用. Redis基础部分讲解过主从配置:对于主从配置可以有两类:一主二从,层级关系.开发者一主二从是 ...
- 消费阿里云日志服务SLS
此文档只关心消费接入,不关心日志接入,只关心消费如何接入,可直接跳转到[sdk消费接入] SLS简介 日志服务: 日志服务(Log Service,简称 LOG)是针对日志类数据的一站式服务,在阿里巴 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十四║ Vuex + JWT 实现授权验证登录
壹周回顾 哈喽,又是元气满满的一个周一,又与大家见面了,周末就是团圆节了,正好咱们的前后端也要团圆了,为什么这么说呢,因为以后的开发可能就需要前后端一起了,两边也终于会师了,还有几天Vue系列就基本告 ...
- LINQ 常规实践总结
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续两次OrderBy,后面一个有可能会打乱前面一个的排序顺序,可能与预期不符. 要实现sql中的order by word,nam ...
- 性能测试工具 wrk 使用教程
文章首发自个人微信公众号:小哈学Java 个人网站地址:https://www.exception.site/wrk 被面试官经常问到之前开发的系统接口 QPS 能达到多少,经常给不出一个数值,支支吾 ...
- 【Android Studio安装部署系列】十八、Android studio更换APP应用图标
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio新建项目后会有一个默认图标,那么如何更换图标呢? 替换图标 这个方案不建议直接在已有项目上更换图标,建议 ...