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