如何根据文件句柄获取文件名?

如何根据文件句柄获取文件名?

#include<windows.h>
#include<stdio.h>
#include<tchar.h>
#include<string.h>
#include<psapi.h>

#defineBUFSIZE512

BOOLGetFileNameFromHandle(HANDLEhFile)
{
BOOLbSuccess=FALSE;
TCHARpszFilename[MAX_PATH+1];
HANDLEhFileMap;

//Getthefilesize.
DWORDdwFileSizeHi=0;
DWORDdwFileSizeLo=GetFileSize(hFile,&dwFileSizeHi);

if(dwFileSizeLo==0&&dwFileSizeHi==0)
{
printf("Cannotmapafilewithalengthofzero./n");
returnFALSE;
}

//Createafilemappingobject.
hFileMap=CreateFileMapping(hFile,
NULL,
PAGE_READONLY,
0,
1,
NULL);

if(hFileMap)
{
//Createafilemappingtogetthefilename.
void*pMem=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,1);

if(pMem)
{
if(GetMappedFileName(GetCurrentProcess(),
pMem,
pszFilename,
MAX_PATH))
{

//Translatepathwithdevicenametodriveletters.
TCHARszTemp[BUFSIZE];
szTemp[0]='/0';

if(GetLogicalDriveStrings(BUFSIZE-1,szTemp))
{
TCHARszName[MAX_PATH];
TCHARszDrive[3]=TEXT(":");
BOOLbFound=FALSE;
TCHAR*p=szTemp;

do
{
//Copythedrivelettertothetemplatestring
*szDrive=*p;

//Lookupeachdevicename
if(QueryDosDevice(szDrive,szName,BUFSIZE))
{
UINTuNameLen=_tcslen(szName);

if(uNameLen<MAX_PATH)
{
bFound=_tcsnicmp(pszFilename,szName,
uNameLen)==0;

if(bFound)
{
//ReconstructpszFilenameusingszTemp
//ReplacedevicepathwithDOSpath
TCHARszTempFile[MAX_PATH];
_stprintf(szTempFile,
TEXT("%s%s"),
szDrive,
pszFilename+uNameLen);
_tcsncpy(pszFilename,szTempFile,MAX_PATH);
}
}
}

//GotothenextNULLcharacter.
while(*p++);
}while(!bFound&&*p);//endofstring
}
}
bSuccess=TRUE;
UnmapViewOfFile(pMem);
}

CloseHandle(hFileMap);
}
printf("Filenameis%s/n",pszFilename);
return(bSuccess);
}