* Sync up to trunk HEAD (r62285). Branch guys deserve the significant speedups too ;)
[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(PUNICODE_STRING SourcePath,
38 PUNICODE_STRING SourceRootPath,
39 PUNICODE_STRING SourceRootDir)
40 {
41 OBJECT_ATTRIBUTES ObjectAttributes;
42 UNICODE_STRING LinkName;
43 UNICODE_STRING SourceName;
44 WCHAR SourceBuffer[MAX_PATH] = {L'\0'};
45 HANDLE Handle;
46 NTSTATUS Status;
47 ULONG Length;
48 PWCHAR Ptr;
49
50 RtlInitUnicodeString(&LinkName,
51 L"\\SystemRoot");
52
53 InitializeObjectAttributes(&ObjectAttributes,
54 &LinkName,
55 OBJ_CASE_INSENSITIVE,
56 NULL,
57 NULL);
58
59 Status = NtOpenSymbolicLinkObject(&Handle,
60 SYMBOLIC_LINK_ALL_ACCESS,
61 &ObjectAttributes);
62 if (!NT_SUCCESS(Status))
63 return(Status);
64
65 SourceName.Length = 0;
66 SourceName.MaximumLength = MAX_PATH * sizeof(WCHAR);
67 SourceName.Buffer = SourceBuffer;
68
69 Status = NtQuerySymbolicLinkObject(Handle,
70 &SourceName,
71 &Length);
72 NtClose(Handle);
73
74 if (NT_SUCCESS(Status))
75 {
76 RtlCreateUnicodeString(SourcePath,
77 SourceName.Buffer);
78
79 /* strip trailing directory */
80 Ptr = wcsrchr(SourceName.Buffer, L'\\');
81 if (Ptr)
82 {
83 RtlCreateUnicodeString(SourceRootDir, Ptr);
84 *Ptr = 0;
85 }
86 else
87 RtlCreateUnicodeString(SourceRootDir, L"");
88
89 RtlCreateUnicodeString(SourceRootPath,
90 SourceName.Buffer);
91 }
92
93 NtClose(Handle);
94
95 return(STATUS_SUCCESS);
96 }
97
98
99 /* EOF */