2010-09-29 80 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

相關問題