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/drivesup.c
23 * PURPOSE: Drive support functions
24 * PROGRAMMER: Eric Kohl
27 /* INCLUDES *****************************************************************/
29 #include <ddk/ntddk.h>
30 #include <ntdll/rtl.h>
36 /* FUNCTIONS ****************************************************************/
39 GetSourcePaths(PUNICODE_STRING SourcePath,
40 PUNICODE_STRING SourceRootPath)
42 OBJECT_ATTRIBUTES ObjectAttributes;
43 UNICODE_STRING LinkName;
44 UNICODE_STRING SourceName;
45 WCHAR SourceBuffer[MAX_PATH];
51 RtlInitUnicodeString(&LinkName,
54 InitializeObjectAttributes(&ObjectAttributes,
60 Status = NtOpenSymbolicLinkObject(&Handle,
61 SYMBOLIC_LINK_ALL_ACCESS,
63 if (!NT_SUCCESS(Status))
66 SourceName.Length = 0;
67 SourceName.MaximumLength = MAX_PATH * sizeof(WCHAR);
68 SourceName.Buffer = SourceBuffer;
70 Status = NtQuerySymbolicLinkObject(Handle,
75 if (NT_SUCCESS(Status))
77 RtlCreateUnicodeString(SourcePath,
80 /* strip trailing directory */
81 Ptr = wcsrchr(SourceName.Buffer, L'\\');
82 // if ((Ptr != NULL) &&
83 // (wcsicmp(Ptr, L"\\reactos") == 0))
87 RtlCreateUnicodeString(SourceRootPath,
93 return(STATUS_SUCCESS);
98 GetDriveLetter(ULONG DriveNumber,
99 ULONG PartitionNumber)
101 OBJECT_ATTRIBUTES ObjectAttributes;
102 UNICODE_STRING LinkName;
106 UNICODE_STRING TargetName;
112 wcscpy(LinkBuffer, L"\\??\\A:");
114 RtlInitUnicodeString(&LinkName,
117 InitializeObjectAttributes(&ObjectAttributes,
123 TargetBuffer = RtlAllocateHeap(ProcessHeap, 0, MAX_PATH * sizeof(WCHAR));
124 DeviceBuffer = RtlAllocateHeap(ProcessHeap, 0, MAX_PATH * sizeof(WCHAR));
126 TargetName.Length = 0;
127 TargetName.MaximumLength = MAX_PATH * sizeof(WCHAR);
128 TargetName.Buffer = TargetBuffer;
130 swprintf(DeviceBuffer,
131 L"\\Device\\Harddisk%lu\\Partition%lu",
135 for (Letter = 'C'; Letter <= 'Z'; Letter++)
137 LinkBuffer[4] = (WCHAR)Letter;
138 TargetName.Length = 0;
140 Status = NtOpenSymbolicLinkObject(&LinkHandle,
141 SYMBOLIC_LINK_ALL_ACCESS,
143 if (NT_SUCCESS(Status))
145 Status = NtQuerySymbolicLinkObject(LinkHandle,
149 if (NT_SUCCESS(Status))
151 if (_wcsicmp(DeviceBuffer, TargetBuffer) == 0)
153 RtlFreeHeap(ProcessHeap, 0, DeviceBuffer);
154 RtlFreeHeap(ProcessHeap, 0, TargetBuffer);
161 RtlFreeHeap(ProcessHeap, 0, DeviceBuffer);
162 RtlFreeHeap(ProcessHeap, 0, TargetBuffer);