395 lines
13 KiB
C
395 lines
13 KiB
C
|
//=======================================================================
|
||
|
//
|
||
|
// Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// File: fileutil.h
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
// IU file utility library
|
||
|
//
|
||
|
//=======================================================================
|
||
|
|
||
|
#ifndef __FILEUTIL_INC
|
||
|
#define __FILEUTIL_INC
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
//
|
||
|
// define constant chars often used in file path processing
|
||
|
//
|
||
|
// ----------------------------------------------------------------------
|
||
|
#ifndef TCHAR_EOS
|
||
|
#define TCHAR_EOS _T('\0')
|
||
|
#endif
|
||
|
#ifndef TCHAR_STAR
|
||
|
#define TCHAR_STAR _T('*')
|
||
|
#endif
|
||
|
#ifndef TCHAR_BACKSLASH
|
||
|
#define TCHAR_BACKSLASH _T('\\')
|
||
|
#endif
|
||
|
#ifndef TCHAR_FWDSLASH
|
||
|
#define TCHAR_FWDSLASH _T('/')
|
||
|
#endif
|
||
|
#ifndef TCHAR_COLON
|
||
|
#define TCHAR_COLON _T(':')
|
||
|
#endif
|
||
|
#ifndef TCHAR_DOT
|
||
|
#define TCHAR_DOT _T('.')
|
||
|
#endif
|
||
|
#ifndef TCHAR_SPACE
|
||
|
#define TCHAR_SPACE _T(' ')
|
||
|
#endif
|
||
|
#ifndef TCHAR_TAB
|
||
|
#define TCHAR_TAB _T('\t')
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
//
|
||
|
// define constants used by path related operations.
|
||
|
// these constants can be found either from CRT or Shlwapi header
|
||
|
// files.
|
||
|
//
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
#ifdef _MAX_PATH
|
||
|
#undef _MAX_PATH
|
||
|
#endif
|
||
|
#define _MAX_PATH MAX_PATH
|
||
|
|
||
|
#ifdef _MAX_DRIVE
|
||
|
#undef _MAX_DRIVE
|
||
|
#endif
|
||
|
#define _MAX_DRIVE 3 // buffer size to take drive letter & ":"
|
||
|
|
||
|
#ifdef _MAX_DIR
|
||
|
#undef _MAX_DIR
|
||
|
#endif
|
||
|
#define _MAX_DIR 256 // max. length of path component
|
||
|
|
||
|
#ifdef _MAX_FNAME
|
||
|
#undef _MAX_FNAME
|
||
|
#endif
|
||
|
#define _MAX_FNAME 256 // max. length of file name component
|
||
|
|
||
|
#ifdef _MAX_EXT
|
||
|
#undef _MAX_EXT
|
||
|
#endif
|
||
|
#define _MAX_EXT 256 // max. length of extension component
|
||
|
|
||
|
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
|
||
|
|
||
|
//Error code for files which are not valid binaries or which do not support the machine architecture
|
||
|
#define BIN_E_MACHINE_MISMATCH HRESULT_FROM_WIN32(ERROR_EXE_MACHINE_TYPE_MISMATCH)
|
||
|
#define BIN_E_BAD_FORMAT HRESULT_FROM_WIN32(ERROR_BAD_FORMAT)
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
//
|
||
|
// Public function MySplitPath() - same as CRT _tsplitpath()
|
||
|
// to break a path into pieces
|
||
|
//
|
||
|
// Input:
|
||
|
// see below
|
||
|
//
|
||
|
// Return:
|
||
|
// Returns the address of the last occurrence of the character in
|
||
|
// the string if successful, or NULL otherwise.
|
||
|
//
|
||
|
// ----------------------------------------------------------------------
|
||
|
void MySplitPath(
|
||
|
LPCTSTR lpcszPath, // original path
|
||
|
LPTSTR lpszDrive, // point to buffer to receive drive letter
|
||
|
LPTSTR lpszDir, // point to buffer to receive directory
|
||
|
LPTSTR lpszFName, // point to buffer to receive file name
|
||
|
LPTSTR lpszExt // point to buffer to receive extension
|
||
|
);
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------
|
||
|
// CreateNestedDirectory
|
||
|
// Creates the full path of the directory (nested directories)
|
||
|
//---------------------------------------------------------------------
|
||
|
BOOL CreateNestedDirectory(LPCTSTR pszDir);
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------------
|
||
|
// GetIndustryUpdateDirectory
|
||
|
// This function returns the location of the IndustryUpdate directory. All local
|
||
|
// files are stored in this directory. The pszPath parameter needs to be at least
|
||
|
// MAX_PATH.
|
||
|
//-----------------------------------------------------------------------------------
|
||
|
void GetIndustryUpdateDirectory(LPTSTR pszPath);
|
||
|
|
||
|
//-----------------------------------------------------------------------------------
|
||
|
// GetWindowsUpdateV3Directory - used for V3 history migration
|
||
|
// This function returns the location of the WindowsUpdate(V3) directory. All V3
|
||
|
// local files are stored in this directory. The pszPath parameter needs to be
|
||
|
// at least MAX_PATH. The directory is created if not found
|
||
|
//-----------------------------------------------------------------------------------
|
||
|
void GetWindowsUpdateV3Directory(LPTSTR pszPath);
|
||
|
|
||
|
// **********************************************************************************
|
||
|
//
|
||
|
// File version related declarations
|
||
|
//
|
||
|
// **********************************************************************************
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// define a type to hold file version data
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
typedef struct _FILE_VERSION
|
||
|
{
|
||
|
WORD Major;
|
||
|
WORD Minor;
|
||
|
WORD Build;
|
||
|
WORD Ext;
|
||
|
} FILE_VERSION, *LPFILE_VERSION;
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// public function to retrieve file version
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
BOOL GetFileVersion(LPCTSTR lpsFile, LPFILE_VERSION lpstVersion);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// publif function to retrieve the creation time of a file in ISO 8601 format
|
||
|
// without zone info
|
||
|
//
|
||
|
// if buffer too small, call GetLastError();
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
BOOL GetFileTimeStamp(
|
||
|
LPCTSTR lpsFile, // file path
|
||
|
LPTSTR lpsTimeStamp, // buffer to receive timestamp
|
||
|
int iBufSize // buffer size in characters
|
||
|
);
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// public functions to compare file versions
|
||
|
//
|
||
|
// return:
|
||
|
// -1: if file ver of 1st parameter < file ver of 2nd parameter
|
||
|
// 0: if file ver of 1st parameter = file ver of 2nd parameter
|
||
|
// +1: if file ver of 1st parameter > file ver of 2nd parameter
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
HRESULT CompareFileVersion(LPCTSTR lpsFile1, LPCTSTR lpsFile2, int *pCompareResult);
|
||
|
HRESULT CompareFileVersion(LPCTSTR lpsFile, FILE_VERSION stVersion, int *pCompareResult);
|
||
|
int CompareFileVersion(const FILE_VERSION stVersion1, const FILE_VERSION stVersion2);
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// public function to convert a string type functoin to FILE_VERSION type
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
BOOL ConvertStringVerToFileVer(LPCSTR lpsVer, LPFILE_VERSION lpstVer);
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// publif function to convert a FILE_VERSION to a string
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
BOOL ConvertFileVerToStringVer(
|
||
|
FILE_VERSION stVer, // version to convert
|
||
|
char chDel, // delimiter to use
|
||
|
LPSTR lpsBuffer, // buffer of string
|
||
|
int ccBufSize // size of buffer
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// **********************************************************************************
|
||
|
//
|
||
|
// detection related, in addition to file version group
|
||
|
//
|
||
|
// **********************************************************************************
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// public function to check if a file exists
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
BOOL FileExists(
|
||
|
LPCTSTR lpsFile // file with path to check
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// public function to expand the file path
|
||
|
//
|
||
|
// Assumption: lpszFilePath points to allocated buffer of MAX_PATH.
|
||
|
// if the expanded path is longer than MAX_PATH, error returned.
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
HRESULT ExpandFilePath(
|
||
|
LPCTSTR lpszFilePath, // original string
|
||
|
LPTSTR lpszDestination, // buffer for expanded string
|
||
|
UINT cChars // number of chars that buffer can take
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// public function to find the free disk space in KB
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
HRESULT GetFreeDiskSpace(
|
||
|
TCHAR tcDriveLetter, // drive letter
|
||
|
int *piKBytes // out result in KB if successful, 0 if fail
|
||
|
);
|
||
|
|
||
|
HRESULT GetFreeDiskSpace(
|
||
|
LPCTSTR pszUNC, // UNC Path
|
||
|
int *piKBytes // out result in KB if successful, 0 if fail
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
//
|
||
|
// function to validate the folder to make sure
|
||
|
// user has required priviledge
|
||
|
//
|
||
|
// folder will be verified exist. then required priviledge will be checked.
|
||
|
//
|
||
|
// ASSUMPTION: lpszFolder not exceeding MAX_PATH long!!!
|
||
|
//
|
||
|
//----------------------------------------------------------------------
|
||
|
DWORD ValidateFolder(LPTSTR lpszFolder, BOOL fCheckForWrite);
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
//
|
||
|
// function to get a QueryServer from the Ident File for a Given ClientName
|
||
|
// This also looks in the registry for the IsBeta regkey indicating Beta
|
||
|
// functionlality
|
||
|
//
|
||
|
//----------------------------------------------------------------------
|
||
|
HRESULT GetClientQueryServer(LPCTSTR pszClientName, // Client Name to get QueryServer for
|
||
|
LPTSTR pszQueryServer, // Buffer for Query Server Return
|
||
|
UINT cChars); // Length of Buffer in Chars
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
//
|
||
|
// function to walk a directory and extract all cabinet files
|
||
|
//
|
||
|
//----------------------------------------------------------------------
|
||
|
HRESULT DecompressFolderCabs(LPCTSTR pszDecompressPath);
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
//
|
||
|
// wrapper function for AdvPack ExtractFiles API (forces conversion to ANSI);
|
||
|
//
|
||
|
//----------------------------------------------------------------------
|
||
|
BOOL IUExtractFiles(LPCTSTR pszCabFile, LPCTSTR pszDecompressFolder, LPCTSTR pszFileNames = NULL);
|
||
|
|
||
|
//Replace the file extension with a new extension
|
||
|
BOOL ReplaceFileExtension( LPCTSTR pszPath, LPCTSTR pszNewExt, LPTSTR pszNewPathBuf, DWORD cchNewPathBuf);
|
||
|
// ReplaceFileInPath
|
||
|
BOOL ReplaceFileInPath( LPCTSTR pszPath, LPCTSTR pszNewFile, LPTSTR pszNewPathBuf, DWORD cchNewPathBuf);
|
||
|
|
||
|
//Function to verify that the specified file is a binary
|
||
|
//and that it is compatible with the OS architecture
|
||
|
HRESULT IsBinaryCompatible(LPCTSTR lpszFile);
|
||
|
|
||
|
|
||
|
// file exists routine
|
||
|
inline BOOL fFileExists(LPCTSTR lpszFileName, BOOL *pfIsDir = NULL)
|
||
|
{
|
||
|
DWORD dwAttribute = GetFileAttributes(lpszFileName); //GetFileAttributes do not like "\" at the end of direcotry
|
||
|
if (INVALID_FILE_ATTRIBUTES != dwAttribute)
|
||
|
{
|
||
|
if (NULL != pfIsDir)
|
||
|
{
|
||
|
*pfIsDir = (FILE_ATTRIBUTE_DIRECTORY & dwAttribute);
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//Get the path to the WindowsUpdate Directory (without the backslash at the end)
|
||
|
BOOL GetWUDirectory(LPTSTR lpszDirPath, DWORD chCount, BOOL fGetV4Path = FALSE);
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
//Function to set ACL's on Windows Update directories, optionally creates the
|
||
|
//directory if it doesnt already exists
|
||
|
//This function will:
|
||
|
// * Take ownership of the directory and it's children
|
||
|
// * Set all the children to inherit ACL's from parent
|
||
|
// * Set the specified directory to NOT inherit properties from it's parent
|
||
|
// * Set the required ACL's on the specified directory
|
||
|
// * Replace the ACL's on the children (i.e. propogate own ACL's and remove
|
||
|
// those ACL's which were explicitly set
|
||
|
//
|
||
|
// Input:
|
||
|
// lpszDirectory: Path to the directory to ACL, If it is NULL we use the
|
||
|
path to the WindowsUpdate directory
|
||
|
fCreateAlways: Flag to indicate creation of new directory if it doesnt
|
||
|
already exist
|
||
|
******************************************************************************/
|
||
|
HRESULT CreateDirectoryAndSetACLs(LPCTSTR lpszDirectory, BOOL fCreateAlways);
|
||
|
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// File CRC API and Structure Definitions
|
||
|
// Note: This logic is taken from the Windows Update V3 Implemention of File CRC's.
|
||
|
// We use the CryptCATAdminCalcHashFromFileHandle API to calculate a CRC of the file
|
||
|
// and compare it to the passed in CRC_HASH.
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
|
||
|
// size of the CRC hash in bytes
|
||
|
const int CRC_HASH_SIZE = 20;
|
||
|
const int CRC_HASH_STRING_LENGTH = CRC_HASH_SIZE * 2 + 1; // Double the CRC HASH SIZE (2 characters for each byte), + 1 for the NULL
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// VerifyFileCRC : This function takes a File Path, calculates the hash on this file
|
||
|
// and compares it to the passed in Hash (pCRC).
|
||
|
// Returns:
|
||
|
// S_OK: CRC's Match
|
||
|
// ERROR_CRC (HRESULT_FROM_WIN32(ERROR_CRC): if the CRC's do not match
|
||
|
// Otherwise an HRESULT Error Code
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
HRESULT VerifyFileCRC(LPCTSTR pszFileToVerify, LPCTSTR pszHash);
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// CalculateFileCRC : This function takes a File Path, calculates a CRC from the file
|
||
|
// and returns it in passed in CRC_HASH pointer.
|
||
|
//
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
HRESULT CalculateFileCRC(LPCTSTR pszFileToHash, LPTSTR pszHash, int cchBuf);
|
||
|
|
||
|
#endif //__FILEUTIL_INC
|