Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

885 lines
18 KiB

//+-------------------------------------------------------------------------
//
// 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