2010-09-29 79 views
1

在通过zwopenfile(打开目录选项)打开目录时,它会返回目录路径的句柄。现在我需要从句柄中获取目录路径。它是我的要求。如何从打开的句柄中获取目录名称/路径

我可以看到一个示例(请参阅下面的代码),其中可以从文件句柄中获取文件名。但下面的例子对目录没有帮助。从打开的句柄中获取目录名是否存在任何可能性。

CHAR* GetFileNameFromHandle(HANDLE hFile) 
{ 
    BOOL bSuccess = FALSE; 
    TCHAR pszFilename[MAX_PATH+1]; 
    HANDLE hFileMap; 

    // Get the file size. 
    DWORD dwFileSizeHi = 0; 
    DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); 

    if(dwFileSizeLo == 0 && dwFileSizeHi == 0) 
    { 
    printf("Cannot map a file with a length of zero.\n"); 
    return FALSE; 
    } 

    // Create a file mapping object. 
    hFileMap = CreateFileMappingW(hFile, 
        NULL, 
        PAGE_READONLY, 
        0, 
        1, 
        NULL); 

    if (hFileMap) 
    { 
    // Create a file mapping to get the file name. 
    void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1); 

    if (pMem) 
    { 
     if (GetMappedFileNameW (GetCurrentProcess(), 
          pMem, 
          pszFilename, 
          MAX_PATH)) 
     { 

     // Translate path with device name to drive letters. 
     TCHAR szTemp[1024]; 
     szTemp[0] = '\0'; 

     if (GetLogicalDriveStrings(1024-1, szTemp)) 
     { 
      TCHAR szName[MAX_PATH]; 
      TCHAR szDrive[3] = TEXT(" :"); 
      BOOL bFound = FALSE; 
      TCHAR* p = szTemp; 

      do 
      { 
      // Copy the drive letter to the template string 
      *szDrive = *p; 

      // Look up each device name 
      if (QueryDosDevice(szDrive, szName, MAX_PATH)) 
      { 
       UINT uNameLen = _tcslen(szName); 

       if (uNameLen < MAX_PATH) 
       { 
       bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0; 

       if (bFound && *(pszFilename + uNameLen) == _T('\\')) 
       { 
        // Reconstruct pszFilename using szTempFile 
        // Replace device path with DOS path 
        TCHAR szTempFile[MAX_PATH]; 
        StringCchPrintf(szTempFile, 
          MAX_PATH, 
          TEXT("%s%s"), 
          szDrive, 
          pszFilename+uNameLen); 
        StringCchCopyN(pszFilename, MAX_PATH+1, szTempFile, _tcslen(szTempFile)); 
       } 
       } 
      } 

      // Go to the next NULL character. 
      while (*p++); 
      } while (!bFound && *p); // end of string 
     } 
     } 
     bSuccess = TRUE; 
     UnmapViewOfFile(pMem); 
    } 

    CloseHandle(hFileMap); 
    } 
    _tprintf(TEXT("File name is %s\n"), pszFilename); 
    return(pszFilename); 
} 

回答

1

NtQueryObject做到了。

+3

介意告诉我们你是如何做到的? – roymustang86 2011-09-23 14:17:39

+0

有关如何使用NtQueryObject()执行此任务,请参阅http://stackoverflow.com/a/5286888/4727717。这使用了相当多的Windows API的未记录功能。 – Holger 2016-03-08 09:42:01

0

您发布的MSDN示例给出了“完全限定”文件名,即驱动器号和完整路径。

因此,应该很容易得到目录名称:在最后的\之后剥去所有的东西。

+0

它不能这样做。我手中的句柄是一个目录句柄,通过zwopenfile(打开目录选项)打开。在函数中使用句柄失败..该函数只能用于文件句柄.. – 2010-09-29 12:24:59

+0

@Beetle:用这些信息更新你的问题可能是一个好主意。 – 2010-09-29 13:42:27

+0

Okie谢谢,问题重新措辞。 – 2010-09-30 04:20:17

相关问题