2010-09-29 5 views
1

Lors de l'ouverture d'un répertoire via zwopenfile (option de répertoire ouvert), il renvoie un handle pour le chemin d'accès au répertoire. Maintenant, je dois obtenir le chemin du répertoire à partir du handle. C'est mon exigence.Comment obtenir le nom/chemin du répertoire à partir d'un descripteur ouvert

Je pourrais voir un exemple (s'il vous plaît voir le code ci-dessous) où le nom de fichier peut être récupéré à partir de la poignée de fichier. Mais l'exemple ci-dessous n'aide pas pour le répertoire. Est-il possible de récupérer le nom du répertoire à partir de son handle ouvert.

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); 
} 

Répondre

1

NtQueryObject l'a fait.

+3

Vous nous dites comment vous l'avez fait? – roymustang86

+0

Voir http://stackoverflow.com/a/5286888/4727717 pour savoir comment utiliser NtQueryObject() pour cette tâche. Ceci utilise beaucoup de fonctionnalités non documentées de l'API Windows. – Holger

0

L'exemple de MSDN, qui vous avez publié, donne un nom de fichier « complet », à savoir la lettre de lecteur et le chemin complet.

Avec cela, il devrait être facile d'obtenir le nom du répertoire: il suffit de tout enlever après la dernière \.

+0

Cela n'a pas pu être fait. Le descripteur que j'ai dans ma main est un descripteur de répertoire, ouvert via zwopenfile (option de répertoire ouvert). Utilisation de la poignée dans la fonction échoue .. La fonction ne fonctionnera qu'avec la poignée de fichier .. –

+0

@Beetle: Il pourrait être une bonne idée de mettre à jour votre question avec cette information. –

+0

Okie merci, question reformulée. –