wetwoo的小窝
wetwoo的小窝

导航

<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
统计
  • 随笔 - 22
  • 文章 - 4
  • 评论 - 14
  • 引用 - 0

留言簿(1)

随笔档案

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>
#include <strsafe.h>
#pragma comment(lib, "psapi")

#define BUFSIZE 512

BOOL 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 = CreateFileMapping(hFile,
  NULL,
  PAGE_READONLY,
  0,
  MAX_PATH,
  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, BUFSIZE))
      {
       UINT uNameLen = _tcslen(szName);
       
       if (uNameLen < MAX_PATH)
       {
        bFound = _tcsnicmp(pszFilename, szName,
         uNameLen) == 0;
        
        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);
 }
 _tprintf(TEXT("File name is %s\n"), pszFilename);
 return(bSuccess);
}

posted on 2008-08-14 16:23 wetwoo的小窝 阅读(90) 评论(0)  编辑 收藏
Comments
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]