|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000
//
// File: FileVersionInfo.cpp
//
// Contents: Code for generating matching information for files in a given
// directory and it's subdirectories.
//
// History: 18-Jul-00 jdoherty Created.
// 14-Mar-02 mnikkel Modified to use strsafe.h
//
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <shlobj.h>
#include <strsafe.h>
BOOL MyStoreFileVersionInfo( CHAR *szFileName, CHAR *szFileOutName ); void CheckVerQueryStats ( LPVOID lpData );
// Needed by GetFileVersionInfo stubs
typedef struct StringTable { WORD wLength; WORD wValueLength; WORD wType; CHAR szKey[8]; } ST;
typedef struct StringFileInfo { WORD wLength; WORD wValueLength; WORD wType; CHAR szKey[sizeof("StringFileInfo")]; ST st; } SFI;
typedef struct tagVERHEAD { WORD wTotLen; WORD wValLen; WORD wType; // always 0
CHAR szKey[(sizeof("VS_VERSION_INFO")+3)&~03]; VS_FIXEDFILEINFO vsf; SFI sfi; } VERHEAD;
int __cdecl main(int argc, CHAR* argv[]) { LPTSTR szCommandLine = {'\0'};
if (argc > 3) { printf("The correct usage is:\n\tFileVerInfo.exe [filename including path]\n"); getchar(); return 0; } printf("Attempting to retrieve file version info for: %s\n", argv[1]);
if(!MyStoreFileVersionInfo(argv[1], argv[2])) { printf("There was a problem retrieving the information.\n"); getchar(); return 0; }
else szCommandLine = GetCommandLine(); printf("The command line contained: %s\n", szCommandLine); printf("Operation completed successfully");
getchar();
return 0; }
/*
This function retrieves the version information for the file specified and stores the information on the users desktop, FileVerInfo.bin */ BOOL MyStoreFileVersionInfo ( CHAR *szFileName, CHAR *szFileOutName ) { LPDWORD lpdwHandle = 0; DWORD dwBytesToWrite = GetFileVersionInfoSizeA(szFileName, lpdwHandle); DWORD lpdwBytesWritten = 0; LPVOID lpData= malloc(dwBytesToWrite); CHAR lpPath[MAX_PATH*2] = {'\0'}; HANDLE hfile; if( !dwBytesToWrite ) { printf("There was a problem in GetFileVersionInfoSize()\n"); printf("GLE reports error %d\n", GetLastError()); return FALSE; } if ( !GetFileVersionInfoA(szFileName, NULL, dwBytesToWrite, lpData) ) { printf("There was a problem in GetFileVersionInfo()\n"); return FALSE; }
CheckVerQueryStats(lpData);
if(S_OK != StringCchCat(lpPath, MAX_PATH*2, ".\\")) { printf("Unable to add to path string!\n"); return FALSE; }
if ( szFileOutName ) { if(S_OK != StringCchCat(lpPath, MAX_PATH*2, szFileOutName) || S_OK != StringCchCat(lpPath, MAX_PATH*2, ".bin")) { printf("Unable to add to path string!\n"); return FALSE; } } else { if(S_OK != StringCchCat(lpPath, MAX_PATH*2, ".\\FileVerInfo.bin")) { printf("Unable to add to path string!\n"); return FALSE; } }
hfile = CreateFileA(lpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hfile == INVALID_HANDLE_VALUE) { printf("There was a problem opening %s\n", lpPath); return FALSE; }
printf("About to write to file: %s\n", lpPath);
WriteFile( hfile, lpData, dwBytesToWrite, &lpdwBytesWritten, NULL );
CloseHandle (hfile);
return TRUE; }
/*
This function displays the minor version and the SFI version to the screen */ void CheckVerQueryStats ( LPVOID lpData ) { PUINT puLen = 0;
printf("The minor version is: \t%x\n",((VERHEAD*) lpData)->vsf.dwFileVersionMS); printf("The SFI version is: \t%s\n",((VERHEAD*) lpData)->sfi.st.szKey); return;
}
|