zoukankan      html  css  js  c++  java
  • 根据文件句柄获得完整路径

    使用NtQueryInformationFile函数获得不到完整路径

    可以用NtQueryObject获取完整的NT路径:

     1 #include <windows.h>
     2 #include <iostream>
     3 using namespace std;
     4 
     5 
     6 typedef struct _OBJECT_NAME_INFORMATION {
     7     WORD Length;
     8     WORD MaximumLength;
     9     LPWSTR Buffer;
    10 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
    11 
    12 typedef long(__stdcall*PNtQueryObject)(HANDLE ObjectHandle,ULONG ObjectInformationClass,PVOID ObjectInformation,ULONG ObjectInformationLength,PULONG ReturnLength);
    13 
    14 int main(){
    15     PNtQueryObject NtQueryObject(reinterpret_cast<PNtQueryObject>(GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"NtQueryObject")));
    16     OBJECT_NAME_INFORMATION name,*pname;ULONG len;
    17     HANDLE hFile=CreateFile(L"D:\\xiao\\xiaoma.txt",FILE_READ_DATA,1,0,OPEN_EXISTING,0,0);
    18     NtQueryObject(hFile,1,&name,sizeof name,&len);
    19     pname=reinterpret_cast<POBJECT_NAME_INFORMATION>(new char[len]);
    20     NtQueryObject(hFile,1,pname,len,&len);
    21     wcout<<pname->Buffer<<endl;
    22     return 0;
    23 }

    这样获得的路径是NT路径,如果要转化为DOS路径的话,可以用下面的函数。

     1 ///////////////////////////////////////////
     2 //功  能:传入一个逻辑路径,转化成DOS路径
     3 //参  数:DeviceName,逻辑路径
     4 //        DosName,DOS路径
     5 //返回值:执行成功,返回YES
     6 ///////////////////////////////////////////
     7 
     8 
     9 NTSTATUS
    10     RtlVolumeDeviceToDosName_(
    11     IN  PUNICODE_STRING  DeviceName,
    12     OUT PUNICODE_STRING  DosName
    13     )
    14 
    15 {
    16 
    17     UNICODE_STRING driveLetterName;
    18     WCHAR          driveLetterNameBuf[256];
    19     NTSTATUS status=STATUS_SUCCESS;
    20     WCHAR c;
    21     int Len,i,j;
    22     WCHAR DriLetter[3];
    23     UNICODE_STRING linkTarget;
    24     USHORT len;
    25     ANSI_STRING ANSI_PATH;
    26     CHAR T2[256];
    27     ANSI_PATH.Buffer=T2;
    28     ANSI_PATH.MaximumLength=256;
    29 
    30     for (c = L'A'; c <= L'Z'; c++)
    31     {
    32         RtlInitEmptyUnicodeString(&driveLetterName,driveLetterNameBuf,sizeof(driveLetterNameBuf));
    33         RtlAppendUnicodeToString(&driveLetterName, L"\\??\");
    34             DriLetter[0] = c;
    35         DriLetter[1] = L':';
    36         DriLetter[2] = 0;
    37         RtlAppendUnicodeToString(&driveLetterName,DriLetter);
    38         status = QuerySymbolicLink(&driveLetterName, &linkTarget);
    39         if (!NT_SUCCESS(status))
    40         {
    41             continue;
    42         }
    43         if (RtlPrefixUnicodeString(&linkTarget, DeviceName, TRUE))
    44         {
    45             Len=linkTarget.Length;
    46             ExFreePool(linkTarget.Buffer);
    47             break;
    48         }
    49         ExFreePool(linkTarget.Buffer);
    50     }
    51     if (c <= L'Z')
    52     {
    53         DosName->Length   = DeviceName->Length+4-Len;
    54         *(DosName->Buffer)  = c;
    55         *(DosName->Buffer+ 1) = ':';
    56         *(DosName->Buffer+ 2) = 0;
    57         j=2;
    58         for(i=Len/2;i<DeviceName->Length/2;i++,j++)
    59         {
    60             *(DosName->Buffer+j)=DeviceName->Buffer[i];
    61         }
    62         return STATUS_SUCCESS;
    63     }
    64     return status;
    65 }

     

     

  • 相关阅读:
    linux下编译安装mysql
    Linux系统信息查看命令(转载)
    python使用memcached
    ./configure 命令使用和参数解析
    linux平台下使用 nginx + spawn-cgi 部署webpy程序
    冒泡排序
    在gitub上添加ssh key
    给p标签做单行省略 设置宽度的问题
    移动端的无缝滚动
    canvas-图片翻转
  • 原文地址:https://www.cnblogs.com/02xiaoma/p/2764904.html
Copyright © 2011-2022 走看看