[KERNEL32]

Fixed implementation of both GetFileTime/SetFileTime

svn path=/trunk/; revision=50983
This commit is contained in:
Pierre Schweitzer 2011-03-06 13:28:11 +00:00
parent fd989b27e9
commit a815fa86d2

View file

@ -1421,18 +1421,18 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
* @implemented * @implemented
*/ */
BOOL WINAPI BOOL WINAPI
GetFileTime(HANDLE hFile, GetFileTime(IN HANDLE hFile,
LPFILETIME lpCreationTime, OUT LPFILETIME lpCreationTime OPTIONAL,
LPFILETIME lpLastAccessTime, OUT LPFILETIME lpLastAccessTime OPTIONAL,
LPFILETIME lpLastWriteTime) OUT LPFILETIME lpLastWriteTime OPTIONAL)
{ {
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic; FILE_BASIC_INFORMATION FileBasic;
NTSTATUS Status;
if(IsConsoleHandle(hFile)) if(IsConsoleHandle(hFile))
{ {
SetLastError(ERROR_INVALID_HANDLE); BaseSetLastNTError(STATUS_INVALID_HANDLE);
return FALSE; return FALSE;
} }
@ -1443,16 +1443,27 @@ GetFileTime(HANDLE hFile,
FileBasicInformation); FileBasicInformation);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
} }
if (lpCreationTime) if (lpCreationTime)
memcpy(lpCreationTime, &FileBasic.CreationTime, sizeof(FILETIME)); {
lpCreationTime->dwLowDateTime = FileBasic.CreationTime.LowPart;
lpCreationTime->dwHighDateTime = FileBasic.CreationTime.HighPart;
}
if (lpLastAccessTime) if (lpLastAccessTime)
memcpy(lpLastAccessTime, &FileBasic.LastAccessTime, sizeof(FILETIME)); {
lpLastAccessTime->dwLowDateTime = FileBasic.LastAccessTime.LowPart;
lpLastAccessTime->dwHighDateTime = FileBasic.LastAccessTime.HighPart;
}
if (lpLastWriteTime) if (lpLastWriteTime)
memcpy(lpLastWriteTime, &FileBasic.LastWriteTime, sizeof(FILETIME)); {
lpLastWriteTime->dwLowDateTime = FileBasic.LastWriteTime.LowPart;
lpLastWriteTime->dwHighDateTime = FileBasic.LastWriteTime.HighPart;
}
return TRUE; return TRUE;
} }
@ -1462,40 +1473,40 @@ GetFileTime(HANDLE hFile,
* @implemented * @implemented
*/ */
BOOL WINAPI BOOL WINAPI
SetFileTime(HANDLE hFile, SetFileTime(IN HANDLE hFile,
CONST FILETIME *lpCreationTime, CONST FILETIME *lpCreationTime OPTIONAL,
CONST FILETIME *lpLastAccessTime, CONST FILETIME *lpLastAccessTime OPTIONAL,
CONST FILETIME *lpLastWriteTime) CONST FILETIME *lpLastWriteTime OPTIONAL)
{ {
FILE_BASIC_INFORMATION FileBasic;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status; NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic;
if(IsConsoleHandle(hFile)) if(IsConsoleHandle(hFile))
{ {
SetLastError(ERROR_INVALID_HANDLE); BaseSetLastNTError(STATUS_INVALID_HANDLE);
return FALSE; return FALSE;
} }
Status = NtQueryInformationFile(hFile, memset(&FileBasic, 0, sizeof(FILE_BASIC_INFORMATION));
&IoStatusBlock,
&FileBasic,
sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
if (lpCreationTime) if (lpCreationTime)
memcpy(&FileBasic.CreationTime, lpCreationTime, sizeof(FILETIME)); {
if (lpLastAccessTime) FileBasic.CreationTime.LowPart = lpCreationTime->dwLowDateTime;
memcpy(&FileBasic.LastAccessTime, lpLastAccessTime, sizeof(FILETIME)); FileBasic.CreationTime.HighPart = lpCreationTime->dwHighDateTime;
if (lpLastWriteTime) }
memcpy(&FileBasic.LastWriteTime, lpLastWriteTime, sizeof(FILETIME));
// should i initialize changetime ??? if (lpLastAccessTime)
{
FileBasic.LastAccessTime.LowPart = lpLastAccessTime->dwLowDateTime;
FileBasic.LastAccessTime.HighPart = lpLastAccessTime->dwHighDateTime;
}
if (lpLastWriteTime)
{
FileBasic.LastWriteTime.LowPart = lpLastWriteTime->dwLowDateTime;
FileBasic.LastWriteTime.HighPart = lpLastWriteTime->dwHighDateTime;
}
Status = NtSetInformationFile(hFile, Status = NtSetInformationFile(hFile,
&IoStatusBlock, &IoStatusBlock,
@ -1504,7 +1515,7 @@ SetFileTime(HANDLE hFile,
FileBasicInformation); FileBasicInformation);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
} }