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 DatabaseOffset
; // 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
333 DRIVER_DISPATCH MountMgrDeviceControl
;
337 IssueUniqueIdChangeNotifyWorker(
338 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
339 IN PMOUNTDEV_UNIQUE_ID UniqueId
343 WaitForOnlinesToComplete(
344 IN PDEVICE_EXTENSION DeviceExtension
348 RegisterForTargetDeviceNotification(
349 IN PDEVICE_EXTENSION DeviceExtension
,
350 IN PDEVICE_INFORMATION DeviceInformation
354 SendOnlineNotification(
355 IN PUNICODE_STRING SymbolicName
359 IssueUniqueIdChangeNotify(
360 IN PDEVICE_EXTENSION DeviceExtension
,
361 IN PUNICODE_STRING DeviceName
,
362 IN PMOUNTDEV_UNIQUE_ID UniqueId
366 PostOnlineNotification(
367 IN PDEVICE_EXTENSION DeviceExtension
,
368 IN PUNICODE_STRING SymbolicName
373 IN PDEVICE_EXTENSION DeviceExtension
377 MountMgrNotifyNameChange(
378 IN PDEVICE_EXTENSION DeviceExtension
,
379 IN PUNICODE_STRING DeviceName
,
380 IN BOOLEAN ValidateVolume
385 MountMgrUniqueIdChangeRoutine(
386 IN PDEVICE_EXTENSION DeviceExtension
,
387 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
388 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
392 CreateNoDriveLetterEntry(
393 IN PMOUNTDEV_UNIQUE_ID UniqueId
397 HasNoDriveLetterEntry(
398 IN PMOUNTDEV_UNIQUE_ID UniqueId
403 MountMgrCreatePointWorker(
404 IN PDEVICE_EXTENSION DeviceExtension
,
405 IN PUNICODE_STRING SymbolicLinkName
,
406 IN PUNICODE_STRING DeviceName
410 QueryPointsFromSymbolicLinkName(
411 IN PDEVICE_EXTENSION DeviceExtension
,
412 IN PUNICODE_STRING SymbolicName
,
417 QueryPointsFromMemory(
418 IN PDEVICE_EXTENSION DeviceExtension
,
420 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
421 IN PUNICODE_STRING SymbolicName OPTIONAL
426 GlobalCreateSymbolicLink(
427 IN PUNICODE_STRING DosName
,
428 IN PUNICODE_STRING DeviceName
432 GlobalDeleteSymbolicLink(
433 IN PUNICODE_STRING DosName
437 QuerySuggestedLinkName(
438 IN PUNICODE_STRING SymbolicName
,
439 OUT PUNICODE_STRING SuggestedLinkName
,
440 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
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
,
455 PSAVED_LINK_INFORMATION
457 IN PDEVICE_EXTENSION DeviceExtension
,
458 IN PMOUNTDEV_UNIQUE_ID UniqueId
463 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
464 IN PUNICODE_STRING DosName
,
465 IN PUNICODE_STRING NewLink
470 IN PUNICODE_STRING SymbolicName
475 OUT PUNICODE_STRING VolumeName
,
476 IN PGUID VolumeGuid OPTIONAL
481 PUNICODE_STRING SymbolicName
485 DeleteSymbolicLinkNameFromMemory(
486 IN PDEVICE_EXTENSION DeviceExtension
,
487 IN PUNICODE_STRING SymbolicLink
,
488 IN BOOLEAN MarkOffline
492 MountMgrQuerySymbolicLink(
493 IN PUNICODE_STRING SymbolicName
,
494 IN OUT PUNICODE_STRING LinkTarget
497 #endif /* _MNTMGR_H_ */