[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 #ifdef IsEqualGUID
20 #undef IsEqualGUID
21 #endif
22
23 #define IsEqualGUID(rguid1, rguid2) (RtlCompareMemory(rguid1, rguid2, sizeof(GUID)) == sizeof(GUID))
24
25 #define FILE_READ_PROPERTIES 0x00000008
26 #define FILE_WRITE_PROPERTIES 0x00000010
27 /* Leave FIXME */
28
29 typedef struct _DEVICE_EXTENSION
30 {
31 PDEVICE_OBJECT DeviceObject; // 0x0
32 PDRIVER_OBJECT DriverObject; // 0x4
33 LIST_ENTRY DeviceListHead; // 0x8
34 LIST_ENTRY OfflineDeviceListHead; // 0x10
35 PVOID NotificationEntry; // 0x18
36 KSEMAPHORE DeviceLock; // 0x1C
37 KSEMAPHORE RemoteDatabaseLock; // 0x30
38 ULONG AutomaticDriveLetter; // 0x44
39 LIST_ENTRY IrpListHead; // 0x48
40 ULONG EpicNumber; // 0x50
41 LIST_ENTRY SavedLinksListHead; // 0x54
42 BOOLEAN ProcessedSuggestions; // 0x5C
43 BOOLEAN NoAutoMount; // 0x5D
44 LIST_ENTRY WorkerQueueListHead; // 0x60
45 KSEMAPHORE WorkerSemaphore; // 0x68
46 LONG WorkerReferences; // 0x7C
47 KSPIN_LOCK WorkerLock; // 0x80
48 LIST_ENTRY UniqueIdWorkerItemListHead; // 0x84
49 PMOUNTDEV_UNIQUE_ID DriveLetterData; // 0x8C
50 UNICODE_STRING RegistryPath; // 0x90
51 LONG WorkerThreadStatus; // 0x98
52 LIST_ENTRY OnlineNotificationListHead; // 0x9C
53 ULONG OnlineNotificationWorkerActive; // 0xA4
54 ULONG OnlineNotificationCount; // 0xA8
55 KEVENT OnlineNotificationEvent; // 0xAC
56 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // 0xBC
57
58 typedef struct _DEVICE_INFORMATION
59 {
60 LIST_ENTRY DeviceListEntry; // 0x00
61 LIST_ENTRY SymbolicLinksListHead; // 0x08
62 LIST_ENTRY ReplicatedUniqueIdsListHead; // 0x10
63 LIST_ENTRY AssociatedDevicesHead; // 0x18
64 UNICODE_STRING SymbolicName; // 0x20
65 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x28
66 UNICODE_STRING DeviceName; // 0x2C
67 BOOLEAN KeepLinks; // 0x34
68 UCHAR SuggestedDriveLetter; // 0x35
69 BOOLEAN ManuallyRegistered; // 0x36
70 BOOLEAN Removable; // 0x37
71 BOOLEAN LetterAssigned; // 0x38
72 BOOLEAN NeedsReconcile; // 0x39
73 BOOLEAN NoDatabase; // 0x3A
74 BOOLEAN SkipNotifications; // 0x3B
75 ULONG Migrated; // 0x3C
76 LONG MountState; // 0x40
77 PVOID TargetDeviceNotificationEntry; // 0x44
78 PDEVICE_EXTENSION DeviceExtension; // 0x48
79 } DEVICE_INFORMATION, *PDEVICE_INFORMATION; // 0x4C
80
81 typedef struct _SYMLINK_INFORMATION
82 {
83 LIST_ENTRY SymbolicLinksListEntry; // 0x00
84 UNICODE_STRING Name; // 0x08
85 BOOLEAN Online; // 0x10
86 } SYMLINK_INFORMATION, *PSYMLINK_INFORMATION; // 0x14
87
88 typedef struct _SAVED_LINK_INFORMATION
89 {
90 LIST_ENTRY SavedLinksListEntry; // 0x0
91 LIST_ENTRY SymbolicLinksListHead; // 0x8
92 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x10
93 } SAVED_LINK_INFORMATION, *PSAVED_LINK_INFORMATION; // 0x14
94
95 typedef struct _UNIQUE_ID_REPLICATE
96 {
97 LIST_ENTRY ReplicatedUniqueIdsListEntry; // 0x0
98 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x8
99 } UNIQUE_ID_REPLICATE, *PUNIQUE_ID_REPLICATE; // 0xC
100
101 typedef struct _DATABASE_ENTRY
102 {
103 ULONG EntrySize; // 0x00
104 ULONG EntryReferences; // 0x04
105 USHORT SymbolicNameOffset; // 0x08
106 USHORT SymbolicNameLength; // 0x0A
107 USHORT UniqueIdOffset; // 0x0C
108 USHORT UniqueIdLength; // 0x0E
109 } DATABASE_ENTRY, *PDATABASE_ENTRY; // 0x10
110
111 typedef struct _ASSOCIATED_DEVICE_ENTRY
112 {
113 LIST_ENTRY AssociatedDevicesEntry; // 0x00
114 PDEVICE_INFORMATION DeviceInformation; // 0x08
115 UNICODE_STRING String; // 0x0C
116 } ASSOCIATED_DEVICE_ENTRY, *PASSOCIATED_DEVICE_ENTRY; // 0x14
117
118 typedef struct _DEVICE_INFORMATION_ENTRY
119 {
120 LIST_ENTRY DeviceInformationEntry; // 0x00
121 PDEVICE_INFORMATION DeviceInformation; // 0x08
122 } DEVICE_INFORMATION_ENTRY, *PDEVICE_INFORMATION_ENTRY; // 0x0C
123
124 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
125 {
126 WORK_QUEUE_ITEM; // 0x00
127 PDEVICE_EXTENSION DeviceExtension; // 0x10
128 UNICODE_STRING SymbolicName; // 0x14
129 } ONLINE_NOTIFICATION_WORK_ITEM, *PONLINE_NOTIFICATION_WORK_ITEM; // 0x1C
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 PDEVICE_EXTENSION DeviceExtension; // 0x14
138 PDEVICE_INFORMATION DeviceInformation; // 0x18
139 } RECONCILE_WORK_ITEM, *PRECONCILE_WORK_ITEM; // 0x1C
140
141 typedef struct _MIGRATE_WORK_ITEM
142 {
143 PIO_WORKITEM WorkItem; // 0x0
144 PDEVICE_INFORMATION DeviceInformation; // 0x4
145 PKEVENT Event; // 0x8
146 NTSTATUS Status; // 0x0C
147 HANDLE Database; // 0x10
148 } MIGRATE_WORK_ITEM, *PMIGRATE_WORK_ITEM; // 0x14
149
150 typedef struct _UNIQUE_ID_WORK_ITEM
151 {
152 LIST_ENTRY UniqueIdWorkerItemListEntry; // 0x0
153 PIO_WORKITEM WorkItem; // 0x8
154 PDEVICE_EXTENSION DeviceExtension; // 0xC
155 PIRP Irp; // 0x10
156 PVOID IrpBuffer; // 0x14
157 PKEVENT Event; // 0x1C
158 UNICODE_STRING DeviceName; // 0x20
159 ULONG IrpBufferLength; // 0x28
160 ULONG StackSize; // 0x2C
161 } UNIQUE_ID_WORK_ITEM, *PUNIQUE_ID_WORK_ITEM; // 0x30
162
163 /* Memory allocation helpers */
164 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
165 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
166
167 /* Misc macros */
168 #define MAX(a, b) ((a > b) ? a : b)
169
170 #define LETTER_POSITION 0xC
171 #define COLON_POSITION 0xD
172 #define DRIVE_LETTER_LENGTH 0x1C
173
174 /* mountmgr.c */
175
176 extern UNICODE_STRING DosDevicesMount;
177 extern PDEVICE_OBJECT gdeviceObject;
178 extern UNICODE_STRING ReparseIndex;
179 extern UNICODE_STRING DeviceFloppy;
180 extern UNICODE_STRING DeviceMount;
181 extern UNICODE_STRING DeviceCdRom;
182 extern UNICODE_STRING SafeVolumes;
183 extern UNICODE_STRING DosDevices;
184 extern UNICODE_STRING DosGlobal;
185 extern UNICODE_STRING Global;
186 extern UNICODE_STRING Volume;
187 extern KEVENT UnloadEvent;
188 extern LONG Unloading;
189
190 DRIVER_INITIALIZE DriverEntry;
191
192 VOID
193 NTAPI
194 MountMgrCancel(
195 IN PDEVICE_OBJECT DeviceObject,
196 IN PIRP Irp
197 );
198
199 NTSTATUS
200 MountMgrMountedDeviceArrival(
201 IN PDEVICE_EXTENSION Extension,
202 IN PUNICODE_STRING SymbolicName,
203 IN BOOLEAN FromVolume
204 );
205
206 VOID
207 MountMgrMountedDeviceRemoval(
208 IN PDEVICE_EXTENSION Extension,
209 IN PUNICODE_STRING DeviceName
210 );
211
212 NTSTATUS
213 FindDeviceInfo(
214 IN PDEVICE_EXTENSION DeviceExtension,
215 IN PUNICODE_STRING SymbolicName,
216 IN BOOLEAN DeviceNameGiven,
217 OUT PDEVICE_INFORMATION * DeviceInformation
218 );
219
220 VOID
221 MountMgrFreeDeadDeviceInfo(
222 IN PDEVICE_INFORMATION DeviceInformation
223 );
224
225 NTSTATUS
226 QueryDeviceInformation(
227 IN PUNICODE_STRING SymbolicName,
228 OUT PUNICODE_STRING DeviceName OPTIONAL,
229 OUT PMOUNTDEV_UNIQUE_ID * UniqueId OPTIONAL,
230 OUT PBOOLEAN Removable OPTIONAL,
231 OUT PBOOLEAN GptDriveLetter OPTIONAL,
232 OUT PBOOLEAN HasGuid OPTIONAL,
233 IN OUT LPGUID StableGuid OPTIONAL,
234 OUT PBOOLEAN Valid OPTIONAL
235 );
236
237 BOOLEAN
238 HasDriveLetter(
239 IN PDEVICE_INFORMATION DeviceInformation
240 );
241
242 INIT_SECTION
243 BOOLEAN
244 MountmgrReadNoAutoMount(
245 IN PUNICODE_STRING RegistryPath
246 );
247
248 /* database.c */
249
250 extern PWSTR DatabasePath;
251 extern PWSTR OfflinePath;
252
253 VOID
254 ReconcileThisDatabaseWithMaster(
255 IN PDEVICE_EXTENSION DeviceExtension,
256 IN PDEVICE_INFORMATION DeviceInformation
257 );
258
259 NTSTATUS
260 WaitForRemoteDatabaseSemaphore(
261 IN PDEVICE_EXTENSION DeviceExtension
262 );
263
264 VOID
265 ReleaseRemoteDatabaseSemaphore(
266 IN PDEVICE_EXTENSION DeviceExtension
267 );
268
269 VOID
270 ChangeRemoteDatabaseUniqueId(
271 IN PDEVICE_INFORMATION DeviceInformation,
272 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
273 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
274 );
275
276 VOID
277 ReconcileAllDatabasesWithMaster(
278 IN PDEVICE_EXTENSION DeviceExtension
279 );
280
281 VOID
282 DeleteFromLocalDatabase(
283 IN PUNICODE_STRING SymbolicLink,
284 IN PMOUNTDEV_UNIQUE_ID UniqueId
285 );
286
287 VOID
288 DeleteRegistryDriveLetter(
289 IN PMOUNTDEV_UNIQUE_ID UniqueId
290 );
291
292 VOID
293 DeleteNoDriveLetterEntry(
294 IN PMOUNTDEV_UNIQUE_ID UniqueId
295 );
296
297 NTSTATUS
298 QueryVolumeName(
299 IN HANDLE RootDirectory,
300 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation,
301 IN PUNICODE_STRING FileName OPTIONAL,
302 OUT PUNICODE_STRING SymbolicName,
303 OUT PUNICODE_STRING VolumeName
304 );
305
306 HANDLE
307 OpenRemoteDatabase(
308 IN PDEVICE_INFORMATION DeviceInformation,
309 IN BOOLEAN MigrateDatabase
310 );
311
312 PDATABASE_ENTRY
313 GetRemoteDatabaseEntry(
314 IN HANDLE Database,
315 IN LONG StartingOffset
316 );
317
318 NTSTATUS
319 WriteRemoteDatabaseEntry(
320 IN HANDLE Database,
321 IN LONG Offset,
322 IN PDATABASE_ENTRY Entry
323 );
324
325 NTSTATUS
326 CloseRemoteDatabase(
327 IN HANDLE Database
328 );
329
330 NTSTATUS
331 AddRemoteDatabaseEntry(
332 IN HANDLE Database,
333 IN PDATABASE_ENTRY Entry
334 );
335
336 NTSTATUS
337 DeleteRemoteDatabaseEntry(
338 IN HANDLE Database,
339 IN LONG StartingOffset
340 );
341
342 VOID
343 NTAPI
344 ReconcileThisDatabaseWithMasterWorker(
345 IN PVOID Parameter
346 );
347
348 /* device.c */
349
350 DRIVER_DISPATCH MountMgrDeviceControl;
351
352 /* notify.c */
353 VOID
354 IssueUniqueIdChangeNotifyWorker(
355 IN PUNIQUE_ID_WORK_ITEM WorkItem,
356 IN PMOUNTDEV_UNIQUE_ID UniqueId
357 );
358
359 VOID
360 WaitForOnlinesToComplete(
361 IN PDEVICE_EXTENSION DeviceExtension
362 );
363
364 VOID
365 RegisterForTargetDeviceNotification(
366 IN PDEVICE_EXTENSION DeviceExtension,
367 IN PDEVICE_INFORMATION DeviceInformation
368 );
369
370 VOID
371 SendOnlineNotification(
372 IN PUNICODE_STRING SymbolicName
373 );
374
375 VOID
376 IssueUniqueIdChangeNotify(
377 IN PDEVICE_EXTENSION DeviceExtension,
378 IN PUNICODE_STRING DeviceName,
379 IN PMOUNTDEV_UNIQUE_ID UniqueId
380 );
381
382 VOID
383 PostOnlineNotification(
384 IN PDEVICE_EXTENSION DeviceExtension,
385 IN PUNICODE_STRING SymbolicName
386 );
387
388 VOID
389 MountMgrNotify(
390 IN PDEVICE_EXTENSION DeviceExtension
391 );
392
393 VOID
394 MountMgrNotifyNameChange(
395 IN PDEVICE_EXTENSION DeviceExtension,
396 IN PUNICODE_STRING DeviceName,
397 IN BOOLEAN ValidateVolume
398 );
399
400 /* uniqueid.c */
401 VOID
402 MountMgrUniqueIdChangeRoutine(
403 IN PDEVICE_EXTENSION DeviceExtension,
404 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
405 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
406 );
407
408 VOID
409 CreateNoDriveLetterEntry(
410 IN PMOUNTDEV_UNIQUE_ID UniqueId
411 );
412
413 BOOLEAN
414 HasNoDriveLetterEntry(
415 IN PMOUNTDEV_UNIQUE_ID UniqueId
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_ */