-/*
+/* $Id: file.c,v 1.31 2002/04/27 19:15:00 hbirr Exp $
+ *
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/kernel32/file/file.c
* PURPOSE: Directory functions
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
- GetTempFileName is modified from WINE [ Alexandre Juiliard ]
+ * GetTempFileName is modified from WINE [ Alexandre Juiliard ]
* UPDATE HISTORY:
* Created 01/11/98
*/
-/* FIXME: the large integer manipulations in this file dont handle overflow */
+/* INCLUDES *****************************************************************/
-#undef WIN32_LEAN_AND_MEAN
-#include <windows.h>
#include <ddk/ntddk.h>
-#include <wstring.h>
+#include <windows.h>
+#include <wchar.h>
#include <string.h>
-#include <ddk/li.h>
-#include <ddk/rtl.h>
-
-#define LPPROGRESS_ROUTINE void*
+#define NDEBUG
+#include <kernel32/kernel32.h>
+#include <kernel32/error.h>
+#define LPPROGRESS_ROUTINE void*
-WINBOOL
-CopyFileExW(
- LPCWSTR lpExistingFileName,
- LPCWSTR lpNewFileName,
- LPPROGRESS_ROUTINE lpProgressRoutine,
- LPVOID lpData,
- WINBOOL * pbCancel,
- DWORD dwCopyFlags
- );
-
-WINBOOL
-CopyFileExA(
- LPCSTR lpExistingFileName,
- LPCSTR lpNewFileName,
- LPPROGRESS_ROUTINE lpProgressRoutine,
- LPVOID lpData,
- WINBOOL * pbCancel,
- DWORD dwCopyFlags
- );
-
-DWORD
-GetCurrentTime(VOID);
+/* GLOBALS ******************************************************************/
-BOOLEAN bIsFileApiAnsi; // set the file api to ansi or oem
+WINBOOL bIsFileApiAnsi = TRUE; // set the file api to ansi or oem
+/* FUNCTIONS ****************************************************************/
-VOID
-STDCALL
+VOID STDCALL
SetFileApisToOEM(VOID)
{
- bIsFileApiAnsi = FALSE;
- return;
+ bIsFileApiAnsi = FALSE;
}
-WINBASEAPI
-VOID
-WINAPI
+
+VOID STDCALL
SetFileApisToANSI(VOID)
{
- bIsFileApiAnsi = TRUE;
- return;
+ bIsFileApiAnsi = TRUE;
}
-
-WINBOOL
-STDCALL
+WINBOOL STDCALL
AreFileApisANSI(VOID)
{
- return bIsFileApiAnsi;
-
-}
-
-
-
-
-WINBOOL STDCALL WriteFile(HANDLE hFile,
- LPCVOID lpBuffer,
- DWORD nNumberOfBytesToWrite,
- LPDWORD lpNumberOfBytesWritten,
- LPOVERLAPPED lpOverLapped)
-{
-
- LARGE_INTEGER Offset;
- HANDLE hEvent = NULL;
- NTSTATUS errCode;
-
- WCHAR Buffer[1000];
-
- //printk("%.*s",nNumberOfBytesToWrite,lpBuffer);
-
- if (lpOverLapped != NULL )
- {
- SET_LARGE_INTEGER_LOW_PART(Offset, lpOverLapped->Offset);
- SET_LARGE_INTEGER_HIGH_PART(Offset, lpOverLapped->OffsetHigh);
- lpOverLapped->Internal = STATUS_PENDING;
- hEvent= lpOverLapped->hEvent;
- }
- errCode = NtWriteFile(hFile,hEvent,NULL,NULL,
- (PIO_STATUS_BLOCK)lpOverLapped,
- (PVOID)lpBuffer,
- nNumberOfBytesToWrite,
- &Offset,
- NULL);
- if (!NT_SUCCESS(errCode))
- {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
- return(TRUE);
-}
-
-WINBOOL STDCALL ReadFile(HANDLE hFile,
- LPVOID lpBuffer,
- DWORD nNumberOfBytesToRead,
- LPDWORD lpNumberOfBytesRead,
- LPOVERLAPPED lpOverLapped)
-{
-
- HANDLE hEvent = NULL;
- PLARGE_INTEGER Offset;
- LARGE_INTEGER ByteOffset;
- NTSTATUS errCode;
- PIO_STATUS_BLOCK IoStatusBlock;
- IO_STATUS_BLOCK IIosb;
-
-
- if ( lpOverLapped != NULL )
- {
- SET_LARGE_INTEGER_LOW_PART(ByteOffset, lpOverLapped->Offset);
- SET_LARGE_INTEGER_HIGH_PART(ByteOffset, lpOverLapped->OffsetHigh);
- Offset = &ByteOffset;
- lpOverLapped->Internal = STATUS_PENDING;
- hEvent = lpOverLapped->hEvent;
- IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
- }
- else
- {
- IoStatusBlock = &IIosb;
- Offset = NULL;
- }
-
- errCode = NtReadFile(hFile,
- hEvent,
- NULL,
- NULL,
- IoStatusBlock,
- lpBuffer,
- nNumberOfBytesToRead,
- Offset,
- NULL);
- if ( !NT_SUCCESS(errCode) )
- {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
-
- return TRUE;
-}
-
-WINBOOL
-STDCALL
-ReadFileEx(
- HANDLE hFile,
- LPVOID lpBuffer,
- DWORD nNumberOfBytesToRead,
- LPOVERLAPPED lpOverLapped,
- LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
- )
-{
- HANDLE hEvent = NULL;
- LARGE_INTEGER Offset;
- NTSTATUS errCode;
- IO_STATUS_BLOCK IIosb;
- PIO_STATUS_BLOCK IoStatusBlock;
-
-
- if ( lpOverLapped != NULL ) {
- SET_LARGE_INTEGER_LOW_PART(Offset, lpOverLapped->Offset);
- SET_LARGE_INTEGER_HIGH_PART(Offset, lpOverLapped->OffsetHigh);
- lpOverLapped->Internal = STATUS_PENDING;
- hEvent = lpOverLapped->hEvent;
- IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
- }
- else {
- SET_LARGE_INTEGER_LOW_PART(Offset, 0);
- SET_LARGE_INTEGER_HIGH_PART(Offset, 0);
- IoStatusBlock = &IIosb;
- }
-
-
-
-
- errCode = NtReadFile(hFile,
- hEvent,
- (PIO_APC_ROUTINE)lpCompletionRoutine,
- NULL,
- IoStatusBlock,
- lpBuffer,
- nNumberOfBytesToRead,
- &Offset,
- NULL);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- return TRUE;
-}
-
-
-WINBOOL
-STDCALL
-LockFile(
- HANDLE hFile,
- DWORD dwFileOffsetLow,
- DWORD dwFileOffsetHigh,
- DWORD nNumberOfBytesToLockLow,
- DWORD nNumberOfBytesToLockHigh
- )
-{
- DWORD dwReserved;
- OVERLAPPED Overlapped;
-
- Overlapped.Offset = dwFileOffsetLow;
- Overlapped.OffsetHigh = dwFileOffsetHigh;
- dwReserved = 0;
-
- return LockFileEx(hFile, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK,dwReserved,nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, &Overlapped ) ;
-
-}
-
-WINBOOL
-STDCALL
-LockFileEx(
- HANDLE hFile,
- DWORD dwFlags,
- DWORD dwReserved,
- DWORD nNumberOfBytesToLockLow,
- DWORD nNumberOfBytesToLockHigh,
- LPOVERLAPPED lpOverlapped
- )
-{
- LARGE_INTEGER BytesToLock;
- BOOL LockImmediate;
- BOOL LockExclusive;
- NTSTATUS errCode;
- LARGE_INTEGER Offset;
-
- if(dwReserved != 0)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- lpOverlapped->Internal = STATUS_PENDING;
-
- SET_LARGE_INTEGER_LOW_PART(Offset, lpOverlapped->Offset);
- SET_LARGE_INTEGER_HIGH_PART(Offset, lpOverlapped->OffsetHigh);
-
- if ( (dwFlags & LOCKFILE_FAIL_IMMEDIATELY) == LOCKFILE_FAIL_IMMEDIATELY )
- LockImmediate = TRUE;
- else
- LockImmediate = FALSE;
-
- if ( (dwFlags & LOCKFILE_EXCLUSIVE_LOCK) == LOCKFILE_EXCLUSIVE_LOCK )
- LockExclusive = TRUE;
- else
- LockExclusive = FALSE;
-
- SET_LARGE_INTEGER_LOW_PART(BytesToLock, nNumberOfBytesToLockLow);
- SET_LARGE_INTEGER_HIGH_PART(BytesToLock, nNumberOfBytesToLockHigh);
-
- errCode = NtLockFile(hFile,
- NULL,
- NULL,
- NULL,
- (PIO_STATUS_BLOCK)lpOverlapped,
- &Offset,
- &BytesToLock,
- NULL,
- LockImmediate,
- LockExclusive);
- if ( !NT_SUCCESS(errCode) )
- {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
- return TRUE;
-
-}
-
-WINBOOL
-STDCALL
-UnlockFile(
- HANDLE hFile,
- DWORD dwFileOffsetLow,
- DWORD dwFileOffsetHigh,
- DWORD nNumberOfBytesToUnlockLow,
- DWORD nNumberOfBytesToUnlockHigh
- )
-{
- DWORD dwReserved;
- OVERLAPPED Overlapped;
- Overlapped.Offset = dwFileOffsetLow;
- Overlapped.OffsetHigh = dwFileOffsetHigh;
- dwReserved = 0;
- return UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, &Overlapped);
-
-}
-
-
-
-WINBOOL
-STDCALL
-UnlockFileEx(
- HANDLE hFile,
- DWORD dwReserved,
- DWORD nNumberOfBytesToUnLockLow,
- DWORD nNumberOfBytesToUnLockHigh,
- LPOVERLAPPED lpOverlapped
- )
-{
- LARGE_INTEGER BytesToUnLock;
- LARGE_INTEGER StartAddress;
- NTSTATUS errCode;
-
- if(dwReserved != 0)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- if ( lpOverlapped == NULL )
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- SET_LARGE_INTEGER_LOW_PART(BytesToUnLock, nNumberOfBytesToUnLockLow);
- SET_LARGE_INTEGER_HIGH_PART(BytesToUnLock, nNumberOfBytesToUnLockHigh);
-
- SET_LARGE_INTEGER_LOW_PART(StartAddress, lpOverlapped->Offset);
- SET_LARGE_INTEGER_HIGH_PART(StartAddress, lpOverlapped->OffsetHigh);
-
- errCode = NtUnlockFile(hFile,
- (PIO_STATUS_BLOCK)lpOverlapped,
- &StartAddress,
- &BytesToUnLock,
- NULL);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-
-
-
-
-
-WINBOOL
-STDCALL
-CopyFileA(
- LPCSTR lpExistingFileName,
- LPCSTR lpNewFileName,
- WINBOOL bFailIfExists
- )
-{
- return CopyFileExA(lpExistingFileName,lpNewFileName,NULL,NULL,FALSE,bFailIfExists);
+ return bIsFileApiAnsi;
}
-WINBOOL
-STDCALL
-CopyFileExA(
- LPCSTR lpExistingFileName,
- LPCSTR lpNewFileName,
- LPPROGRESS_ROUTINE lpProgressRoutine,
- LPVOID lpData,
- WINBOOL * pbCancel,
- DWORD dwCopyFlags
- )
-{
- ULONG i;
- WCHAR ExistingFileNameW[MAX_PATH];
- WCHAR NewFileNameW[MAX_PATH];
-
-
-
- i = 0;
- while ((*lpExistingFileName)!=0 && i < MAX_PATH)
- {
- ExistingFileNameW[i] = *lpExistingFileName;
- lpExistingFileName++;
- i++;
- }
- ExistingFileNameW[i] = 0;
-
- i = 0;
- while ((*lpNewFileName)!=0 && i < MAX_PATH)
- {
- NewFileNameW[i] = *lpNewFileName;
- lpNewFileName++;
- i++;
- }
- NewFileNameW[i] = 0;
-
- return CopyFileExW(ExistingFileNameW,NewFileNameW,lpProgressRoutine,lpData,pbCancel,dwCopyFlags);
-}
-
-
-WINBOOL
-STDCALL
-CopyFileW(
- LPCWSTR lpExistingFileName,
- LPCWSTR lpNewFileName,
- WINBOOL bFailIfExists
- )
-{
- return CopyFileExW(lpExistingFileName,lpNewFileName,NULL,NULL,NULL,bFailIfExists);
-}
-
-
-
-
-WINBOOL
-STDCALL
-CopyFileExW(
- LPCWSTR lpExistingFileName,
- LPCWSTR lpNewFileName,
- LPPROGRESS_ROUTINE lpProgressRoutine,
- LPVOID lpData,
- WINBOOL * pbCancel,
- DWORD dwCopyFlags
- )
+HFILE STDCALL
+OpenFile(LPCSTR lpFileName,
+ LPOFSTRUCT lpReOpenBuff,
+ UINT uStyle)
{
-
- NTSTATUS errCode = 0;
- HANDLE FileHandleSource, FileHandleDest;
+ OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
+ UNICODE_STRING FileNameString;
+ UNICODE_STRING FileNameU;
+ ANSI_STRING FileName;
+ WCHAR PathNameW[MAX_PATH];
+ HANDLE FileHandle = NULL;
+ NTSTATUS errCode;
+ PWCHAR FilePart;
+ ULONG Len;
- FILE_STANDARD_INFORMATION FileStandard;
- FILE_BASIC_INFORMATION FileBasic;
- FILE_POSITION_INFORMATION FilePosition;
-
- UCHAR *lpBuffer = NULL;
-
-
-
- ULONG RegionSize = 0x1000000;
-
- BOOL bCancel = FALSE;
-
-
-
- FileHandleSource = CreateFileW(
- lpExistingFileName,
- GENERIC_READ,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING,
- NULL
- );
-
-
-
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
-
- errCode = NtQueryInformationFile(FileHandleSource,
- &IoStatusBlock,&FileStandard, sizeof(FILE_STANDARD_INFORMATION),
- FileStandardInformation);
- if ( !NT_SUCCESS(errCode) ) {
- NtClose(FileHandleSource);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
+ DPRINT("OpenFile('%s', lpReOpenBuff %x, uStyle %x)\n", lpFileName, lpReOpenBuff, uStyle);
- errCode = NtQueryInformationFile(FileHandleSource,
- &IoStatusBlock,&FileBasic, sizeof(FILE_BASIC_INFORMATION),
- FileBasicInformation);
- if ( !NT_SUCCESS(errCode) ) {
- NtClose(FileHandleSource);
- SetLastError(RtlNtStatusToDosError(errCode));
+ if (lpReOpenBuff == NULL)
+ {
return FALSE;
}
-
-
-
-
-
-
- FileHandleDest = CreateFileW(
- lpNewFileName,
- GENERIC_WRITE,
- FILE_SHARE_WRITE,
- NULL,
- dwCopyFlags ? CREATE_NEW : CREATE_ALWAYS ,
- FileBasic.FileAttributes|FILE_FLAG_NO_BUFFERING,
- NULL
- );
-
- if ( !NT_SUCCESS(errCode) ) {
- NtClose(FileHandleSource);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
-
-
- SET_LARGE_INTEGER_LOW_PART(FilePosition.CurrentByteOffset, 0);
- SET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset, 0);
+ RtlInitAnsiString (&FileName, (LPSTR)lpFileName);
- errCode = NtSetInformationFile(FileHandleSource,
- &IoStatusBlock,&FilePosition, sizeof(FILE_POSITION_INFORMATION),
- FilePositionInformation);
- if ( !NT_SUCCESS(errCode) ) {
- NtClose(FileHandleSource);
- NtClose(FileHandleDest);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
- errCode = NtSetInformationFile(FileHandleDest,
- &IoStatusBlock,&FilePosition, sizeof(FILE_POSITION_INFORMATION),
- FilePositionInformation);
-
- if ( !NT_SUCCESS(errCode) ) {
- NtClose(FileHandleSource);
- NtClose(FileHandleDest);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
-
-
- errCode = NtAllocateVirtualMemory(
- NtCurrentProcess(),
- (PVOID *)&lpBuffer,
- 2,
- &RegionSize,
- MEM_COMMIT,
- PAGE_READWRITE
- );
-
- if ( !NT_SUCCESS(errCode) ) {
- NtClose(FileHandleSource);
- NtClose(FileHandleDest);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
-
-
-
-
-
- do {
-
- errCode = NtReadFile(
- FileHandleSource,
- NULL,
- NULL,
- NULL,
- (PIO_STATUS_BLOCK)&IoStatusBlock,
- lpBuffer,
- RegionSize,
- NULL,
- NULL);
- if ( pbCancel != NULL )
- bCancel = *pbCancel;
-
-
- if ( !NT_SUCCESS(errCode) || bCancel ) {
- NtFreeVirtualMemory(NtCurrentProcess(),(PVOID *)&lpBuffer, &RegionSize,MEM_RELEASE);
- NtClose(FileHandleSource);
- NtClose(FileHandleDest);
- if ( errCode == STATUS_END_OF_FILE )
- break;
- else
- return FALSE;
-
- }
-
- errCode = NtWriteFile(FileHandleDest,
- NULL,
- lpProgressRoutine,
- lpData,
- (PIO_STATUS_BLOCK)&IoStatusBlock,
- lpBuffer,
- RegionSize,
- NULL,
- NULL);
-
-
-
- if ( !NT_SUCCESS(errCode) ) {
- NtFreeVirtualMemory(NtCurrentProcess(),(PVOID *)&lpBuffer, &RegionSize,MEM_RELEASE);
- NtClose(FileHandleSource);
- NtClose(FileHandleDest);
- return FALSE;
- }
-
- } while ( TRUE );
-
- return TRUE;
-
-
-}
+ /* convert ansi (or oem) string to unicode */
+ if (bIsFileApiAnsi)
+ RtlAnsiStringToUnicodeString (&FileNameU, &FileName, TRUE);
+ else
+ RtlOemStringToUnicodeString (&FileNameU, &FileName, TRUE);
+ Len = SearchPathW (NULL,
+ FileNameU.Buffer,
+ NULL,
+ OFS_MAXPATHNAME,
+ PathNameW,
+ &FilePart);
-HFILE
-STDCALL
-OpenFile(
- LPCSTR lpFileName,
- LPOFSTRUCT lpReOpenBuff,
- UINT uStyle
- )
-{
- NTSTATUS errCode;
- HANDLE FileHandle = NULL;
- UNICODE_STRING FileNameString;
- WCHAR FileNameW[MAX_PATH];
- WCHAR PathNameW[MAX_PATH];
- ULONG i;
- OBJECT_ATTRIBUTES ObjectAttributes;
- IO_STATUS_BLOCK IoStatusBlock;
- WCHAR *FilePart;
- ULONG Len;
+ RtlFreeUnicodeString(&FileNameU);
- if ( lpReOpenBuff == NULL ) {
- return FALSE;
+ if (Len == 0 || Len > OFS_MAXPATHNAME)
+ {
+ return (HFILE)INVALID_HANDLE_VALUE;
}
-
+ FileName.Buffer = lpReOpenBuff->szPathName;
+ FileName.Length = 0;
+ FileName.MaximumLength = OFS_MAXPATHNAME;
-
- i = 0;
- while ((*lpFileName)!=0 && i < MAX_PATH)
- {
- FileNameW[i] = *lpFileName;
- lpFileName++;
- i++;
- }
- FileNameW[i] = 0;
+ RtlInitUnicodeString(&FileNameU, PathNameW);
+ /* convert unicode string to ansi (or oem) */
+ if (bIsFileApiAnsi)
+ RtlUnicodeStringToAnsiString (&FileName, &FileNameU, FALSE);
+ else
+ RtlUnicodeStringToOemString (&FileName, &FileNameU, FALSE);
- Len = SearchPathW(NULL,FileNameW,NULL,MAX_PATH,PathNameW,&FilePart);
- if ( Len == 0 )
- return (HFILE)NULL;
-
-
- if ( Len > MAX_PATH )
- return (HFILE)NULL;
-
- FileNameString.Length = lstrlenW(PathNameW)*sizeof(WCHAR);
- FileNameString.Buffer = PathNameW;
- FileNameString.MaximumLength = FileNameString.Length+sizeof(WCHAR);
-
-
-
+ if (!RtlDosPathNameToNtPathName_U ((LPWSTR)PathNameW,
+ &FileNameString,
+ NULL,
+ NULL))
+ {
+ return (HFILE)INVALID_HANDLE_VALUE;
+ }
- ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
+ ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
ObjectAttributes.RootDirectory = NULL;
- ObjectAttributes.ObjectName = &FileNameString;
+ ObjectAttributes.ObjectName = &FileNameString;
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT;
ObjectAttributes.SecurityDescriptor = NULL;
ObjectAttributes.SecurityQualityOfService = NULL;
// FILE_SHARE_READ
// FILE_NO_INTERMEDIATE_BUFFERING
-
-
- if ((uStyle & OF_PARSE) == OF_PARSE )
+ if ((uStyle & OF_PARSE) == OF_PARSE)
+ {
+ RtlFreeUnicodeString(&FileNameString);
return (HFILE)NULL;
+ }
+ errCode = NtOpenFile (&FileHandle,
+ GENERIC_READ|SYNCHRONIZE,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ FILE_SHARE_READ,
+ FILE_NON_DIRECTORY_FILE);
- errCode = NtOpenFile(
- &FileHandle,
- GENERIC_READ|SYNCHRONIZE,
- &ObjectAttributes,
- &IoStatusBlock,
- FILE_SHARE_READ,
- FILE_NON_DIRECTORY_FILE
- );
+ RtlFreeUnicodeString(&FileNameString);
lpReOpenBuff->nErrCode = RtlNtStatusToDosError(errCode);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus (errCode);
return (HFILE)INVALID_HANDLE_VALUE;
}
return (HFILE)FileHandle;
-
}
-WINBOOL
-STDCALL
-MoveFileA(
- LPCSTR lpExistingFileName,
- LPCSTR lpNewFileName
- )
+WINBOOL STDCALL
+FlushFileBuffers(HANDLE hFile)
{
- return MoveFileExA(lpExistingFileName,lpNewFileName,MOVEFILE_COPY_ALLOWED);
-}
+ NTSTATUS errCode;
+ IO_STATUS_BLOCK IoStatusBlock;
-WINBOOL
-STDCALL
-MoveFileExA(
- LPCSTR lpExistingFileName,
- LPCSTR lpNewFileName,
- DWORD dwFlags
- )
-{
- ULONG i;
- WCHAR ExistingFileNameW[MAX_PATH];
- WCHAR NewFileNameW[MAX_PATH];
-
-
-
- i = 0;
- while ((*lpExistingFileName)!=0 && i < MAX_PATH)
- {
- ExistingFileNameW[i] = *lpExistingFileName;
- lpExistingFileName++;
- i++;
- }
- ExistingFileNameW[i] = 0;
-
- i = 0;
- while ((*lpNewFileName)!=0 && i < MAX_PATH)
- {
- NewFileNameW[i] = *lpNewFileName;
- lpNewFileName++;
- i++;
- }
- NewFileNameW[i] = 0;
-
- return MoveFileExW(ExistingFileNameW,NewFileNameW,dwFlags);
-
+ errCode = NtFlushBuffersFile(hFile,
+ &IoStatusBlock);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ return(FALSE);
+ }
+ return(TRUE);
}
-
-WINBOOL
-STDCALL
-MoveFileW(
- LPCWSTR lpExistingFileName,
- LPCWSTR lpNewFileName
- )
+DWORD STDCALL
+SetFilePointer(HANDLE hFile,
+ LONG lDistanceToMove,
+ PLONG lpDistanceToMoveHigh,
+ DWORD dwMoveMethod)
{
- return MoveFileExW(lpExistingFileName,lpNewFileName,MOVEFILE_COPY_ALLOWED);
+ FILE_POSITION_INFORMATION FilePosition;
+ FILE_STANDARD_INFORMATION FileStandart;
+ NTSTATUS errCode;
+ IO_STATUS_BLOCK IoStatusBlock;
+ LARGE_INTEGER Distance;
+
+ DPRINT("SetFilePointer(hFile %x, lDistanceToMove %d, dwMoveMethod %d)\n",
+ hFile,lDistanceToMove,dwMoveMethod);
+
+ Distance.u.LowPart = lDistanceToMove;
+ if (lpDistanceToMoveHigh)
+ {
+ Distance.u.HighPart = *lpDistanceToMoveHigh;
+ }
+ else if (lDistanceToMove >= 0)
+ {
+ Distance.u.HighPart = 0;
+ }
+ else
+ {
+ Distance.u.HighPart = -1;
+ }
+
+ if (dwMoveMethod == FILE_CURRENT)
+ {
+ NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FilePosition,
+ sizeof(FILE_POSITION_INFORMATION),
+ FilePositionInformation);
+ FilePosition.CurrentByteOffset.QuadPart += Distance.QuadPart;
+ }
+ else if (dwMoveMethod == FILE_END)
+ {
+ NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileStandart,
+ sizeof(FILE_STANDARD_INFORMATION),
+ FileStandardInformation);
+ FilePosition.CurrentByteOffset.QuadPart =
+ FileStandart.EndOfFile.QuadPart + Distance.QuadPart;
+ }
+ else if ( dwMoveMethod == FILE_BEGIN )
+ {
+ FilePosition.CurrentByteOffset.QuadPart = Distance.QuadPart;
+ }
+
+ errCode = NtSetInformationFile(hFile,
+ &IoStatusBlock,
+ &FilePosition,
+ sizeof(FILE_POSITION_INFORMATION),
+ FilePositionInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ return -1;
+ }
+
+ if (lpDistanceToMoveHigh != NULL)
+ {
+ *lpDistanceToMoveHigh = FilePosition.CurrentByteOffset.u.HighPart;
+ }
+ return FilePosition.CurrentByteOffset.u.LowPart;
}
-#define FILE_RENAME_SIZE MAX_PATH +sizeof(FILE_RENAME_INFORMATION)
-WINBOOL
-STDCALL
-MoveFileExW(
- LPCWSTR lpExistingFileName,
- LPCWSTR lpNewFileName,
- DWORD dwFlags
- )
+DWORD STDCALL
+GetFileType(HANDLE hFile)
{
- HANDLE hFile = NULL;
- IO_STATUS_BLOCK IoStatusBlock;
- FILE_RENAME_INFORMATION *FileRename;
- USHORT Buffer[FILE_RENAME_SIZE];
- NTSTATUS errCode;
+ FILE_FS_DEVICE_INFORMATION DeviceInfo;
+ IO_STATUS_BLOCK StatusBlock;
+ NTSTATUS Status;
- hFile = CreateFileW(
- lpExistingFileName,
- GENERIC_ALL,
- FILE_SHARE_WRITE|FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL
- );
+ /* get real handle */
+ switch ((ULONG)hFile)
+ {
+ case STD_INPUT_HANDLE:
+ hFile = NtCurrentPeb()->ProcessParameters->InputHandle;
+ break;
+ case STD_OUTPUT_HANDLE:
+ hFile = NtCurrentPeb()->ProcessParameters->OutputHandle;
+ break;
+ case STD_ERROR_HANDLE:
+ hFile = NtCurrentPeb()->ProcessParameters->ErrorHandle;
+ break;
+ }
- FileRename = (FILE_RENAME_INFORMATION *)Buffer;
- if ( ( dwFlags & MOVEFILE_REPLACE_EXISTING ) == MOVEFILE_REPLACE_EXISTING )
- FileRename->Replace = TRUE;
- else
- FileRename->Replace = FALSE;
-
- FileRename->FileNameLength = lstrlenW(lpNewFileName);
- memcpy(FileRename->FileName,lpNewFileName,min(FileRename->FileNameLength,MAX_PATH));
-
- errCode = NtSetInformationFile(hFile,&IoStatusBlock,FileRename, FILE_RENAME_SIZE, FileRenameInformation);
- if ( !NT_SUCCESS(errCode) ) {
- if ( CopyFileW(lpExistingFileName,lpNewFileName,FileRename->Replace) )
- DeleteFileW(lpExistingFileName);
- }
+ /* check console handles */
+ if (((ULONG)hFile & 3) == 3)
+ {
+// if (VerifyConsoleHandle(hFile))
+ return FILE_TYPE_CHAR;
+ }
- CloseHandle(hFile);
- return TRUE;
-}
+ Status = NtQueryVolumeInformationFile(hFile,
+ &StatusBlock,
+ &DeviceInfo,
+ sizeof(FILE_FS_DEVICE_INFORMATION),
+ FileFsDeviceInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FILE_TYPE_UNKNOWN;
+ }
-WINBOOL
-STDCALL
-DeleteFileA(
- LPCSTR lpFileName
- )
-{
- ULONG i;
-
- WCHAR FileNameW[MAX_PATH];
-
-
-
- i = 0;
- while ((*lpFileName)!=0 && i < MAX_PATH)
- {
- FileNameW[i] = *lpFileName;
- lpFileName++;
- i++;
- }
- FileNameW[i] = 0;
- return DeleteFileW(FileNameW);
+ switch (DeviceInfo.DeviceType)
+ {
+ case FILE_DEVICE_CD_ROM:
+ case FILE_DEVICE_CD_ROM_FILE_SYSTEM:
+ case FILE_DEVICE_CONTROLLER:
+ case FILE_DEVICE_DATALINK:
+ case FILE_DEVICE_DFS:
+ case FILE_DEVICE_DISK:
+ case FILE_DEVICE_DISK_FILE_SYSTEM:
+ case FILE_DEVICE_VIRTUAL_DISK:
+ return FILE_TYPE_DISK;
+
+ case FILE_DEVICE_KEYBOARD:
+ case FILE_DEVICE_MOUSE:
+ case FILE_DEVICE_NULL:
+ case FILE_DEVICE_PARALLEL_PORT:
+ case FILE_DEVICE_PRINTER:
+ case FILE_DEVICE_SERIAL_PORT:
+ case FILE_DEVICE_SCREEN:
+ case FILE_DEVICE_SOUND:
+ case FILE_DEVICE_MODEM:
+ return FILE_TYPE_CHAR;
+
+ case FILE_DEVICE_NAMED_PIPE:
+ return FILE_TYPE_PIPE;
+ }
+ return FILE_TYPE_UNKNOWN;
}
-WINBOOL
-STDCALL
-DeleteFileW(
- LPCWSTR lpFileName
- )
+
+DWORD STDCALL
+GetFileSize(HANDLE hFile,
+ LPDWORD lpFileSizeHigh)
{
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING FileNameString;
- NTSTATUS errCode;
- WCHAR PathNameW[MAX_PATH];
- UINT Len;
- if ( lpFileName[1] != ':' ) {
- Len = GetCurrentDirectoryW(MAX_PATH,PathNameW);
- if ( Len == 0 )
- return FALSE;
- if ( PathNameW[Len-1] != L'\\' ) {
- PathNameW[Len] = L'\\';
- PathNameW[Len+1] = 0;
- }
- }
+ NTSTATUS errCode;
+ FILE_STANDARD_INFORMATION FileStandard;
+ IO_STATUS_BLOCK IoStatusBlock;
+
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileStandard,
+ sizeof(FILE_STANDARD_INFORMATION),
+ FileStandardInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ if ( lpFileSizeHigh == NULL )
+ {
+ return -1;
+ }
else
- PathNameW[0] = 0;
- lstrcatW(PathNameW,lpFileName);
- FileNameString.Length = lstrlenW( PathNameW)*sizeof(WCHAR);
- if ( FileNameString.Length == 0 )
- return FALSE;
+ {
+ return 0;
+ }
+ }
+ if ( lpFileSizeHigh != NULL )
+ *lpFileSizeHigh = FileStandard.AllocationSize.u.HighPart;
- if ( FileNameString.Length > MAX_PATH*sizeof(WCHAR) )
- return FALSE;
-
+ return FileStandard.AllocationSize.u.LowPart;
+}
-
-
- FileNameString.Buffer = (WCHAR *)PathNameW;
- FileNameString.MaximumLength = FileNameString.Length+sizeof(WCHAR);
-
-
+DWORD STDCALL
+GetCompressedFileSizeA(LPCSTR lpFileName,
+ LPDWORD lpFileSizeHigh)
+{
+ UNICODE_STRING FileNameU;
+ ANSI_STRING FileName;
+ DWORD Size;
- ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
- ObjectAttributes.RootDirectory = NULL;
- ObjectAttributes.ObjectName = &FileNameString;
- ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT;
- ObjectAttributes.SecurityDescriptor = NULL;
- ObjectAttributes.SecurityQualityOfService = NULL;
+ RtlInitAnsiString(&FileName,
+ (LPSTR)lpFileName);
+ /* convert ansi (or oem) string to unicode */
+ if (bIsFileApiAnsi)
+ RtlAnsiStringToUnicodeString(&FileNameU,
+ &FileName,
+ TRUE);
+ else
+ RtlOemStringToUnicodeString(&FileNameU,
+ &FileName,
+ TRUE);
+ Size = GetCompressedFileSizeW(FileNameU.Buffer,
+ lpFileSizeHigh);
+ RtlFreeUnicodeString (&FileNameU);
- errCode = NtDeleteFile(&ObjectAttributes);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- return TRUE;
+ return Size;
}
-WINBOOL
-STDCALL
-FlushFileBuffers(
- HANDLE hFile
- )
-{
- NTSTATUS errCode;
- IO_STATUS_BLOCK IoStatusBlock;
- errCode = NtFlushBuffersFile(
- hFile,
- &IoStatusBlock
- );
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- return TRUE;
+DWORD STDCALL
+GetCompressedFileSizeW(LPCWSTR lpFileName,
+ LPDWORD lpFileSizeHigh)
+{
+ FILE_COMPRESSION_INFORMATION FileCompression;
+ NTSTATUS errCode;
+ IO_STATUS_BLOCK IoStatusBlock;
+ HANDLE hFile;
+
+ hFile = CreateFileW(lpFileName,
+ GENERIC_READ,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileCompression,
+ sizeof(FILE_COMPRESSION_INFORMATION),
+ FileCompressionInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ CloseHandle(hFile);
+ SetLastErrorByStatus(errCode);
+ return 0;
+ }
+ CloseHandle(hFile);
+ return 0;
}
-DWORD
-STDCALL
-SetFilePointer(
- HANDLE hFile,
- LONG lDistanceToMove,
- PLONG lpDistanceToMoveHigh,
- DWORD dwMoveMethod
- )
+WINBOOL STDCALL
+GetFileInformationByHandle(HANDLE hFile,
+ LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
{
- FILE_POSITION_INFORMATION FilePosition;
- FILE_END_OF_FILE_INFORMATION FileEndOfFile;
- NTSTATUS errCode;
- IO_STATUS_BLOCK IoStatusBlock;
- if ( dwMoveMethod == FILE_CURRENT ) {
- NtQueryInformationFile(hFile,&IoStatusBlock,&FilePosition, sizeof(FILE_POSITION_INFORMATION),FilePositionInformation);
- SET_LARGE_INTEGER_LOW_PART(FilePosition.CurrentByteOffset,
- GET_LARGE_INTEGER_LOW_PART(FilePosition.CurrentByteOffset) +
- lDistanceToMove);
- if ( lpDistanceToMoveHigh != NULL ) {
- SET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset,
- GET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset) +
- *lpDistanceToMoveHigh);
- }
- }
- else if ( dwMoveMethod == FILE_END ) {
- NtQueryInformationFile(hFile,&IoStatusBlock,&FileEndOfFile, sizeof(FILE_END_OF_FILE_INFORMATION),FileEndOfFileInformation);
- SET_LARGE_INTEGER_LOW_PART(FilePosition.CurrentByteOffset,
- GET_LARGE_INTEGER_LOW_PART(FileEndOfFile.EndOfFile) -
- lDistanceToMove);
- if ( lpDistanceToMoveHigh != NULL ) {
- SET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset,
- GET_LARGE_INTEGER_HIGH_PART(FileEndOfFile.EndOfFile) -
- *lpDistanceToMoveHigh);
- } else {
- SET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset,
- GET_LARGE_INTEGER_HIGH_PART(FileEndOfFile.EndOfFile));
- }
- }
- else if ( dwMoveMethod == FILE_CURRENT ) {
- SET_LARGE_INTEGER_LOW_PART(FilePosition.CurrentByteOffset,
- lDistanceToMove);
- if ( lpDistanceToMoveHigh != NULL ) {
- SET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset,
- *lpDistanceToMoveHigh);
- } else {
- SET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset,
- 0);
- }
- }
+ struct
+ {
+ FILE_FS_VOLUME_INFORMATION FileFsVolume;
+ WCHAR Name[255];
+ }
+ FileFsVolume;
- errCode = NtSetInformationFile(hFile,&IoStatusBlock,&FilePosition, sizeof(FILE_POSITION_INFORMATION),FilePositionInformation);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return -1;
- }
-
- if ( lpDistanceToMoveHigh != NULL ) {
- *lpDistanceToMoveHigh = GET_LARGE_INTEGER_HIGH_PART(FilePosition.CurrentByteOffset);
- }
- return GET_LARGE_INTEGER_LOW_PART(FilePosition.CurrentByteOffset);
-}
+ FILE_BASIC_INFORMATION FileBasic;
+ FILE_INTERNAL_INFORMATION FileInternal;
+ FILE_STANDARD_INFORMATION FileStandard;
+ NTSTATUS errCode;
+ IO_STATUS_BLOCK IoStatusBlock;
-DWORD
-STDCALL
-GetFileType(
- HANDLE hFile
- )
-{
- return FILE_TYPE_UNKNOWN;
-}
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ return FALSE;
+ }
+ lpFileInformation->dwFileAttributes = (DWORD)FileBasic.FileAttributes;
+ memcpy(&lpFileInformation->ftCreationTime,&FileBasic.CreationTime,sizeof(LARGE_INTEGER));
+ memcpy(&lpFileInformation->ftLastAccessTime,&FileBasic.LastAccessTime,sizeof(LARGE_INTEGER));
+ memcpy(&lpFileInformation->ftLastWriteTime, &FileBasic.LastWriteTime,sizeof(LARGE_INTEGER));
-DWORD
-STDCALL
-GetFileSize(
- HANDLE hFile,
- LPDWORD lpFileSizeHigh
- )
-{
- NTSTATUS errCode;
- FILE_STANDARD_INFORMATION FileStandard;
- IO_STATUS_BLOCK IoStatusBlock;
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileInternal,
+ sizeof(FILE_INTERNAL_INFORMATION),
+ FileInternalInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ return FALSE;
+ }
+ lpFileInformation->nFileIndexHigh = FileInternal.IndexNumber.u.HighPart;
+ lpFileInformation->nFileIndexLow = FileInternal.IndexNumber.u.LowPart;
- errCode = NtQueryInformationFile(hFile,
- &IoStatusBlock,&FileStandard, sizeof(FILE_STANDARD_INFORMATION),
- FileStandardInformation);
- if ( !NT_SUCCESS(errCode) ) {
- CloseHandle(hFile);
- SetLastError(RtlNtStatusToDosError(errCode));
- if ( lpFileSizeHigh == NULL ) {
- return -1;
- }
- else
- return 0;
- }
- if ( lpFileSizeHigh != NULL )
- *lpFileSizeHigh = GET_LARGE_INTEGER_HIGH_PART(FileStandard.AllocationSize);
+ errCode = NtQueryVolumeInformationFile(hFile,
+ &IoStatusBlock,
+ &FileFsVolume,
+ sizeof(FileFsVolume),
+ FileFsVolumeInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ return FALSE;
+ }
- CloseHandle(hFile);
- return GET_LARGE_INTEGER_LOW_PART(FileStandard.AllocationSize);
-}
+ lpFileInformation->dwVolumeSerialNumber = FileFsVolume.FileFsVolume.VolumeSerialNumber;
-DWORD
-STDCALL
-GetCompressedFileSizeA(
- LPCSTR lpFileName,
- LPDWORD lpFileSizeHigh
- )
-{
- WCHAR FileNameW[MAX_PATH];
- ULONG i;
- i = 0;
- while ((*lpFileName)!=0 && i < MAX_PATH)
- {
- FileNameW[i] = *lpFileName;
- lpFileName++;
- i++;
- }
- FileNameW[i] = 0;
-
-
- return GetCompressedFileSizeW(FileNameW,lpFileSizeHigh);
-
-}
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileStandard,
+ sizeof(FILE_STANDARD_INFORMATION),
+ FileStandardInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus(errCode);
+ return FALSE;
+ }
-DWORD
-STDCALL
-GetCompressedFileSizeW(
- LPCWSTR lpFileName,
- LPDWORD lpFileSizeHigh
- )
-{
- FILE_COMPRESSION_INFORMATION FileCompression;
- NTSTATUS errCode;
- IO_STATUS_BLOCK IoStatusBlock;
- HANDLE hFile;
-
- hFile = CreateFileW(
- lpFileName,
- GENERIC_READ,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL
- );
-
- errCode = NtQueryInformationFile(hFile,
- &IoStatusBlock,&FileCompression, sizeof(FILE_COMPRESSION_INFORMATION),
- FileCompressionInformation);
- if ( !NT_SUCCESS(errCode) ) {
- CloseHandle(hFile);
- SetLastError(RtlNtStatusToDosError(errCode));
- return 0;
- }
- CloseHandle(hFile);
- return 0;
+ lpFileInformation->nNumberOfLinks = FileStandard.NumberOfLinks;
+ lpFileInformation->nFileSizeHigh = FileStandard.AllocationSize.u.HighPart;
+ lpFileInformation->nFileSizeLow = FileStandard.AllocationSize.u.LowPart;
+ return TRUE;
}
-
-WINBOOL
-STDCALL
-GetFileInformationByHandle(
- HANDLE hFile,
- LPBY_HANDLE_FILE_INFORMATION lpFileInformation
- )
+DWORD STDCALL
+GetFileAttributesA(LPCSTR lpFileName)
{
- FILE_DIRECTORY_INFORMATION FileDirectory;
- FILE_INTERNAL_INFORMATION FileInternal;
- FILE_FS_VOLUME_INFORMATION FileFsVolume;
- FILE_STANDARD_INFORMATION FileStandard;
+ UNICODE_STRING FileNameU;
+ ANSI_STRING FileName;
+ WINBOOL Result;
- NTSTATUS errCode;
- IO_STATUS_BLOCK IoStatusBlock;
- errCode = NtQueryInformationFile(hFile,&IoStatusBlock,&FileDirectory, sizeof(FILE_DIRECTORY_INFORMATION),FileDirectoryInformation);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- lpFileInformation->dwFileAttributes = (DWORD)FileDirectory.FileAttributes;
- memcpy(&lpFileInformation->ftCreationTime,&FileDirectory.CreationTime,sizeof(LARGE_INTEGER));
- memcpy(&lpFileInformation->ftLastAccessTime,&FileDirectory.LastAccessTime,sizeof(LARGE_INTEGER));
- memcpy(&lpFileInformation->ftLastWriteTime, &FileDirectory.LastWriteTime,sizeof(LARGE_INTEGER));
- lpFileInformation->nFileSizeHigh = GET_LARGE_INTEGER_HIGH_PART(FileDirectory.AllocationSize);
- lpFileInformation->nFileSizeLow = GET_LARGE_INTEGER_LOW_PART(FileDirectory.AllocationSize);
-
-
-
- errCode = NtQueryInformationFile(hFile,&IoStatusBlock,&FileInternal, sizeof(FILE_INTERNAL_INFORMATION),FileInternalInformation);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- lpFileInformation->nFileIndexHigh = GET_LARGE_INTEGER_HIGH_PART(FileInternal.IndexNumber);
- lpFileInformation->nFileIndexLow = GET_LARGE_INTEGER_LOW_PART(FileInternal.IndexNumber);
+ RtlInitAnsiString (&FileName,
+ (LPSTR)lpFileName);
+ /* convert ansi (or oem) string to unicode */
+ if (bIsFileApiAnsi)
+ RtlAnsiStringToUnicodeString (&FileNameU,
+ &FileName,
+ TRUE);
+ else
+ RtlOemStringToUnicodeString (&FileNameU,
+ &FileName,
+ TRUE);
- errCode = NtQueryVolumeInformationFile(hFile,&IoStatusBlock,&FileFsVolume, sizeof(FILE_FS_VOLUME_INFORMATION),FileFsVolumeInformation);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- lpFileInformation->dwVolumeSerialNumber = FileFsVolume.VolumeSerialNumber;
+ Result = GetFileAttributesW (FileNameU.Buffer);
+ RtlFreeUnicodeString (&FileNameU);
- errCode = NtQueryInformationFile(hFile,&IoStatusBlock,&FileStandard, sizeof(FILE_STANDARD_INFORMATION),FileStandardInformation);
- if ( !NT_SUCCESS(errCode) ) {
- CloseHandle(hFile);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- lpFileInformation->nNumberOfLinks = FileStandard.NumberOfLinks;
- CloseHandle(hFile);
- return TRUE;
-
+ return Result;
}
+DWORD STDCALL
+GetFileAttributesW(LPCWSTR lpFileName)
+{
+ IO_STATUS_BLOCK IoStatusBlock;
+ FILE_BASIC_INFORMATION FileBasic;
+ HANDLE hFile;
+ NTSTATUS errCode;
+ hFile = CreateFileW(lpFileName,
+ FILE_READ_ATTRIBUTES,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ return 0xFFFFFFFF;
+ }
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ CloseHandle(hFile);
+ SetLastErrorByStatus(errCode);
+ return 0xFFFFFFFF;
+ }
+ CloseHandle(hFile);
+ return (DWORD)FileBasic.FileAttributes;
+}
-DWORD
-STDCALL
-GetFileAttributesA(
- LPCSTR lpFileName
- )
+WINBOOL STDCALL
+SetFileAttributesA(LPCSTR lpFileName,
+ DWORD dwFileAttributes)
{
- ULONG i;
- WCHAR FileNameW[MAX_PATH];
- i = 0;
- while ((*lpFileName)!=0 && i < MAX_PATH)
- {
- FileNameW[i] = *lpFileName;
- lpFileName++;
- i++;
- }
- FileNameW[i] = 0;
- return GetFileAttributesW(FileNameW);
-}
+ UNICODE_STRING FileNameU;
+ ANSI_STRING FileName;
+ WINBOOL Result;
+ RtlInitAnsiString(&FileName,
+ (LPSTR)lpFileName);
-DWORD
-STDCALL
-GetFileAttributesW(
- LPCWSTR lpFileName
- )
-{
- IO_STATUS_BLOCK IoStatusBlock;
- FILE_BASIC_INFORMATION FileBasic;
- HANDLE hFile;
- NTSTATUS errCode;
+ /* convert ansi (or oem) string to unicode */
+ if (bIsFileApiAnsi)
+ RtlAnsiStringToUnicodeString(&FileNameU,
+ &FileName,
+ TRUE);
+ else
+ RtlOemStringToUnicodeString(&FileNameU,
+ &FileName,
+ TRUE);
+ Result = SetFileAttributesW(FileNameU.Buffer,
+ dwFileAttributes);
- hFile = CreateFileW(
- lpFileName,
- GENERIC_READ,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL
- );
-
-
- errCode = NtQueryInformationFile(hFile,&IoStatusBlock,&FileBasic, sizeof(FILE_BASIC_INFORMATION),FileBasicInformation);
- if ( !NT_SUCCESS(errCode) ) {
- CloseHandle(hFile);
- SetLastError(RtlNtStatusToDosError(errCode));
- return 0;
- }
- CloseHandle(hFile);
- return (DWORD)FileBasic.FileAttributes;
-
-}
+ RtlFreeUnicodeString(&FileNameU);
-WINBOOL
-STDCALL
-SetFileAttributesA(
- LPCSTR lpFileName,
- DWORD dwFileAttributes
- )
-{
- ULONG i;
- WCHAR FileNameW[MAX_PATH];
- i = 0;
- while ((*lpFileName)!=0 && i < MAX_PATH)
- {
- FileNameW[i] = *lpFileName;
- lpFileName++;
- i++;
- }
- FileNameW[i] = 0;
- return SetFileAttributesW(FileNameW, dwFileAttributes);
+ return Result;
}
-WINBOOL
-STDCALL
-SetFileAttributesW(
- LPCWSTR lpFileName,
- DWORD dwFileAttributes
- )
+WINBOOL STDCALL
+SetFileAttributesW(LPCWSTR lpFileName,
+ DWORD dwFileAttributes)
{
- IO_STATUS_BLOCK IoStatusBlock;
- FILE_BASIC_INFORMATION FileBasic;
- HANDLE hFile;
- NTSTATUS errCode;
-
-
- hFile = CreateFileW(
- lpFileName,
- GENERIC_READ,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL
- );
-
-
- errCode = NtQueryInformationFile(hFile,&IoStatusBlock,&FileBasic, sizeof(FILE_BASIC_INFORMATION),FileBasicInformation);
- if ( !NT_SUCCESS(errCode) ) {
- CloseHandle(hFile);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- FileBasic.FileAttributes = dwFileAttributes;
- errCode = NtSetInformationFile(hFile,&IoStatusBlock,&FileBasic, sizeof(FILE_BASIC_INFORMATION),FileBasicInformation);
- if ( !NT_SUCCESS(errCode) ) {
- CloseHandle(hFile);
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
+ IO_STATUS_BLOCK IoStatusBlock;
+ FILE_BASIC_INFORMATION FileBasic;
+ HANDLE hFile;
+ NTSTATUS errCode;
+
+ hFile = CreateFileW(lpFileName,
+ FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ errCode = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(errCode))
+ {
CloseHandle(hFile);
- return TRUE;
-
+ SetLastErrorByStatus(errCode);
+ return FALSE;
+ }
+ FileBasic.FileAttributes = dwFileAttributes;
+ errCode = NtSetInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(errCode))
+ {
+ CloseHandle(hFile);
+ SetLastErrorByStatus(errCode);
+ return FALSE;
+ }
+ CloseHandle(hFile);
+ return TRUE;
}
-
-DWORD
-GetCurrentTime(VOID)
+UINT STDCALL
+GetTempFileNameA(LPCSTR lpPathName,
+ LPCSTR lpPrefixString,
+ UINT uUnique,
+ LPSTR lpTempFileName)
{
- NTSTATUS errCode;
- FILETIME CurrentTime;
-memset(&CurrentTime,sizeof(FILETIME),0);
-// errCode = NtQuerySystemTime (
-// (TIME *)&CurrentTime
-// );
- return CurrentTime.dwLowDateTime;
-}
+ HANDLE hFile;
+ UINT unique = uUnique;
+ UINT len;
+ const char *format = "%.*s\\~%.3s%4.4x.TMP";
-UINT
-STDCALL
-GetTempFileNameA(
- LPCSTR lpPathName,
- LPCSTR lpPrefixString,
- UINT uUnique,
- LPSTR lpTempFileName
- )
-{
- HANDLE hFile;
- UINT unique = uUnique;
-
- if (lpPathName == NULL)
- return 0;
-
- if (uUnique == 0)
- uUnique = GetCurrentTime();
- /*
- sprintf(lpTempFileName,"%s\\%c%.3s%4.4x%s",
- lpPathName,'~',lpPrefixString,uUnique,".tmp");
- */
- if (unique)
- return uUnique;
+ DPRINT("GetTempFileNameA(lpPathName %s, lpPrefixString %.*s, "
+ "uUnique %x, lpTempFileName %x)\n", lpPathName, 4,
+ lpPrefixString, uUnique, lpTempFileName);
- while ((hFile = CreateFileA(lpTempFileName, GENERIC_WRITE, 0, NULL,
- CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY,
- 0)) == INVALID_HANDLE_VALUE)
- {
- // wsprintfA(lpTempFileName,"%s\\%c%.3s%4.4x%s",
-// lpPathName,'~',lpPrefixString,++uUnique,".tmp");
- }
-
- CloseHandle((HANDLE)hFile);
- return uUnique;
+ if (lpPathName == NULL)
+ return 0;
+
+ len = strlen(lpPathName);
+ if (len > 0 && (lpPathName[len-1] == '\\' || lpPathName[len-1] == '/'))
+ len--;
+
+ if (uUnique == 0)
+ uUnique = GetCurrentTime();
+
+ sprintf(lpTempFileName,format,len,lpPathName,lpPrefixString,uUnique);
+
+ if (unique)
+ return uUnique;
+
+ while ((hFile = CreateFileA(lpTempFileName, GENERIC_WRITE, 0, NULL,
+ CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY,
+ 0)) == INVALID_HANDLE_VALUE)
+ {
+ if (GetLastError() != ERROR_ALREADY_EXISTS)
+ {
+ return 0;
+ }
+ sprintf(lpTempFileName,format,len,lpPathName,lpPrefixString,++uUnique);
+ }
+ CloseHandle(hFile);
+ return uUnique;
}
-UINT
-STDCALL
-GetTempFileNameW(
- LPCWSTR lpPathName,
- LPCWSTR lpPrefixString,
- UINT uUnique,
- LPWSTR lpTempFileName
- )
+UINT STDCALL
+GetTempFileNameW(LPCWSTR lpPathName,
+ LPCWSTR lpPrefixString,
+ UINT uUnique,
+ LPWSTR lpTempFileName)
{
- HANDLE hFile;
- UINT unique = uUnique;
-
- if (lpPathName == NULL)
- return 0;
+ HANDLE hFile;
+ UINT unique = uUnique;
+ UINT len;
+ const WCHAR *format = L"%.*S\\~%.3S%4.4x.TMP";
+
+ DPRINT("GetTempFileNameW(lpPathName %S, lpPrefixString %.*S, "
+ "uUnique %x, lpTempFileName %x)\n", lpPathName, 4,
+ lpPrefixString, uUnique, lpTempFileName);
- if (uUnique == 0)
- uUnique = GetCurrentTime();
-
- // swprintf(lpTempFileName,L"%s\\%c%.3s%4.4x%s",
-// lpPathName,'~',lpPrefixString,uUnique,L".tmp");
-
- if (unique)
- return uUnique;
+ if (lpPathName == NULL)
+ return 0;
+
+ len = wcslen(lpPathName);
+ if (len > 0 && (lpPathName[len-1] == L'\\' || lpPathName[len-1] == L'/'))
+ len--;
+
+ if (uUnique == 0)
+ uUnique = GetCurrentTime();
+
+ swprintf(lpTempFileName,format,len,lpPathName,lpPrefixString,uUnique);
+
+ if (unique)
+ return uUnique;
- while ((hFile = CreateFileW(lpTempFileName, GENERIC_WRITE, 0, NULL,
- CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY,
- 0)) == INVALID_HANDLE_VALUE)
- {
-// wsprintfW(lpTempFileName,L"%s\\%c%.3s%4.4x%s",
-// lpPathName,'~',lpPrefixString,++uUnique,L".tmp");
- }
-
- CloseHandle((HANDLE)hFile);
- return uUnique;
+ while ((hFile = CreateFileW(lpTempFileName, GENERIC_WRITE, 0, NULL,
+ CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY,
+ 0)) == INVALID_HANDLE_VALUE)
+ {
+ if (GetLastError() != ERROR_ALREADY_EXISTS)
+ {
+ return 0;
+ }
+ swprintf(lpTempFileName,format,len,lpPathName,lpPrefixString,++uUnique);
+ }
+ CloseHandle(hFile);
+ return uUnique;
}
-WINBOOL
-STDCALL
-GetFileTime(
- HANDLE hFile,
+
+WINBOOL STDCALL
+GetFileTime(HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
- LPFILETIME lpLastWriteTime
- )
-{
- IO_STATUS_BLOCK IoStatusBlock;
- FILE_BASIC_INFORMATION FileBasic;
- NTSTATUS errCode;
-
+ LPFILETIME lpLastWriteTime)
+{
+ IO_STATUS_BLOCK IoStatusBlock;
+ FILE_BASIC_INFORMATION FileBasic;
+ NTSTATUS Status;
+
+ Status = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
-
- errCode = NtQueryInformationFile(hFile,&IoStatusBlock,&FileBasic, sizeof(FILE_BASIC_INFORMATION),FileBasicInformation);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
- memcpy(lpCreationTime,&FileBasic.CreationTime,sizeof(FILETIME));
- memcpy(lpLastAccessTime,&FileBasic.LastAccessTime,sizeof(FILETIME));
- memcpy(lpLastWriteTime,&FileBasic.LastWriteTime,sizeof(FILETIME));
- return TRUE;
+ if (lpCreationTime)
+ memcpy(lpCreationTime, &FileBasic.CreationTime, sizeof(FILETIME));
+ if (lpLastAccessTime)
+ memcpy(lpLastAccessTime, &FileBasic.LastAccessTime, sizeof(FILETIME));
+ if (lpLastWriteTime)
+ memcpy(lpLastWriteTime, &FileBasic.LastWriteTime, sizeof(FILETIME));
+
+ return TRUE;
}
-WINBOOL
-STDCALL
-SetFileTime(
- HANDLE hFile,
+
+WINBOOL STDCALL
+SetFileTime(HANDLE hFile,
CONST FILETIME *lpCreationTime,
CONST FILETIME *lpLastAccessTime,
- CONST FILETIME *lpLastWriteTime
- )
-{
- FILE_BASIC_INFORMATION FileBasic;
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS errCode;
-
-
-
- memcpy(&FileBasic.CreationTime,lpCreationTime,sizeof(FILETIME));
- memcpy(&FileBasic.LastAccessTime,lpLastAccessTime,sizeof(FILETIME));
- memcpy(&FileBasic.LastWriteTime,lpLastWriteTime,sizeof(FILETIME));
+ CONST FILETIME *lpLastWriteTime)
+{
+ FILE_BASIC_INFORMATION FileBasic;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+
+ Status = NtQueryInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
- // shoud i initialize changetime ???
-
- errCode = NtSetInformationFile(hFile,&IoStatusBlock,&FileBasic, sizeof(FILE_BASIC_INFORMATION),FileBasicInformation);
- if ( !NT_SUCCESS(errCode) ) {
- SetLastError(RtlNtStatusToDosError(errCode));
- return FALSE;
- }
-
- return TRUE;
+ if (lpCreationTime)
+ memcpy(&FileBasic.CreationTime, lpCreationTime, sizeof(FILETIME));
+ if (lpLastAccessTime)
+ memcpy(&FileBasic.LastAccessTime, lpLastAccessTime, sizeof(FILETIME));
+ if (lpLastWriteTime)
+ memcpy(&FileBasic.LastWriteTime, lpLastWriteTime, sizeof(FILETIME));
+
+ // should i initialize changetime ???
+
+ Status = NtSetInformationFile(hFile,
+ &IoStatusBlock,
+ &FileBasic,
+ sizeof(FILE_BASIC_INFORMATION),
+ FileBasicInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
-WINBOOL
-STDCALL
-SetEndOfFile(
- HANDLE hFile
- )
+
+WINBOOL STDCALL
+SetEndOfFile(HANDLE hFile)
{
- int x = -1;
- DWORD Num;
- return WriteFile(hFile,&x,1,&Num,NULL);
+ int x = -1;
+ DWORD Num;
+ return WriteFile(hFile,&x,1,&Num,NULL);
}
+
+/* EOF */