From 2e3612cc58c72eec43ab9f76dc6ce4b2c47607cb Mon Sep 17 00:00:00 2001 From: Robert Dickenson Date: Thu, 7 Nov 2002 02:52:37 +0000 Subject: [PATCH] Manually applying Gunnars patch because it's easier this way - and a good chance to review mods. svn path=/trunk/; revision=3716 --- reactos/lib/kernel32/file/curdir.c | 9 +--- reactos/lib/kernel32/file/file.c | 78 +++++++++++++++++++++++++++--- reactos/lib/kernel32/file/lfile.c | 8 +-- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/reactos/lib/kernel32/file/curdir.c b/reactos/lib/kernel32/file/curdir.c index 524a3440aeb..9c68c5aea23 100644 --- a/reactos/lib/kernel32/file/curdir.c +++ b/reactos/lib/kernel32/file/curdir.c @@ -1,4 +1,4 @@ -/* $Id: curdir.c,v 1.32 2002/10/20 03:33:34 robd Exp $ +/* $Id: curdir.c,v 1.33 2002/11/07 02:52:37 robd Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -324,12 +324,8 @@ GetWindowsDirectoryA ( Length = RtlUnicodeStringToAnsiSize (&WindowsDirectory); //len of ansi str incl. nullchar - printf("windirlen incl term %i\n", Length); - if (uSize >= Length){ - printf("ok: enoug space\n"); - String.Length = 0; String.MaximumLength = uSize; String.Buffer = lpBuffer; @@ -347,12 +343,9 @@ GetWindowsDirectoryA ( if (!NT_SUCCESS(Status)) return 0; - printf("good: ret chars %i\n",Length-1); - printf("dir: %s\n",lpBuffer); return Length-1; //good: ret chars excl. nullchar } - printf("bad: ret chars needed %i\n",Length); return Length; //bad: ret space needed incl. nullchar } diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 680134e3b6d..ec70fca3366 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.37 2002/10/20 11:55:59 chorns Exp $ +/* $Id: file.c,v 1.38 2002/11/07 02:52:37 robd Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -259,15 +259,18 @@ GetFileType(HANDLE hFile) switch ((ULONG)hFile) { case STD_INPUT_HANDLE: - hFile = NtCurrentPeb()->ProcessParameters->hStdInput; + hFile = NtCurrentPeb()->ProcessParameters->hStdInput; + break; case STD_OUTPUT_HANDLE: - hFile = NtCurrentPeb()->ProcessParameters->hStdOutput; + hFile = NtCurrentPeb()->ProcessParameters->hStdOutput; + break; case STD_ERROR_HANDLE: - hFile = NtCurrentPeb()->ProcessParameters->hStdError; + hFile = NtCurrentPeb()->ProcessParameters->hStdError; + break; } @@ -800,12 +803,73 @@ SetFileTime(HANDLE hFile, } +/* +The caller must have opened the file with the DesiredAccess FILE_WRITE_DATA flag set. +*/ WINBOOL STDCALL SetEndOfFile(HANDLE hFile) { - int x = -1; - DWORD Num; - return WriteFile(hFile,&x,1,&Num,NULL); + IO_STATUS_BLOCK IoStatusBlock; + FILE_END_OF_FILE_INFORMATION EndOfFileInfo; + FILE_ALLOCATION_INFORMATION FileAllocationInfo; + FILE_POSITION_INFORMATION FilePosInfo; + NTSTATUS Status; + + //get current position + Status = NtQueryInformationFile( + hFile, + &IoStatusBlock, + &FilePosInfo, + sizeof(FILE_POSITION_INFORMATION), + FilePositionInformation + ); + + if (!NT_SUCCESS(Status)){ + SetLastErrorByStatus(Status); + return FALSE; + } + + EndOfFileInfo.EndOfFile.QuadPart = FilePosInfo.CurrentByteOffset.QuadPart; + + /* + NOTE: + This call is not supposed to free up any space after the eof marker + if the file gets truncated. We have to deallocate the space explicitly afterwards. + But...most file systems dispatch both FileEndOfFileInformation + and FileAllocationInformation as they were the same command. + + */ + Status = NtSetInformationFile( + hFile, + &IoStatusBlock, //out + &EndOfFileInfo, + sizeof(FILE_END_OF_FILE_INFORMATION), + FileEndOfFileInformation + ); + + if (!NT_SUCCESS(Status)){ + SetLastErrorByStatus(Status); + return FALSE; + } + + FileAllocationInfo.AllocationSize.QuadPart = FilePosInfo.CurrentByteOffset.QuadPart; + + + Status = NtSetInformationFile( + hFile, + &IoStatusBlock, //out + &FileAllocationInfo, + sizeof(FILE_ALLOCATION_INFORMATION), + FileAllocationInformation + ); + + if (!NT_SUCCESS(Status)){ + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; + } /* EOF */ diff --git a/reactos/lib/kernel32/file/lfile.c b/reactos/lib/kernel32/file/lfile.c index 08915c99547..271ea60e52c 100644 --- a/reactos/lib/kernel32/file/lfile.c +++ b/reactos/lib/kernel32/file/lfile.c @@ -1,4 +1,4 @@ -/* $Id: lfile.c,v 1.6 2000/06/03 14:47:32 ea Exp $ +/* $Id: lfile.c,v 1.7 2002/11/07 02:52:37 robd Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -156,11 +156,11 @@ _lcreat ( DWORD FileAttributes = 0; - if ( iAttribute == 1 ) + if ( iAttribute == 0 ) FileAttributes |= FILE_ATTRIBUTE_NORMAL; - else if ( iAttribute == 2 ) + else if ( iAttribute == 1 ) FileAttributes |= FILE_ATTRIBUTE_READONLY; - else if ( iAttribute == 3 ) + else if ( iAttribute == 2 ) FileAttributes |= FILE_ATTRIBUTE_HIDDEN; else if ( iAttribute == 4 ) FileAttributes |= FILE_ATTRIBUTE_SYSTEM;