目录的CreateFileMapping

时间:2011-09-23 16:13:50

标签: c++ windows backup wdk

我有这个函数,它从文件句柄中提供完整的文件名(路径)。唯一的问题是目录句柄的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: %x\n", 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] = '\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 %s\n"), pszFilename);
  return(bSuccess);
}

1 个答案:

答案 0 :(得分:3)

您可以使用NtQueryInformationFile和FileNameInformation来检索与文件句柄关联的名称。