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