229 lines
6.1 KiB
C
229 lines
6.1 KiB
C
|
|
|||
|
|
|||
|
//#include <string.h>
|
|||
|
//#include <tchar.h>
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include "perfmon.h"
|
|||
|
#include "fileutil.h"
|
|||
|
#include "utils.h"
|
|||
|
|
|||
|
#include <string.h> // for strncpy
|
|||
|
#ifdef UNICODE
|
|||
|
#define _tcsrchr wcsrchr
|
|||
|
#else
|
|||
|
#define _tcsrchr strrchr
|
|||
|
#endif
|
|||
|
|
|||
|
#define DRIVE_DELIMITER TEXT(':')
|
|||
|
#define DIRECTORY_DELIMITER TEXT('\\')
|
|||
|
#define EXTENSION_DELIMITER TEXT('.')
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
VOID FileErrorMessageBox(HWND hWnd, LPTSTR lpszFileName, DWORD ErrorCode)
|
|||
|
{
|
|||
|
TCHAR szErrorMessage[FILE_ERROR_MESSAGE_SIZE] ;
|
|||
|
TCHAR szErrorMessageTemplate[FILE_ERROR_MESSAGE_SIZE] ;
|
|||
|
|
|||
|
StringLoad (IDS_FILE_ERROR, szErrorMessageTemplate) ;
|
|||
|
TSPRINTF((LPTSTR)szErrorMessage,
|
|||
|
(LPTSTR)szErrorMessageTemplate,
|
|||
|
lpszFileName,
|
|||
|
ErrorCode) ;
|
|||
|
|
|||
|
MessageBox (hWnd, (LPTSTR)szErrorMessage, NULL,
|
|||
|
MB_OK | MB_ICONSTOP | MB_TASKMODAL);
|
|||
|
return ;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
BOOL FileRead (HANDLE hFile,
|
|||
|
LPMEMORY lpMemory,
|
|||
|
DWORD nAmtToRead)
|
|||
|
{ // FileRead
|
|||
|
BOOL bSuccess ;
|
|||
|
DWORD nAmtRead ;
|
|||
|
|
|||
|
bSuccess = ReadFile (hFile, lpMemory, nAmtToRead, &nAmtRead, NULL) ;
|
|||
|
return (bSuccess && (nAmtRead == nAmtToRead)) ;
|
|||
|
} // FileRead
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL FileWrite (HANDLE hFile,
|
|||
|
LPMEMORY lpMemory,
|
|||
|
DWORD nAmtToWrite)
|
|||
|
{ // FileWrite
|
|||
|
BOOL bSuccess = FALSE;
|
|||
|
DWORD nAmtWritten = 0;
|
|||
|
DWORD dwFileSizeLow, dwFileSizeHigh;
|
|||
|
LONGLONG llResultSize;
|
|||
|
|
|||
|
dwFileSizeLow = GetFileSize (hFile, &dwFileSizeHigh);
|
|||
|
// limit file size to 2GB
|
|||
|
|
|||
|
if (dwFileSizeHigh > 0) {
|
|||
|
SetLastError (ERROR_WRITE_FAULT);
|
|||
|
bSuccess = FALSE;
|
|||
|
} else {
|
|||
|
// note that the error return of this function is 0xFFFFFFFF
|
|||
|
// since that is > the file size limit, this will be interpreted
|
|||
|
// as an error (a size error) so it's accounted for in the following
|
|||
|
// test.
|
|||
|
llResultSize = dwFileSizeLow + nAmtToWrite;
|
|||
|
if (llResultSize >= 0x80000000) {
|
|||
|
SetLastError (ERROR_WRITE_FAULT);
|
|||
|
bSuccess = FALSE;
|
|||
|
} else {
|
|||
|
// write buffer to file
|
|||
|
bSuccess = WriteFile (hFile, lpMemory, nAmtToWrite, &nAmtWritten, NULL) ;
|
|||
|
if (bSuccess) bSuccess = (nAmtWritten == nAmtToWrite ? TRUE : FALSE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return (bSuccess) ;
|
|||
|
} // FileWrite
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
HANDLE FileHandleOpen (LPTSTR lpszFilePath)
|
|||
|
{ // FileHandleOpen
|
|||
|
return ((HANDLE) CreateFile (lpszFilePath,
|
|||
|
GENERIC_READ |
|
|||
|
GENERIC_WRITE,
|
|||
|
FILE_SHARE_READ |
|
|||
|
FILE_SHARE_WRITE,
|
|||
|
NULL,
|
|||
|
OPEN_EXISTING,
|
|||
|
0,
|
|||
|
NULL)) ;
|
|||
|
} // FileHandleOpen
|
|||
|
|
|||
|
|
|||
|
HANDLE FileHandleCreate (LPTSTR lpszFilePath)
|
|||
|
{ // FileHandleCreate
|
|||
|
return ((HANDLE) CreateFile (lpszFilePath,
|
|||
|
GENERIC_READ | GENERIC_WRITE,
|
|||
|
FILE_SHARE_READ,
|
|||
|
NULL,
|
|||
|
CREATE_ALWAYS,
|
|||
|
FILE_ATTRIBUTE_NORMAL,
|
|||
|
NULL)) ;
|
|||
|
} // FileHandleCreate
|
|||
|
|
|||
|
|
|||
|
|
|||
|
long FileSeekEnd (HANDLE hFile,
|
|||
|
long lAmtToMove)
|
|||
|
{ // FileSeekEnd
|
|||
|
return (SetFilePointer (hFile, lAmtToMove, NULL, FILE_END)) ;
|
|||
|
} // FileSeekEnd
|
|||
|
|
|||
|
|
|||
|
long FileSeekBegin (HANDLE hFile,
|
|||
|
long lAmtToMove)
|
|||
|
{ // FileSeekBegin
|
|||
|
return (SetFilePointer (hFile, lAmtToMove, NULL, FILE_BEGIN)) ;
|
|||
|
} // FileSeekBegin
|
|||
|
|
|||
|
|
|||
|
long FileSeekCurrent (HANDLE hFile,
|
|||
|
long lAmtToMove)
|
|||
|
{ // FileSeekCurrent
|
|||
|
return (SetFilePointer (hFile, lAmtToMove, NULL, FILE_CURRENT)) ;
|
|||
|
} // FileSeekCurrent
|
|||
|
|
|||
|
|
|||
|
|
|||
|
long FileTell (HANDLE hFile)
|
|||
|
{ // FileTell
|
|||
|
return (SetFilePointer (hFile, 0, NULL, FILE_CURRENT)) ;
|
|||
|
} // FileTell
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LPMEMORY FileMap (HANDLE hFile, HANDLE *phMapHandle)
|
|||
|
/*
|
|||
|
To Do: Error reporting!!
|
|||
|
*/
|
|||
|
{ // FileMap
|
|||
|
HANDLE hMapping ;
|
|||
|
|
|||
|
|
|||
|
*phMapHandle = 0 ;
|
|||
|
hMapping = CreateFileMapping (hFile, NULL, PAGE_READONLY,
|
|||
|
0, 0, NULL) ;
|
|||
|
if (!hMapping)
|
|||
|
return (NULL) ;
|
|||
|
|
|||
|
*phMapHandle = hMapping ;
|
|||
|
return (MapViewOfFile (hMapping, FILE_MAP_READ, 0, 0, 0)) ;
|
|||
|
} // FileMap
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL FileUnMap (LPVOID pBase, HANDLE hMapping)
|
|||
|
/*
|
|||
|
To Do: Error reporting!!
|
|||
|
*/
|
|||
|
{ // FileUnMap
|
|||
|
UnmapViewOfFile(pBase) ;
|
|||
|
CloseHandle (hMapping) ;
|
|||
|
return (TRUE) ;
|
|||
|
} // FileUnMap
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void FileNameExtension (LPTSTR lpszSpec,
|
|||
|
LPTSTR lpszFileNameExtension)
|
|||
|
/*
|
|||
|
Effect: Return the name and extension portion only of lpszSpec
|
|||
|
int lpszFileNameExtension.
|
|||
|
|
|||
|
Assert: lpszFileNameExtension is large enough to hold a name,
|
|||
|
delimiter, extension, and terminating null character.
|
|||
|
*/
|
|||
|
{ // FileNameExtension
|
|||
|
LPTSTR lpszDelimiter ;
|
|||
|
|
|||
|
lpszDelimiter = _tcsrchr ((LPCTSTR)lpszSpec, (TCHAR)DIRECTORY_DELIMITER) ;
|
|||
|
if (!lpszDelimiter)
|
|||
|
lpszDelimiter = _tcsrchr ((LPCTSTR)lpszSpec, (TCHAR)DRIVE_DELIMITER) ;
|
|||
|
|
|||
|
lstrcpy (lpszFileNameExtension,
|
|||
|
lpszDelimiter ? ++lpszDelimiter : lpszSpec) ;
|
|||
|
} // FileNameExtension
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void FileDriveDirectory (LPTSTR lpszFileSpec,
|
|||
|
LPTSTR lpszDirectory)
|
|||
|
/*
|
|||
|
Effect: Extract the drive and directory from the file
|
|||
|
specification lpszFileSpec, and return the it in
|
|||
|
lpszDirectory.
|
|||
|
|
|||
|
Internals: Copy the the whole spec to lpszDirectory. Use lstrrchr
|
|||
|
to find the *last* directory delimiter ('\') and
|
|||
|
truncate the string right after that.
|
|||
|
|
|||
|
Note: This function assumes that the specification lpszFileSpec
|
|||
|
is fairly complete, in that it contains both a directory
|
|||
|
and a file name.
|
|||
|
*/
|
|||
|
{ // FileDriveDirectory
|
|||
|
LPTSTR lpszDelimiter ;
|
|||
|
|
|||
|
lstrcpy (lpszDirectory, lpszFileSpec) ;
|
|||
|
lpszDelimiter = _tcsrchr ((LPCTSTR)lpszDirectory, (TCHAR)DIRECTORY_DELIMITER) ;
|
|||
|
if (lpszDelimiter)
|
|||
|
*(++lpszDelimiter) = TEXT('\0') ;
|
|||
|
} // FileDriveDirectory
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|