|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: file.cpp
//
//--------------------------------------------------------------------------
#include "windows.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "crtem.h"
#include "unicode.h"
#ifdef _M_IX86
HANDLE WINAPI CreateFile9x ( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) {
BYTE rgb[_MAX_PATH]; char * szFileName; HANDLE hFile;
hFile = INVALID_HANDLE_VALUE; if(MkMBStr(rgb, _MAX_PATH, lpFileName, &szFileName)) hFile = CreateFileA ( szFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile );
FreeMBStr(rgb, szFileName);
return(hFile); }
HANDLE WINAPI CreateFileU ( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) {
if(FIsWinNT()) return( CreateFileW ( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile )); else return( CreateFile9x ( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile )); }
BOOL WINAPI DeleteFile9x( LPCWSTR lpFileName ) { BYTE rgb[_MAX_PATH]; char * szFileName; BOOL fResult;
fResult = FALSE; if(MkMBStr(rgb, _MAX_PATH, lpFileName, &szFileName)) fResult = DeleteFileA ( szFileName ); FreeMBStr(rgb, szFileName); return(fResult); }
BOOL WINAPI DeleteFileU( LPCWSTR lpFileName ) { if(FIsWinNT()) return( DeleteFileW (lpFileName) ); else return( DeleteFile9x (lpFileName) ); }
BOOL WINAPI CopyFile9x(LPCWSTR lpwExistingFileName, LPCWSTR lpwNewFileName, BOOL bFailIfExists) { BYTE rgbexist[_MAX_PATH]; BYTE rgbnew[_MAX_PATH]; char * szFileNameExist; char * szFileNameNew; BOOL fResult;
fResult = FALSE;
if (!(MkMBStr(rgbexist, _MAX_PATH, lpwExistingFileName, &szFileNameExist))) { return(FALSE); }
if (!(MkMBStr(rgbnew, _MAX_PATH, lpwNewFileName, &szFileNameNew))) { FreeMBStr(rgbexist, szFileNameExist); return(FALSE); }
fResult = CopyFileA(szFileNameExist, szFileNameNew, bFailIfExists);
FreeMBStr(rgbexist, szFileNameExist); FreeMBStr(rgbnew, szFileNameNew);
return(fResult); }
BOOL WINAPI CopyFileU(LPCWSTR lpwExistingFileName, LPCWSTR lpwNewFileName, BOOL bFailIfExists) { if (FIsWinNT()) return( CopyFileW(lpwExistingFileName, lpwNewFileName, bFailIfExists) ); else return( CopyFile9x(lpwExistingFileName, lpwNewFileName, bFailIfExists) ); }
BOOL WINAPI MoveFileEx9x( LPCWSTR lpExistingFileName, // address of name of the existing file
LPCWSTR lpNewFileName, // address of new name for the file
DWORD dwFlags) // flag to determine how to move file
{ BYTE rgbExisting[_MAX_PATH]; BYTE rgbNew[_MAX_PATH]; char * szExisting = NULL; char * szNew = NULL; BOOL bResult = FALSE;
if ((MkMBStr(rgbExisting, _MAX_PATH, lpExistingFileName, &szExisting)) && (MkMBStr(rgbNew, _MAX_PATH, lpNewFileName, &szNew))) { bResult = MoveFileExA(szExisting, szNew, dwFlags); }
FreeMBStr(rgbExisting, szExisting); FreeMBStr(rgbNew, szNew);
return (bResult); }
BOOL WINAPI MoveFileExU( LPCWSTR lpExistingFileName, // address of name of the existing file
LPCWSTR lpNewFileName, // address of new name for the file
DWORD dwFlags) // flag to determine how to move file
{ if (FIsWinNT()) return(MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags)); else return(MoveFileEx9x(lpExistingFileName, lpNewFileName, dwFlags)); }
DWORD WINAPI GetFileAttributes9x( LPCWSTR lpFileName ) { if (lpFileName == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return(0xFFFFFFFF); }
BYTE rgb[_MAX_PATH]; char * szFileName; DWORD dwAttr;
dwAttr = 0xFFFFFFFF; if(MkMBStr(rgb, _MAX_PATH, lpFileName, &szFileName)) dwAttr = GetFileAttributesA ( szFileName ); FreeMBStr(rgb, szFileName); return(dwAttr); }
DWORD WINAPI GetFileAttributesU( LPCWSTR lpFileName ) { if(FIsWinNT()) return( GetFileAttributesW (lpFileName) ); else return( GetFileAttributes9x (lpFileName) ); }
BOOL WINAPI SetFileAttributes9x( LPCWSTR lpFileName, DWORD dwFileAttributes ) { if (lpFileName == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return(0); }
BYTE rgb[_MAX_PATH]; char * szFileName; BOOL fResult;
fResult = FALSE; if(MkMBStr(rgb, _MAX_PATH, lpFileName, &szFileName)) fResult = SetFileAttributesA ( szFileName, dwFileAttributes ); FreeMBStr(rgb, szFileName); return(fResult); }
BOOL WINAPI SetFileAttributesU( LPCWSTR lpFileName, DWORD dwFileAttributes ) { if(FIsWinNT()) return( SetFileAttributesW (lpFileName, dwFileAttributes) ); else return( SetFileAttributes9x (lpFileName, dwFileAttributes) ); }
DWORD WINAPI GetCurrentDirectory9x( DWORD nBufferLength, // size, in characters, of directory buffer
LPWSTR lpBuffer) // address of buffer for current directory
{ BYTE rgb[_MAX_PATH]; char * szDir = NULL; DWORD dwResult = 0;
if (nBufferLength == 0) { return(GetCurrentDirectoryA(0, NULL)); } else { szDir = (char *) malloc(nBufferLength); if (szDir == NULL) { SetLastError(E_OUTOFMEMORY); return 0; } dwResult = GetCurrentDirectoryA(nBufferLength, szDir);
if (dwResult == 0) { return 0; }
MultiByteToWideChar( 0, 0, szDir, -1, lpBuffer, nBufferLength); }
free(szDir); return (dwResult); }
DWORD WINAPI GetCurrentDirectoryU( DWORD nBufferLength, // size, in characters, of directory buffer
LPWSTR lpBuffer) // address of buffer for current directory
{ if (FIsWinNT()) return(GetCurrentDirectoryW(nBufferLength, lpBuffer)); else return(GetCurrentDirectory9x(nBufferLength, lpBuffer)); }
BOOL WINAPI CreateDirectory9x( LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ) { if (lpPathName == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return(0); }
BYTE rgb[_MAX_PATH]; char * szPathName; BOOL fResult;
fResult = FALSE; if(MkMBStr(rgb, _MAX_PATH, lpPathName, &szPathName)) fResult = CreateDirectoryA ( szPathName, lpSecurityAttributes ); FreeMBStr(rgb, szPathName); return(fResult); }
BOOL WINAPI CreateDirectoryU( LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ) { if(FIsWinNT()) return( CreateDirectoryW (lpPathName, lpSecurityAttributes) ); else return( CreateDirectory9x (lpPathName, lpSecurityAttributes) ); }
BOOL WINAPI RemoveDirectory9x( LPCWSTR lpPathName ) { if (lpPathName == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return(0); }
BYTE rgb[_MAX_PATH]; char * szPathName; BOOL fResult;
fResult = FALSE; if(MkMBStr(rgb, _MAX_PATH, lpPathName, &szPathName)) fResult = RemoveDirectoryA ( szPathName ); FreeMBStr(rgb, szPathName); return(fResult); }
BOOL WINAPI RemoveDirectoryU( LPCWSTR lpPathName ) { if(FIsWinNT()) return( RemoveDirectoryW (lpPathName) ); else return( RemoveDirectory9x (lpPathName) ); }
UINT WINAPI GetWindowsDirectory9x( LPWSTR lpBuffer, UINT uSize ) { char rgch[_MAX_PATH]; char * szDir = NULL; UINT cchDir;
int cchConverted; UINT cch;
szDir = rgch; cchDir = sizeof(rgch); if (0 == (cchDir = GetWindowsDirectoryA ( szDir, cchDir))) goto ErrorReturn;
// bump to include null terminator
cchDir++;
if (cchDir > sizeof(rgch)) { szDir = (char *) malloc(cchDir); if(!szDir) { SetLastError(ERROR_OUTOFMEMORY); goto ErrorReturn; } if (0 == (cchDir = GetWindowsDirectoryA ( szDir, cchDir))) goto ErrorReturn; cchDir++; }
// how long is the unicode string
if (0 >= (cchConverted = MultiByteToWideChar( 0, 0, szDir, cchDir, NULL, 0))) goto ErrorReturn; if ((UINT) cchConverted <= uSize) { if (0 >= (cchConverted = MultiByteToWideChar( 0, 0, szDir, cchDir, lpBuffer, (int) uSize))) goto ErrorReturn; else // Don't include null terminating char if input buffer was large
// enough
cch = (UINT) cchConverted - 1; } else // Include null terminating if input buffer wasn't large enough
cch = (UINT) cchConverted;
CommonReturn: if (szDir != rgch && szDir) free(szDir); return cch; ErrorReturn: cch = 0; goto CommonReturn; }
UINT WINAPI GetWindowsDirectoryU( LPWSTR lpBuffer, UINT uSize ) { if(FIsWinNT()) return( GetWindowsDirectoryW (lpBuffer, uSize)); else return( GetWindowsDirectory9x (lpBuffer, uSize)); }
UINT WINAPI GetTempFileName9x( IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName ) { UINT uResult = 0;
BYTE rgbPathName[_MAX_PATH]; BYTE rgbPrefixString[_MAX_PATH];
char* szPathName = NULL; char* szPrefixString = NULL;
char szTempFileName[_MAX_PATH];
if ((MkMBStr(rgbPathName, _MAX_PATH, lpPathName, &szPathName)) && (MkMBStr(rgbPrefixString, _MAX_PATH, lpPrefixString, &szPrefixString))) { if ( ( uResult = GetTempFileNameA( szPathName, szPrefixString, uUnique, szTempFileName ) != 0 ) ) { MultiByteToWideChar( CP_ACP, 0, szTempFileName, -1, lpTempFileName, MAX_PATH ); } }
FreeMBStr(rgbPathName, szPathName); FreeMBStr(rgbPrefixString, szPrefixString);
return( uResult ); }
UINT WINAPI GetTempFileNameU( IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName ) { if(FIsWinNT()) return( GetTempFileNameW( lpPathName, lpPrefixString, uUnique, lpTempFileName ) ); else return( GetTempFileName9x( lpPathName, lpPrefixString, uUnique, lpTempFileName ) ); }
HINSTANCE WINAPI LoadLibrary9x( LPCWSTR lpLibFileName ) { BYTE rgb[_MAX_PATH]; char * szLibFileName; HINSTANCE hInst;
hInst = NULL; if(MkMBStr(rgb, _MAX_PATH, lpLibFileName, &szLibFileName)) hInst = LoadLibraryA ( szLibFileName );
FreeMBStr(rgb, szLibFileName);
return(hInst); }
HINSTANCE WINAPI LoadLibraryU( LPCWSTR lpLibFileName ) { if(FIsWinNT()) return( LoadLibraryW(lpLibFileName) ); else return( LoadLibrary9x(lpLibFileName) );
}
HINSTANCE WINAPI LoadLibraryEx9x( LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags ){
BYTE rgb[_MAX_PATH]; char * szLibFileName; HINSTANCE hInst;
hInst = NULL; if(MkMBStr(rgb, _MAX_PATH, lpLibFileName, &szLibFileName)) hInst = LoadLibraryExA ( szLibFileName, hFile, dwFlags );
FreeMBStr(rgb, szLibFileName);
return(hInst); }
HINSTANCE WINAPI LoadLibraryExU( LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags ){
if(FIsWinNT()) return( LoadLibraryExW ( lpLibFileName, hFile, dwFlags )); else return( LoadLibraryEx9x ( lpLibFileName, hFile, dwFlags )); }
DWORD WINAPI ExpandEnvironmentStrings9x( LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize ) { BYTE rgb1[_MAX_PATH]; char * szSrc = NULL;
char rgch[_MAX_PATH]; char * szDst = NULL; DWORD cchDst;
int cbConverted; DWORD cch;
if(!MkMBStr(rgb1, _MAX_PATH, lpSrc, &szSrc)) goto ErrorReturn;
szDst = rgch; cchDst = sizeof(rgch); if (0 == (cchDst = ExpandEnvironmentStringsA( szSrc, szDst, cchDst))) goto ErrorReturn;
if (cchDst > sizeof(rgch)) { szDst = (char *) malloc(cchDst); if(!szDst) { SetLastError(ERROR_OUTOFMEMORY); goto ErrorReturn; } if (0 == (cchDst = ExpandEnvironmentStringsA( szSrc, szDst, cchDst))) goto ErrorReturn; }
// how long is the unicode string
if (0 >= (cbConverted = MultiByteToWideChar( 0, 0, szDst, cchDst, NULL, 0))) goto ErrorReturn; if ((DWORD) cbConverted <= nSize) { if (0 >= (cbConverted = MultiByteToWideChar( 0, 0, szDst, cchDst, lpDst, nSize))) goto ErrorReturn; }
cch = (DWORD) cbConverted;
CommonReturn: FreeMBStr(rgb1, szSrc); if (szDst != rgch && szDst) free(szDst); return cch; ErrorReturn: cch = 0; goto CommonReturn; }
DWORD WINAPI ExpandEnvironmentStringsU( LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize ) { if (lpSrc == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return(0); }
if(FIsWinNT()) return( ExpandEnvironmentStringsW( lpSrc, lpDst, nSize )); else return( ExpandEnvironmentStrings9x( lpSrc, lpDst, nSize )); }
void ConvertFindDataAToFindDataW( IN LPWIN32_FIND_DATAA pFindFileDataA, OUT LPWIN32_FIND_DATAW pFindFileDataW ) { DWORD cchFilename;
memset(pFindFileDataW, 0, sizeof(*pFindFileDataW)); pFindFileDataW->dwFileAttributes = pFindFileDataA->dwFileAttributes; pFindFileDataW->ftCreationTime = pFindFileDataA->ftCreationTime; pFindFileDataW->ftLastAccessTime = pFindFileDataA->ftLastAccessTime; pFindFileDataW->ftLastWriteTime = pFindFileDataA->ftLastWriteTime; pFindFileDataW->nFileSizeHigh = pFindFileDataA->nFileSizeHigh; pFindFileDataW->nFileSizeLow = pFindFileDataA->nFileSizeLow; // pFindFileDataW->dwReserved0 = pFindFileDataA->dwReserved0;
// pFindFileDataW->dwReserved1 = pFindFileDataA->dwReserved1;
// CHAR cFileName[ MAX_PATH ];
// pFindFileDataW->cAlternateFileName = pFindFileDataA->cAlternateFileName;
cchFilename = strlen(pFindFileDataA->cFileName); if (0 != cchFilename && MAX_PATH > cchFilename) MultiByteToWideChar( CP_ACP, 0, // dwFlags
pFindFileDataA->cFileName, cchFilename + 1, pFindFileDataW->cFileName, MAX_PATH ); }
HANDLE WINAPI FindFirstFile9x( IN LPCWSTR pwszDir, OUT LPWIN32_FIND_DATAW lpFindFileData ) { HANDLE hFindFile; BYTE rgb[_MAX_PATH]; WIN32_FIND_DATAA FindFileDataA; LPSTR pszDir;
if (pwszDir == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return(INVALID_HANDLE_VALUE); }
if (!MkMBStr(rgb, _MAX_PATH, pwszDir, &pszDir)) return INVALID_HANDLE_VALUE;
hFindFile = FindFirstFileA(pszDir, &FindFileDataA); if (INVALID_HANDLE_VALUE != hFindFile) ConvertFindDataAToFindDataW(&FindFileDataA, lpFindFileData); FreeMBStr(rgb, pszDir); return hFindFile; }
HANDLE WINAPI FindFirstFileU( IN LPCWSTR pwszDir, OUT LPWIN32_FIND_DATAW lpFindFileData ) { if (FIsWinNT()) return FindFirstFileW(pwszDir, lpFindFileData); else return FindFirstFile9x(pwszDir, lpFindFileData); }
BOOL WINAPI FindNextFile9x( IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData ) { BOOL fResult; WIN32_FIND_DATAA FindFileDataA;
fResult = FindNextFileA(hFindFile, &FindFileDataA); if (fResult) ConvertFindDataAToFindDataW(&FindFileDataA, lpFindFileData); return fResult; }
BOOL WINAPI FindNextFileU( IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData ) { if (FIsWinNT()) return FindNextFileW(hFindFile, lpFindFileData); else return FindNextFile9x(hFindFile, lpFindFileData); }
HANDLE WINAPI FindFirstChangeNotification9x( LPCWSTR pwszPath, BOOL bWatchSubtree, DWORD dwNotifyFilter ) { HANDLE hChange; BYTE rgb[_MAX_PATH]; LPSTR pszPath;
if (pwszPath == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return INVALID_HANDLE_VALUE; }
if (!MkMBStr(rgb, _MAX_PATH, pwszPath, &pszPath)) return INVALID_HANDLE_VALUE;
hChange = FindFirstChangeNotificationA(pszPath, bWatchSubtree, dwNotifyFilter); FreeMBStr(rgb, pszPath); return hChange; }
HANDLE WINAPI FindFirstChangeNotificationU( LPCWSTR pwszPath, BOOL bWatchSubtree, DWORD dwNotifyFilter ) { if (FIsWinNT()) return FindFirstChangeNotificationW( pwszPath, bWatchSubtree, dwNotifyFilter); else return FindFirstChangeNotification9x( pwszPath, bWatchSubtree, dwNotifyFilter); } #endif // _M_IX86
|