several fixes

svn path=/trunk/; revision=488
This commit is contained in:
Eric Kohl 1999-05-19 17:57:02 +00:00
parent 77360caec8
commit 0495cfd8d4

View file

@ -9,16 +9,14 @@
* Created 01/11/98 * Created 01/11/98
*/ */
/* FIXME: the large integer manipulations in this file dont handle overflow */ /* INCLUDES *****************************************************************/
/* INCLUDES ****************************************************************/
#include <windows.h> #include <windows.h>
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
//#define NDEBUG #define NDEBUG
#include <kernel32/kernel32.h> #include <kernel32/kernel32.h>
#define LPPROGRESS_ROUTINE void* #define LPPROGRESS_ROUTINE void*
@ -34,16 +32,19 @@ VOID STDCALL SetFileApisToOEM(VOID)
bIsFileApiAnsi = FALSE; bIsFileApiAnsi = FALSE;
} }
WINBASEAPI VOID WINAPI SetFileApisToANSI(VOID) WINBASEAPI VOID WINAPI SetFileApisToANSI(VOID)
{ {
bIsFileApiAnsi = TRUE; bIsFileApiAnsi = TRUE;
} }
WINBOOL STDCALL AreFileApisANSI(VOID) WINBOOL STDCALL AreFileApisANSI(VOID)
{ {
return(bIsFileApiAnsi); return(bIsFileApiAnsi);
} }
HFILE STDCALL OpenFile(LPCSTR lpFileName, HFILE STDCALL OpenFile(LPCSTR lpFileName,
LPOFSTRUCT lpReOpenBuff, LPOFSTRUCT lpReOpenBuff,
UINT uStyle) UINT uStyle)
@ -115,6 +116,7 @@ HFILE STDCALL OpenFile(LPCSTR lpFileName,
return (HFILE)FileHandle; return (HFILE)FileHandle;
} }
WINBOOL STDCALL FlushFileBuffers(HANDLE hFile) WINBOOL STDCALL FlushFileBuffers(HANDLE hFile)
{ {
NTSTATUS errCode; NTSTATUS errCode;
@ -140,10 +142,14 @@ DWORD STDCALL SetFilePointer(HANDLE hFile,
FILE_END_OF_FILE_INFORMATION FileEndOfFile; FILE_END_OF_FILE_INFORMATION FileEndOfFile;
NTSTATUS errCode; NTSTATUS errCode;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
LARGE_INTEGER Distance;
DPRINT("SetFilePointer(hFile %x, lDistanceToMove %d, dwMoveMethod %d)\n", DPRINT("SetFilePointer(hFile %x, lDistanceToMove %d, dwMoveMethod %d)\n",
hFile,lDistanceToMove,dwMoveMethod); hFile,lDistanceToMove,dwMoveMethod);
Distance.u.LowPart = lDistanceToMove;
Distance.u.HighPart = (lpDistanceToMoveHigh) ? *lpDistanceToMoveHigh : 0;
if (dwMoveMethod == FILE_CURRENT) if (dwMoveMethod == FILE_CURRENT)
{ {
NtQueryInformationFile(hFile, NtQueryInformationFile(hFile,
@ -151,42 +157,21 @@ DWORD STDCALL SetFilePointer(HANDLE hFile,
&FilePosition, &FilePosition,
sizeof(FILE_POSITION_INFORMATION), sizeof(FILE_POSITION_INFORMATION),
FilePositionInformation); FilePositionInformation);
FilePosition.CurrentByteOffset.u.LowPart += lDistanceToMove; FilePosition.CurrentByteOffset.QuadPart += Distance.QuadPart;
if (lpDistanceToMoveHigh != NULL)
{
FilePosition.CurrentByteOffset.u.HighPart =
FilePosition.CurrentByteOffset.u.HighPart +
*lpDistanceToMoveHigh;
}
} }
else if (dwMoveMethod == FILE_END) else if (dwMoveMethod == FILE_END)
{ {
NtQueryInformationFile(hFile,&IoStatusBlock,&FileEndOfFile, sizeof(FILE_END_OF_FILE_INFORMATION),FileEndOfFileInformation); NtQueryInformationFile(hFile,
FilePosition.CurrentByteOffset.u.LowPart = &IoStatusBlock,
FileEndOfFile.EndOfFile.u.LowPart - lDistanceToMove; &FileEndOfFile,
if ( lpDistanceToMoveHigh != NULL ) sizeof(FILE_END_OF_FILE_INFORMATION),
{ FileEndOfFileInformation);
FilePosition.CurrentByteOffset.u.HighPart = FilePosition.CurrentByteOffset.QuadPart =
FileEndOfFile.EndOfFile.u.HighPart - *lpDistanceToMoveHigh; FileEndOfFile.EndOfFile.QuadPart - Distance.QuadPart;
}
else
{
FilePosition.CurrentByteOffset.u.HighPart =
FileEndOfFile.EndOfFile.u.HighPart;
}
} }
else if ( dwMoveMethod == FILE_BEGIN ) else if ( dwMoveMethod == FILE_BEGIN )
{ {
FilePosition.CurrentByteOffset.u.LowPart = lDistanceToMove; FilePosition.CurrentByteOffset.QuadPart = Distance.QuadPart;
if ( lpDistanceToMoveHigh != NULL )
{
FilePosition.CurrentByteOffset.u.HighPart =
*lpDistanceToMoveHigh;
}
else
{
FilePosition.CurrentByteOffset.u.HighPart = 0;
}
} }
errCode = NtSetInformationFile(hFile, errCode = NtSetInformationFile(hFile,
@ -207,9 +192,10 @@ DWORD STDCALL SetFilePointer(HANDLE hFile,
return FilePosition.CurrentByteOffset.u.LowPart; return FilePosition.CurrentByteOffset.u.LowPart;
} }
DWORD STDCALL GetFileType(HANDLE hFile) DWORD STDCALL GetFileType(HANDLE hFile)
{ {
return FILE_TYPE_UNKNOWN; return FILE_TYPE_UNKNOWN;
} }
@ -219,7 +205,6 @@ DWORD STDCALL GetFileSize(HANDLE hFile,
NTSTATUS errCode; NTSTATUS errCode;
FILE_STANDARD_INFORMATION FileStandard; FILE_STANDARD_INFORMATION FileStandard;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
errCode = NtQueryInformationFile(hFile, errCode = NtQueryInformationFile(hFile,
&IoStatusBlock, &IoStatusBlock,
@ -228,7 +213,6 @@ DWORD STDCALL GetFileSize(HANDLE hFile,
FileStandardInformation); FileStandardInformation);
if (!NT_SUCCESS(errCode)) if (!NT_SUCCESS(errCode))
{ {
CloseHandle(hFile);
SetLastError(RtlNtStatusToDosError(errCode)); SetLastError(RtlNtStatusToDosError(errCode));
if ( lpFileSizeHigh == NULL ) if ( lpFileSizeHigh == NULL )
{ {
@ -242,10 +226,10 @@ DWORD STDCALL GetFileSize(HANDLE hFile,
if ( lpFileSizeHigh != NULL ) if ( lpFileSizeHigh != NULL )
*lpFileSizeHigh = FileStandard.AllocationSize.u.HighPart; *lpFileSizeHigh = FileStandard.AllocationSize.u.HighPart;
CloseHandle(hFile);
return FileStandard.AllocationSize.u.LowPart; return FileStandard.AllocationSize.u.LowPart;
} }
DWORD STDCALL GetCompressedFileSizeA(LPCSTR lpFileName, DWORD STDCALL GetCompressedFileSizeA(LPCSTR lpFileName,
LPDWORD lpFileSizeHigh) LPDWORD lpFileSizeHigh)
{ {
@ -264,6 +248,7 @@ DWORD STDCALL GetCompressedFileSizeA(LPCSTR lpFileName,
return GetCompressedFileSizeW(FileNameW,lpFileSizeHigh); return GetCompressedFileSizeW(FileNameW,lpFileSizeHigh);
} }
DWORD STDCALL GetCompressedFileSizeW(LPCWSTR lpFileName, DWORD STDCALL GetCompressedFileSizeW(LPCWSTR lpFileName,
LPDWORD lpFileSizeHigh) LPDWORD lpFileSizeHigh)
{ {
@ -296,7 +281,6 @@ DWORD STDCALL GetCompressedFileSizeW(LPCWSTR lpFileName,
} }
WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile, WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile,
LPBY_HANDLE_FILE_INFORMATION lpFileInformation) LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
{ {
@ -317,6 +301,7 @@ WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile,
SetLastError(RtlNtStatusToDosError(errCode)); SetLastError(RtlNtStatusToDosError(errCode));
return FALSE; return FALSE;
} }
lpFileInformation->dwFileAttributes = (DWORD)FileDirectory.FileAttributes; lpFileInformation->dwFileAttributes = (DWORD)FileDirectory.FileAttributes;
memcpy(&lpFileInformation->ftCreationTime,&FileDirectory.CreationTime,sizeof(LARGE_INTEGER)); memcpy(&lpFileInformation->ftCreationTime,&FileDirectory.CreationTime,sizeof(LARGE_INTEGER));
memcpy(&lpFileInformation->ftLastAccessTime,&FileDirectory.LastAccessTime,sizeof(LARGE_INTEGER)); memcpy(&lpFileInformation->ftLastAccessTime,&FileDirectory.LastAccessTime,sizeof(LARGE_INTEGER));
@ -334,6 +319,7 @@ WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile,
SetLastError(RtlNtStatusToDosError(errCode)); SetLastError(RtlNtStatusToDosError(errCode));
return FALSE; return FALSE;
} }
lpFileInformation->nFileIndexHigh = FileInternal.IndexNumber.u.HighPart; lpFileInformation->nFileIndexHigh = FileInternal.IndexNumber.u.HighPart;
lpFileInformation->nFileIndexLow = FileInternal.IndexNumber.u.LowPart; lpFileInformation->nFileIndexLow = FileInternal.IndexNumber.u.LowPart;
@ -347,6 +333,7 @@ WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile,
SetLastError(RtlNtStatusToDosError(errCode)); SetLastError(RtlNtStatusToDosError(errCode));
return FALSE; return FALSE;
} }
lpFileInformation->dwVolumeSerialNumber = FileFsVolume.VolumeSerialNumber; lpFileInformation->dwVolumeSerialNumber = FileFsVolume.VolumeSerialNumber;
errCode = NtQueryInformationFile(hFile, errCode = NtQueryInformationFile(hFile,
@ -356,20 +343,16 @@ WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile,
FileStandardInformation); FileStandardInformation);
if (!NT_SUCCESS(errCode)) if (!NT_SUCCESS(errCode))
{ {
CloseHandle(hFile);
SetLastError(RtlNtStatusToDosError(errCode)); SetLastError(RtlNtStatusToDosError(errCode));
return FALSE; return FALSE;
} }
lpFileInformation->nNumberOfLinks = FileStandard.NumberOfLinks; lpFileInformation->nNumberOfLinks = FileStandard.NumberOfLinks;
CloseHandle(hFile);
return TRUE; return TRUE;
} }
DWORD STDCALL GetFileAttributesA(LPCSTR lpFileName) DWORD STDCALL GetFileAttributesA(LPCSTR lpFileName)
{ {
ULONG i; ULONG i;
@ -418,6 +401,7 @@ DWORD STDCALL GetFileAttributesW(LPCWSTR lpFileName)
return (DWORD)FileBasic.FileAttributes; return (DWORD)FileBasic.FileAttributes;
} }
WINBOOL STDCALL SetFileAttributesA(LPCSTR lpFileName, WINBOOL STDCALL SetFileAttributesA(LPCSTR lpFileName,
DWORD dwFileAttributes) DWORD dwFileAttributes)
{ {
@ -479,9 +463,6 @@ WINBOOL STDCALL SetFileAttributesW(LPCWSTR lpFileName,
} }
UINT STDCALL GetTempFileNameA(LPCSTR lpPathName, UINT STDCALL GetTempFileNameA(LPCSTR lpPathName,
LPCSTR lpPrefixString, LPCSTR lpPrefixString,
UINT uUnique, UINT uUnique,
@ -547,6 +528,7 @@ UINT STDCALL GetTempFileNameW(LPCWSTR lpPathName,
return uUnique; return uUnique;
} }
WINBOOL STDCALL GetFileTime(HANDLE hFile, WINBOOL STDCALL GetFileTime(HANDLE hFile,
LPFILETIME lpCreationTime, LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime, LPFILETIME lpLastAccessTime,
@ -566,12 +548,15 @@ WINBOOL STDCALL GetFileTime(HANDLE hFile,
SetLastError(RtlNtStatusToDosError(errCode)); SetLastError(RtlNtStatusToDosError(errCode));
return FALSE; return FALSE;
} }
memcpy(lpCreationTime,&FileBasic.CreationTime,sizeof(FILETIME)); memcpy(lpCreationTime,&FileBasic.CreationTime,sizeof(FILETIME));
memcpy(lpLastAccessTime,&FileBasic.LastAccessTime,sizeof(FILETIME)); memcpy(lpLastAccessTime,&FileBasic.LastAccessTime,sizeof(FILETIME));
memcpy(lpLastWriteTime,&FileBasic.LastWriteTime,sizeof(FILETIME)); memcpy(lpLastWriteTime,&FileBasic.LastWriteTime,sizeof(FILETIME));
return TRUE; return TRUE;
} }
WINBOOL STDCALL SetFileTime(HANDLE hFile, WINBOOL STDCALL SetFileTime(HANDLE hFile,
CONST FILETIME *lpCreationTime, CONST FILETIME *lpCreationTime,
CONST FILETIME *lpLastAccessTime, CONST FILETIME *lpLastAccessTime,
@ -601,6 +586,7 @@ WINBOOL STDCALL SetFileTime(HANDLE hFile,
return TRUE; return TRUE;
} }
WINBOOL STDCALL SetEndOfFile(HANDLE hFile) WINBOOL STDCALL SetEndOfFile(HANDLE hFile)
{ {
int x = -1; int x = -1;