1 /*
2 * PROJECT: ReactOS DiskPart
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/system/diskpart/select.c
5 * PURPOSE: Manages all the partitions of the OS in an interactive way.
6 * PROGRAMMERS: Lee Schroeder
7 */
8
9 #include "diskpart.h"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 /* FUNCTIONS ******************************************************************/
15
16 BOOL
SelectDisk(INT argc,PWSTR * argv)17 SelectDisk(
18 INT argc,
19 PWSTR *argv)
20 {
21 PLIST_ENTRY Entry;
22 PDISKENTRY DiskEntry;
23 ULONG ulValue;
24
25 DPRINT("Select Disk()\n");
26
27 if (argc > 3)
28 {
29 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
30 return TRUE;
31 }
32
33 if (argc == 2)
34 {
35 if (CurrentDisk == NULL)
36 ConResPuts(StdOut, IDS_SELECT_NO_DISK);
37 else
38 ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
39 return TRUE;
40 }
41
42 if (!IsDecString(argv[2]))
43 {
44 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
45 return TRUE;
46 }
47
48 ulValue = wcstoul(argv[2], NULL, 10);
49 if ((ulValue == 0) && (errno == ERANGE))
50 {
51 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
52 return TRUE;
53 }
54
55 CurrentDisk = NULL;
56
57 Entry = DiskListHead.Flink;
58 while (Entry != &DiskListHead)
59 {
60 DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
61
62 if (DiskEntry->DiskNumber == ulValue)
63 {
64 CurrentDisk = DiskEntry;
65 CurrentPartition = NULL;
66 ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
67 return TRUE;
68 }
69
70 Entry = Entry->Flink;
71 }
72
73 ConResPuts(StdErr, IDS_SELECT_DISK_INVALID);
74 return TRUE;
75 }
76
77
78 BOOL
SelectPartition(INT argc,PWSTR * argv)79 SelectPartition(
80 INT argc,
81 PWSTR *argv)
82 {
83 PLIST_ENTRY Entry;
84 PPARTENTRY PartEntry;
85 ULONG ulValue;
86 ULONG PartNumber = 1;
87
88 DPRINT("Select Partition()\n");
89
90 if (argc > 3)
91 {
92 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
93 return TRUE;
94 }
95
96 if (CurrentDisk == NULL)
97 {
98 ConResPuts(StdOut, IDS_SELECT_PARTITION_NO_DISK);
99 return TRUE;
100 }
101
102 if (argc == 2)
103 {
104 if (CurrentPartition == NULL)
105 ConResPuts(StdOut, IDS_SELECT_NO_PARTITION);
106 else
107 ConResPrintf(StdOut, IDS_SELECT_PARTITION, CurrentPartition);
108 return TRUE;
109 }
110
111 if (!IsDecString(argv[2]))
112 {
113 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
114 return TRUE;
115 }
116
117 ulValue = wcstoul(argv[2], NULL, 10);
118 if ((ulValue == 0) && (errno == ERANGE))
119 {
120 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
121 return TRUE;
122 }
123
124 Entry = CurrentDisk->PrimaryPartListHead.Flink;
125 while (Entry != &CurrentDisk->PrimaryPartListHead)
126 {
127 PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
128
129 if (PartEntry->PartitionType != 0)
130 {
131 if (PartNumber == ulValue)
132 {
133 CurrentPartition = PartEntry;
134 ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
135 return TRUE;
136 }
137
138 PartNumber++;
139 }
140
141 Entry = Entry->Flink;
142 }
143
144 Entry = CurrentDisk->LogicalPartListHead.Flink;
145 while (Entry != &CurrentDisk->LogicalPartListHead)
146 {
147 PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
148
149 if (PartEntry->PartitionType != 0)
150 {
151 if (PartNumber == ulValue)
152 {
153 CurrentPartition = PartEntry;
154 ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
155 return TRUE;
156 }
157
158 PartNumber++;
159 }
160 Entry = Entry->Flink;
161 }
162
163 ConResPuts(StdErr, IDS_SELECT_PARTITION_INVALID);
164 return TRUE;
165 }
166
167
168 BOOL
SelectVolume(INT argc,PWSTR * argv)169 SelectVolume(
170 INT argc,
171 PWSTR *argv)
172 {
173 PLIST_ENTRY Entry;
174 PVOLENTRY VolumeEntry;
175 ULONG ulValue;
176
177 DPRINT("SelectVolume()\n");
178
179 if (argc > 3)
180 {
181 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
182 return TRUE;
183 }
184
185 if (argc == 2)
186 {
187 if (CurrentDisk == NULL)
188 ConResPuts(StdOut, IDS_SELECT_NO_VOLUME);
189 else
190 ConResPrintf(StdOut, IDS_SELECT_VOLUME, CurrentVolume->VolumeNumber);
191 return TRUE;
192 }
193
194 if (!IsDecString(argv[2]))
195 {
196 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
197 return TRUE;
198 }
199
200 ulValue = wcstoul(argv[2], NULL, 10);
201 if ((ulValue == 0) && (errno == ERANGE))
202 {
203 ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
204 return TRUE;
205 }
206
207 CurrentVolume = NULL;
208
209 Entry = VolumeListHead.Flink;
210 while (Entry != &VolumeListHead)
211 {
212 VolumeEntry = CONTAINING_RECORD(Entry, VOLENTRY, ListEntry);
213
214 if (VolumeEntry->VolumeNumber == ulValue)
215 {
216 CurrentVolume = VolumeEntry;
217 ConResPrintf(StdOut, IDS_SELECT_VOLUME, CurrentVolume->VolumeNumber);
218 return TRUE;
219 }
220
221 Entry = Entry->Flink;
222 }
223
224 ConResPuts(StdErr, IDS_SELECT_VOLUME_INVALID);
225 return TRUE;
226 }
227