【问题标题】:How to get the Directory name/path from an opened handle如何从打开的句柄中获取目录名称/路径
【发布时间】:2011-04-18 18:17:51
【问题描述】:

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

【问题讨论】:

    标签: c api winapi file-io file


    【解决方案1】:

    NtQueryObject 做到了。

    【讨论】:

    • 介意告诉我们你是怎么做到的吗?
    • 请参阅stackoverflow.com/a/5286888/4727717,了解如何使用 NtQueryObject() 完成此任务。这使用了很多未记录的 Windows API 功能。
    【解决方案2】:

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

    这样,应该很容易得到目录名:只需去掉最后一个\之后的所有内容。

    【讨论】:

    • 不能这样做。我手上的句柄是一个目录句柄,通过zwopenfile(打开目录选项)打开。在函数中使用句柄失败..该函数仅适用于文件句柄..
    • @Beetle:用这些信息更新您的问题可能是个好主意。
    猜你喜欢
    • 2020-02-28
    • 2019-10-14
    • 1970-01-01
    • 2016-01-28
    • 2015-02-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多