[FREELDR] Silence a debug print.
[reactos.git] / base / setup / usetup / filesup.c
1 /*
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)
7 */
8
9 /* INCLUDES *****************************************************************/
10
11 #include "usetup.h"
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* FUNCTIONS ****************************************************************/
17
18 static
19 NTSTATUS
20 SetupCreateSingleDirectory(
21 PWCHAR DirectoryName)
22 {
23 OBJECT_ATTRIBUTES ObjectAttributes;
24 IO_STATUS_BLOCK IoStatusBlock;
25 UNICODE_STRING PathName;
26 HANDLE DirectoryHandle;
27 NTSTATUS Status;
28
29 if (!RtlCreateUnicodeString(&PathName, DirectoryName))
30 return STATUS_NO_MEMORY;
31
32 if (PathName.Length > sizeof(WCHAR) &&
33 PathName.Buffer[PathName.Length / sizeof(WCHAR) - 2] == L'\\' &&
34 PathName.Buffer[PathName.Length / sizeof(WCHAR) - 1] == L'.')
35 {
36 PathName.Length -= sizeof(WCHAR);
37 PathName.Buffer[PathName.Length / sizeof(WCHAR)] = 0;
38 }
39
40 if (PathName.Length > sizeof(WCHAR) &&
41 PathName.Buffer[PathName.Length / sizeof(WCHAR) - 1] == L'\\')
42 {
43 PathName.Length -= sizeof(WCHAR);
44 PathName.Buffer[PathName.Length / sizeof(WCHAR)] = 0;
45 }
46
47 InitializeObjectAttributes(&ObjectAttributes,
48 &PathName,
49 OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
50 NULL,
51 NULL);
52
53 Status = NtCreateFile(&DirectoryHandle,
54 FILE_LIST_DIRECTORY | SYNCHRONIZE,
55 &ObjectAttributes,
56 &IoStatusBlock,
57 NULL,
58 FILE_ATTRIBUTE_DIRECTORY,
59 FILE_SHARE_READ | FILE_SHARE_WRITE,
60 FILE_OPEN_IF,
61 FILE_OPEN_FOR_BACKUP_INTENT | FILE_DIRECTORY_FILE,
62 NULL,
63 0);
64 if (NT_SUCCESS(Status))
65 {
66 NtClose(DirectoryHandle);
67 }
68
69 RtlFreeUnicodeString(&PathName);
70
71 return Status;
72 }
73
74 NTSTATUS
75 SetupCreateDirectory(
76 PWCHAR PathName)
77 {
78 PWCHAR PathBuffer = NULL;
79 PWCHAR Ptr, EndPtr;
80 ULONG BackslashCount;
81 ULONG Size;
82 NTSTATUS Status = STATUS_SUCCESS;
83
84 Size = (wcslen(PathName) + 1) * sizeof(WCHAR);
85 PathBuffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, Size);
86 if (PathBuffer == NULL)
87 return STATUS_INSUFFICIENT_RESOURCES;
88
89 wcscpy(PathBuffer, PathName);
90 EndPtr = PathBuffer + wcslen(PathName);
91
92 Ptr = PathBuffer;
93
94 /* Skip the '\Device\HarddiskX\PartitionY\ part */
95 BackslashCount = 0;
96 while (Ptr < EndPtr && BackslashCount < 4)
97 {
98 if (*Ptr == L'\\')
99 BackslashCount++;
100
101 Ptr++;
102 }
103
104 while (Ptr < EndPtr)
105 {
106 if (*Ptr == L'\\')
107 {
108 *Ptr = 0;
109
110 DPRINT("PathBuffer: %S\n", PathBuffer);
111 if (!DoesDirExist(NULL, PathBuffer))
112 {
113 DPRINT("Create: %S\n", PathBuffer);
114 Status = SetupCreateSingleDirectory(PathBuffer);
115 if (!NT_SUCCESS(Status))
116 goto done;
117 }
118
119 *Ptr = L'\\';
120 }
121
122 Ptr++;
123 }
124
125 if (!DoesDirExist(NULL, PathBuffer))
126 {
127 DPRINT("Create: %S\n", PathBuffer);
128 Status = SetupCreateSingleDirectory(PathBuffer);
129 if (!NT_SUCCESS(Status))
130 goto done;
131 }
132
133 done:
134 DPRINT("Done.\n");
135 if (PathBuffer != NULL)
136 RtlFreeHeap(RtlGetProcessHeap(), 0, PathBuffer);
137
138 return Status;
139 }
140
141 BOOLEAN
142 IsValidPath(
143 IN PCWSTR InstallDir)
144 {
145 UINT i, Length;
146
147 Length = wcslen(InstallDir);
148
149 // TODO: Add check for 8.3 too.
150
151 /* Path must be at least 2 characters long */
152 // if (Length < 2)
153 // return FALSE;
154
155 /* Path must start with a backslash */
156 // if (InstallDir[0] != L'\\')
157 // return FALSE;
158
159 /* Path must not end with a backslash */
160 if (InstallDir[Length - 1] == L'\\')
161 return FALSE;
162
163 /* Path must not contain whitespace characters */
164 for (i = 0; i < Length; i++)
165 {
166 if (iswspace(InstallDir[i]))
167 return FALSE;
168 }
169
170 /* Path component must not end with a dot */
171 for (i = 0; i < Length; i++)
172 {
173 if (InstallDir[i] == L'\\' && i > 0)
174 {
175 if (InstallDir[i - 1] == L'.')
176 return FALSE;
177 }
178 }
179
180 if (InstallDir[Length - 1] == L'.')
181 return FALSE;
182
183 return TRUE;
184 }
185
186 /* EOF */