C 如何从打开的句柄获取目录名/路径

C 如何从打开的句柄获取目录名/路径,c,api,winapi,file-io,file,C,Api,Winapi,File Io,File,通过zwopenfile(opendirectory选项)打开目录时,它返回目录路径的句柄。现在我需要从句柄获取目录路径。这是我的要求 我可以看到一个示例(请参见下面的代码),其中可以从文件句柄获取文件名。但下面的示例对目录没有帮助。从打开的句柄中获取目录名是否有任何可能性 CHAR* GetFileNameFromHandle(HANDLE hFile) { BOOL bSuccess = FALSE; TCHAR pszFilename[MAX_PATH+1]; HANDLE

通过zwopenfile(opendirectory选项)打开目录时,它返回目录路径的句柄。现在我需要从句柄获取目录路径。这是我的要求

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

 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);
}
CHAR*GetFileNameFromHandle(HANDLE-hFile)
{
BOOL bsucces=假;
TCHAR pszFilename[MAX_PATH+1];
处理hFileMap;
//获取文件大小。
DWORD dwFileSizeHi=0;
DWORD dwFileSizeLo=GetFileSize(hFile,&dwFileSizeHi);
if(dwFileSizeLo==0&&dwFileSizeHi==0)
{
printf(“无法映射长度为零的文件。\n”);
返回FALSE;
}
//创建文件映射对象。
hFileMap=CreateFileMappingW(hFile,
无效的
第页(只读),
0, 
1.
无效);
if(hFileMap)
{
//创建文件映射以获取文件名。
void*pMem=MapViewOfFile(hFileMap,文件映射读取,0,0,1);
如果(pMem)
{
如果(GetMappedFileNameW)(GetCurrentProcess(),
pMem,
pszFilename,
最大路径)
{
//将具有设备名称的路径转换为驱动器号。
TCHAR szTemp[1024];
szTemp[0]='\0';
if(GetLogicalDriveStrings(1024-1,szTemp))
{
TCHAR szName[MAX_PATH];
TCHAR szDrive[3]=文本(“:”);
boolbfound=FALSE;
TCHAR*p=szTemp;
做
{
//将驱动器号复制到模板字符串中
*szDrive=*p;
//查找每个设备名称
if(QueryDosDevice(szDrive、szName、MAX_PATH))
{
UINT uNameLen=_tcslen(szName);
如果(未删除<最大路径)
{
bFound=_tcsnicmp(pszFilename,szName,uNameLen)=0;
如果(bFound&&*(pszFilename+uNameLen)=\u T('\\'))
{
//使用szTempFile重建pszFilename
//将设备路径替换为DOS路径
TCHAR szTempFile[MAX_PATH];
StringCchPrintf(szTempFile,
马克斯路,
文本(“%s%s”),
深圳路,
pszFilename+uNameLen);
StringCchCopyN(pszFilename,MAX_PATH+1,szTempFile,_tcslen(szTempFile));
}
}
}
//转到下一个空字符。
而(*p++);
}while(!bFound&&*p);//字符串结尾
}
}
b成功=真;
未经批准的文件(pMem);
} 
CloseHandle(hFileMap);
}
_tprintf(文本(“文件名为%s\n”)、pszFilename;
返回(pszFilename);
}

您发布的MSDN示例提供了一个“完全限定”的文件名,即驱动器号和完整路径


这样,就可以很容易地获得目录名:只需去掉最后一个
\

之后的所有内容。您发布的MSDN示例提供了一个“完全限定”的文件名,即驱动器号和完整路径


有了它,就可以很容易地得到目录名:只要在上一个
\

NtQueryObject完成后去掉所有内容。

NtQueryObject完成了。

不可能这样做。我手中的句柄是一个目录句柄,通过zwopenfile(opendirectory选项)打开。在函数中使用句柄失败。。该函数仅适用于文件句柄。@甲壳虫:用这些信息更新您的问题可能是个好主意。这样做是不可能的。我手中的句柄是一个目录句柄,通过zwopenfile(opendirectory选项)打开。在函数中使用句柄失败。。该函数只能与文件句柄一起使用。@甲壳虫:用这些信息更新您的问题可能是一个好主意。请告诉我们您是如何完成的?请参阅如何使用NtQueryObject()完成此任务。这使用了相当多的Windows API未记录的功能。请告诉我们您是如何做到的?请参阅如何使用NtQueryObject()完成此任务。这使用了相当多的WindowsAPI未记录的特性。