CreateFileMapping for Directory

CreateFileMapping for Directory

本文关键字:Directory for CreateFileMapping      更新时间:2023-10-16

我有这个函数,它从文件句柄中给出完整的文件名(路径)。唯一的问题是CreateFileMapping对目录句柄失败。有解决方法吗?

我得到句柄使用NtCreateFile()

   ULONG status = NtCreatefile(&f, GENERIC_ALL, &oa, iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_OPEN_BY_FILE_ID , NULL, 0);
    printf("status: %X, handle: %xn", status, f);

   BOOL CHouseKeeper::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 )
  {
     _tprintf(TEXT("Cannot map a file with a length of zero.n"));
     return FALSE;
  }
  // Create a file mapping object.
  //It fails here if a directory handle is passed, it returns 0
  hFileMap = CreateFileMapping(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 (GetMappedFileName (GetCurrentProcess(), 
                         pMem, 
                         pszFilename,
                         MAX_PATH)) 
      {
        // Translate path with device name to drive letters.
        TCHAR szTemp[BUFSIZE];
        szTemp[0] = '';
        if (GetLogicalDriveStrings(BUFSIZE-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))
        {
          size_t uNameLen = _tcslen(szName);
          if (uNameLen < MAX_PATH) 
          {
            bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0
                     && *(pszFilename + uNameLen) == _T('');
            if (bFound) 
            {
              // 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);
  }else {
  wcout<<GetLastError()<<endl;
  }
  _tprintf(TEXT("File name is %sn"), pszFilename);
  return(bSuccess);
}

可以使用带有FileNameInformation的NtQueryInformationFile来检索与文件句柄相关联的名称