[REACTOS] Cleanup INIT and some PAGE section allocations
[reactos.git] / drivers / storage / mountmgr / mntmgr.h
1 #ifndef _MNTMGR_H_
2 #define _MNTMGR_H_
3
4 #include <ntifs.h>
5 #include <mountdev.h>
6 #include <ntddvol.h>
7 #include <ntdddisk.h>
8 #include <wdmguid.h>
9 #include <ndk/psfuncs.h>
10 #include <ntdddisk.h>
11 #include <section_attribs.h>
12
13 typedef struct _DEVICE_EXTENSION
14 {
15 PDEVICE_OBJECT DeviceObject; // 0x0
16 PDRIVER_OBJECT DriverObject; // 0x4
17 LIST_ENTRY DeviceListHead; // 0x8
18 LIST_ENTRY OfflineDeviceListHead; // 0x10
19 PVOID NotificationEntry; // 0x18
20 KSEMAPHORE DeviceLock; // 0x1C
21 KSEMAPHORE RemoteDatabaseLock; // 0x30
22 ULONG AutomaticDriveLetter; // 0x44
23 LIST_ENTRY IrpListHead; // 0x48
24 ULONG EpicNumber; // 0x50
25 LIST_ENTRY SavedLinksListHead; // 0x54
26 BOOLEAN ProcessedSuggestions; // 0x5C
27 BOOLEAN NoAutoMount; // 0x5D
28 LIST_ENTRY WorkerQueueListHead; // 0x60
29 KSEMAPHORE WorkerSemaphore; // 0x68
30 LONG WorkerReferences; // 0x7C
31 KSPIN_LOCK WorkerLock; // 0x80
32 LIST_ENTRY UniqueIdWorkerItemListHead; // 0x84
33 PMOUNTDEV_UNIQUE_ID DriveLetterData; // 0x8C
34 UNICODE_STRING RegistryPath; // 0x90
35 LONG WorkerThreadStatus; // 0x98
36 LIST_ENTRY OnlineNotificationListHead; // 0x9C
37 ULONG OnlineNotificationWorkerActive; // 0xA4
38 ULONG OnlineNotificationCount; // 0xA8
39 KEVENT OnlineNotificationEvent; // 0xAC
40 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // 0xBC
41
42 typedef struct _DEVICE_INFORMATION
43 {
44 LIST_ENTRY DeviceListEntry; // 0x00
45 LIST_ENTRY SymbolicLinksListHead; // 0x08
46 LIST_ENTRY ReplicatedUniqueIdsListHead; // 0x10
47 LIST_ENTRY AssociatedDevicesHead; // 0x18
48 UNICODE_STRING SymbolicName; // 0x20
49 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x28
50 UNICODE_STRING DeviceName; // 0x2C
51 BOOLEAN KeepLinks; // 0x34
52 UCHAR SuggestedDriveLetter; // 0x35
53 BOOLEAN ManuallyRegistered; // 0x36
54 BOOLEAN Removable; // 0x37
55 BOOLEAN LetterAssigned; // 0x38
56 BOOLEAN NeedsReconcile; // 0x39
57 BOOLEAN NoDatabase; // 0x3A
58 BOOLEAN SkipNotifications; // 0x3B
59 ULONG Migrated; // 0x3C
60 LONG MountState; // 0x40
61 PVOID TargetDeviceNotificationEntry; // 0x44
62 PDEVICE_EXTENSION DeviceExtension; // 0x48
63 } DEVICE_INFORMATION, *PDEVICE_INFORMATION; // 0x4C
64
65 typedef struct _SYMLINK_INFORMATION
66 {
67 LIST_ENTRY SymbolicLinksListEntry; // 0x00
68 UNICODE_STRING Name; // 0x08
69 BOOLEAN Online; // 0x10
70 } SYMLINK_INFORMATION, *PSYMLINK_INFORMATION; // 0x14
71
72 typedef struct _SAVED_LINK_INFORMATION
73 {
74 LIST_ENTRY SavedLinksListEntry; // 0x0
75 LIST_ENTRY SymbolicLinksListHead; // 0x8
76 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x10
77 } SAVED_LINK_INFORMATION, *PSAVED_LINK_INFORMATION; // 0x14
78
79 typedef struct _UNIQUE_ID_REPLICATE
80 {
81 LIST_ENTRY ReplicatedUniqueIdsListEntry; // 0x0
82 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x8
83 } UNIQUE_ID_REPLICATE, *PUNIQUE_ID_REPLICATE; // 0xC
84
85 typedef struct _DATABASE_ENTRY
86 {
87 ULONG EntrySize; // 0x00
88 ULONG EntryReferences; // 0x04
89 USHORT SymbolicNameOffset; // 0x08
90 USHORT SymbolicNameLength; // 0x0A
91 USHORT UniqueIdOffset; // 0x0C
92 USHORT UniqueIdLength; // 0x0E
93 } DATABASE_ENTRY, *PDATABASE_ENTRY; // 0x10
94
95 typedef struct _ASSOCIATED_DEVICE_ENTRY
96 {
97 LIST_ENTRY AssociatedDevicesEntry; // 0x00
98 PDEVICE_INFORMATION DeviceInformation; // 0x08
99 UNICODE_STRING String; // 0x0C
100 } ASSOCIATED_DEVICE_ENTRY, *PASSOCIATED_DEVICE_ENTRY; // 0x14
101
102 typedef struct _DEVICE_INFORMATION_ENTRY
103 {
104 LIST_ENTRY DeviceInformationEntry; // 0x00
105 PDEVICE_INFORMATION DeviceInformation; // 0x08
106 } DEVICE_INFORMATION_ENTRY, *PDEVICE_INFORMATION_ENTRY; // 0x0C
107
108 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
109 {
110 WORK_QUEUE_ITEM WorkItem; // 0x00
111 PDEVICE_EXTENSION DeviceExtension; // 0x10
112 UNICODE_STRING SymbolicName; // 0x14
113 } ONLINE_NOTIFICATION_WORK_ITEM, *PONLINE_NOTIFICATION_WORK_ITEM; // 0x1C
114
115 typedef struct _RECONCILE_WORK_ITEM_CONTEXT
116 {
117 PDEVICE_EXTENSION DeviceExtension;
118 PDEVICE_INFORMATION DeviceInformation;
119 } RECONCILE_WORK_ITEM_CONTEXT, *PRECONCILE_WORK_ITEM_CONTEXT;
120
121 typedef struct _RECONCILE_WORK_ITEM
122 {
123 LIST_ENTRY WorkerQueueListEntry; // 0x00
124 PIO_WORKITEM WorkItem; // 0x08
125 PWORKER_THREAD_ROUTINE WorkerRoutine; // 0x0C
126 PVOID Context; // 0x10
127 RECONCILE_WORK_ITEM_CONTEXT; // 0x14
128 } RECONCILE_WORK_ITEM, *PRECONCILE_WORK_ITEM; // 0x1C
129
130 typedef struct _MIGRATE_WORK_ITEM
131 {
132 PIO_WORKITEM WorkItem; // 0x0
133 PDEVICE_INFORMATION DeviceInformation; // 0x4
134 PKEVENT Event; // 0x8
135 NTSTATUS Status; // 0x0C
136 HANDLE Database; // 0x10
137 } MIGRATE_WORK_ITEM, *PMIGRATE_WORK_ITEM; // 0x14
138
139 typedef struct _UNIQUE_ID_WORK_ITEM
140 {
141 LIST_ENTRY UniqueIdWorkerItemListEntry; // 0x0
142 PIO_WORKITEM WorkItem; // 0x8
143 PDEVICE_EXTENSION DeviceExtension; // 0xC
144 PIRP Irp; // 0x10
145 PVOID IrpBuffer; // 0x14
146 PKEVENT Event; // 0x1C
147 UNICODE_STRING DeviceName; // 0x20
148 ULONG IrpBufferLength; // 0x28
149 ULONG StackSize; // 0x2C
150 } UNIQUE_ID_WORK_ITEM, *PUNIQUE_ID_WORK_ITEM; // 0x30
151
152 /* Memory allocation helpers */
153 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
154 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
155
156 /* Misc macros */
157 #define MAX(a, b) ((a > b) ? a : b)
158
159 #define LETTER_POSITION 0xC
160 #define COLON_POSITION 0xD
161 #define DRIVE_LETTER_LENGTH 0x1C
162
163 /* mountmgr.c */
164
165 extern UNICODE_STRING DosDevicesMount;
166 extern PDEVICE_OBJECT gdeviceObject;
167 extern UNICODE_STRING ReparseIndex;
168 extern UNICODE_STRING DeviceFloppy;
169 extern UNICODE_STRING DeviceMount;
170 extern UNICODE_STRING DeviceCdRom;
171 extern UNICODE_STRING SafeVolumes;
172 extern UNICODE_STRING DosDevices;
173 extern UNICODE_STRING DosGlobal;
174 extern UNICODE_STRING Global;
175 extern UNICODE_STRING Volume;
176 extern KEVENT UnloadEvent;
177 extern LONG Unloading;
178
179 DRIVER_INITIALIZE DriverEntry;
180
181 VOID
182 NTAPI
183 MountMgrCancel(
184 IN PDEVICE_OBJECT DeviceObject,
185 IN PIRP Irp
186 );
187
188 NTSTATUS
189 MountMgrMountedDeviceArrival(
190 IN PDEVICE_EXTENSION Extension,
191 IN PUNICODE_STRING SymbolicName,
192 IN BOOLEAN FromVolume
193 );
194
195 VOID
196 MountMgrMountedDeviceRemoval(
197 IN PDEVICE_EXTENSION Extension,
198 IN PUNICODE_STRING DeviceName
199 );
200
201 NTSTATUS
202 FindDeviceInfo(
203 IN PDEVICE_EXTENSION DeviceExtension,
204 IN PUNICODE_STRING SymbolicName,
205 IN BOOLEAN DeviceNameGiven,
206 OUT PDEVICE_INFORMATION * DeviceInformation
207 );
208
209 VOID
210 MountMgrFreeDeadDeviceInfo(
211 IN PDEVICE_INFORMATION DeviceInformation
212 );
213
214 NTSTATUS
215 QueryDeviceInformation(
216 IN PUNICODE_STRING SymbolicName,
217 OUT PUNICODE_STRING DeviceName OPTIONAL,
218 OUT PMOUNTDEV_UNIQUE_ID * UniqueId OPTIONAL,
219 OUT PBOOLEAN Removable OPTIONAL,
220 OUT PBOOLEAN GptDriveLetter OPTIONAL,
221 OUT PBOOLEAN HasGuid OPTIONAL,
222 IN OUT LPGUID StableGuid OPTIONAL,
223 OUT PBOOLEAN Valid OPTIONAL
224 );
225
226 BOOLEAN
227 HasDriveLetter(
228 IN PDEVICE_INFORMATION DeviceInformation
229 );
230
231 BOOLEAN
232 MountmgrReadNoAutoMount(
233 IN PUNICODE_STRING RegistryPath
234 );
235
236 /* database.c */
237
238 extern PWSTR DatabasePath;
239 extern PWSTR OfflinePath;
240
241 VOID
242 ReconcileThisDatabaseWithMaster(
243 IN PDEVICE_EXTENSION DeviceExtension,
244 IN PDEVICE_INFORMATION DeviceInformation
245 );
246
247 NTSTATUS
248 WaitForRemoteDatabaseSemaphore(
249 IN PDEVICE_EXTENSION DeviceExtension
250 );
251
252 VOID
253 ReleaseRemoteDatabaseSemaphore(
254 IN PDEVICE_EXTENSION DeviceExtension
255 );
256
257 VOID
258 ChangeRemoteDatabaseUniqueId(
259 IN PDEVICE_INFORMATION DeviceInformation,
260 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
261 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
262 );
263
264 VOID
265 ReconcileAllDatabasesWithMaster(
266 IN PDEVICE_EXTENSION DeviceExtension
267 );
268
269 VOID
270 DeleteFromLocalDatabase(
271 IN PUNICODE_STRING SymbolicLink,
272 IN PMOUNTDEV_UNIQUE_ID UniqueId
273 );
274
275 VOID
276 DeleteRegistryDriveLetter(
277 IN PMOUNTDEV_UNIQUE_ID UniqueId
278 );
279
280 VOID
281 DeleteNoDriveLetterEntry(
282 IN PMOUNTDEV_UNIQUE_ID UniqueId
283 );
284
285 NTSTATUS
286 QueryVolumeName(
287 IN HANDLE RootDirectory,
288 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation,
289 IN PUNICODE_STRING FileName OPTIONAL,
290 OUT PUNICODE_STRING SymbolicName,
291 OUT PUNICODE_STRING VolumeName
292 );
293
294 HANDLE
295 OpenRemoteDatabase(
296 IN PDEVICE_INFORMATION DeviceInformation,
297 IN BOOLEAN MigrateDatabase
298 );
299
300 PDATABASE_ENTRY
301 GetRemoteDatabaseEntry(
302 IN HANDLE Database,
303 IN LONG StartingOffset
304 );
305
306 NTSTATUS
307 WriteRemoteDatabaseEntry(
308 IN HANDLE Database,
309 IN LONG Offset,
310 IN PDATABASE_ENTRY Entry
311 );
312
313 NTSTATUS
314 CloseRemoteDatabase(
315 IN HANDLE Database
316 );
317
318 NTSTATUS
319 AddRemoteDatabaseEntry(
320 IN HANDLE Database,
321 IN PDATABASE_ENTRY Entry
322 );
323
324 NTSTATUS
325 DeleteRemoteDatabaseEntry(
326 IN HANDLE Database,
327 IN LONG StartingOffset
328 );
329
330 VOID
331 NTAPI
332 ReconcileThisDatabaseWithMasterWorker(
333 IN PVOID Parameter
334 );
335
336 /* device.c */
337
338 DRIVER_DISPATCH MountMgrDeviceControl;
339
340 /* notify.c */
341 VOID
342 IssueUniqueIdChangeNotifyWorker(
343 IN PUNIQUE_ID_WORK_ITEM WorkItem,
344 IN PMOUNTDEV_UNIQUE_ID UniqueId
345 );
346
347 VOID
348 WaitForOnlinesToComplete(
349 IN PDEVICE_EXTENSION DeviceExtension
350 );
351
352 VOID
353 RegisterForTargetDeviceNotification(
354 IN PDEVICE_EXTENSION DeviceExtension,
355 IN PDEVICE_INFORMATION DeviceInformation
356 );
357
358 VOID
359 SendOnlineNotification(
360 IN PUNICODE_STRING SymbolicName
361 );
362
363 VOID
364 IssueUniqueIdChangeNotify(
365 IN PDEVICE_EXTENSION DeviceExtension,
366 IN PUNICODE_STRING DeviceName,
367 IN PMOUNTDEV_UNIQUE_ID UniqueId
368 );
369
370 VOID
371 PostOnlineNotification(
372 IN PDEVICE_EXTENSION DeviceExtension,
373 IN PUNICODE_STRING SymbolicName
374 );
375
376 VOID
377 MountMgrNotify(
378 IN PDEVICE_EXTENSION DeviceExtension
379 );
380
381 VOID
382 MountMgrNotifyNameChange(
383 IN PDEVICE_EXTENSION DeviceExtension,
384 IN PUNICODE_STRING DeviceName,
385 IN BOOLEAN ValidateVolume
386 );
387
388 /* uniqueid.c */
389 VOID
390 MountMgrUniqueIdChangeRoutine(
391 IN PDEVICE_EXTENSION DeviceExtension,
392 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
393 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
394 );
395
396 VOID
397 CreateNoDriveLetterEntry(
398 IN PMOUNTDEV_UNIQUE_ID UniqueId
399 );
400
401 BOOLEAN
402 HasNoDriveLetterEntry(
403 IN PMOUNTDEV_UNIQUE_ID UniqueId
404 );
405
406 VOID
407 UpdateReplicatedUniqueIds(
408 IN PDEVICE_INFORMATION DeviceInformation,
409 IN PDATABASE_ENTRY DatabaseEntry
410 );
411
412 BOOLEAN
413 IsUniqueIdPresent(
414 IN PDEVICE_EXTENSION DeviceExtension,
415 IN PDATABASE_ENTRY DatabaseEntry
416 );
417
418 /* point.c */
419 NTSTATUS
420 MountMgrCreatePointWorker(
421 IN PDEVICE_EXTENSION DeviceExtension,
422 IN PUNICODE_STRING SymbolicLinkName,
423 IN PUNICODE_STRING DeviceName
424 );
425
426 NTSTATUS
427 QueryPointsFromSymbolicLinkName(
428 IN PDEVICE_EXTENSION DeviceExtension,
429 IN PUNICODE_STRING SymbolicName,
430 IN PIRP Irp
431 );
432
433 NTSTATUS
434 QueryPointsFromMemory(
435 IN PDEVICE_EXTENSION DeviceExtension,
436 IN PIRP Irp,
437 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL,
438 IN PUNICODE_STRING SymbolicName OPTIONAL
439 );
440
441 /* symlink.c */
442 NTSTATUS
443 GlobalCreateSymbolicLink(
444 IN PUNICODE_STRING DosName,
445 IN PUNICODE_STRING DeviceName
446 );
447
448 NTSTATUS
449 GlobalDeleteSymbolicLink(
450 IN PUNICODE_STRING DosName
451 );
452
453 NTSTATUS
454 QuerySuggestedLinkName(
455 IN PUNICODE_STRING SymbolicName,
456 OUT PUNICODE_STRING SuggestedLinkName,
457 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
458 );
459
460 NTSTATUS
461 QuerySymbolicLinkNamesFromStorage(
462 IN PDEVICE_EXTENSION DeviceExtension,
463 IN PDEVICE_INFORMATION DeviceInformation,
464 IN PUNICODE_STRING SuggestedLinkName,
465 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks,
466 OUT PUNICODE_STRING * SymLinks,
467 OUT PULONG SymLinkCount,
468 IN BOOLEAN HasGuid,
469 IN LPGUID Guid
470 );
471
472 PSAVED_LINK_INFORMATION
473 RemoveSavedLinks(
474 IN PDEVICE_EXTENSION DeviceExtension,
475 IN PMOUNTDEV_UNIQUE_ID UniqueId
476 );
477
478 BOOLEAN
479 RedirectSavedLink(
480 IN PSAVED_LINK_INFORMATION SavedLinkInformation,
481 IN PUNICODE_STRING DosName,
482 IN PUNICODE_STRING NewLink
483 );
484
485 VOID
486 SendLinkCreated(
487 IN PUNICODE_STRING SymbolicName
488 );
489
490 NTSTATUS
491 CreateNewVolumeName(
492 OUT PUNICODE_STRING VolumeName,
493 IN PGUID VolumeGuid OPTIONAL
494 );
495
496 BOOLEAN
497 IsDriveLetter(
498 PUNICODE_STRING SymbolicName
499 );
500
501 VOID
502 DeleteSymbolicLinkNameFromMemory(
503 IN PDEVICE_EXTENSION DeviceExtension,
504 IN PUNICODE_STRING SymbolicLink,
505 IN BOOLEAN MarkOffline
506 );
507
508 NTSTATUS
509 MountMgrQuerySymbolicLink(
510 IN PUNICODE_STRING SymbolicName,
511 IN OUT PUNICODE_STRING LinkTarget
512 );
513
514 #endif /* _MNTMGR_H_ */