项目中遇到的比较奇葩的问题,从网上找到一份源码,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, 1) != 0)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 = { 0 }; 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, 1) != 0)return Status; if (IsBadWritePtr(pszDosPath, 1) != 0)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, pNtPat