Fixed bug in SetFileTime().

Patch by Hartmut Birr.

svn path=/trunk/; revision=2074
This commit is contained in:
Eric Kohl 2001-07-19 18:42:02 +00:00
parent 20a0131534
commit d24d5849fe

View file

@ -1,4 +1,4 @@
/* $Id: file.c,v 1.25 2001/03/02 15:45:31 cnettel Exp $ /* $Id: file.c,v 1.26 2001/07/19 18:42:02 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -31,43 +31,31 @@ WINBOOL bIsFileApiAnsi = TRUE; // set the file api to ansi or oem
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
VOID VOID STDCALL
STDCALL SetFileApisToOEM(VOID)
SetFileApisToOEM (
VOID
)
{ {
bIsFileApiAnsi = FALSE; bIsFileApiAnsi = FALSE;
} }
VOID VOID STDCALL
STDCALL SetFileApisToANSI(VOID)
SetFileApisToANSI (
VOID
)
{ {
bIsFileApiAnsi = TRUE; bIsFileApiAnsi = TRUE;
} }
WINBOOL WINBOOL STDCALL
STDCALL AreFileApisANSI(VOID)
AreFileApisANSI (
VOID
)
{ {
return bIsFileApiAnsi; return bIsFileApiAnsi;
} }
HFILE HFILE STDCALL
STDCALL OpenFile(LPCSTR lpFileName,
OpenFile ( LPOFSTRUCT lpReOpenBuff,
LPCSTR lpFileName, UINT uStyle)
LPOFSTRUCT lpReOpenBuff,
UINT uStyle
)
{ {
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
@ -151,7 +139,8 @@ OpenFile (
} }
WINBOOL STDCALL FlushFileBuffers(HANDLE hFile) WINBOOL STDCALL
FlushFileBuffers(HANDLE hFile)
{ {
NTSTATUS errCode; NTSTATUS errCode;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
@ -167,10 +156,11 @@ WINBOOL STDCALL FlushFileBuffers(HANDLE hFile)
} }
DWORD STDCALL SetFilePointer(HANDLE hFile, DWORD STDCALL
LONG lDistanceToMove, SetFilePointer(HANDLE hFile,
PLONG lpDistanceToMoveHigh, LONG lDistanceToMove,
DWORD dwMoveMethod) PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod)
{ {
FILE_POSITION_INFORMATION FilePosition; FILE_POSITION_INFORMATION FilePosition;
FILE_END_OF_FILE_INFORMATION FileEndOfFile; FILE_END_OF_FILE_INFORMATION FileEndOfFile;
@ -191,7 +181,7 @@ DWORD STDCALL SetFilePointer(HANDLE hFile,
&FilePosition, &FilePosition,
sizeof(FILE_POSITION_INFORMATION), sizeof(FILE_POSITION_INFORMATION),
FilePositionInformation); FilePositionInformation);
FilePosition.CurrentByteOffset.QuadPart += Distance.QuadPart; FilePosition.CurrentByteOffset.QuadPart += Distance.QuadPart;
} }
else if (dwMoveMethod == FILE_END) else if (dwMoveMethod == FILE_END)
{ {
@ -227,7 +217,8 @@ DWORD STDCALL SetFilePointer(HANDLE hFile,
} }
DWORD STDCALL GetFileType(HANDLE hFile) DWORD STDCALL
GetFileType(HANDLE hFile)
{ {
FILE_FS_DEVICE_INFORMATION DeviceInfo; FILE_FS_DEVICE_INFORMATION DeviceInfo;
IO_STATUS_BLOCK StatusBlock; IO_STATUS_BLOCK StatusBlock;
@ -298,8 +289,9 @@ DWORD STDCALL GetFileType(HANDLE hFile)
} }
DWORD STDCALL GetFileSize(HANDLE hFile, DWORD STDCALL
LPDWORD lpFileSizeHigh) GetFileSize(HANDLE hFile,
LPDWORD lpFileSizeHigh)
{ {
NTSTATUS errCode; NTSTATUS errCode;
FILE_STANDARD_INFORMATION FileStandard; FILE_STANDARD_INFORMATION FileStandard;
@ -329,8 +321,9 @@ DWORD STDCALL GetFileSize(HANDLE hFile,
} }
DWORD STDCALL GetCompressedFileSizeA(LPCSTR lpFileName, DWORD STDCALL
LPDWORD lpFileSizeHigh) GetCompressedFileSizeA(LPCSTR lpFileName,
LPDWORD lpFileSizeHigh)
{ {
UNICODE_STRING FileNameU; UNICODE_STRING FileNameU;
ANSI_STRING FileName; ANSI_STRING FileName;
@ -358,8 +351,9 @@ DWORD STDCALL GetCompressedFileSizeA(LPCSTR lpFileName,
} }
DWORD STDCALL GetCompressedFileSizeW(LPCWSTR lpFileName, DWORD STDCALL
LPDWORD lpFileSizeHigh) GetCompressedFileSizeW(LPCWSTR lpFileName,
LPDWORD lpFileSizeHigh)
{ {
FILE_COMPRESSION_INFORMATION FileCompression; FILE_COMPRESSION_INFORMATION FileCompression;
NTSTATUS errCode; NTSTATUS errCode;
@ -390,8 +384,9 @@ DWORD STDCALL GetCompressedFileSizeW(LPCWSTR lpFileName,
} }
WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile, WINBOOL STDCALL
LPBY_HANDLE_FILE_INFORMATION lpFileInformation) GetFileInformationByHandle(HANDLE hFile,
LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
{ {
FILE_DIRECTORY_INFORMATION FileDirectory; FILE_DIRECTORY_INFORMATION FileDirectory;
FILE_INTERNAL_INFORMATION FileInternal; FILE_INTERNAL_INFORMATION FileInternal;
@ -462,11 +457,8 @@ WINBOOL STDCALL GetFileInformationByHandle(HANDLE hFile,
} }
DWORD DWORD STDCALL
STDCALL GetFileAttributesA(LPCSTR lpFileName)
GetFileAttributesA (
LPCSTR lpFileName
)
{ {
UNICODE_STRING FileNameU; UNICODE_STRING FileNameU;
ANSI_STRING FileName; ANSI_STRING FileName;
@ -493,7 +485,8 @@ GetFileAttributesA (
} }
DWORD STDCALL GetFileAttributesW(LPCWSTR lpFileName) DWORD STDCALL
GetFileAttributesW(LPCWSTR lpFileName)
{ {
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic; FILE_BASIC_INFORMATION FileBasic;
@ -528,41 +521,39 @@ DWORD STDCALL GetFileAttributesW(LPCWSTR lpFileName)
} }
WINBOOL WINBOOL STDCALL
STDCALL SetFileAttributesA(LPCSTR lpFileName,
SetFileAttributesA ( DWORD dwFileAttributes)
LPCSTR lpFileName,
DWORD dwFileAttributes
)
{ {
UNICODE_STRING FileNameU; UNICODE_STRING FileNameU;
ANSI_STRING FileName; ANSI_STRING FileName;
WINBOOL Result; WINBOOL Result;
RtlInitAnsiString (&FileName, RtlInitAnsiString(&FileName,
(LPSTR)lpFileName); (LPSTR)lpFileName);
/* convert ansi (or oem) string to unicode */ /* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi) if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&FileNameU, RtlAnsiStringToUnicodeString(&FileNameU,
&FileName, &FileName,
TRUE); TRUE);
else else
RtlOemStringToUnicodeString (&FileNameU, RtlOemStringToUnicodeString(&FileNameU,
&FileName, &FileName,
TRUE); TRUE);
Result = SetFileAttributesW (FileNameU.Buffer, Result = SetFileAttributesW(FileNameU.Buffer,
dwFileAttributes); dwFileAttributes);
RtlFreeUnicodeString (&FileNameU); RtlFreeUnicodeString(&FileNameU);
return Result; return Result;
} }
WINBOOL STDCALL SetFileAttributesW(LPCWSTR lpFileName, WINBOOL STDCALL
DWORD dwFileAttributes) SetFileAttributesW(LPCWSTR lpFileName,
DWORD dwFileAttributes)
{ {
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic; FILE_BASIC_INFORMATION FileBasic;
@ -605,10 +596,11 @@ WINBOOL STDCALL SetFileAttributesW(LPCWSTR lpFileName,
} }
UINT STDCALL GetTempFileNameA(LPCSTR lpPathName, UINT STDCALL
LPCSTR lpPrefixString, GetTempFileNameA(LPCSTR lpPathName,
UINT uUnique, LPCSTR lpPrefixString,
LPSTR lpTempFileName) UINT uUnique,
LPSTR lpTempFileName)
{ {
HANDLE hFile; HANDLE hFile;
UINT unique = uUnique; UINT unique = uUnique;
@ -638,10 +630,11 @@ UINT STDCALL GetTempFileNameA(LPCSTR lpPathName,
} }
UINT STDCALL GetTempFileNameW(LPCWSTR lpPathName, UINT STDCALL
LPCWSTR lpPrefixString, GetTempFileNameW(LPCWSTR lpPathName,
UINT uUnique, LPCWSTR lpPrefixString,
LPWSTR lpTempFileName) UINT uUnique,
LPWSTR lpTempFileName)
{ {
HANDLE hFile; HANDLE hFile;
UINT unique = uUnique; UINT unique = uUnique;
@ -671,57 +664,76 @@ UINT STDCALL GetTempFileNameW(LPCWSTR lpPathName,
} }
WINBOOL STDCALL GetFileTime(HANDLE hFile, WINBOOL STDCALL
LPFILETIME lpCreationTime, GetFileTime(HANDLE hFile,
LPFILETIME lpLastAccessTime, LPFILETIME lpCreationTime,
LPFILETIME lpLastWriteTime) LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime)
{ {
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic; FILE_BASIC_INFORMATION FileBasic;
NTSTATUS errCode; NTSTATUS Status;
errCode = NtQueryInformationFile(hFile, Status = NtQueryInformationFile(hFile,
&IoStatusBlock, &IoStatusBlock,
&FileBasic, &FileBasic,
sizeof(FILE_BASIC_INFORMATION), sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation); FileBasicInformation);
if (!NT_SUCCESS(errCode)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus(errCode); SetLastErrorByStatus(Status);
return FALSE; return FALSE;
} }
if (lpCreationTime) memcpy(lpCreationTime,&FileBasic.CreationTime,sizeof(FILETIME)); if (lpCreationTime)
if (lpLastAccessTime) memcpy(lpLastAccessTime,&FileBasic.LastAccessTime,sizeof(FILETIME)); memcpy(lpCreationTime, &FileBasic.CreationTime, sizeof(FILETIME));
if (lpLastWriteTime) memcpy(lpLastWriteTime,&FileBasic.LastWriteTime,sizeof(FILETIME)); if (lpLastAccessTime)
memcpy(lpLastAccessTime, &FileBasic.LastAccessTime, sizeof(FILETIME));
if (lpLastWriteTime)
memcpy(lpLastWriteTime, &FileBasic.LastWriteTime, sizeof(FILETIME));
return TRUE; return TRUE;
} }
WINBOOL STDCALL SetFileTime(HANDLE hFile, WINBOOL STDCALL
CONST FILETIME *lpCreationTime, SetFileTime(HANDLE hFile,
CONST FILETIME *lpLastAccessTime, CONST FILETIME *lpCreationTime,
CONST FILETIME *lpLastWriteTime) CONST FILETIME *lpLastAccessTime,
CONST FILETIME *lpLastWriteTime)
{ {
FILE_BASIC_INFORMATION FileBasic; FILE_BASIC_INFORMATION FileBasic;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS errCode; NTSTATUS Status;
memcpy(&FileBasic.CreationTime,lpCreationTime,sizeof(FILETIME)); Status = NtQueryInformationFile(hFile,
memcpy(&FileBasic.LastAccessTime,lpLastAccessTime,sizeof(FILETIME)); &IoStatusBlock,
memcpy(&FileBasic.LastWriteTime,lpLastWriteTime,sizeof(FILETIME)); &FileBasic,
sizeof(FILE_BASIC_INFORMATION),
// shoud i initialize changetime ??? FileBasicInformation);
if (!NT_SUCCESS(Status))
errCode = NtSetInformationFile(hFile,
&IoStatusBlock,
&FileBasic,
sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation);
if (!NT_SUCCESS(errCode))
{ {
SetLastErrorByStatus(errCode); SetLastErrorByStatus(Status);
return FALSE;
}
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 FALSE;
} }
@ -729,7 +741,8 @@ WINBOOL STDCALL SetFileTime(HANDLE hFile,
} }
WINBOOL STDCALL SetEndOfFile(HANDLE hFile) WINBOOL STDCALL
SetEndOfFile(HANDLE hFile)
{ {
int x = -1; int x = -1;
DWORD Num; DWORD Num;