logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

[WIN32] 파일 핸들로 파일 명 구하기

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

파일 관련 함수를 만들 때 인수로 전달된 핸들로 처리를 하다가 다시 파일 명을 알아내서 처리해야 할 경우가 있습니다.
이럴 경우 다시 인수로 파일 이름을 전달 받아야 하는 난감한 상황에 놓이게 된다.
또한 파일 관련 API Hooking을 할 때도 파일 핸들 만으로 파일 명을 알아내서 처리 할 수 있는 기능이 필요하다.
MSDN을 뒤져보니 좋은 코드가 있어서 수정 해보았습이다.

원리는 주어진 파일 핸들로 파일 맵을 만들어 파일 맵으로 파일 명을 알아내는 것인데요.
간단할 것 같은 소스 코드가 무척 복잡한데요.
GetMappedFileName () 함수를 통해 전달되는 패스 명이 드라이버 절대 경로라서 황당하다는 ^^;
그래서 도스의 드라이버 경로를 구하느라고 코드가 복잡합니다.

드라이버 경로명과 도스의 경로명을 변환하는 부분도 유용하게 쓰일 것 같습니다.



#include <Psapi.h>
#pragma comment(lib, "psapi.lib")
#define BUFSIZE 512

BOOL GetFileNameFromHandle(HANDLE hFile, TCHAR *pszFilename)
{
 BOOL bSuccess = FALSE;
 HANDLE hFileMap;

 // Get the file size.
 DWORD dwFileSizeHi = 0;
 DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);

 if( dwFileSizeLo == 0 && dwFileSizeHi == 0 )
 {
  //OutputDebugString(L"Cannot map a file with a length of zero.\n");
  return FALSE;
 }

 // Create a file mapping object.
 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))
      {
       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];
         swprintf(szTempFile, L"%s%s", szDrive, pszFilename+uNameLen);
         _tcscpy(pszFilename, szTempFile);
        }
       }
      }

      // Go to the next NULL character.
      while (*p++);
     } while (!bFound && *p); // end of string
    }
   }
   bSuccess = TRUE;
   UnmapViewOfFile(pMem);
  }

  CloseHandle(hFileMap);
 }

 return(bSuccess);
}


사용 예제)

void GetFileName()
{
  DWORD dwWritten;
  HANDLE hFile; 
  hFile=CreateFile(L"C:\\test.doc",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);


  if(hFile !=  INVALID_HANDLE_VALUE)
  {
   TCHAR szMapFileName[MAX_PATH+1] = {L"\0"};

   GetFileNameFromHandle(hFile, szMapFileName);

   ::MessageBox(g_hWnd, szMapFileName, L"TEST", MB_OK);

  }

  CloseHandle(hFile);
}

TAG •

List of Articles
No. Subject Author Date Views
45 [C#] UI Update from Thread, Thread에서 UI 업데이트 하기 샘플 코드 lizard2019 2019.01.23 1034
44 [C#] 프로그램 종료 방법 lizard2019 2019.01.23 6761
43 [C#] 코드 실행 시간 측정 및 DateTime 스트링으로 변환 포맷 lizard2019 2019.01.23 22947
42 [Win32] HBITMAP Contrast 조절하는 코드 - RGB 이미지 보정 엉뚱도마뱀 2018.05.04 734
41 [Windows] DOS 명령어 실행하고 결과 스트링 가져오는 샘플 코드 digipine 2017.11.02 2687
40 VC++ UTF8 변환 관련 매크로 digipine 2017.11.02 8778
39 C# 으로 구현한 화면 캡춰 클래스 1 digipine 2017.11.02 33961
38 C# - 한글로된 폰트명 처리 방법 개선 (Font Name Localization) digipine 2017.11.02 1387
37 [C#] StreamReader 에서의 한글 Encoding 문제 digipine 2017.10.29 999
36 [API Hooking] Dll Injection 하는 방법 digipine 2017.10.29 5210
» [WIN32] 파일 핸들로 파일 명 구하기 digipine 2017.10.29 1060
34 [WIN32] Process ID로 HWND 구하기 digipine 2017.10.29 5011
33 MS의 Hot Fix API의 유형 연구 digipine 2017.10.29 311
32 [WIN32] 실행 중인 프로세스를 외부에서 강제로 종료, 안전한 TerminateProcess digipine 2017.10.29 3455
31 [WIN32] API Hook 정리 문서 digipine 2017.10.29 1963
30 [WIN32, WINCE] 디스크 용량 구하는 방법 API GetDiskFreeSpaceEx digipine 2017.10.29 1564
29 [WINCE] MulDiv 함수 구현 digipine 2017.10.29 699
28 [DirectShow] 화면 원본 비율유지 digipine 2017.10.29 956
27 [VC++, WInAPI] 폴더를 통채로 지우기, 서브 폴더 포함, DeleteAllFiles digipine 2017.10.29 1761
26 [Win API]프로세스 아이디와 윈도우 핸들을 이용 파일명 구하기 digipine 2017.10.29 1390
Board Pagination Prev 1 2 3 Next
/ 3