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
;
179 DRIVER_INITIALIZE DriverEntry
;
184 IN PDEVICE_OBJECT DeviceObject
,
189 MountMgrMountedDeviceArrival(
190 IN PDEVICE_EXTENSION Extension
,
191 IN PUNICODE_STRING SymbolicName
,
192 IN BOOLEAN FromVolume
196 MountMgrMountedDeviceRemoval(
197 IN PDEVICE_EXTENSION Extension
,
198 IN PUNICODE_STRING DeviceName
203 IN PDEVICE_EXTENSION DeviceExtension
,
204 IN PUNICODE_STRING SymbolicName
,
205 IN BOOLEAN DeviceNameGiven
,
206 OUT PDEVICE_INFORMATION
* DeviceInformation
210 MountMgrFreeDeadDeviceInfo(
211 IN PDEVICE_INFORMATION DeviceInformation
215 QueryDeviceInformation(
216 IN PUNICODE_STRING SymbolicName
,
217 OUT PUNICODE_STRING DeviceName OPTIONAL
,
218 OUT PMOUNTDEV_UNIQUE_ID
* UniqueId OPTIONAL
,
219 OUT PBOOLEAN Removable OPTIONAL
,
220 OUT PBOOLEAN GptDriveLetter OPTIONAL
,
221 OUT PBOOLEAN HasGuid OPTIONAL
,
222 IN OUT LPGUID StableGuid OPTIONAL
,
223 OUT PBOOLEAN Valid OPTIONAL
228 IN PDEVICE_INFORMATION DeviceInformation
232 MountmgrReadNoAutoMount(
233 IN PUNICODE_STRING RegistryPath
238 extern PWSTR DatabasePath
;
239 extern PWSTR OfflinePath
;
242 ReconcileThisDatabaseWithMaster(
243 IN PDEVICE_EXTENSION DeviceExtension
,
244 IN PDEVICE_INFORMATION DeviceInformation
248 WaitForRemoteDatabaseSemaphore(
249 IN PDEVICE_EXTENSION DeviceExtension
253 ReleaseRemoteDatabaseSemaphore(
254 IN PDEVICE_EXTENSION DeviceExtension
258 ChangeRemoteDatabaseUniqueId(
259 IN PDEVICE_INFORMATION DeviceInformation
,
260 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
261 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
265 ReconcileAllDatabasesWithMaster(
266 IN PDEVICE_EXTENSION DeviceExtension
270 DeleteFromLocalDatabase(
271 IN PUNICODE_STRING SymbolicLink
,
272 IN PMOUNTDEV_UNIQUE_ID UniqueId
276 DeleteRegistryDriveLetter(
277 IN PMOUNTDEV_UNIQUE_ID UniqueId
281 DeleteNoDriveLetterEntry(
282 IN PMOUNTDEV_UNIQUE_ID UniqueId
287 IN HANDLE RootDirectory
,
288 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation
,
289 IN PUNICODE_STRING FileName OPTIONAL
,
290 OUT PUNICODE_STRING SymbolicName
,
291 OUT PUNICODE_STRING VolumeName
296 IN PDEVICE_INFORMATION DeviceInformation
,
297 IN BOOLEAN MigrateDatabase
301 GetRemoteDatabaseEntry(
303 IN LONG StartingOffset
307 WriteRemoteDatabaseEntry(
310 IN PDATABASE_ENTRY Entry
319 AddRemoteDatabaseEntry(
321 IN PDATABASE_ENTRY Entry
325 DeleteRemoteDatabaseEntry(
327 IN LONG StartingOffset
332 ReconcileThisDatabaseWithMasterWorker(
338 DRIVER_DISPATCH MountMgrDeviceControl
;
342 IssueUniqueIdChangeNotifyWorker(
343 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
344 IN PMOUNTDEV_UNIQUE_ID UniqueId
348 WaitForOnlinesToComplete(
349 IN PDEVICE_EXTENSION DeviceExtension
353 RegisterForTargetDeviceNotification(
354 IN PDEVICE_EXTENSION DeviceExtension
,
355 IN PDEVICE_INFORMATION DeviceInformation
359 SendOnlineNotification(
360 IN PUNICODE_STRING SymbolicName
364 IssueUniqueIdChangeNotify(
365 IN PDEVICE_EXTENSION DeviceExtension
,
366 IN PUNICODE_STRING DeviceName
,
367 IN PMOUNTDEV_UNIQUE_ID UniqueId
371 PostOnlineNotification(
372 IN PDEVICE_EXTENSION DeviceExtension
,
373 IN PUNICODE_STRING SymbolicName
378 IN PDEVICE_EXTENSION DeviceExtension
382 MountMgrNotifyNameChange(
383 IN PDEVICE_EXTENSION DeviceExtension
,
384 IN PUNICODE_STRING DeviceName
,
385 IN BOOLEAN ValidateVolume
390 MountMgrUniqueIdChangeRoutine(
391 IN PDEVICE_EXTENSION DeviceExtension
,
392 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
393 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
397 CreateNoDriveLetterEntry(
398 IN PMOUNTDEV_UNIQUE_ID UniqueId
402 HasNoDriveLetterEntry(
403 IN PMOUNTDEV_UNIQUE_ID UniqueId
407 UpdateReplicatedUniqueIds(
408 IN PDEVICE_INFORMATION DeviceInformation
,
409 IN PDATABASE_ENTRY DatabaseEntry
414 IN PDEVICE_EXTENSION DeviceExtension
,
415 IN PDATABASE_ENTRY DatabaseEntry
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_ */