* Sync up to trunk head (r65394).
[reactos.git] / base / setup / usetup / drivesup.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 2002 ReactOS Team
4 *
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.
9 *
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.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 /*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: subsys/system/usetup/drivesup.c
23 * PURPOSE: Drive support functions
24 * PROGRAMMER: Eric Kohl
25 */
26
27 /* INCLUDES *****************************************************************/
28
29 #include "usetup.h"
30
31 #define NDEBUG
32 #include <debug.h>
33
34 /* FUNCTIONS ****************************************************************/
35
36 NTSTATUS
37 GetSourcePaths(
38 PUNICODE_STRING SourcePath,
39 PUNICODE_STRING SourceRootPath,
40 PUNICODE_STRING SourceRootDir)
41 {
42 OBJECT_ATTRIBUTES ObjectAttributes;
43 UNICODE_STRING LinkName;
44 UNICODE_STRING SourceName;
45 WCHAR SourceBuffer[MAX_PATH] = {L'\0'};
46 HANDLE Handle;
47 NTSTATUS Status;
48 ULONG Length;
49 PWCHAR Ptr;
50
51 RtlInitUnicodeString(&LinkName,
52 L"\\SystemRoot");
53
54 InitializeObjectAttributes(&ObjectAttributes,
55 &LinkName,
56 OBJ_CASE_INSENSITIVE,
57 NULL,
58 NULL);
59
60 Status = NtOpenSymbolicLinkObject(&Handle,
61 SYMBOLIC_LINK_ALL_ACCESS,
62 &ObjectAttributes);
63 if (!NT_SUCCESS(Status))
64 return Status;
65
66 SourceName.Length = 0;
67 SourceName.MaximumLength = MAX_PATH * sizeof(WCHAR);
68 SourceName.Buffer = SourceBuffer;
69
70 Status = NtQuerySymbolicLinkObject(Handle,
71 &SourceName,
72 &Length);
73 NtClose(Handle);
74
75 if (NT_SUCCESS(Status))
76 {
77 RtlCreateUnicodeString(SourcePath,
78 SourceName.Buffer);
79
80 /* strip trailing directory */
81 Ptr = wcsrchr(SourceName.Buffer, L'\\');
82 if (Ptr)
83 {
84 RtlCreateUnicodeString(SourceRootDir, Ptr);
85 *Ptr = 0;
86 }
87 else
88 RtlCreateUnicodeString(SourceRootDir, L"");
89
90 RtlCreateUnicodeString(SourceRootPath,
91 SourceName.Buffer);
92 }
93
94 NtClose(Handle);
95
96 return STATUS_SUCCESS;
97 }
98
99 /* EOF */