144249b8f3ce3369e6bdd89b94fde4998c5d21f9
[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 Volume; // 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 DatabaseOffset; // 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 _ONLINE_NOTIFICATION_WORK_ITEM
120 {
121 WORK_QUEUE_ITEM; // 0x00
122 PDEVICE_EXTENSION DeviceExtension; // 0x10
123 UNICODE_STRING SymbolicName; // 0x14
124 } ONLINE_NOTIFICATION_WORK_ITEM, *PONLINE_NOTIFICATION_WORK_ITEM; // 0x1C
125
126 typedef struct _RECONCILE_WORK_ITEM
127 {
128 LIST_ENTRY WorkerQueueListEntry; // 0x00
129 PIO_WORKITEM WorkItem; // 0x08
130 PWORKER_THREAD_ROUTINE WorkerRoutine; // 0x0C
131 PVOID Context; // 0x10
132 PDEVICE_EXTENSION DeviceExtension; // 0x14
133 PDEVICE_INFORMATION DeviceInformation; // 0x18
134 } RECONCILE_WORK_ITEM, *PRECONCILE_WORK_ITEM; // 0x1C
135
136 typedef struct _MIGRATE_WORK_ITEM
137 {
138 PIO_WORKITEM WorkItem; // 0x0
139 PDEVICE_INFORMATION DeviceInformation; // 0x4
140 PKEVENT Event; // 0x8
141 NTSTATUS Status; // 0x0C
142 HANDLE Database; // 0x10
143 } MIGRATE_WORK_ITEM, *PMIGRATE_WORK_ITEM; // 0x14
144
145 typedef struct _UNIQUE_ID_WORK_ITEM
146 {
147 LIST_ENTRY UniqueIdWorkerItemListEntry; // 0x0
148 PIO_WORKITEM WorkItem; // 0x8
149 PDEVICE_EXTENSION DeviceExtension; // 0xC
150 PIRP Irp; // 0x10
151 PVOID IrpBuffer; // 0x14
152 PKEVENT Event; // 0x1C
153 UNICODE_STRING DeviceName; // 0x20
154 ULONG IrpBufferLength; // 0x28
155 ULONG StackSize; // 0x2C
156 } UNIQUE_ID_WORK_ITEM, *PUNIQUE_ID_WORK_ITEM; // 0x30
157
158 /* Memory allocation helpers */
159 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
160 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
161
162 /* Misc macros */
163 #define MAX(a, b) ((a > b) ? a : b)
164
165 #define LETTER_POSITION 0xC
166 #define COLON_POSITION 0xD
167 #define DRIVE_LETTER_LENGTH 0x1C
168
169 /* mountmgr.c */
170
171 extern UNICODE_STRING DosDevicesMount;
172 extern PDEVICE_OBJECT gdeviceObject;
173 extern UNICODE_STRING ReparseIndex;
174 extern UNICODE_STRING DeviceFloppy;
175 extern UNICODE_STRING DeviceMount;
176 extern UNICODE_STRING DeviceCdRom;
177 extern UNICODE_STRING SafeVolumes;
178 extern UNICODE_STRING DosDevices;
179 extern UNICODE_STRING DosGlobal;
180 extern UNICODE_STRING Global;
181 extern UNICODE_STRING Volume;
182 extern KEVENT UnloadEvent;
183 extern LONG Unloading;
184
185 DRIVER_INITIALIZE DriverEntry;
186
187 VOID
188 NTAPI
189 MountMgrCancel(
190 IN PDEVICE_OBJECT DeviceObject,
191 IN PIRP Irp
192 );
193
194 NTSTATUS
195 MountMgrMountedDeviceArrival(
196 IN PDEVICE_EXTENSION Extension,
197 IN PUNICODE_STRING SymbolicName,
198 IN BOOLEAN FromVolume
199 );
200
201 VOID
202 MountMgrMountedDeviceRemoval(
203 IN PDEVICE_EXTENSION Extension,
204 IN PUNICODE_STRING DeviceName
205 );
206
207 NTSTATUS
208 FindDeviceInfo(
209 IN PDEVICE_EXTENSION DeviceExtension,
210 IN PUNICODE_STRING SymbolicName,
211 IN BOOLEAN DeviceNameGiven,
212 OUT PDEVICE_INFORMATION * DeviceInformation
213 );
214
215 VOID
216 MountMgrFreeDeadDeviceInfo(
217 IN PDEVICE_INFORMATION DeviceInformation
218 );
219
220 NTSTATUS
221 QueryDeviceInformation(
222 IN PUNICODE_STRING SymbolicName,
223 OUT PUNICODE_STRING DeviceName OPTIONAL,
224 OUT PMOUNTDEV_UNIQUE_ID * UniqueId OPTIONAL,
225 OUT PBOOLEAN Removable OPTIONAL,
226 OUT PBOOLEAN GptDriveLetter OPTIONAL,
227 OUT PBOOLEAN HasGuid OPTIONAL,
228 IN OUT LPGUID StableGuid OPTIONAL,
229 OUT PBOOLEAN Valid OPTIONAL
230 );
231
232 BOOLEAN
233 HasDriveLetter(
234 IN PDEVICE_INFORMATION DeviceInformation
235 );
236
237 INIT_SECTION
238 BOOLEAN
239 MountmgrReadNoAutoMount(
240 IN PUNICODE_STRING RegistryPath
241 );
242
243 /* database.c */
244
245 extern PWSTR DatabasePath;
246 extern PWSTR OfflinePath;
247
248 VOID
249 ReconcileThisDatabaseWithMaster(
250 IN PDEVICE_EXTENSION DeviceExtension,
251 IN PDEVICE_INFORMATION DeviceInformation
252 );
253
254 NTSTATUS
255 WaitForRemoteDatabaseSemaphore(
256 IN PDEVICE_EXTENSION DeviceExtension
257 );
258
259 VOID
260 ReleaseRemoteDatabaseSemaphore(
261 IN PDEVICE_EXTENSION DeviceExtension
262 );
263
264 VOID
265 ChangeRemoteDatabaseUniqueId(
266 IN PDEVICE_INFORMATION DeviceInformation,
267 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
268 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
269 );
270
271 VOID
272 ReconcileAllDatabasesWithMaster(
273 IN PDEVICE_EXTENSION DeviceExtension
274 );
275
276 VOID
277 DeleteFromLocalDatabase(
278 IN PUNICODE_STRING SymbolicLink,
279 IN PMOUNTDEV_UNIQUE_ID UniqueId
280 );
281
282 VOID
283 DeleteRegistryDriveLetter(
284 IN PMOUNTDEV_UNIQUE_ID UniqueId
285 );
286
287 VOID
288 DeleteNoDriveLetterEntry(
289 IN PMOUNTDEV_UNIQUE_ID UniqueId
290 );
291
292 NTSTATUS
293 QueryVolumeName(
294 IN HANDLE RootDirectory,
295 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation,
296 IN PUNICODE_STRING FileName OPTIONAL,
297 OUT PUNICODE_STRING SymbolicName,
298 OUT PUNICODE_STRING VolumeName
299 );
300
301 HANDLE
302 OpenRemoteDatabase(
303 IN PDEVICE_INFORMATION DeviceInformation,
304 IN BOOLEAN MigrateDatabase
305 );
306
307 PDATABASE_ENTRY
308 GetRemoteDatabaseEntry(
309 IN HANDLE Database,
310 IN LONG StartingOffset
311 );
312
313 NTSTATUS
314 WriteRemoteDatabaseEntry(
315 IN HANDLE Database,
316 IN LONG Offset,
317 IN PDATABASE_ENTRY Entry
318 );
319
320 NTSTATUS
321 CloseRemoteDatabase(
322 IN HANDLE Database
323 );
324
325 NTSTATUS
326 AddRemoteDatabaseEntry(
327 IN HANDLE Database,
328 IN PDATABASE_ENTRY Entry
329 );
330
331 /* device.c */
332
333 DRIVER_DISPATCH MountMgrDeviceControl;
334
335 /* notify.c */
336 VOID
337 IssueUniqueIdChangeNotifyWorker(
338 IN PUNIQUE_ID_WORK_ITEM WorkItem,
339 IN PMOUNTDEV_UNIQUE_ID UniqueId
340 );
341
342 VOID
343 WaitForOnlinesToComplete(
344 IN PDEVICE_EXTENSION DeviceExtension
345 );
346
347 VOID
348 RegisterForTargetDeviceNotification(
349 IN PDEVICE_EXTENSION DeviceExtension,
350 IN PDEVICE_INFORMATION DeviceInformation
351 );
352
353 VOID
354 SendOnlineNotification(
355 IN PUNICODE_STRING SymbolicName
356 );
357
358 VOID
359 IssueUniqueIdChangeNotify(
360 IN PDEVICE_EXTENSION DeviceExtension,
361 IN PUNICODE_STRING DeviceName,
362 IN PMOUNTDEV_UNIQUE_ID UniqueId
363 );
364
365 VOID
366 PostOnlineNotification(
367 IN PDEVICE_EXTENSION DeviceExtension,
368 IN PUNICODE_STRING SymbolicName
369 );
370
371 VOID
372 MountMgrNotify(
373 IN PDEVICE_EXTENSION DeviceExtension
374 );
375
376 VOID
377 MountMgrNotifyNameChange(
378 IN PDEVICE_EXTENSION DeviceExtension,
379 IN PUNICODE_STRING DeviceName,
380 IN BOOLEAN ValidateVolume
381 );
382
383 /* uniqueid.c */
384 VOID
385 MountMgrUniqueIdChangeRoutine(
386 IN PDEVICE_EXTENSION DeviceExtension,
387 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
388 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
389 );
390
391 VOID
392 CreateNoDriveLetterEntry(
393 IN PMOUNTDEV_UNIQUE_ID UniqueId
394 );
395
396 BOOLEAN
397 HasNoDriveLetterEntry(
398 IN PMOUNTDEV_UNIQUE_ID UniqueId
399 );
400
401 /* point.c */
402 NTSTATUS
403 MountMgrCreatePointWorker(
404 IN PDEVICE_EXTENSION DeviceExtension,
405 IN PUNICODE_STRING SymbolicLinkName,
406 IN PUNICODE_STRING DeviceName
407 );
408
409 NTSTATUS
410 QueryPointsFromSymbolicLinkName(
411 IN PDEVICE_EXTENSION DeviceExtension,
412 IN PUNICODE_STRING SymbolicName,
413 IN PIRP Irp
414 );
415
416 NTSTATUS
417 QueryPointsFromMemory(
418 IN PDEVICE_EXTENSION DeviceExtension,
419 IN PIRP Irp,
420 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL,
421 IN PUNICODE_STRING SymbolicName OPTIONAL
422 );
423
424 /* symlink.c */
425 NTSTATUS
426 GlobalCreateSymbolicLink(
427 IN PUNICODE_STRING DosName,
428 IN PUNICODE_STRING DeviceName
429 );
430
431 NTSTATUS
432 GlobalDeleteSymbolicLink(
433 IN PUNICODE_STRING DosName
434 );
435
436 NTSTATUS
437 QuerySuggestedLinkName(
438 IN PUNICODE_STRING SymbolicName,
439 OUT PUNICODE_STRING SuggestedLinkName,
440 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
441 );
442
443 NTSTATUS
444 QuerySymbolicLinkNamesFromStorage(
445 IN PDEVICE_EXTENSION DeviceExtension,
446 IN PDEVICE_INFORMATION DeviceInformation,
447 IN PUNICODE_STRING SuggestedLinkName,
448 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks,
449 OUT PUNICODE_STRING * SymLinks,
450 OUT PULONG SymLinkCount,
451 IN BOOLEAN HasGuid,
452 IN LPGUID Guid
453 );
454
455 PSAVED_LINK_INFORMATION
456 RemoveSavedLinks(
457 IN PDEVICE_EXTENSION DeviceExtension,
458 IN PMOUNTDEV_UNIQUE_ID UniqueId
459 );
460
461 BOOLEAN
462 RedirectSavedLink(
463 IN PSAVED_LINK_INFORMATION SavedLinkInformation,
464 IN PUNICODE_STRING DosName,
465 IN PUNICODE_STRING NewLink
466 );
467
468 VOID
469 SendLinkCreated(
470 IN PUNICODE_STRING SymbolicName
471 );
472
473 NTSTATUS
474 CreateNewVolumeName(
475 OUT PUNICODE_STRING VolumeName,
476 IN PGUID VolumeGuid OPTIONAL
477 );
478
479 BOOLEAN
480 IsDriveLetter(
481 PUNICODE_STRING SymbolicName
482 );
483
484 VOID
485 DeleteSymbolicLinkNameFromMemory(
486 IN PDEVICE_EXTENSION DeviceExtension,
487 IN PUNICODE_STRING SymbolicLink,
488 IN BOOLEAN MarkOffline
489 );
490
491 NTSTATUS
492 MountMgrQuerySymbolicLink(
493 IN PUNICODE_STRING SymbolicName,
494 IN OUT PUNICODE_STRING LinkTarget
495 );
496
497 #endif /* _MNTMGR_H_ */