9 #include <ndk/psfuncs.h>
11 #include <section_attribs.h>
13 typedef struct _DEVICE_EXTENSION
15 PDEVICE_OBJECT DeviceObject
; // 0x0
16 PDRIVER_OBJECT DriverObject
; // 0x4
17 LIST_ENTRY DeviceListHead
; // 0x8
18 LIST_ENTRY OfflineDeviceListHead
; // 0x10
19 PVOID NotificationEntry
; // 0x18
20 KSEMAPHORE DeviceLock
; // 0x1C
21 KSEMAPHORE RemoteDatabaseLock
; // 0x30
22 ULONG AutomaticDriveLetter
; // 0x44
23 LIST_ENTRY IrpListHead
; // 0x48
24 ULONG EpicNumber
; // 0x50
25 LIST_ENTRY SavedLinksListHead
; // 0x54
26 BOOLEAN ProcessedSuggestions
; // 0x5C
27 BOOLEAN NoAutoMount
; // 0x5D
28 LIST_ENTRY WorkerQueueListHead
; // 0x60
29 KSEMAPHORE WorkerSemaphore
; // 0x68
30 LONG WorkerReferences
; // 0x7C
31 KSPIN_LOCK WorkerLock
; // 0x80
32 LIST_ENTRY UniqueIdWorkerItemListHead
; // 0x84
33 PMOUNTDEV_UNIQUE_ID DriveLetterData
; // 0x8C
34 UNICODE_STRING RegistryPath
; // 0x90
35 LONG WorkerThreadStatus
; // 0x98
36 LIST_ENTRY OnlineNotificationListHead
; // 0x9C
37 ULONG OnlineNotificationWorkerActive
; // 0xA4
38 ULONG OnlineNotificationCount
; // 0xA8
39 KEVENT OnlineNotificationEvent
; // 0xAC
40 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
; // 0xBC
42 typedef struct _DEVICE_INFORMATION
44 LIST_ENTRY DeviceListEntry
; // 0x00
45 LIST_ENTRY SymbolicLinksListHead
; // 0x08
46 LIST_ENTRY ReplicatedUniqueIdsListHead
; // 0x10
47 LIST_ENTRY AssociatedDevicesHead
; // 0x18
48 UNICODE_STRING SymbolicName
; // 0x20
49 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x28
50 UNICODE_STRING DeviceName
; // 0x2C
51 BOOLEAN KeepLinks
; // 0x34
52 UCHAR SuggestedDriveLetter
; // 0x35
53 BOOLEAN ManuallyRegistered
; // 0x36
54 BOOLEAN Removable
; // 0x37
55 BOOLEAN LetterAssigned
; // 0x38
56 BOOLEAN NeedsReconcile
; // 0x39
57 BOOLEAN NoDatabase
; // 0x3A
58 BOOLEAN SkipNotifications
; // 0x3B
59 ULONG Migrated
; // 0x3C
60 LONG MountState
; // 0x40
61 PVOID TargetDeviceNotificationEntry
; // 0x44
62 PDEVICE_EXTENSION DeviceExtension
; // 0x48
63 } DEVICE_INFORMATION
, *PDEVICE_INFORMATION
; // 0x4C
65 typedef struct _SYMLINK_INFORMATION
67 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
68 UNICODE_STRING Name
; // 0x08
69 BOOLEAN Online
; // 0x10
70 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
72 typedef struct _SAVED_LINK_INFORMATION
74 LIST_ENTRY SavedLinksListEntry
; // 0x0
75 LIST_ENTRY SymbolicLinksListHead
; // 0x8
76 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
77 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
79 typedef struct _UNIQUE_ID_REPLICATE
81 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
82 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
83 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
85 typedef struct _DATABASE_ENTRY
87 ULONG EntrySize
; // 0x00
88 ULONG EntryReferences
; // 0x04
89 USHORT SymbolicNameOffset
; // 0x08
90 USHORT SymbolicNameLength
; // 0x0A
91 USHORT UniqueIdOffset
; // 0x0C
92 USHORT UniqueIdLength
; // 0x0E
93 } DATABASE_ENTRY
, *PDATABASE_ENTRY
; // 0x10
95 typedef struct _ASSOCIATED_DEVICE_ENTRY
97 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
98 PDEVICE_INFORMATION DeviceInformation
; // 0x08
99 UNICODE_STRING String
; // 0x0C
100 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
102 typedef struct _DEVICE_INFORMATION_ENTRY
104 LIST_ENTRY DeviceInformationEntry
; // 0x00
105 PDEVICE_INFORMATION DeviceInformation
; // 0x08
106 } DEVICE_INFORMATION_ENTRY
, *PDEVICE_INFORMATION_ENTRY
; // 0x0C
108 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
110 WORK_QUEUE_ITEM WorkItem
; // 0x00
111 PDEVICE_EXTENSION DeviceExtension
; // 0x10
112 UNICODE_STRING SymbolicName
; // 0x14
113 } ONLINE_NOTIFICATION_WORK_ITEM
, *PONLINE_NOTIFICATION_WORK_ITEM
; // 0x1C
115 typedef struct _RECONCILE_WORK_ITEM_CONTEXT
117 PDEVICE_EXTENSION DeviceExtension
;
118 PDEVICE_INFORMATION DeviceInformation
;
119 } RECONCILE_WORK_ITEM_CONTEXT
, *PRECONCILE_WORK_ITEM_CONTEXT
;
121 typedef struct _RECONCILE_WORK_ITEM
123 LIST_ENTRY WorkerQueueListEntry
; // 0x00
124 PIO_WORKITEM WorkItem
; // 0x08
125 PWORKER_THREAD_ROUTINE WorkerRoutine
; // 0x0C
126 PVOID Context
; // 0x10
127 RECONCILE_WORK_ITEM_CONTEXT
; // 0x14
128 } RECONCILE_WORK_ITEM
, *PRECONCILE_WORK_ITEM
; // 0x1C
130 typedef struct _MIGRATE_WORK_ITEM
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
139 typedef struct _UNIQUE_ID_WORK_ITEM
141 LIST_ENTRY UniqueIdWorkerItemListEntry
; // 0x0
142 PIO_WORKITEM WorkItem
; // 0x8
143 PDEVICE_EXTENSION DeviceExtension
; // 0xC
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
152 /* Memory allocation helpers */
153 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
154 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
157 #define MAX(a, b) ((a > b) ? a : b)
159 #define LETTER_POSITION 0xC
160 #define COLON_POSITION 0xD
161 #define DRIVE_LETTER_LENGTH 0x1C
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
;
180 DRIVER_INITIALIZE DriverEntry
;
185 IN PDEVICE_OBJECT DeviceObject
,
190 MountMgrMountedDeviceArrival(
191 IN PDEVICE_EXTENSION Extension
,
192 IN PUNICODE_STRING SymbolicName
,
193 IN BOOLEAN FromVolume
197 MountMgrMountedDeviceRemoval(
198 IN PDEVICE_EXTENSION Extension
,
199 IN PUNICODE_STRING DeviceName
204 IN PDEVICE_EXTENSION DeviceExtension
,
205 IN PUNICODE_STRING SymbolicName
,
206 IN BOOLEAN DeviceNameGiven
,
207 OUT PDEVICE_INFORMATION
* DeviceInformation
211 MountMgrFreeDeadDeviceInfo(
212 IN PDEVICE_INFORMATION DeviceInformation
216 QueryDeviceInformation(
217 IN PUNICODE_STRING SymbolicName
,
218 OUT PUNICODE_STRING DeviceName OPTIONAL
,
219 OUT PMOUNTDEV_UNIQUE_ID
* UniqueId OPTIONAL
,
220 OUT PBOOLEAN Removable OPTIONAL
,
221 OUT PBOOLEAN GptDriveLetter OPTIONAL
,
222 OUT PBOOLEAN HasGuid OPTIONAL
,
223 IN OUT LPGUID StableGuid OPTIONAL
,
224 OUT PBOOLEAN Valid OPTIONAL
229 IN PDEVICE_INFORMATION DeviceInformation
234 MountmgrReadNoAutoMount(
235 IN PUNICODE_STRING RegistryPath
240 extern PWSTR DatabasePath
;
241 extern PWSTR OfflinePath
;
244 ReconcileThisDatabaseWithMaster(
245 IN PDEVICE_EXTENSION DeviceExtension
,
246 IN PDEVICE_INFORMATION DeviceInformation
250 WaitForRemoteDatabaseSemaphore(
251 IN PDEVICE_EXTENSION DeviceExtension
255 ReleaseRemoteDatabaseSemaphore(
256 IN PDEVICE_EXTENSION DeviceExtension
260 ChangeRemoteDatabaseUniqueId(
261 IN PDEVICE_INFORMATION DeviceInformation
,
262 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
263 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
267 ReconcileAllDatabasesWithMaster(
268 IN PDEVICE_EXTENSION DeviceExtension
272 DeleteFromLocalDatabase(
273 IN PUNICODE_STRING SymbolicLink
,
274 IN PMOUNTDEV_UNIQUE_ID UniqueId
278 DeleteRegistryDriveLetter(
279 IN PMOUNTDEV_UNIQUE_ID UniqueId
283 DeleteNoDriveLetterEntry(
284 IN PMOUNTDEV_UNIQUE_ID UniqueId
289 IN HANDLE RootDirectory
,
290 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation
,
291 IN PUNICODE_STRING FileName OPTIONAL
,
292 OUT PUNICODE_STRING SymbolicName
,
293 OUT PUNICODE_STRING VolumeName
298 IN PDEVICE_INFORMATION DeviceInformation
,
299 IN BOOLEAN MigrateDatabase
303 GetRemoteDatabaseEntry(
305 IN LONG StartingOffset
309 WriteRemoteDatabaseEntry(
312 IN PDATABASE_ENTRY Entry
321 AddRemoteDatabaseEntry(
323 IN PDATABASE_ENTRY Entry
327 DeleteRemoteDatabaseEntry(
329 IN LONG StartingOffset
334 ReconcileThisDatabaseWithMasterWorker(
340 DRIVER_DISPATCH MountMgrDeviceControl
;
344 IssueUniqueIdChangeNotifyWorker(
345 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
346 IN PMOUNTDEV_UNIQUE_ID UniqueId
350 WaitForOnlinesToComplete(
351 IN PDEVICE_EXTENSION DeviceExtension
355 RegisterForTargetDeviceNotification(
356 IN PDEVICE_EXTENSION DeviceExtension
,
357 IN PDEVICE_INFORMATION DeviceInformation
361 SendOnlineNotification(
362 IN PUNICODE_STRING SymbolicName
366 IssueUniqueIdChangeNotify(
367 IN PDEVICE_EXTENSION DeviceExtension
,
368 IN PUNICODE_STRING DeviceName
,
369 IN PMOUNTDEV_UNIQUE_ID UniqueId
373 PostOnlineNotification(
374 IN PDEVICE_EXTENSION DeviceExtension
,
375 IN PUNICODE_STRING SymbolicName
380 IN PDEVICE_EXTENSION DeviceExtension
384 MountMgrNotifyNameChange(
385 IN PDEVICE_EXTENSION DeviceExtension
,
386 IN PUNICODE_STRING DeviceName
,
387 IN BOOLEAN ValidateVolume
392 MountMgrUniqueIdChangeRoutine(
393 IN PDEVICE_EXTENSION DeviceExtension
,
394 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
395 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
399 CreateNoDriveLetterEntry(
400 IN PMOUNTDEV_UNIQUE_ID UniqueId
404 HasNoDriveLetterEntry(
405 IN PMOUNTDEV_UNIQUE_ID UniqueId
409 UpdateReplicatedUniqueIds(
410 IN PDEVICE_INFORMATION DeviceInformation
,
411 IN PDATABASE_ENTRY DatabaseEntry
416 IN PDEVICE_EXTENSION DeviceExtension
,
417 IN PDATABASE_ENTRY DatabaseEntry
422 MountMgrCreatePointWorker(
423 IN PDEVICE_EXTENSION DeviceExtension
,
424 IN PUNICODE_STRING SymbolicLinkName
,
425 IN PUNICODE_STRING DeviceName
429 QueryPointsFromSymbolicLinkName(
430 IN PDEVICE_EXTENSION DeviceExtension
,
431 IN PUNICODE_STRING SymbolicName
,
436 QueryPointsFromMemory(
437 IN PDEVICE_EXTENSION DeviceExtension
,
439 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
440 IN PUNICODE_STRING SymbolicName OPTIONAL
445 GlobalCreateSymbolicLink(
446 IN PUNICODE_STRING DosName
,
447 IN PUNICODE_STRING DeviceName
451 GlobalDeleteSymbolicLink(
452 IN PUNICODE_STRING DosName
456 QuerySuggestedLinkName(
457 IN PUNICODE_STRING SymbolicName
,
458 OUT PUNICODE_STRING SuggestedLinkName
,
459 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
463 QuerySymbolicLinkNamesFromStorage(
464 IN PDEVICE_EXTENSION DeviceExtension
,
465 IN PDEVICE_INFORMATION DeviceInformation
,
466 IN PUNICODE_STRING SuggestedLinkName
,
467 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks
,
468 OUT PUNICODE_STRING
* SymLinks
,
469 OUT PULONG SymLinkCount
,
474 PSAVED_LINK_INFORMATION
476 IN PDEVICE_EXTENSION DeviceExtension
,
477 IN PMOUNTDEV_UNIQUE_ID UniqueId
482 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
483 IN PUNICODE_STRING DosName
,
484 IN PUNICODE_STRING NewLink
489 IN PUNICODE_STRING SymbolicName
494 OUT PUNICODE_STRING VolumeName
,
495 IN PGUID VolumeGuid OPTIONAL
500 PUNICODE_STRING SymbolicName
504 DeleteSymbolicLinkNameFromMemory(
505 IN PDEVICE_EXTENSION DeviceExtension
,
506 IN PUNICODE_STRING SymbolicLink
,
507 IN BOOLEAN MarkOffline
511 MountMgrQuerySymbolicLink(
512 IN PUNICODE_STRING SymbolicName
,
513 IN OUT PUNICODE_STRING LinkTarget
516 #endif /* _MNTMGR_H_ */