Sync with trunk r62529.
[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 <wdmguid.h>
8 #include <ndk/psfuncs.h>
9 #include <ntdddisk.h>
10
11 /* Enter FIXME */
12 #ifdef IsEqualGUID
13 #undef IsEqualGUID
14 #endif
15
16 #define IsEqualGUID(rguid1, rguid2) (!RtlCompareMemory(rguid1, rguid2, sizeof(GUID)))
17
18 #define FILE_READ_PROPERTIES 0x00000008
19 #define FILE_WRITE_PROPERTIES 0x00000010
20
21 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
22 /* Leave FIXME */
23
24 typedef struct _DEVICE_EXTENSION
25 {
26 PDEVICE_OBJECT DeviceObject; // 0x0
27 PDRIVER_OBJECT DriverObject; // 0x4
28 LIST_ENTRY DeviceListHead; // 0x8
29 LIST_ENTRY OfflineDeviceListHead; // 0x10
30 PVOID NotificationEntry; // 0x18
31 KSEMAPHORE DeviceLock; // 0x1C
32 KSEMAPHORE RemoteDatabaseLock; // 0x30
33 ULONG AutomaticDriveLetter; // 0x44
34 LIST_ENTRY IrpListHead; // 0x48
35 ULONG EpicNumber; // 0x50
36 LIST_ENTRY SavedLinksListHead; // 0x54
37 BOOLEAN ProcessedSuggestions; // 0x5C
38 BOOLEAN NoAutoMount; // 0x5D
39 LIST_ENTRY WorkerQueueListHead; // 0x60
40 KSEMAPHORE WorkerSemaphore; // 0x68
41 LONG WorkerReferences; // 0x7C
42 KSPIN_LOCK WorkerLock; // 0x80
43 LIST_ENTRY UniqueIdWorkerItemListHead; // 0x84
44 PMOUNTDEV_UNIQUE_ID DriveLetterData; // 0x8C
45 UNICODE_STRING RegistryPath; // 0x90
46 LONG WorkerThreadStatus; // 0x98
47 LIST_ENTRY OnlineNotificationListHead; // 0x9C
48 ULONG OnlineNotificationWorkerActive; // 0xA4
49 ULONG OnlineNotificationCount; // 0xA8
50 KEVENT OnlineNotificationEvent; // 0xAC
51 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // 0xBC
52
53 typedef struct _DEVICE_INFORMATION
54 {
55 LIST_ENTRY DeviceListEntry; // 0x00
56 LIST_ENTRY SymbolicLinksListHead; // 0x08
57 LIST_ENTRY ReplicatedUniqueIdsListHead; // 0x10
58 LIST_ENTRY AssociatedDevicesHead; // 0x18
59 UNICODE_STRING SymbolicName; // 0x20
60 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x28
61 UNICODE_STRING DeviceName; // 0x2C
62 BOOLEAN KeepLinks; // 0x34
63 UCHAR SuggestedDriveLetter; // 0x35
64 BOOLEAN Volume; // 0x36
65 BOOLEAN Removable; // 0x37
66 BOOLEAN LetterAssigned; // 0x38
67 BOOLEAN NeedsReconcile; // 0x39
68 BOOLEAN NoDatabase; // 0x3A
69 BOOLEAN SkipNotifications; // 0x3B
70 ULONG Migrated; // 0x3C
71 LONG MountState; // 0x40
72 PVOID TargetDeviceNotificationEntry; // 0x44
73 PDEVICE_EXTENSION DeviceExtension; // 0x48
74 } DEVICE_INFORMATION, *PDEVICE_INFORMATION; // 0x4C
75
76 typedef struct _SYMLINK_INFORMATION
77 {
78 LIST_ENTRY SymbolicLinksListEntry; // 0x00
79 UNICODE_STRING Name; // 0x08
80 BOOLEAN Online; // 0x10
81 } SYMLINK_INFORMATION, *PSYMLINK_INFORMATION; // 0x14
82
83 typedef struct _SAVED_LINK_INFORMATION
84 {
85 LIST_ENTRY SavedLinksListEntry; // 0x0
86 LIST_ENTRY SymbolicLinksListHead; // 0x8
87 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x10
88 } SAVED_LINK_INFORMATION, *PSAVED_LINK_INFORMATION; // 0x14
89
90 typedef struct _UNIQUE_ID_REPLICATE
91 {
92 LIST_ENTRY ReplicatedUniqueIdsListEntry; // 0x0
93 PMOUNTDEV_UNIQUE_ID UniqueId; // 0x8
94 } UNIQUE_ID_REPLICATE, *PUNIQUE_ID_REPLICATE; // 0xC
95
96 typedef struct _DATABASE_ENTRY
97 {
98 ULONG EntrySize; // 0x00
99 ULONG DatabaseOffset; // 0x04
100 USHORT SymbolicNameOffset; // 0x08
101 USHORT SymbolicNameLength; // 0x0A
102 USHORT UniqueIdOffset; // 0x0C
103 USHORT UniqueIdLength; // 0x0E
104 } DATABASE_ENTRY, *PDATABASE_ENTRY; // 0x10
105
106 typedef struct _ASSOCIATED_DEVICE_ENTRY
107 {
108 LIST_ENTRY AssociatedDevicesEntry; // 0x00
109 PDEVICE_INFORMATION DeviceInformation; // 0x08
110 UNICODE_STRING String; // 0x0C
111 } ASSOCIATED_DEVICE_ENTRY, *PASSOCIATED_DEVICE_ENTRY; // 0x14
112
113 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
114 {
115 WORK_QUEUE_ITEM; // 0x00
116 PDEVICE_EXTENSION DeviceExtension; // 0x10
117 UNICODE_STRING SymbolicName; // 0x14
118 } ONLINE_NOTIFICATION_WORK_ITEM, *PONLINE_NOTIFICATION_WORK_ITEM; // 0x1C
119
120 typedef struct _RECONCILE_WORK_ITEM
121 {
122 LIST_ENTRY WorkerQueueListEntry; // 0x00
123 PIO_WORKITEM WorkItem; // 0x08
124 PWORKER_THREAD_ROUTINE WorkerRoutine; // 0x0C
125 PVOID Context; // 0x10
126 PDEVICE_EXTENSION DeviceExtension; // 0x14
127 PDEVICE_INFORMATION DeviceInformation; // 0x18
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 DRIVER_INITIALIZE DriverEntry;
180
181 VOID
182 NTAPI
183 MountMgrCancel(
184 IN PDEVICE_OBJECT DeviceObject,
185 IN PIRP Irp
186 );
187
188 NTSTATUS
189 MountMgrMountedDeviceArrival(
190 IN PDEVICE_EXTENSION Extension,
191 IN PUNICODE_STRING SymbolicName,
192 IN BOOLEAN FromVolume
193 );
194
195 VOID
196 MountMgrMountedDeviceRemoval(
197 IN PDEVICE_EXTENSION Extension,
198 IN PUNICODE_STRING DeviceName
199 );
200
201 NTSTATUS
202 FindDeviceInfo(
203 IN PDEVICE_EXTENSION DeviceExtension,
204 IN PUNICODE_STRING SymbolicName,
205 IN BOOLEAN DeviceNameGiven,
206 OUT PDEVICE_INFORMATION * DeviceInformation
207 );
208
209 VOID
210 MountMgrFreeDeadDeviceInfo(
211 IN PDEVICE_INFORMATION DeviceInformation
212 );
213
214 NTSTATUS
215 QueryDeviceInformation(
216 IN PUNICODE_STRING SymbolicName,
217 OUT PUNICODE_STRING DeviceName OPTIONAL,
218 OUT PMOUNTDEV_UNIQUE_ID * UniqueId OPTIONAL,
219 OUT PBOOLEAN Removable OPTIONAL,
220 OUT PBOOLEAN GptDriveLetter OPTIONAL,
221 OUT PBOOLEAN HasGuid OPTIONAL,
222 IN OUT LPGUID StableGuid OPTIONAL,
223 OUT PBOOLEAN Valid OPTIONAL
224 );
225
226 BOOLEAN
227 HasDriveLetter(
228 IN PDEVICE_INFORMATION DeviceInformation
229 );
230
231 /* database.c */
232
233 extern PWSTR DatabasePath;
234 extern PWSTR OfflinePath;
235
236 VOID
237 ReconcileThisDatabaseWithMaster(
238 IN PDEVICE_EXTENSION DeviceExtension,
239 IN PDEVICE_INFORMATION DeviceInformation
240 );
241
242 NTSTATUS
243 WaitForRemoteDatabaseSemaphore(
244 IN PDEVICE_EXTENSION DeviceExtension
245 );
246
247 VOID
248 ReleaseRemoteDatabaseSemaphore(
249 IN PDEVICE_EXTENSION DeviceExtension
250 );
251
252 VOID
253 ChangeRemoteDatabaseUniqueId(
254 IN PDEVICE_INFORMATION DeviceInformation,
255 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
256 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
257 );
258
259 VOID
260 ReconcileAllDatabasesWithMaster(
261 IN PDEVICE_EXTENSION DeviceExtension
262 );
263
264 VOID
265 DeleteFromLocalDatabase(
266 IN PUNICODE_STRING SymbolicLink,
267 IN PMOUNTDEV_UNIQUE_ID UniqueId
268 );
269
270 VOID
271 DeleteRegistryDriveLetter(
272 IN PMOUNTDEV_UNIQUE_ID UniqueId
273 );
274
275 VOID
276 DeleteNoDriveLetterEntry(
277 IN PMOUNTDEV_UNIQUE_ID UniqueId
278 );
279
280 NTSTATUS
281 QueryVolumeName(
282 IN HANDLE RootDirectory,
283 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation,
284 IN PUNICODE_STRING FileName OPTIONAL,
285 OUT PUNICODE_STRING SymbolicName,
286 OUT PUNICODE_STRING VolumeName
287 );
288
289 /* device.c */
290
291 DRIVER_DISPATCH MountMgrDeviceControl;
292
293 /* notify.c */
294 VOID
295 IssueUniqueIdChangeNotifyWorker(
296 IN PUNIQUE_ID_WORK_ITEM WorkItem,
297 IN PMOUNTDEV_UNIQUE_ID UniqueId
298 );
299
300 VOID
301 WaitForOnlinesToComplete(
302 IN PDEVICE_EXTENSION DeviceExtension
303 );
304
305 VOID
306 RegisterForTargetDeviceNotification(
307 IN PDEVICE_EXTENSION DeviceExtension,
308 IN PDEVICE_INFORMATION DeviceInformation
309 );
310
311 VOID
312 SendOnlineNotification(
313 IN PUNICODE_STRING SymbolicName
314 );
315
316 VOID
317 IssueUniqueIdChangeNotify(
318 IN PDEVICE_EXTENSION DeviceExtension,
319 IN PUNICODE_STRING DeviceName,
320 IN PMOUNTDEV_UNIQUE_ID UniqueId
321 );
322
323 VOID
324 PostOnlineNotification(
325 IN PDEVICE_EXTENSION DeviceExtension,
326 IN PUNICODE_STRING SymbolicName
327 );
328
329 VOID
330 MountMgrNotify(
331 IN PDEVICE_EXTENSION DeviceExtension
332 );
333
334 VOID
335 MountMgrNotifyNameChange(
336 IN PDEVICE_EXTENSION DeviceExtension,
337 IN PUNICODE_STRING DeviceName,
338 IN BOOLEAN ValidateVolume
339 );
340
341 /* uniqueid.c */
342 VOID
343 MountMgrUniqueIdChangeRoutine(
344 IN PDEVICE_EXTENSION DeviceExtension,
345 IN PMOUNTDEV_UNIQUE_ID OldUniqueId,
346 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
347 );
348
349 VOID
350 CreateNoDriveLetterEntry(
351 IN PMOUNTDEV_UNIQUE_ID UniqueId
352 );
353
354 BOOLEAN
355 HasNoDriveLetterEntry(
356 IN PMOUNTDEV_UNIQUE_ID UniqueId
357 );
358
359 /* point.c */
360 NTSTATUS
361 MountMgrCreatePointWorker(
362 IN PDEVICE_EXTENSION DeviceExtension,
363 IN PUNICODE_STRING SymbolicLinkName,
364 IN PUNICODE_STRING DeviceName
365 );
366
367 NTSTATUS
368 QueryPointsFromSymbolicLinkName(
369 IN PDEVICE_EXTENSION DeviceExtension,
370 IN PUNICODE_STRING SymbolicName,
371 IN PIRP Irp
372 );
373
374 NTSTATUS
375 QueryPointsFromMemory(
376 IN PDEVICE_EXTENSION DeviceExtension,
377 IN PIRP Irp,
378 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL,
379 IN PUNICODE_STRING SymbolicName OPTIONAL
380 );
381
382 /* symlink.c */
383 NTSTATUS
384 GlobalCreateSymbolicLink(
385 IN PUNICODE_STRING DosName,
386 IN PUNICODE_STRING DeviceName
387 );
388
389 NTSTATUS
390 GlobalDeleteSymbolicLink(
391 IN PUNICODE_STRING DosName
392 );
393
394 NTSTATUS
395 QuerySuggestedLinkName(
396 IN PUNICODE_STRING SymbolicName,
397 OUT PUNICODE_STRING SuggestedLinkName,
398 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
399 );
400
401 NTSTATUS
402 QuerySymbolicLinkNamesFromStorage(
403 IN PDEVICE_EXTENSION DeviceExtension,
404 IN PDEVICE_INFORMATION DeviceInformation,
405 IN PUNICODE_STRING SuggestedLinkName,
406 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks,
407 OUT PUNICODE_STRING * SymLinks,
408 OUT PULONG SymLinkCount,
409 IN BOOLEAN HasGuid,
410 IN LPGUID Guid
411 );
412
413 PSAVED_LINK_INFORMATION
414 RemoveSavedLinks(
415 IN PDEVICE_EXTENSION DeviceExtension,
416 IN PMOUNTDEV_UNIQUE_ID UniqueId
417 );
418
419 BOOLEAN
420 RedirectSavedLink(
421 IN PSAVED_LINK_INFORMATION SavedLinkInformation,
422 IN PUNICODE_STRING DosName,
423 IN PUNICODE_STRING NewLink
424 );
425
426 VOID
427 SendLinkCreated(
428 IN PUNICODE_STRING SymbolicName
429 );
430
431 NTSTATUS
432 CreateNewVolumeName(
433 OUT PUNICODE_STRING VolumeName,
434 IN PGUID VolumeGuid OPTIONAL
435 );
436
437 BOOLEAN
438 IsDriveLetter(
439 PUNICODE_STRING SymbolicName
440 );
441
442 VOID
443 DeleteSymbolicLinkNameFromMemory(
444 IN PDEVICE_EXTENSION DeviceExtension,
445 IN PUNICODE_STRING SymbolicLink,
446 IN BOOLEAN MarkOffline
447 );
448
449 #endif /* _MNTMGR_H_ */