[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,40 +1421,51 @@ 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)
{ {
IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status;
FILE_BASIC_INFORMATION FileBasic; IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status; 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, Status = NtQueryInformationFile(hFile,
&IoStatusBlock, &IoStatusBlock,
&FileBasic, &FileBasic,
sizeof(FILE_BASIC_INFORMATION), sizeof(FILE_BASIC_INFORMATION),
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)); {
if (lpLastAccessTime) lpCreationTime->dwLowDateTime = FileBasic.CreationTime.LowPart;
memcpy(lpLastAccessTime, &FileBasic.LastAccessTime, sizeof(FILETIME)); lpCreationTime->dwHighDateTime = FileBasic.CreationTime.HighPart;
if (lpLastWriteTime) }
memcpy(lpLastWriteTime, &FileBasic.LastWriteTime, sizeof(FILETIME));
return TRUE; if (lpLastAccessTime)
{
lpLastAccessTime->dwLowDateTime = FileBasic.LastAccessTime.LowPart;
lpLastAccessTime->dwHighDateTime = FileBasic.LastAccessTime.HighPart;
}
if (lpLastWriteTime)
{
lpLastWriteTime->dwLowDateTime = FileBasic.LastWriteTime.LowPart;
lpLastWriteTime->dwHighDateTime = FileBasic.LastWriteTime.HighPart;
}
return TRUE;
} }
@ -1462,53 +1473,53 @@ 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; NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status; 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;
}
Status = NtSetInformationFile(hFile, if (lpLastWriteTime)
&IoStatusBlock, {
&FileBasic, FileBasic.LastWriteTime.LowPart = lpLastWriteTime->dwLowDateTime;
sizeof(FILE_BASIC_INFORMATION), FileBasic.LastWriteTime.HighPart = lpLastWriteTime->dwHighDateTime;
FileBasicInformation); }
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
return TRUE; Status = NtSetInformationFile(hFile,
&IoStatusBlock,
&FileBasic,
sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
return TRUE;
} }