보안세상

파일의 등록정보를 구 할 수 있는 WINAPI 본문

공부

파일의 등록정보를 구 할 수 있는 WINAPI

똔민 2015. 8. 27. 17:11
반응형

TEST 결과 윈도우 모든 os 및 32,64비트 모두 가능하네요.

#include <tchar.h> #include <Winver.h> #pragma comment(lib,"Version.lib") BOOL GetFileInformation(TCHAR * filePath, TCHAR * fileInformation,DWORD fileInformationSize, TCHAR * fileBlockHeader) { //파일 사이즈를 구한다. DWORD dwHandle=0; DWORD dwFileInfoSize = ::GetFileVersionInfoSize(filePath,&dwHandle); if(dwFileInfoSize == 0) { DWORD errorCode = ::GetLastError(); //writelog.ErrorMsg(errorCode,_TEXT("GetFileInformation_GetFileVersionInfoSize")); return FALSE; } //얻어온 사이즈만큼 힙영역에 메모리를 할당한다. HANDLE hDefaultProcessHeap = ::GetProcessHeap(); LPVOID fileInfo = (LPVOID)HeapAlloc(hDefaultProcessHeap, HEAP_ZERO_MEMORY,dwFileInfoSize); if(fileInfo == NULL) { DWORD errorCode = ::GetLastError(); //writelog.ErrorMsg(errorCode,_TEXT("GetFileInformation_HeapAlloc")); return FALSE; } //VerQueryValue 함수의 첫번째 인자로 넣기 위해서 파일정보를 뽑아온다. BOOL bFileInfo = ::GetFileVersionInfo(filePath,0,dwFileInfoSize,fileInfo); if(bFileInfo == FALSE) { DWORD errorCode = ::GetLastError(); //writelog.ErrorMsg(errorCode,_TEXT("GetFileInformation_GetFileVersionInfo")); goto MemoryFree; } //얻어온 버전값을 정제하기 위해서 Language값과 CodePage값을 얻어온다. //Lang-CodePage struct LANGANDCODEPAGE { WORD wLanguage; WORD wCodePage; } *lpTranslate; UINT uLength = 0; BOOL bQuery = ::VerQueryValue(fileInfo, _TEXT("\\VarFileInfo\\Translation"), (LPVOID *)&lpTranslate, &uLength); if(bQuery == FALSE) { DWORD errorCode = ::GetLastError(); goto MemoryFree; } //얻어온 Language값과 CodePage값으로 파일정보값을 가져온다. TCHAR subBlock[MAX_PATH] = {0,}; _stprintf_s(subBlock, MAX_PATH, _TEXT("\\StringFileInfo\\%04X%04X\\%s") ,lpTranslate[0].wLanguage,lpTranslate[0].wCodePage,fileBlockHeader); LPVOID information = NULL; UINT informationLen = 0; bQuery = ::VerQueryValue(fileInfo,subBlock,(LPVOID *)&information, &informationLen); if(bQuery == FALSE || informationLen == 0) { DWORD errorCode = ::GetLastError(); goto MemoryFree; } memcpy_s(fileInformation,fileInformationSize, information,_tcslen((TCHAR*)information)*sizeof(TCHAR)); BOOL bFree = ::HeapFree(hDefaultProcessHeap, 0, fileInfo); if(bFree == FALSE) { DWORD errorCode = ::GetLastError(); return FALSE; } return TRUE; //사용한 메모리를 정리한다. MemoryFree: bFree = ::HeapFree(hDefaultProcessHeap, 0, fileInfo); if(bFree == FALSE) { DWORD errorCode = ::GetLastError(); //writelog.ErrorMsg(errorCode,_TEXT("GetFileInformation_HeapFree")); } return FALSE; } //Unit Test Code #include <Shlobj.h> #pragma comment(lib, "Shell32.lib") SUITE(Version) { TEST(FileVersion) { TCHAR filePath[MAX_PATH]={0,}; ::SHGetSpecialFolderPath(NULL,filePath,CSIDL_PROGRAM_FILES,FALSE); _tcscat_s(filePath,MAX_PATH,_TEXT("\\ESTsoft\\ALSong\\ALSkin.dll")); TCHAR fileVersion[MAX_PATH]={0,}; BOOL bFileVersion = GetFileInformation(filePath, fileVersion,MAX_PATH, _TEXT("FileVersion")); CHECK(bFileVersion); CHECK_ARRAY_EQUAL( _TEXT("9,6,19,0"),fileVersion,8); //::MessageBox(NULL,fileVersion,NULL,MB_OK); } TEST(FileDescription) { TCHAR filePath[MAX_PATH]={0,}; ::SHGetSpecialFolderPath(NULL,filePath,CSIDL_PROGRAM_FILES,FALSE); _tcscat_s(filePath,MAX_PATH,_TEXT("\\ESTsoft\\ALSong\\ALSkin.dll")); TCHAR fileDescription[MAX_PATH]={0,}; BOOL bFileVersion = GetFileInformation(filePath, fileDescription,MAX_PATH, _TEXT("FileDescription")); CHECK(bFileVersion); CHECK_ARRAY_EQUAL( _TEXT("ALSkin DLL"),fileDescription,10); //::MessageBox(NULL,fileDescription,NULL,MB_OK); } TEST(ProductName) { TCHAR filePath[MAX_PATH]={0,}; ::SHGetSpecialFolderPath(NULL,filePath,CSIDL_PROGRAM_FILES,FALSE); _tcscat_s(filePath,MAX_PATH,_TEXT("\\ESTsoft\\ALSong\\ALSkin.dll")); TCHAR ProductName[MAX_PATH]={0,}; BOOL bFileVersion = GetFileInformation(filePath, ProductName,MAX_PATH, _TEXT("ProductName")); CHECK(bFileVersion); CHECK_ARRAY_EQUAL( _TEXT("ALSkin 동적 연결 라이브러리"),ProductName,18); //::MessageBox(NULL,ProductName,NULL,MB_OK); } }


반응형

'공부' 카테고리의 다른 글

NSIS Plugin을 만들기  (0) 2015.09.03
COM실행파일이 사라진 이유  (0) 2015.09.02
알약이나 v3의 확장자는 exe가 아니고 .aye일까??  (0) 2015.08.19
makecab.exe 란?  (0) 2015.07.10
taskmgr.exe / perfmon.exe 란?  (0) 2015.07.10
Comments