9 #include <ndk/psfuncs.h>
13 #define INIT_SECTION __attribute__((section ("INIT")))
15 #define INIT_SECTION /* Done via alloc_text for MSC */
23 #define IsEqualGUID(rguid1, rguid2) (RtlCompareMemory(rguid1, rguid2, sizeof(GUID)) == sizeof(GUID))
25 #define FILE_READ_PROPERTIES 0x00000008
26 #define FILE_WRITE_PROPERTIES 0x00000010
29 typedef struct _DEVICE_EXTENSION
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
58 typedef struct _DEVICE_INFORMATION
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
81 typedef struct _SYMLINK_INFORMATION
83 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
84 UNICODE_STRING Name
; // 0x08
85 BOOLEAN Online
; // 0x10
86 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
88 typedef struct _SAVED_LINK_INFORMATION
90 LIST_ENTRY SavedLinksListEntry
; // 0x0
91 LIST_ENTRY SymbolicLinksListHead
; // 0x8
92 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
93 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
95 typedef struct _UNIQUE_ID_REPLICATE
97 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
98 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
99 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
101 typedef struct _DATABASE_ENTRY
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
111 typedef struct _ASSOCIATED_DEVICE_ENTRY
113 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
114 PDEVICE_INFORMATION DeviceInformation
; // 0x08
115 UNICODE_STRING String
; // 0x0C
116 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
118 typedef struct _DEVICE_INFORMATION_ENTRY
120 LIST_ENTRY DeviceInformationEntry
; // 0x00
121 PDEVICE_INFORMATION DeviceInformation
; // 0x08
122 } DEVICE_INFORMATION_ENTRY
, *PDEVICE_INFORMATION_ENTRY
; // 0x0C
124 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
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
131 typedef struct _RECONCILE_WORK_ITEM
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
141 typedef struct _MIGRATE_WORK_ITEM
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
150 typedef struct _UNIQUE_ID_WORK_ITEM
152 LIST_ENTRY UniqueIdWorkerItemListEntry
; // 0x0
153 PIO_WORKITEM WorkItem
; // 0x8
154 PDEVICE_EXTENSION DeviceExtension
; // 0xC
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
163 /* Memory allocation helpers */
164 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
165 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
168 #define MAX(a, b) ((a > b) ? a : b)
170 #define LETTER_POSITION 0xC
171 #define COLON_POSITION 0xD
172 #define DRIVE_LETTER_LENGTH 0x1C
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
;
190 DRIVER_INITIALIZE DriverEntry
;
195 IN PDEVICE_OBJECT DeviceObject
,
200 MountMgrMountedDeviceArrival(
201 IN PDEVICE_EXTENSION Extension
,
202 IN PUNICODE_STRING SymbolicName
,
203 IN BOOLEAN FromVolume
207 MountMgrMountedDeviceRemoval(
208 IN PDEVICE_EXTENSION Extension
,
209 IN PUNICODE_STRING DeviceName
214 IN PDEVICE_EXTENSION DeviceExtension
,
215 IN PUNICODE_STRING SymbolicName
,
216 IN BOOLEAN DeviceNameGiven
,
217 OUT PDEVICE_INFORMATION
* DeviceInformation
221 MountMgrFreeDeadDeviceInfo(
222 IN PDEVICE_INFORMATION DeviceInformation
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
239 IN PDEVICE_INFORMATION DeviceInformation
244 MountmgrReadNoAutoMount(
245 IN PUNICODE_STRING RegistryPath
250 extern PWSTR DatabasePath
;
251 extern PWSTR OfflinePath
;
254 ReconcileThisDatabaseWithMaster(
255 IN PDEVICE_EXTENSION DeviceExtension
,
256 IN PDEVICE_INFORMATION DeviceInformation
260 WaitForRemoteDatabaseSemaphore(
261 IN PDEVICE_EXTENSION DeviceExtension
265 ReleaseRemoteDatabaseSemaphore(
266 IN PDEVICE_EXTENSION DeviceExtension
270 ChangeRemoteDatabaseUniqueId(
271 IN PDEVICE_INFORMATION DeviceInformation
,
272 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
273 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
277 ReconcileAllDatabasesWithMaster(
278 IN PDEVICE_EXTENSION DeviceExtension
282 DeleteFromLocalDatabase(
283 IN PUNICODE_STRING SymbolicLink
,
284 IN PMOUNTDEV_UNIQUE_ID UniqueId
288 DeleteRegistryDriveLetter(
289 IN PMOUNTDEV_UNIQUE_ID UniqueId
293 DeleteNoDriveLetterEntry(
294 IN PMOUNTDEV_UNIQUE_ID UniqueId
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
308 IN PDEVICE_INFORMATION DeviceInformation
,
309 IN BOOLEAN MigrateDatabase
313 GetRemoteDatabaseEntry(
315 IN LONG StartingOffset
319 WriteRemoteDatabaseEntry(
322 IN PDATABASE_ENTRY Entry
331 AddRemoteDatabaseEntry(
333 IN PDATABASE_ENTRY Entry
337 DeleteRemoteDatabaseEntry(
339 IN LONG StartingOffset
344 ReconcileThisDatabaseWithMasterWorker(
350 DRIVER_DISPATCH MountMgrDeviceControl
;
354 IssueUniqueIdChangeNotifyWorker(
355 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
356 IN PMOUNTDEV_UNIQUE_ID UniqueId
360 WaitForOnlinesToComplete(
361 IN PDEVICE_EXTENSION DeviceExtension
365 RegisterForTargetDeviceNotification(
366 IN PDEVICE_EXTENSION DeviceExtension
,
367 IN PDEVICE_INFORMATION DeviceInformation
371 SendOnlineNotification(
372 IN PUNICODE_STRING SymbolicName
376 IssueUniqueIdChangeNotify(
377 IN PDEVICE_EXTENSION DeviceExtension
,
378 IN PUNICODE_STRING DeviceName
,
379 IN PMOUNTDEV_UNIQUE_ID UniqueId
383 PostOnlineNotification(
384 IN PDEVICE_EXTENSION DeviceExtension
,
385 IN PUNICODE_STRING SymbolicName
390 IN PDEVICE_EXTENSION DeviceExtension
394 MountMgrNotifyNameChange(
395 IN PDEVICE_EXTENSION DeviceExtension
,
396 IN PUNICODE_STRING DeviceName
,
397 IN BOOLEAN ValidateVolume
402 MountMgrUniqueIdChangeRoutine(
403 IN PDEVICE_EXTENSION DeviceExtension
,
404 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
405 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
409 CreateNoDriveLetterEntry(
410 IN PMOUNTDEV_UNIQUE_ID UniqueId
414 HasNoDriveLetterEntry(
415 IN PMOUNTDEV_UNIQUE_ID UniqueId
420 MountMgrCreatePointWorker(
421 IN PDEVICE_EXTENSION DeviceExtension
,
422 IN PUNICODE_STRING SymbolicLinkName
,
423 IN PUNICODE_STRING DeviceName
427 QueryPointsFromSymbolicLinkName(
428 IN PDEVICE_EXTENSION DeviceExtension
,
429 IN PUNICODE_STRING SymbolicName
,
434 QueryPointsFromMemory(
435 IN PDEVICE_EXTENSION DeviceExtension
,
437 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
438 IN PUNICODE_STRING SymbolicName OPTIONAL
443 GlobalCreateSymbolicLink(
444 IN PUNICODE_STRING DosName
,
445 IN PUNICODE_STRING DeviceName
449 GlobalDeleteSymbolicLink(
450 IN PUNICODE_STRING DosName
454 QuerySuggestedLinkName(
455 IN PUNICODE_STRING SymbolicName
,
456 OUT PUNICODE_STRING SuggestedLinkName
,
457 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
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
,
472 PSAVED_LINK_INFORMATION
474 IN PDEVICE_EXTENSION DeviceExtension
,
475 IN PMOUNTDEV_UNIQUE_ID UniqueId
480 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
481 IN PUNICODE_STRING DosName
,
482 IN PUNICODE_STRING NewLink
487 IN PUNICODE_STRING SymbolicName
492 OUT PUNICODE_STRING VolumeName
,
493 IN PGUID VolumeGuid OPTIONAL
498 PUNICODE_STRING SymbolicName
502 DeleteSymbolicLinkNameFromMemory(
503 IN PDEVICE_EXTENSION DeviceExtension
,
504 IN PUNICODE_STRING SymbolicLink
,
505 IN BOOLEAN MarkOffline
509 MountMgrQuerySymbolicLink(
510 IN PUNICODE_STRING SymbolicName
,
511 IN OUT PUNICODE_STRING LinkTarget
514 #endif /* _MNTMGR_H_ */