c++ - 为目录创建文件映射

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

最佳答案

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

关于c++ - 为目录创建文件映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531933/

相关文章:

c++ - 继承自 boost::variant 和模板化 AST

linux - 无法使用 expdp 导出,无法打开日志等等

c++ - CLIon - 使用 SDL_TTF 的 undefined reference

C++动态分配类数组

Java 计划任务(在 windows 中)

android - 使用批处理将文件从Windows复制到Android

mysql - 备份 MySQL 数据库的安全方法?

bash - 为变量中的每个参数重复命令

c++ - 带有两个 mpf_t 的 gmp pow

windows - python win32com FileSystemObject 获取巨大文件夹失败