Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588528
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:50:58

#include
#include
#include
#include
#include
#include
#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的小窝 阅读(63)   

--------------------next---------------------

阅读(297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~