9 #include <ndk/psfuncs.h>
13 #define INIT_SECTION __attribute__((section ("INIT")))
15 #define INIT_SECTION /* Done via alloc_text for MSC */
19 #define FILE_READ_PROPERTIES 0x00000008
20 #define FILE_WRITE_PROPERTIES 0x00000010
23 typedef struct _DEVICE_EXTENSION
25 PDEVICE_OBJECT DeviceObject
; // 0x0
26 PDRIVER_OBJECT DriverObject
; // 0x4
27 LIST_ENTRY DeviceListHead
; // 0x8
28 LIST_ENTRY OfflineDeviceListHead
; // 0x10
29 PVOID NotificationEntry
; // 0x18
30 KSEMAPHORE DeviceLock
; // 0x1C
31 KSEMAPHORE RemoteDatabaseLock
; // 0x30
32 ULONG AutomaticDriveLetter
; // 0x44
33 LIST_ENTRY IrpListHead
; // 0x48
34 ULONG EpicNumber
; // 0x50
35 LIST_ENTRY SavedLinksListHead
; // 0x54
36 BOOLEAN ProcessedSuggestions
; // 0x5C
37 BOOLEAN NoAutoMount
; // 0x5D
38 LIST_ENTRY WorkerQueueListHead
; // 0x60
39 KSEMAPHORE WorkerSemaphore
; // 0x68
40 LONG WorkerReferences
; // 0x7C
41 KSPIN_LOCK WorkerLock
; // 0x80
42 LIST_ENTRY UniqueIdWorkerItemListHead
; // 0x84
43 PMOUNTDEV_UNIQUE_ID DriveLetterData
; // 0x8C
44 UNICODE_STRING RegistryPath
; // 0x90
45 LONG WorkerThreadStatus
; // 0x98
46 LIST_ENTRY OnlineNotificationListHead
; // 0x9C
47 ULONG OnlineNotificationWorkerActive
; // 0xA4
48 ULONG OnlineNotificationCount
; // 0xA8
49 KEVENT OnlineNotificationEvent
; // 0xAC
50 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
; // 0xBC
52 typedef struct _DEVICE_INFORMATION
54 LIST_ENTRY DeviceListEntry
; // 0x00
55 LIST_ENTRY SymbolicLinksListHead
; // 0x08
56 LIST_ENTRY ReplicatedUniqueIdsListHead
; // 0x10
57 LIST_ENTRY AssociatedDevicesHead
; // 0x18
58 UNICODE_STRING SymbolicName
; // 0x20
59 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x28
60 UNICODE_STRING DeviceName
; // 0x2C
61 BOOLEAN KeepLinks
; // 0x34
62 UCHAR SuggestedDriveLetter
; // 0x35
63 BOOLEAN ManuallyRegistered
; // 0x36
64 BOOLEAN Removable
; // 0x37
65 BOOLEAN LetterAssigned
; // 0x38
66 BOOLEAN NeedsReconcile
; // 0x39
67 BOOLEAN NoDatabase
; // 0x3A
68 BOOLEAN SkipNotifications
; // 0x3B
69 ULONG Migrated
; // 0x3C
70 LONG MountState
; // 0x40
71 PVOID TargetDeviceNotificationEntry
; // 0x44
72 PDEVICE_EXTENSION DeviceExtension
; // 0x48
73 } DEVICE_INFORMATION
, *PDEVICE_INFORMATION
; // 0x4C
75 typedef struct _SYMLINK_INFORMATION
77 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
78 UNICODE_STRING Name
; // 0x08
79 BOOLEAN Online
; // 0x10
80 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
82 typedef struct _SAVED_LINK_INFORMATION
84 LIST_ENTRY SavedLinksListEntry
; // 0x0
85 LIST_ENTRY SymbolicLinksListHead
; // 0x8
86 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
87 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
89 typedef struct _UNIQUE_ID_REPLICATE
91 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
92 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
93 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
95 typedef struct _DATABASE_ENTRY
97 ULONG EntrySize
; // 0x00
98 ULONG EntryReferences
; // 0x04
99 USHORT SymbolicNameOffset
; // 0x08
100 USHORT SymbolicNameLength
; // 0x0A
101 USHORT UniqueIdOffset
; // 0x0C
102 USHORT UniqueIdLength
; // 0x0E
103 } DATABASE_ENTRY
, *PDATABASE_ENTRY
; // 0x10
105 typedef struct _ASSOCIATED_DEVICE_ENTRY
107 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
108 PDEVICE_INFORMATION DeviceInformation
; // 0x08
109 UNICODE_STRING String
; // 0x0C
110 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
112 typedef struct _DEVICE_INFORMATION_ENTRY
114 LIST_ENTRY DeviceInformationEntry
; // 0x00
115 PDEVICE_INFORMATION DeviceInformation
; // 0x08
116 } DEVICE_INFORMATION_ENTRY
, *PDEVICE_INFORMATION_ENTRY
; // 0x0C
118 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
120 WORK_QUEUE_ITEM
; // 0x00
121 PDEVICE_EXTENSION DeviceExtension
; // 0x10
122 UNICODE_STRING SymbolicName
; // 0x14
123 } ONLINE_NOTIFICATION_WORK_ITEM
, *PONLINE_NOTIFICATION_WORK_ITEM
; // 0x1C
125 typedef struct _RECONCILE_WORK_ITEM_CONTEXT
127 PDEVICE_EXTENSION DeviceExtension
;
128 PDEVICE_INFORMATION DeviceInformation
;
129 } RECONCILE_WORK_ITEM_CONTEXT
, *PRECONCILE_WORK_ITEM_CONTEXT
;
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 RECONCILE_WORK_ITEM_CONTEXT
; // 0x14
138 } RECONCILE_WORK_ITEM
, *PRECONCILE_WORK_ITEM
; // 0x1C
140 typedef struct _MIGRATE_WORK_ITEM
142 PIO_WORKITEM WorkItem
; // 0x0
143 PDEVICE_INFORMATION DeviceInformation
; // 0x4
144 PKEVENT Event
; // 0x8
145 NTSTATUS Status
; // 0x0C
146 HANDLE Database
; // 0x10
147 } MIGRATE_WORK_ITEM
, *PMIGRATE_WORK_ITEM
; // 0x14
149 typedef struct _UNIQUE_ID_WORK_ITEM
151 LIST_ENTRY UniqueIdWorkerItemListEntry
; // 0x0
152 PIO_WORKITEM WorkItem
; // 0x8
153 PDEVICE_EXTENSION DeviceExtension
; // 0xC
155 PVOID IrpBuffer
; // 0x14
156 PKEVENT Event
; // 0x1C
157 UNICODE_STRING DeviceName
; // 0x20
158 ULONG IrpBufferLength
; // 0x28
159 ULONG StackSize
; // 0x2C
160 } UNIQUE_ID_WORK_ITEM
, *PUNIQUE_ID_WORK_ITEM
; // 0x30
162 /* Memory allocation helpers */
163 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
164 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
167 #define MAX(a, b) ((a > b) ? a : b)
169 #define LETTER_POSITION 0xC
170 #define COLON_POSITION 0xD
171 #define DRIVE_LETTER_LENGTH 0x1C
175 extern UNICODE_STRING DosDevicesMount
;
176 extern PDEVICE_OBJECT gdeviceObject
;
177 extern UNICODE_STRING ReparseIndex
;
178 extern UNICODE_STRING DeviceFloppy
;
179 extern UNICODE_STRING DeviceMount
;
180 extern UNICODE_STRING DeviceCdRom
;
181 extern UNICODE_STRING SafeVolumes
;
182 extern UNICODE_STRING DosDevices
;
183 extern UNICODE_STRING DosGlobal
;
184 extern UNICODE_STRING Global
;
185 extern UNICODE_STRING Volume
;
186 extern KEVENT UnloadEvent
;
187 extern LONG Unloading
;
189 DRIVER_INITIALIZE DriverEntry
;
194 IN PDEVICE_OBJECT DeviceObject
,
199 MountMgrMountedDeviceArrival(
200 IN PDEVICE_EXTENSION Extension
,
201 IN PUNICODE_STRING SymbolicName
,
202 IN BOOLEAN FromVolume
206 MountMgrMountedDeviceRemoval(
207 IN PDEVICE_EXTENSION Extension
,
208 IN PUNICODE_STRING DeviceName
213 IN PDEVICE_EXTENSION DeviceExtension
,
214 IN PUNICODE_STRING SymbolicName
,
215 IN BOOLEAN DeviceNameGiven
,
216 OUT PDEVICE_INFORMATION
* DeviceInformation
220 MountMgrFreeDeadDeviceInfo(
221 IN PDEVICE_INFORMATION DeviceInformation
225 QueryDeviceInformation(
226 IN PUNICODE_STRING SymbolicName
,
227 OUT PUNICODE_STRING DeviceName OPTIONAL
,
228 OUT PMOUNTDEV_UNIQUE_ID
* UniqueId OPTIONAL
,
229 OUT PBOOLEAN Removable OPTIONAL
,
230 OUT PBOOLEAN GptDriveLetter OPTIONAL
,
231 OUT PBOOLEAN HasGuid OPTIONAL
,
232 IN OUT LPGUID StableGuid OPTIONAL
,
233 OUT PBOOLEAN Valid OPTIONAL
238 IN PDEVICE_INFORMATION DeviceInformation
243 MountmgrReadNoAutoMount(
244 IN PUNICODE_STRING RegistryPath
249 extern PWSTR DatabasePath
;
250 extern PWSTR OfflinePath
;
253 ReconcileThisDatabaseWithMaster(
254 IN PDEVICE_EXTENSION DeviceExtension
,
255 IN PDEVICE_INFORMATION DeviceInformation
259 WaitForRemoteDatabaseSemaphore(
260 IN PDEVICE_EXTENSION DeviceExtension
264 ReleaseRemoteDatabaseSemaphore(
265 IN PDEVICE_EXTENSION DeviceExtension
269 ChangeRemoteDatabaseUniqueId(
270 IN PDEVICE_INFORMATION DeviceInformation
,
271 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
272 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
276 ReconcileAllDatabasesWithMaster(
277 IN PDEVICE_EXTENSION DeviceExtension
281 DeleteFromLocalDatabase(
282 IN PUNICODE_STRING SymbolicLink
,
283 IN PMOUNTDEV_UNIQUE_ID UniqueId
287 DeleteRegistryDriveLetter(
288 IN PMOUNTDEV_UNIQUE_ID UniqueId
292 DeleteNoDriveLetterEntry(
293 IN PMOUNTDEV_UNIQUE_ID UniqueId
298 IN HANDLE RootDirectory
,
299 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation
,
300 IN PUNICODE_STRING FileName OPTIONAL
,
301 OUT PUNICODE_STRING SymbolicName
,
302 OUT PUNICODE_STRING VolumeName
307 IN PDEVICE_INFORMATION DeviceInformation
,
308 IN BOOLEAN MigrateDatabase
312 GetRemoteDatabaseEntry(
314 IN LONG StartingOffset
318 WriteRemoteDatabaseEntry(
321 IN PDATABASE_ENTRY Entry
330 AddRemoteDatabaseEntry(
332 IN PDATABASE_ENTRY Entry
336 DeleteRemoteDatabaseEntry(
338 IN LONG StartingOffset
343 ReconcileThisDatabaseWithMasterWorker(
349 DRIVER_DISPATCH MountMgrDeviceControl
;
353 IssueUniqueIdChangeNotifyWorker(
354 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
355 IN PMOUNTDEV_UNIQUE_ID UniqueId
359 WaitForOnlinesToComplete(
360 IN PDEVICE_EXTENSION DeviceExtension
364 RegisterForTargetDeviceNotification(
365 IN PDEVICE_EXTENSION DeviceExtension
,
366 IN PDEVICE_INFORMATION DeviceInformation
370 SendOnlineNotification(
371 IN PUNICODE_STRING SymbolicName
375 IssueUniqueIdChangeNotify(
376 IN PDEVICE_EXTENSION DeviceExtension
,
377 IN PUNICODE_STRING DeviceName
,
378 IN PMOUNTDEV_UNIQUE_ID UniqueId
382 PostOnlineNotification(
383 IN PDEVICE_EXTENSION DeviceExtension
,
384 IN PUNICODE_STRING SymbolicName
389 IN PDEVICE_EXTENSION DeviceExtension
393 MountMgrNotifyNameChange(
394 IN PDEVICE_EXTENSION DeviceExtension
,
395 IN PUNICODE_STRING DeviceName
,
396 IN BOOLEAN ValidateVolume
401 MountMgrUniqueIdChangeRoutine(
402 IN PDEVICE_EXTENSION DeviceExtension
,
403 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
404 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
408 CreateNoDriveLetterEntry(
409 IN PMOUNTDEV_UNIQUE_ID UniqueId
413 HasNoDriveLetterEntry(
414 IN PMOUNTDEV_UNIQUE_ID UniqueId
418 UpdateReplicatedUniqueIds(
419 IN PDEVICE_INFORMATION DeviceInformation
,
420 IN PDATABASE_ENTRY DatabaseEntry
425 IN PDEVICE_EXTENSION DeviceExtension
,
426 IN PDATABASE_ENTRY DatabaseEntry
431 MountMgrCreatePointWorker(
432 IN PDEVICE_EXTENSION DeviceExtension
,
433 IN PUNICODE_STRING SymbolicLinkName
,
434 IN PUNICODE_STRING DeviceName
438 QueryPointsFromSymbolicLinkName(
439 IN PDEVICE_EXTENSION DeviceExtension
,
440 IN PUNICODE_STRING SymbolicName
,
445 QueryPointsFromMemory(
446 IN PDEVICE_EXTENSION DeviceExtension
,
448 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
449 IN PUNICODE_STRING SymbolicName OPTIONAL
454 GlobalCreateSymbolicLink(
455 IN PUNICODE_STRING DosName
,
456 IN PUNICODE_STRING DeviceName
460 GlobalDeleteSymbolicLink(
461 IN PUNICODE_STRING DosName
465 QuerySuggestedLinkName(
466 IN PUNICODE_STRING SymbolicName
,
467 OUT PUNICODE_STRING SuggestedLinkName
,
468 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
472 QuerySymbolicLinkNamesFromStorage(
473 IN PDEVICE_EXTENSION DeviceExtension
,
474 IN PDEVICE_INFORMATION DeviceInformation
,
475 IN PUNICODE_STRING SuggestedLinkName
,
476 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks
,
477 OUT PUNICODE_STRING
* SymLinks
,
478 OUT PULONG SymLinkCount
,
483 PSAVED_LINK_INFORMATION
485 IN PDEVICE_EXTENSION DeviceExtension
,
486 IN PMOUNTDEV_UNIQUE_ID UniqueId
491 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
492 IN PUNICODE_STRING DosName
,
493 IN PUNICODE_STRING NewLink
498 IN PUNICODE_STRING SymbolicName
503 OUT PUNICODE_STRING VolumeName
,
504 IN PGUID VolumeGuid OPTIONAL
509 PUNICODE_STRING SymbolicName
513 DeleteSymbolicLinkNameFromMemory(
514 IN PDEVICE_EXTENSION DeviceExtension
,
515 IN PUNICODE_STRING SymbolicLink
,
516 IN BOOLEAN MarkOffline
520 MountMgrQuerySymbolicLink(
521 IN PUNICODE_STRING SymbolicName
,
522 IN OUT PUNICODE_STRING LinkTarget
525 #endif /* _MNTMGR_H_ */