2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS text-mode setup
4 * FILE: base/setup/usetup/filesup.c
5 * PURPOSE: File support functions
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS ****************************************************************/
20 SetupCreateSingleDirectory(
23 OBJECT_ATTRIBUTES ObjectAttributes
;
24 IO_STATUS_BLOCK IoStatusBlock
;
25 UNICODE_STRING PathName
;
26 HANDLE DirectoryHandle
;
29 if (!RtlCreateUnicodeString(&PathName
, DirectoryName
))
30 return STATUS_NO_MEMORY
;
32 if (PathName
.Length
> sizeof(WCHAR
) &&
33 PathName
.Buffer
[PathName
.Length
/ sizeof(WCHAR
) - 2] == L
'\\' &&
34 PathName
.Buffer
[PathName
.Length
/ sizeof(WCHAR
) - 1] == L
'.')
36 PathName
.Length
-= sizeof(WCHAR
);
37 PathName
.Buffer
[PathName
.Length
/ sizeof(WCHAR
)] = 0;
40 if (PathName
.Length
> sizeof(WCHAR
) &&
41 PathName
.Buffer
[PathName
.Length
/ sizeof(WCHAR
) - 1] == L
'\\')
43 PathName
.Length
-= sizeof(WCHAR
);
44 PathName
.Buffer
[PathName
.Length
/ sizeof(WCHAR
)] = 0;
47 InitializeObjectAttributes(&ObjectAttributes
,
49 OBJ_CASE_INSENSITIVE
| OBJ_INHERIT
,
53 Status
= NtCreateFile(&DirectoryHandle
,
54 FILE_LIST_DIRECTORY
| SYNCHRONIZE
,
58 FILE_ATTRIBUTE_DIRECTORY
,
59 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
61 FILE_OPEN_FOR_BACKUP_INTENT
| FILE_DIRECTORY_FILE
,
64 if (NT_SUCCESS(Status
))
66 NtClose(DirectoryHandle
);
69 RtlFreeUnicodeString(&PathName
);
78 PWCHAR PathBuffer
= NULL
;
82 NTSTATUS Status
= STATUS_SUCCESS
;
84 Size
= (wcslen(PathName
) + 1) * sizeof(WCHAR
);
85 PathBuffer
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Size
);
86 if (PathBuffer
== NULL
)
87 return STATUS_INSUFFICIENT_RESOURCES
;
89 wcscpy(PathBuffer
, PathName
);
90 EndPtr
= PathBuffer
+ wcslen(PathName
);
94 /* Skip the '\Device\HarddiskX\PartitionY\ part */
96 while (Ptr
< EndPtr
&& BackslashCount
< 4)
110 DPRINT("PathBuffer: %S\n", PathBuffer
);
111 if (!DoesDirExist(NULL
, PathBuffer
))
113 DPRINT("Create: %S\n", PathBuffer
);
114 Status
= SetupCreateSingleDirectory(PathBuffer
);
115 if (!NT_SUCCESS(Status
))
125 if (!DoesDirExist(NULL
, PathBuffer
))
127 DPRINT("Create: %S\n", PathBuffer
);
128 Status
= SetupCreateSingleDirectory(PathBuffer
);
129 if (!NT_SUCCESS(Status
))
135 if (PathBuffer
!= NULL
)
136 RtlFreeHeap(RtlGetProcessHeap(), 0, PathBuffer
);
143 IN PCWSTR InstallDir
)
147 Length
= wcslen(InstallDir
);
149 // TODO: Add check for 8.3 too.
151 /* Path must be at least 2 characters long */
155 /* Path must start with a backslash */
156 // if (InstallDir[0] != L'\\')
159 /* Path must not end with a backslash */
160 if (InstallDir
[Length
- 1] == L
'\\')
163 /* Path must not contain whitespace characters */
164 for (i
= 0; i
< Length
; i
++)
166 if (iswspace(InstallDir
[i
]))
170 /* Path component must not end with a dot */
171 for (i
= 0; i
< Length
; i
++)
173 if (InstallDir
[i
] == L
'\\' && i
> 0)
175 if (InstallDir
[i
- 1] == L
'.')
180 if (InstallDir
[Length
- 1] == L
'.')