[KERNEL32]
[reactos.git] / reactos / dll / win32 / kernel32 / file / file.c
index e04f873..7f0c044 100644 (file)
@@ -406,26 +406,26 @@ OpenFile(LPCSTR lpFileName,
  * @implemented
  */
 BOOL WINAPI
-FlushFileBuffers(HANDLE hFile)
+FlushFileBuffers(IN HANDLE hFile)
 {
-   NTSTATUS errCode;
-   IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoStatusBlock;
 
-   hFile = TranslateStdHandle(hFile);
+    hFile = TranslateStdHandle(hFile);
 
-   if (IsConsoleHandle(hFile))
-   {
-      return FALSE;
-   }
+    if (IsConsoleHandle(hFile))
+    {
+        return FlushConsoleInputBuffer(hFile);
+    }
 
-   errCode = NtFlushBuffersFile(hFile,
-                               &IoStatusBlock);
-   if (!NT_SUCCESS(errCode))
-     {
-       SetLastErrorByStatus(errCode);
-       return(FALSE);
-     }
-   return(TRUE);
+    Status = NtFlushBuffersFile(hFile,
+                                &IoStatusBlock);
+    if (!NT_SUCCESS(Status))
+    {
+        BaseSetLastNTError(Status);
+        return FALSE;
+    }
+    return TRUE;
 }
 
 
@@ -1287,7 +1287,7 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
     static const WCHAR Ext[] = { L'.', 't', 'm', 'p', UNICODE_NULL };
 
     RtlInitUnicodeString(&PathNameString, lpPathName);
-    if (PathNameString.Length == 0 || PathNameString.Buffer[PathNameString.Length - sizeof(WCHAR)] != L'\\')
+    if (PathNameString.Length == 0 || PathNameString.Buffer[(PathNameString.Length / sizeof(WCHAR)) - 1] != L'\\')
     {
         PathNameString.Length += sizeof(WCHAR);
     }
@@ -1306,15 +1306,15 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
     {
         memmove(lpTempFileName, PathNameString.Buffer, PathNameString.Length);
     }
+
     /* PathName MUST BE a path. Check it */
-    lpTempFileName[PathNameString.Length - sizeof(WCHAR)] = UNICODE_NULL;
+    lpTempFileName[(PathNameString.Length / sizeof(WCHAR)) - 1] = UNICODE_NULL;
     FileAttributes = GetFileAttributesW(lpTempFileName);
     if (FileAttributes == INVALID_FILE_ATTRIBUTES)
     {
         /* Append a '\' if necessary */
-        lpTempFileName[PathNameString.Length - sizeof(WCHAR)] = L'\\';
-        lpTempFileName[PathNameString.Length] = UNICODE_NULL;
+        lpTempFileName[(PathNameString.Length / sizeof(WCHAR)) - 1] = L'\\';
+        lpTempFileName[PathNameString.Length / sizeof(WCHAR)] = UNICODE_NULL;
         FileAttributes = GetFileAttributesW(lpTempFileName);
         if (FileAttributes == INVALID_FILE_ATTRIBUTES)
         {
@@ -1329,7 +1329,7 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
     }
  
     /* Make sure not to mix path & prefix */
-    lpTempFileName[PathNameString.Length - sizeof(WCHAR)] = L'\\';
+    lpTempFileName[(PathNameString.Length / sizeof(WCHAR)) - 1] = L'\\';
     RtlInitUnicodeString(&PrefixString, lpPrefixString);
     if (PrefixString.Length > 3 * sizeof(WCHAR))
     {
@@ -1337,7 +1337,7 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
     }
  
     /* Append prefix to path */
-    TempFileName = lpTempFileName + PathNameString.Length / sizeof(WCHAR) - 1;
+    TempFileName = lpTempFileName + PathNameString.Length / sizeof(WCHAR);
     memmove(TempFileName, PrefixString.Buffer, PrefixString.Length);
     TempFileName += PrefixString.Length / sizeof(WCHAR);
  
@@ -1364,8 +1364,8 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
         /* Convert that ID to wchar */
         RtlIntegerToChar(ID, 0x10, sizeof(IDString), IDString);
         Let = IDString;
-         do
-         {
+        do
+        {
             *(TempFileName++) = RtlAnsiCharToUnicodeChar(&Let);
         } while (*Let != 0);
  
@@ -1421,40 +1421,51 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
  * @implemented
  */
 BOOL WINAPI
-GetFileTime(HANDLE hFile,
-           LPFILETIME lpCreationTime,
-           LPFILETIME lpLastAccessTime,
-           LPFILETIME lpLastWriteTime)
+GetFileTime(IN HANDLE hFile,
+            OUT LPFILETIME lpCreationTime OPTIONAL,
+            OUT LPFILETIME lpLastAccessTime OPTIONAL,
+            OUT LPFILETIME lpLastWriteTime OPTIONAL)
 {
-   IO_STATUS_BLOCK IoStatusBlock;
-   FILE_BASIC_INFORMATION FileBasic;
-   NTSTATUS Status;
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoStatusBlock;
+    FILE_BASIC_INFORMATION FileBasic;
 
-   if(IsConsoleHandle(hFile))
-   {
-     SetLastError(ERROR_INVALID_HANDLE);
-     return FALSE;
-   }
+    if(IsConsoleHandle(hFile))
+    {
+        BaseSetLastNTError(STATUS_INVALID_HANDLE);
+        return FALSE;
+    }
 
-   Status = NtQueryInformationFile(hFile,
-                                  &IoStatusBlock,
-                                  &FileBasic,
-                                  sizeof(FILE_BASIC_INFORMATION),
-                                  FileBasicInformation);
-   if (!NT_SUCCESS(Status))
-     {
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
+    Status = NtQueryInformationFile(hFile,
+                                    &IoStatusBlock,
+                                    &FileBasic,
+                                    sizeof(FILE_BASIC_INFORMATION),
+                                    FileBasicInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        BaseSetLastNTError(Status);
+        return FALSE;
+    }
 
-   if (lpCreationTime)
-     memcpy(lpCreationTime, &FileBasic.CreationTime, sizeof(FILETIME));
-   if (lpLastAccessTime)
-     memcpy(lpLastAccessTime, &FileBasic.LastAccessTime, sizeof(FILETIME));
-   if (lpLastWriteTime)
-     memcpy(lpLastWriteTime, &FileBasic.LastWriteTime, sizeof(FILETIME));
+    if (lpCreationTime)
+    {
+        lpCreationTime->dwLowDateTime = FileBasic.CreationTime.LowPart;
+        lpCreationTime->dwHighDateTime = FileBasic.CreationTime.HighPart;
+    }
 
-   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
  */
 BOOL WINAPI
-SetFileTime(HANDLE hFile,
-           CONST FILETIME *lpCreationTime,
-           CONST FILETIME *lpLastAccessTime,
-           CONST FILETIME *lpLastWriteTime)
+SetFileTime(IN HANDLE hFile,
+            CONST FILETIME *lpCreationTime OPTIONAL,
+            CONST FILETIME *lpLastAccessTime OPTIONAL,
+            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))
-   {
-     SetLastError(ERROR_INVALID_HANDLE);
-     return FALSE;
-   }
+    if(IsConsoleHandle(hFile))
+    {
+        BaseSetLastNTError(STATUS_INVALID_HANDLE);
+        return FALSE;
+    }
 
-   Status = NtQueryInformationFile(hFile,
-                                  &IoStatusBlock,
-                                  &FileBasic,
-                                  sizeof(FILE_BASIC_INFORMATION),
-                                  FileBasicInformation);
-   if (!NT_SUCCESS(Status))
-     {
-       SetLastErrorByStatus(Status);
-       return FALSE;
-     }
+    memset(&FileBasic, 0, sizeof(FILE_BASIC_INFORMATION));
 
-   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;
-     }
+    if (lpCreationTime)
+    {
+        FileBasic.CreationTime.LowPart = lpCreationTime->dwLowDateTime;
+        FileBasic.CreationTime.HighPart = lpCreationTime->dwHighDateTime;
+    }
 
-   return TRUE;
+    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,
+                                  &IoStatusBlock,
+                                  &FileBasic,
+                                  sizeof(FILE_BASIC_INFORMATION),
+                                  FileBasicInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        BaseSetLastNTError(Status);
+        return FALSE;
+    }
+
+    return TRUE;
 }