9 #include <ndk/psfuncs.h>
13 #define INIT_SECTION __attribute__((section ("INIT")))
15 #define INIT_SECTION /* Done via alloc_text for MSC */
18 typedef struct _DEVICE_EXTENSION
20 PDEVICE_OBJECT DeviceObject
; // 0x0
21 PDRIVER_OBJECT DriverObject
; // 0x4
22 LIST_ENTRY DeviceListHead
; // 0x8
23 LIST_ENTRY OfflineDeviceListHead
; // 0x10
24 PVOID NotificationEntry
; // 0x18
25 KSEMAPHORE DeviceLock
; // 0x1C
26 KSEMAPHORE RemoteDatabaseLock
; // 0x30
27 ULONG AutomaticDriveLetter
; // 0x44
28 LIST_ENTRY IrpListHead
; // 0x48
29 ULONG EpicNumber
; // 0x50
30 LIST_ENTRY SavedLinksListHead
; // 0x54
31 BOOLEAN ProcessedSuggestions
; // 0x5C
32 BOOLEAN NoAutoMount
; // 0x5D
33 LIST_ENTRY WorkerQueueListHead
; // 0x60
34 KSEMAPHORE WorkerSemaphore
; // 0x68
35 LONG WorkerReferences
; // 0x7C
36 KSPIN_LOCK WorkerLock
; // 0x80
37 LIST_ENTRY UniqueIdWorkerItemListHead
; // 0x84
38 PMOUNTDEV_UNIQUE_ID DriveLetterData
; // 0x8C
39 UNICODE_STRING RegistryPath
; // 0x90
40 LONG WorkerThreadStatus
; // 0x98
41 LIST_ENTRY OnlineNotificationListHead
; // 0x9C
42 ULONG OnlineNotificationWorkerActive
; // 0xA4
43 ULONG OnlineNotificationCount
; // 0xA8
44 KEVENT OnlineNotificationEvent
; // 0xAC
45 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
; // 0xBC
47 typedef struct _DEVICE_INFORMATION
49 LIST_ENTRY DeviceListEntry
; // 0x00
50 LIST_ENTRY SymbolicLinksListHead
; // 0x08
51 LIST_ENTRY ReplicatedUniqueIdsListHead
; // 0x10
52 LIST_ENTRY AssociatedDevicesHead
; // 0x18
53 UNICODE_STRING SymbolicName
; // 0x20
54 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x28
55 UNICODE_STRING DeviceName
; // 0x2C
56 BOOLEAN KeepLinks
; // 0x34
57 UCHAR SuggestedDriveLetter
; // 0x35
58 BOOLEAN ManuallyRegistered
; // 0x36
59 BOOLEAN Removable
; // 0x37
60 BOOLEAN LetterAssigned
; // 0x38
61 BOOLEAN NeedsReconcile
; // 0x39
62 BOOLEAN NoDatabase
; // 0x3A
63 BOOLEAN SkipNotifications
; // 0x3B
64 ULONG Migrated
; // 0x3C
65 LONG MountState
; // 0x40
66 PVOID TargetDeviceNotificationEntry
; // 0x44
67 PDEVICE_EXTENSION DeviceExtension
; // 0x48
68 } DEVICE_INFORMATION
, *PDEVICE_INFORMATION
; // 0x4C
70 typedef struct _SYMLINK_INFORMATION
72 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
73 UNICODE_STRING Name
; // 0x08
74 BOOLEAN Online
; // 0x10
75 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
77 typedef struct _SAVED_LINK_INFORMATION
79 LIST_ENTRY SavedLinksListEntry
; // 0x0
80 LIST_ENTRY SymbolicLinksListHead
; // 0x8
81 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
82 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
84 typedef struct _UNIQUE_ID_REPLICATE
86 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
87 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
88 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
90 typedef struct _DATABASE_ENTRY
92 ULONG EntrySize
; // 0x00
93 ULONG EntryReferences
; // 0x04
94 USHORT SymbolicNameOffset
; // 0x08
95 USHORT SymbolicNameLength
; // 0x0A
96 USHORT UniqueIdOffset
; // 0x0C
97 USHORT UniqueIdLength
; // 0x0E
98 } DATABASE_ENTRY
, *PDATABASE_ENTRY
; // 0x10
100 typedef struct _ASSOCIATED_DEVICE_ENTRY
102 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
103 PDEVICE_INFORMATION DeviceInformation
; // 0x08
104 UNICODE_STRING String
; // 0x0C
105 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
107 typedef struct _DEVICE_INFORMATION_ENTRY
109 LIST_ENTRY DeviceInformationEntry
; // 0x00
110 PDEVICE_INFORMATION DeviceInformation
; // 0x08
111 } DEVICE_INFORMATION_ENTRY
, *PDEVICE_INFORMATION_ENTRY
; // 0x0C
113 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
115 WORK_QUEUE_ITEM WorkItem
; // 0x00
116 PDEVICE_EXTENSION DeviceExtension
; // 0x10
117 UNICODE_STRING SymbolicName
; // 0x14
118 } ONLINE_NOTIFICATION_WORK_ITEM
, *PONLINE_NOTIFICATION_WORK_ITEM
; // 0x1C
120 typedef struct _RECONCILE_WORK_ITEM_CONTEXT
122 PDEVICE_EXTENSION DeviceExtension
;
123 PDEVICE_INFORMATION DeviceInformation
;
124 } RECONCILE_WORK_ITEM_CONTEXT
, *PRECONCILE_WORK_ITEM_CONTEXT
;
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 RECONCILE_WORK_ITEM_CONTEXT
; // 0x14
133 } RECONCILE_WORK_ITEM
, *PRECONCILE_WORK_ITEM
; // 0x1C
135 typedef struct _MIGRATE_WORK_ITEM
137 PIO_WORKITEM WorkItem
; // 0x0
138 PDEVICE_INFORMATION DeviceInformation
; // 0x4
139 PKEVENT Event
; // 0x8
140 NTSTATUS Status
; // 0x0C
141 HANDLE Database
; // 0x10
142 } MIGRATE_WORK_ITEM
, *PMIGRATE_WORK_ITEM
; // 0x14
144 typedef struct _UNIQUE_ID_WORK_ITEM
146 LIST_ENTRY UniqueIdWorkerItemListEntry
; // 0x0
147 PIO_WORKITEM WorkItem
; // 0x8
148 PDEVICE_EXTENSION DeviceExtension
; // 0xC
150 PVOID IrpBuffer
; // 0x14
151 PKEVENT Event
; // 0x1C
152 UNICODE_STRING DeviceName
; // 0x20
153 ULONG IrpBufferLength
; // 0x28
154 ULONG StackSize
; // 0x2C
155 } UNIQUE_ID_WORK_ITEM
, *PUNIQUE_ID_WORK_ITEM
; // 0x30
157 /* Memory allocation helpers */
158 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
159 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
162 #define MAX(a, b) ((a > b) ? a : b)
164 #define LETTER_POSITION 0xC
165 #define COLON_POSITION 0xD
166 #define DRIVE_LETTER_LENGTH 0x1C
170 extern UNICODE_STRING DosDevicesMount
;
171 extern PDEVICE_OBJECT gdeviceObject
;
172 extern UNICODE_STRING ReparseIndex
;
173 extern UNICODE_STRING DeviceFloppy
;
174 extern UNICODE_STRING DeviceMount
;
175 extern UNICODE_STRING DeviceCdRom
;
176 extern UNICODE_STRING SafeVolumes
;
177 extern UNICODE_STRING DosDevices
;
178 extern UNICODE_STRING DosGlobal
;
179 extern UNICODE_STRING Global
;
180 extern UNICODE_STRING Volume
;
181 extern KEVENT UnloadEvent
;
182 extern LONG Unloading
;
184 DRIVER_INITIALIZE DriverEntry
;
189 IN PDEVICE_OBJECT DeviceObject
,
194 MountMgrMountedDeviceArrival(
195 IN PDEVICE_EXTENSION Extension
,
196 IN PUNICODE_STRING SymbolicName
,
197 IN BOOLEAN FromVolume
201 MountMgrMountedDeviceRemoval(
202 IN PDEVICE_EXTENSION Extension
,
203 IN PUNICODE_STRING DeviceName
208 IN PDEVICE_EXTENSION DeviceExtension
,
209 IN PUNICODE_STRING SymbolicName
,
210 IN BOOLEAN DeviceNameGiven
,
211 OUT PDEVICE_INFORMATION
* DeviceInformation
215 MountMgrFreeDeadDeviceInfo(
216 IN PDEVICE_INFORMATION DeviceInformation
220 QueryDeviceInformation(
221 IN PUNICODE_STRING SymbolicName
,
222 OUT PUNICODE_STRING DeviceName OPTIONAL
,
223 OUT PMOUNTDEV_UNIQUE_ID
* UniqueId OPTIONAL
,
224 OUT PBOOLEAN Removable OPTIONAL
,
225 OUT PBOOLEAN GptDriveLetter OPTIONAL
,
226 OUT PBOOLEAN HasGuid OPTIONAL
,
227 IN OUT LPGUID StableGuid OPTIONAL
,
228 OUT PBOOLEAN Valid OPTIONAL
233 IN PDEVICE_INFORMATION DeviceInformation
238 MountmgrReadNoAutoMount(
239 IN PUNICODE_STRING RegistryPath
244 extern PWSTR DatabasePath
;
245 extern PWSTR OfflinePath
;
248 ReconcileThisDatabaseWithMaster(
249 IN PDEVICE_EXTENSION DeviceExtension
,
250 IN PDEVICE_INFORMATION DeviceInformation
254 WaitForRemoteDatabaseSemaphore(
255 IN PDEVICE_EXTENSION DeviceExtension
259 ReleaseRemoteDatabaseSemaphore(
260 IN PDEVICE_EXTENSION DeviceExtension
264 ChangeRemoteDatabaseUniqueId(
265 IN PDEVICE_INFORMATION DeviceInformation
,
266 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
267 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
271 ReconcileAllDatabasesWithMaster(
272 IN PDEVICE_EXTENSION DeviceExtension
276 DeleteFromLocalDatabase(
277 IN PUNICODE_STRING SymbolicLink
,
278 IN PMOUNTDEV_UNIQUE_ID UniqueId
282 DeleteRegistryDriveLetter(
283 IN PMOUNTDEV_UNIQUE_ID UniqueId
287 DeleteNoDriveLetterEntry(
288 IN PMOUNTDEV_UNIQUE_ID UniqueId
293 IN HANDLE RootDirectory
,
294 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation
,
295 IN PUNICODE_STRING FileName OPTIONAL
,
296 OUT PUNICODE_STRING SymbolicName
,
297 OUT PUNICODE_STRING VolumeName
302 IN PDEVICE_INFORMATION DeviceInformation
,
303 IN BOOLEAN MigrateDatabase
307 GetRemoteDatabaseEntry(
309 IN LONG StartingOffset
313 WriteRemoteDatabaseEntry(
316 IN PDATABASE_ENTRY Entry
325 AddRemoteDatabaseEntry(
327 IN PDATABASE_ENTRY Entry
331 DeleteRemoteDatabaseEntry(
333 IN LONG StartingOffset
338 ReconcileThisDatabaseWithMasterWorker(
344 DRIVER_DISPATCH MountMgrDeviceControl
;
348 IssueUniqueIdChangeNotifyWorker(
349 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
350 IN PMOUNTDEV_UNIQUE_ID UniqueId
354 WaitForOnlinesToComplete(
355 IN PDEVICE_EXTENSION DeviceExtension
359 RegisterForTargetDeviceNotification(
360 IN PDEVICE_EXTENSION DeviceExtension
,
361 IN PDEVICE_INFORMATION DeviceInformation
365 SendOnlineNotification(
366 IN PUNICODE_STRING SymbolicName
370 IssueUniqueIdChangeNotify(
371 IN PDEVICE_EXTENSION DeviceExtension
,
372 IN PUNICODE_STRING DeviceName
,
373 IN PMOUNTDEV_UNIQUE_ID UniqueId
377 PostOnlineNotification(
378 IN PDEVICE_EXTENSION DeviceExtension
,
379 IN PUNICODE_STRING SymbolicName
384 IN PDEVICE_EXTENSION DeviceExtension
388 MountMgrNotifyNameChange(
389 IN PDEVICE_EXTENSION DeviceExtension
,
390 IN PUNICODE_STRING DeviceName
,
391 IN BOOLEAN ValidateVolume
396 MountMgrUniqueIdChangeRoutine(
397 IN PDEVICE_EXTENSION DeviceExtension
,
398 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
399 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
403 CreateNoDriveLetterEntry(
404 IN PMOUNTDEV_UNIQUE_ID UniqueId
408 HasNoDriveLetterEntry(
409 IN PMOUNTDEV_UNIQUE_ID UniqueId
413 UpdateReplicatedUniqueIds(
414 IN PDEVICE_INFORMATION DeviceInformation
,
415 IN PDATABASE_ENTRY DatabaseEntry
420 IN PDEVICE_EXTENSION DeviceExtension
,
421 IN PDATABASE_ENTRY DatabaseEntry
426 MountMgrCreatePointWorker(
427 IN PDEVICE_EXTENSION DeviceExtension
,
428 IN PUNICODE_STRING SymbolicLinkName
,
429 IN PUNICODE_STRING DeviceName
433 QueryPointsFromSymbolicLinkName(
434 IN PDEVICE_EXTENSION DeviceExtension
,
435 IN PUNICODE_STRING SymbolicName
,
440 QueryPointsFromMemory(
441 IN PDEVICE_EXTENSION DeviceExtension
,
443 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
444 IN PUNICODE_STRING SymbolicName OPTIONAL
449 GlobalCreateSymbolicLink(
450 IN PUNICODE_STRING DosName
,
451 IN PUNICODE_STRING DeviceName
455 GlobalDeleteSymbolicLink(
456 IN PUNICODE_STRING DosName
460 QuerySuggestedLinkName(
461 IN PUNICODE_STRING SymbolicName
,
462 OUT PUNICODE_STRING SuggestedLinkName
,
463 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
467 QuerySymbolicLinkNamesFromStorage(
468 IN PDEVICE_EXTENSION DeviceExtension
,
469 IN PDEVICE_INFORMATION DeviceInformation
,
470 IN PUNICODE_STRING SuggestedLinkName
,
471 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks
,
472 OUT PUNICODE_STRING
* SymLinks
,
473 OUT PULONG SymLinkCount
,
478 PSAVED_LINK_INFORMATION
480 IN PDEVICE_EXTENSION DeviceExtension
,
481 IN PMOUNTDEV_UNIQUE_ID UniqueId
486 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
487 IN PUNICODE_STRING DosName
,
488 IN PUNICODE_STRING NewLink
493 IN PUNICODE_STRING SymbolicName
498 OUT PUNICODE_STRING VolumeName
,
499 IN PGUID VolumeGuid OPTIONAL
504 PUNICODE_STRING SymbolicName
508 DeleteSymbolicLinkNameFromMemory(
509 IN PDEVICE_EXTENSION DeviceExtension
,
510 IN PUNICODE_STRING SymbolicLink
,
511 IN BOOLEAN MarkOffline
515 MountMgrQuerySymbolicLink(
516 IN PUNICODE_STRING SymbolicName
,
517 IN OUT PUNICODE_STRING LinkTarget
520 #endif /* _MNTMGR_H_ */