Dmitry Gorbachev <hs26332@mail.cnt.ru>
authorAleksey Bragin <aleksey@reactos.org>
Tue, 16 Oct 2007 14:59:09 +0000 (14:59 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Tue, 16 Oct 2007 14:59:09 +0000 (14:59 +0000)
- NtSetInformationFile() could be done before asynchronously called NtWriteFile is completed. Fix this by sending the synchronous flag.
- Check return status of the second NtSetInformationFile() call.
See issue #2071 for more details.

svn path=/trunk/; revision=29629

reactos/base/setup/usetup/filesup.c

index 2ace364..2ec6fe1 100644 (file)
@@ -204,7 +204,9 @@ SetupCopyFile(PWCHAR SourceFileName,
                        FILE_ATTRIBUTE_NORMAL,
                        0,
                        FILE_OVERWRITE_IF,
-                       FILE_NO_INTERMEDIATE_BUFFERING | FILE_SEQUENTIAL_ONLY,
+                       FILE_NO_INTERMEDIATE_BUFFERING |
+                       FILE_SEQUENTIAL_ONLY |
+                       FILE_SYNCHRONOUS_IO_NONALERT,
                        NULL,
                        0);
   if(!NT_SUCCESS(Status))
@@ -243,11 +245,17 @@ SetupCopyFile(PWCHAR SourceFileName,
     }
 
   /* shorten the file back to it's real size after completing the write */
-  NtSetInformationFile(FileHandleDest,
+  Status = NtSetInformationFile(FileHandleDest,
                       &IoStatusBlock,
                       &FileStandard.EndOfFile,
                       sizeof(FILE_END_OF_FILE_INFORMATION),
                       FileEndOfFileInformation);
+
+  if(!NT_SUCCESS(Status))
+    {
+      DPRINT1("NtSetInformationFile failed: %x\n", Status);
+    }
+
  closedest:
   NtClose(FileHandleDest);
  unmapsrcsec: