8 #include <ndk/psfuncs.h>
12 #define INIT_SECTION __attribute__((section ("INIT")))
14 #define INIT_SECTION /* Done via alloc_text for MSC */
22 #define IsEqualGUID(rguid1, rguid2) (RtlCompareMemory(rguid1, rguid2, sizeof(GUID)) == sizeof(GUID))
24 #define FILE_READ_PROPERTIES 0x00000008
25 #define FILE_WRITE_PROPERTIES 0x00000010
27 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
30 typedef struct _DEVICE_EXTENSION
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
59 typedef struct _DEVICE_INFORMATION
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
82 typedef struct _SYMLINK_INFORMATION
84 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
85 UNICODE_STRING Name
; // 0x08
86 BOOLEAN Online
; // 0x10
87 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
89 typedef struct _SAVED_LINK_INFORMATION
91 LIST_ENTRY SavedLinksListEntry
; // 0x0
92 LIST_ENTRY SymbolicLinksListHead
; // 0x8
93 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
94 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
96 typedef struct _UNIQUE_ID_REPLICATE
98 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
99 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
100 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
102 typedef struct _DATABASE_ENTRY
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
112 typedef struct _ASSOCIATED_DEVICE_ENTRY
114 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
115 PDEVICE_INFORMATION DeviceInformation
; // 0x08
116 UNICODE_STRING String
; // 0x0C
117 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
119 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
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
126 typedef struct _RECONCILE_WORK_ITEM
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
136 typedef struct _MIGRATE_WORK_ITEM
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
145 typedef struct _UNIQUE_ID_WORK_ITEM
147 LIST_ENTRY UniqueIdWorkerItemListEntry
; // 0x0
148 PIO_WORKITEM WorkItem
; // 0x8
149 PDEVICE_EXTENSION DeviceExtension
; // 0xC
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
158 /* Memory allocation helpers */
159 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
160 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
163 #define MAX(a, b) ((a > b) ? a : b)
165 #define LETTER_POSITION 0xC
166 #define COLON_POSITION 0xD
167 #define DRIVE_LETTER_LENGTH 0x1C
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
;
185 DRIVER_INITIALIZE DriverEntry
;
190 IN PDEVICE_OBJECT DeviceObject
,
195 MountMgrMountedDeviceArrival(
196 IN PDEVICE_EXTENSION Extension
,
197 IN PUNICODE_STRING SymbolicName
,
198 IN BOOLEAN FromVolume
202 MountMgrMountedDeviceRemoval(
203 IN PDEVICE_EXTENSION Extension
,
204 IN PUNICODE_STRING DeviceName
209 IN PDEVICE_EXTENSION DeviceExtension
,
210 IN PUNICODE_STRING SymbolicName
,
211 IN BOOLEAN DeviceNameGiven
,
212 OUT PDEVICE_INFORMATION
* DeviceInformation
216 MountMgrFreeDeadDeviceInfo(
217 IN PDEVICE_INFORMATION DeviceInformation
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
234 IN PDEVICE_INFORMATION DeviceInformation
239 MountmgrReadNoAutoMount(
240 IN PUNICODE_STRING RegistryPath
245 extern PWSTR DatabasePath
;
246 extern PWSTR OfflinePath
;
249 ReconcileThisDatabaseWithMaster(
250 IN PDEVICE_EXTENSION DeviceExtension
,
251 IN PDEVICE_INFORMATION DeviceInformation
255 WaitForRemoteDatabaseSemaphore(
256 IN PDEVICE_EXTENSION DeviceExtension
260 ReleaseRemoteDatabaseSemaphore(
261 IN PDEVICE_EXTENSION DeviceExtension
265 ChangeRemoteDatabaseUniqueId(
266 IN PDEVICE_INFORMATION DeviceInformation
,
267 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
268 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
272 ReconcileAllDatabasesWithMaster(
273 IN PDEVICE_EXTENSION DeviceExtension
277 DeleteFromLocalDatabase(
278 IN PUNICODE_STRING SymbolicLink
,
279 IN PMOUNTDEV_UNIQUE_ID UniqueId
283 DeleteRegistryDriveLetter(
284 IN PMOUNTDEV_UNIQUE_ID UniqueId
288 DeleteNoDriveLetterEntry(
289 IN PMOUNTDEV_UNIQUE_ID UniqueId
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
303 IN PDEVICE_INFORMATION DeviceInformation
,
304 IN BOOLEAN MigrateDatabase
308 GetRemoteDatabaseEntry(
310 IN LONG StartingOffset
314 WriteRemoteDatabaseEntry(
317 IN PDATABASE_ENTRY Entry
326 AddRemoteDatabaseEntry(
328 IN PDATABASE_ENTRY Entry
332 DeleteRemoteDatabaseEntry(
334 IN LONG StartingOffset
339 DRIVER_DISPATCH MountMgrDeviceControl
;
343 IssueUniqueIdChangeNotifyWorker(
344 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
345 IN PMOUNTDEV_UNIQUE_ID UniqueId
349 WaitForOnlinesToComplete(
350 IN PDEVICE_EXTENSION DeviceExtension
354 RegisterForTargetDeviceNotification(
355 IN PDEVICE_EXTENSION DeviceExtension
,
356 IN PDEVICE_INFORMATION DeviceInformation
360 SendOnlineNotification(
361 IN PUNICODE_STRING SymbolicName
365 IssueUniqueIdChangeNotify(
366 IN PDEVICE_EXTENSION DeviceExtension
,
367 IN PUNICODE_STRING DeviceName
,
368 IN PMOUNTDEV_UNIQUE_ID UniqueId
372 PostOnlineNotification(
373 IN PDEVICE_EXTENSION DeviceExtension
,
374 IN PUNICODE_STRING SymbolicName
379 IN PDEVICE_EXTENSION DeviceExtension
383 MountMgrNotifyNameChange(
384 IN PDEVICE_EXTENSION DeviceExtension
,
385 IN PUNICODE_STRING DeviceName
,
386 IN BOOLEAN ValidateVolume
391 MountMgrUniqueIdChangeRoutine(
392 IN PDEVICE_EXTENSION DeviceExtension
,
393 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
394 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
398 CreateNoDriveLetterEntry(
399 IN PMOUNTDEV_UNIQUE_ID UniqueId
403 HasNoDriveLetterEntry(
404 IN PMOUNTDEV_UNIQUE_ID UniqueId
409 MountMgrCreatePointWorker(
410 IN PDEVICE_EXTENSION DeviceExtension
,
411 IN PUNICODE_STRING SymbolicLinkName
,
412 IN PUNICODE_STRING DeviceName
416 QueryPointsFromSymbolicLinkName(
417 IN PDEVICE_EXTENSION DeviceExtension
,
418 IN PUNICODE_STRING SymbolicName
,
423 QueryPointsFromMemory(
424 IN PDEVICE_EXTENSION DeviceExtension
,
426 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
427 IN PUNICODE_STRING SymbolicName OPTIONAL
432 GlobalCreateSymbolicLink(
433 IN PUNICODE_STRING DosName
,
434 IN PUNICODE_STRING DeviceName
438 GlobalDeleteSymbolicLink(
439 IN PUNICODE_STRING DosName
443 QuerySuggestedLinkName(
444 IN PUNICODE_STRING SymbolicName
,
445 OUT PUNICODE_STRING SuggestedLinkName
,
446 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
450 QuerySymbolicLinkNamesFromStorage(
451 IN PDEVICE_EXTENSION DeviceExtension
,
452 IN PDEVICE_INFORMATION DeviceInformation
,
453 IN PUNICODE_STRING SuggestedLinkName
,
454 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks
,
455 OUT PUNICODE_STRING
* SymLinks
,
456 OUT PULONG SymLinkCount
,
461 PSAVED_LINK_INFORMATION
463 IN PDEVICE_EXTENSION DeviceExtension
,
464 IN PMOUNTDEV_UNIQUE_ID UniqueId
469 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
470 IN PUNICODE_STRING DosName
,
471 IN PUNICODE_STRING NewLink
476 IN PUNICODE_STRING SymbolicName
481 OUT PUNICODE_STRING VolumeName
,
482 IN PGUID VolumeGuid OPTIONAL
487 PUNICODE_STRING SymbolicName
491 DeleteSymbolicLinkNameFromMemory(
492 IN PDEVICE_EXTENSION DeviceExtension
,
493 IN PUNICODE_STRING SymbolicLink
,
494 IN BOOLEAN MarkOffline
498 MountMgrQuerySymbolicLink(
499 IN PUNICODE_STRING SymbolicName
,
500 IN OUT PUNICODE_STRING LinkTarget
503 #endif /* _MNTMGR_H_ */