3 * Copyright (C) 2002 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: subsys/system/usetup/filesup.c
23 * PURPOSE: File support functions
24 * PROGRAMMER: Eric Kohl
27 /* INCLUDES *****************************************************************/
29 #include <ddk/ntddk.h>
30 #include <ntdll/rtl.h>
36 /* FUNCTIONS ****************************************************************/
40 CreateDirectory(PWCHAR DirectoryName)
42 OBJECT_ATTRIBUTES ObjectAttributes;
43 IO_STATUS_BLOCK IoStatusBlock;
44 UNICODE_STRING PathName;
45 HANDLE DirectoryHandle;
48 RtlCreateUnicodeString(&PathName,
51 InitializeObjectAttributes(&ObjectAttributes,
53 OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
57 Status = NtCreateFile(&DirectoryHandle,
62 FILE_ATTRIBUTE_DIRECTORY,
68 if (NT_SUCCESS(Status))
70 NtClose(DirectoryHandle);
73 RtlFreeUnicodeString(&PathName);
80 SetupCopyFile(PWCHAR SourceFileName,
81 PWCHAR DestinationFileName)
83 OBJECT_ATTRIBUTES ObjectAttributes;
84 HANDLE FileHandleSource;
85 HANDLE FileHandleDest;
86 IO_STATUS_BLOCK IoStatusBlock;
87 FILE_STANDARD_INFORMATION FileStandard;
88 FILE_BASIC_INFORMATION FileBasic;
89 FILE_POSITION_INFORMATION FilePosition;
92 UNICODE_STRING FileName;
97 RtlInitUnicodeString(&FileName,
100 InitializeObjectAttributes(&ObjectAttributes,
102 OBJ_CASE_INSENSITIVE,
106 Status = NtOpenFile(&FileHandleSource,
111 FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY);
112 if (!NT_SUCCESS(Status))
118 Status = NtQueryInformationFile(FileHandleSource,
121 sizeof(FILE_STANDARD_INFORMATION),
122 FileStandardInformation);
123 if (!NT_SUCCESS(Status))
126 NtClose(FileHandleSource);
130 Status = NtQueryInformationFile(FileHandleSource,
131 &IoStatusBlock,&FileBasic,
132 sizeof(FILE_BASIC_INFORMATION),
133 FileBasicInformation);
134 if (!NT_SUCCESS(Status))
137 NtClose(FileHandleSource);
141 RtlInitUnicodeString(&FileName,
142 DestinationFileName);
144 InitializeObjectAttributes(&ObjectAttributes,
146 OBJ_CASE_INSENSITIVE,
150 Status = NtCreateFile(&FileHandleDest,
155 FILE_ATTRIBUTE_NORMAL,
158 FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY,
161 if (!NT_SUCCESS(Status))
164 NtClose(FileHandleSource);
168 FilePosition.CurrentByteOffset.QuadPart = 0;
170 Status = NtSetInformationFile(FileHandleSource,
173 sizeof(FILE_POSITION_INFORMATION),
174 FilePositionInformation);
175 if (!NT_SUCCESS(Status))
178 NtClose(FileHandleSource);
179 NtClose(FileHandleDest);
183 Status = NtSetInformationFile(FileHandleDest,
186 sizeof(FILE_POSITION_INFORMATION),
187 FilePositionInformation);
188 if (!NT_SUCCESS(Status))
191 NtClose(FileHandleSource);
192 NtClose(FileHandleDest);
196 RegionSize = PAGE_ROUND_UP(FileStandard.EndOfFile.u.LowPart);
197 if (RegionSize > 0x100000)
199 RegionSize = 0x100000;
201 Status = NtAllocateVirtualMemory(NtCurrentProcess(),
205 MEM_RESERVE | MEM_COMMIT,
207 if (!NT_SUCCESS(Status))
210 NtClose(FileHandleSource);
211 NtClose(FileHandleDest);
217 Status = NtReadFile(FileHandleSource,
226 if (!NT_SUCCESS(Status))
228 NtFreeVirtualMemory(NtCurrentProcess(),
232 if (Status == STATUS_END_OF_FILE)
234 DPRINT("STATUS_END_OF_FILE\n");
238 NtClose(FileHandleSource);
239 NtClose(FileHandleDest);
243 DPRINT("Bytes read %lu\n", IoStatusBlock.Information);
245 Status = NtWriteFile(FileHandleDest,
251 IoStatusBlock.Information,
254 if (!NT_SUCCESS(Status))
257 NtFreeVirtualMemory(NtCurrentProcess(),
261 NtClose(FileHandleSource);
262 NtClose(FileHandleDest);
268 /* Copy file date/time from source file */
269 Status = NtSetInformationFile(FileHandleDest,
272 sizeof(FILE_BASIC_INFORMATION),
273 FileBasicInformation);
274 if (!NT_SUCCESS(Status))
276 DPRINT("NtSetInformationFile() failed (Status %lx)\n", Status);
279 NtClose(FileHandleSource);
280 NtClose(FileHandleDest);
287 DoesFileExist(PWSTR PathName,
290 OBJECT_ATTRIBUTES ObjectAttributes;
291 IO_STATUS_BLOCK IoStatusBlock;
293 WCHAR FullName[MAX_PATH];
297 wcscpy(FullName, PathName);
298 if (FileName != NULL)
300 if (FileName[0] != L'\\')
301 wcscat(FullName, L"\\");
302 wcscat(FullName, FileName);
305 RtlInitUnicodeString(&Name,
308 InitializeObjectAttributes(&ObjectAttributes,
310 OBJ_CASE_INSENSITIVE,
314 Status = NtOpenFile(&FileHandle,
319 FILE_SYNCHRONOUS_IO_ALERT);
320 if (!NT_SUCCESS(Status))