[MOUNTMGR] Remove a leftover UNREFERENCED_PARAMETER()
[reactos.git] / drivers / filters / 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 INIT_FUNCTION
180 DRIVER_INITIALIZE DriverEntry;
181
182 VOID
183 NTAPI
184 MountMgrCancel(
185 IN PDEVICE_OBJECT DeviceObject,
186 IN PIRP Irp
187 );
188
189 NTSTATUS
190 MountMgrMountedDeviceArrival(
191 IN PDEVICE_EXTENSION Extension,
192 IN PUNICODE_STRING SymbolicName,
193 IN BOOLEAN FromVolume
194 );
195
196 VOID
197 MountMgrMountedDeviceRemoval(
198 IN PDEVICE_EXTENSION Extension,
199 IN PUNICODE_STRING DeviceName
200 );
201
202 NTSTATUS
203 FindDeviceInfo(
204 IN PDEVICE_EXTENSION DeviceExtension,
205 IN PUNICODE_STRING SymbolicName,
206 IN BOOLEAN DeviceNameGiven,
207 OUT PDEVICE_INFORMATION * DeviceInformation
208 );
209
210 VOID
211 MountMgrFreeDeadDeviceInfo(
212 IN PDEVICE_INFORMATION DeviceInformation
213 );
214
215 NTSTATUS
216 QueryDeviceInformation(
217 IN PUNICODE_STRING SymbolicName,
218 OUT PUNICODE_STRING DeviceName OPTIONAL,
219 OUT PMOUNTDEV_UNIQUE_ID * UniqueId OPTIONAL,
220 OUT PBOOLEAN Removable OPTIONAL,
221 OUT PBOOLEAN GptDriveLetter OPTIONAL,
222 OUT PBOOLEAN HasGuid OPTIONAL,
223 IN OUT LPGUID StableGuid OPTIONAL,
224 OUT PBOOLEAN Valid OPTIONAL
225 );
226
227 BOOLEAN
228 HasDriveLetter(
229 IN PDEVICE_INFORMATION DeviceInformation
230 );
231
232 INIT_FUNCTION
233 BOOLEAN
234 MountmgrReadNoAutoMount(
235 IN PUNICODE_STRING RegistryPath
236 );
237
238 /* database.c */
239
240 extern PWSTR DatabasePath;
241 extern PWSTR OfflinePath;
242
243 VOID
244 ReconcileThisDatabaseWithMaster(
245 IN PDEVICE_EXTENSION DeviceExtension,
246 IN PDEVICE_INFORMATION DeviceInformation
247 );
248
249 NTSTATUS
250 WaitForRemoteDatabaseSemaphore(
251 IN PDEVICE_EXTENSION DeviceExtension
252 );
253
254 VOID
255 ReleaseRemoteDatabaseSemaphore(
256 IN PDEVICE_EXTENSION DeviceExtension
257 );
258
259 VOID
260 ChangeRemoteDatabaseUniqueId(
261 IN PDEVICE_INFORMATION DeviceInformation,
262 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
263 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
264 );
265
266 VOID
267 ReconcileAllDatabasesWithMaster(
268 IN PDEVICE_EXTENSION DeviceExtension
269 );
270
271 VOID
272 DeleteFromLocalDatabase(
273 IN PUNICODE_STRING SymbolicLink,
274 IN PMOUNTDEV_UNIQUE_ID UniqueId
275 );
276
277 VOID
278 DeleteRegistryDriveLetter(
279 IN PMOUNTDEV_UNIQUE_ID UniqueId
280 );
281
282 VOID
283 DeleteNoDriveLetterEntry(
284 IN PMOUNTDEV_UNIQUE_ID UniqueId
285 );
286
287 NTSTATUS
288 QueryVolumeName(
289 IN HANDLE RootDirectory,
290 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation,
291 IN PUNICODE_STRING FileName OPTIONAL,
292 OUT PUNICODE_STRING SymbolicName,
293 OUT PUNICODE_STRING VolumeName
294 );
295
296 HANDLE
297 OpenRemoteDatabase(
298 IN PDEVICE_INFORMATION DeviceInformation,
299 IN BOOLEAN MigrateDatabase
300 );
301
302 PDATABASE_ENTRY
303 GetRemoteDatabaseEntry(
304 IN HANDLE Database,
305 IN LONG StartingOffset
306 );
307
308 NTSTATUS
309 WriteRemoteDatabaseEntry(
310 IN HANDLE Database,
311 IN LONG Offset,
312 IN PDATABASE_ENTRY Entry
313 );
314
315 NTSTATUS
316 CloseRemoteDatabase(
317 IN HANDLE Database
318 );
319
320 NTSTATUS
321 AddRemoteDatabaseEntry(
322 IN HANDLE Database,
323 IN PDATABASE_ENTRY Entry
324 );
325
326 NTSTATUS
327 DeleteRemoteDatabaseEntry(
328 IN HANDLE Database,
329 IN LONG StartingOffset
330 );
331
332 VOID
333 NTAPI
334 ReconcileThisDatabaseWithMasterWorker(
335 IN PVOID Parameter
336 );
337
338 /* device.c */
339
340 DRIVER_DISPATCH MountMgrDeviceControl;
341
342 /* notify.c */
343 VOID
344 IssueUniqueIdChangeNotifyWorker(
345 IN PUNIQUE_ID_WORK_ITEM WorkItem,
346 IN PMOUNTDEV_UNIQUE_ID UniqueId
347 );
348
349 VOID
350 WaitForOnlinesToComplete(
351 IN PDEVICE_EXTENSION DeviceExtension
352 );
353
354 VOID
355 RegisterForTargetDeviceNotification(
356 IN PDEVICE_EXTENSION DeviceExtension,
357 IN PDEVICE_INFORMATION DeviceInformation
358 );
359
360 VOID
361 SendOnlineNotification(
362 IN PUNICODE_STRING SymbolicName
363 );
364
365 VOID
366 IssueUniqueIdChangeNotify(
367 IN PDEVICE_EXTENSION DeviceExtension,
368 IN PUNICODE_STRING DeviceName,
369 IN PMOUNTDEV_UNIQUE_ID UniqueId
370 );
371
372 VOID
373 PostOnlineNotification(
374 IN PDEVICE_EXTENSION DeviceExtension,
375 IN PUNICODE_STRING SymbolicName
376 );
377
378 VOID
379 MountMgrNotify(
380 IN PDEVICE_EXTENSION DeviceExtension
381 );
382
383 VOID
384 MountMgrNotifyNameChange(
385 IN PDEVICE_EXTENSION DeviceExtension,
386 IN PUNICODE_STRING DeviceName,
387 IN BOOLEAN ValidateVolume
388 );
389
390 /* uniqueid.c */
391 VOID
392 MountMgrUniqueIdChangeRoutine(
393 IN PDEVICE_EXTENSION DeviceExtension,
394 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
395 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
396 );
397
398 VOID
399 CreateNoDriveLetterEntry(
400 IN PMOUNTDEV_UNIQUE_ID UniqueId
401 );
402
403 BOOLEAN
404 HasNoDriveLetterEntry(
405 IN PMOUNTDEV_UNIQUE_ID UniqueId
406 );
407
408 VOID
409 UpdateReplicatedUniqueIds(
410 IN PDEVICE_INFORMATION DeviceInformation,
411 IN PDATABASE_ENTRY DatabaseEntry
412 );
413
414 BOOLEAN
415 IsUniqueIdPresent(
416 IN PDEVICE_EXTENSION DeviceExtension,
417 IN PDATABASE_ENTRY DatabaseEntry
418 );
419
420 /* point.c */
421 NTSTATUS
422 MountMgrCreatePointWorker(
423 IN PDEVICE_EXTENSION DeviceExtension,
424 IN PUNICODE_STRING SymbolicLinkName,
425 IN PUNICODE_STRING DeviceName
426 );
427
428 NTSTATUS
429 QueryPointsFromSymbolicLinkName(
430 IN PDEVICE_EXTENSION DeviceExtension,
431 IN PUNICODE_STRING SymbolicName,
432 IN PIRP Irp
433 );
434
435 NTSTATUS
436 QueryPointsFromMemory(
437 IN PDEVICE_EXTENSION DeviceExtension,
438 IN PIRP Irp,
439 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL,
440 IN PUNICODE_STRING SymbolicName OPTIONAL
441 );
442
443 /* symlink.c */
444 NTSTATUS
445 GlobalCreateSymbolicLink(
446 IN PUNICODE_STRING DosName,
447 IN PUNICODE_STRING DeviceName
448 );
449
450 NTSTATUS
451 GlobalDeleteSymbolicLink(
452 IN PUNICODE_STRING DosName
453 );
454
455 NTSTATUS
456 QuerySuggestedLinkName(
457 IN PUNICODE_STRING SymbolicName,
458 OUT PUNICODE_STRING SuggestedLinkName,
459 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
460 );
461
462 NTSTATUS
463 QuerySymbolicLinkNamesFromStorage(
464 IN PDEVICE_EXTENSION DeviceExtension,
465 IN PDEVICE_INFORMATION DeviceInformation,
466 IN PUNICODE_STRING SuggestedLinkName,
467 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks,
468 OUT PUNICODE_STRING * SymLinks,
469 OUT PULONG SymLinkCount,
470 IN BOOLEAN HasGuid,
471 IN LPGUID Guid
472 );
473
474 PSAVED_LINK_INFORMATION
475 RemoveSavedLinks(
476 IN PDEVICE_EXTENSION DeviceExtension,
477 IN PMOUNTDEV_UNIQUE_ID UniqueId
478 );
479
480 BOOLEAN
481 RedirectSavedLink(
482 IN PSAVED_LINK_INFORMATION SavedLinkInformation,
483 IN PUNICODE_STRING DosName,
484 IN PUNICODE_STRING NewLink
485 );
486
487 VOID
488 SendLinkCreated(
489 IN PUNICODE_STRING SymbolicName
490 );
491
492 NTSTATUS
493 CreateNewVolumeName(
494 OUT PUNICODE_STRING VolumeName,
495 IN PGUID VolumeGuid OPTIONAL
496 );
497
498 BOOLEAN
499 IsDriveLetter(
500 PUNICODE_STRING SymbolicName
501 );
502
503 VOID
504 DeleteSymbolicLinkNameFromMemory(
505 IN PDEVICE_EXTENSION DeviceExtension,
506 IN PUNICODE_STRING SymbolicLink,
507 IN BOOLEAN MarkOffline
508 );
509
510 NTSTATUS
511 MountMgrQuerySymbolicLink(
512 IN PUNICODE_STRING SymbolicName,
513 IN OUT PUNICODE_STRING LinkTarget
514 );
515
516 #endif /* _MNTMGR_H_ */