8 #include <ndk/psfuncs.h>
12 #define INIT_SECTION __attribute__((section ("INIT")))
14 #define INIT_SECTION /* Done via alloc_text for MSC */
22 #define IsEqualGUID(rguid1, rguid2) (RtlCompareMemory(rguid1, rguid2, sizeof(GUID)) == sizeof(GUID))
24 #define FILE_READ_PROPERTIES 0x00000008
25 #define FILE_WRITE_PROPERTIES 0x00000010
27 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
30 typedef struct _DEVICE_EXTENSION
32 PDEVICE_OBJECT DeviceObject
; // 0x0
33 PDRIVER_OBJECT DriverObject
; // 0x4
34 LIST_ENTRY DeviceListHead
; // 0x8
35 LIST_ENTRY OfflineDeviceListHead
; // 0x10
36 PVOID NotificationEntry
; // 0x18
37 KSEMAPHORE DeviceLock
; // 0x1C
38 KSEMAPHORE RemoteDatabaseLock
; // 0x30
39 ULONG AutomaticDriveLetter
; // 0x44
40 LIST_ENTRY IrpListHead
; // 0x48
41 ULONG EpicNumber
; // 0x50
42 LIST_ENTRY SavedLinksListHead
; // 0x54
43 BOOLEAN ProcessedSuggestions
; // 0x5C
44 BOOLEAN NoAutoMount
; // 0x5D
45 LIST_ENTRY WorkerQueueListHead
; // 0x60
46 KSEMAPHORE WorkerSemaphore
; // 0x68
47 LONG WorkerReferences
; // 0x7C
48 KSPIN_LOCK WorkerLock
; // 0x80
49 LIST_ENTRY UniqueIdWorkerItemListHead
; // 0x84
50 PMOUNTDEV_UNIQUE_ID DriveLetterData
; // 0x8C
51 UNICODE_STRING RegistryPath
; // 0x90
52 LONG WorkerThreadStatus
; // 0x98
53 LIST_ENTRY OnlineNotificationListHead
; // 0x9C
54 ULONG OnlineNotificationWorkerActive
; // 0xA4
55 ULONG OnlineNotificationCount
; // 0xA8
56 KEVENT OnlineNotificationEvent
; // 0xAC
57 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
; // 0xBC
59 typedef struct _DEVICE_INFORMATION
61 LIST_ENTRY DeviceListEntry
; // 0x00
62 LIST_ENTRY SymbolicLinksListHead
; // 0x08
63 LIST_ENTRY ReplicatedUniqueIdsListHead
; // 0x10
64 LIST_ENTRY AssociatedDevicesHead
; // 0x18
65 UNICODE_STRING SymbolicName
; // 0x20
66 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x28
67 UNICODE_STRING DeviceName
; // 0x2C
68 BOOLEAN KeepLinks
; // 0x34
69 UCHAR SuggestedDriveLetter
; // 0x35
70 BOOLEAN ManuallyRegistered
; // 0x36
71 BOOLEAN Removable
; // 0x37
72 BOOLEAN LetterAssigned
; // 0x38
73 BOOLEAN NeedsReconcile
; // 0x39
74 BOOLEAN NoDatabase
; // 0x3A
75 BOOLEAN SkipNotifications
; // 0x3B
76 ULONG Migrated
; // 0x3C
77 LONG MountState
; // 0x40
78 PVOID TargetDeviceNotificationEntry
; // 0x44
79 PDEVICE_EXTENSION DeviceExtension
; // 0x48
80 } DEVICE_INFORMATION
, *PDEVICE_INFORMATION
; // 0x4C
82 typedef struct _SYMLINK_INFORMATION
84 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
85 UNICODE_STRING Name
; // 0x08
86 BOOLEAN Online
; // 0x10
87 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
89 typedef struct _SAVED_LINK_INFORMATION
91 LIST_ENTRY SavedLinksListEntry
; // 0x0
92 LIST_ENTRY SymbolicLinksListHead
; // 0x8
93 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
94 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
96 typedef struct _UNIQUE_ID_REPLICATE
98 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
99 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
100 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
102 typedef struct _DATABASE_ENTRY
104 ULONG EntrySize
; // 0x00
105 ULONG EntryReferences
; // 0x04
106 USHORT SymbolicNameOffset
; // 0x08
107 USHORT SymbolicNameLength
; // 0x0A
108 USHORT UniqueIdOffset
; // 0x0C
109 USHORT UniqueIdLength
; // 0x0E
110 } DATABASE_ENTRY
, *PDATABASE_ENTRY
; // 0x10
112 typedef struct _ASSOCIATED_DEVICE_ENTRY
114 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
115 PDEVICE_INFORMATION DeviceInformation
; // 0x08
116 UNICODE_STRING String
; // 0x0C
117 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
119 typedef struct _DEVICE_INFORMATION_ENTRY
121 LIST_ENTRY DeviceInformationEntry
; // 0x00
122 PDEVICE_INFORMATION DeviceInformation
; // 0x08
123 } DEVICE_INFORMATION_ENTRY
, *PDEVICE_INFORMATION_ENTRY
; // 0x0C
125 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
127 WORK_QUEUE_ITEM
; // 0x00
128 PDEVICE_EXTENSION DeviceExtension
; // 0x10
129 UNICODE_STRING SymbolicName
; // 0x14
130 } ONLINE_NOTIFICATION_WORK_ITEM
, *PONLINE_NOTIFICATION_WORK_ITEM
; // 0x1C
132 typedef struct _RECONCILE_WORK_ITEM
134 LIST_ENTRY WorkerQueueListEntry
; // 0x00
135 PIO_WORKITEM WorkItem
; // 0x08
136 PWORKER_THREAD_ROUTINE WorkerRoutine
; // 0x0C
137 PVOID Context
; // 0x10
138 PDEVICE_EXTENSION DeviceExtension
; // 0x14
139 PDEVICE_INFORMATION DeviceInformation
; // 0x18
140 } RECONCILE_WORK_ITEM
, *PRECONCILE_WORK_ITEM
; // 0x1C
142 typedef struct _MIGRATE_WORK_ITEM
144 PIO_WORKITEM WorkItem
; // 0x0
145 PDEVICE_INFORMATION DeviceInformation
; // 0x4
146 PKEVENT Event
; // 0x8
147 NTSTATUS Status
; // 0x0C
148 HANDLE Database
; // 0x10
149 } MIGRATE_WORK_ITEM
, *PMIGRATE_WORK_ITEM
; // 0x14
151 typedef struct _UNIQUE_ID_WORK_ITEM
153 LIST_ENTRY UniqueIdWorkerItemListEntry
; // 0x0
154 PIO_WORKITEM WorkItem
; // 0x8
155 PDEVICE_EXTENSION DeviceExtension
; // 0xC
157 PVOID IrpBuffer
; // 0x14
158 PKEVENT Event
; // 0x1C
159 UNICODE_STRING DeviceName
; // 0x20
160 ULONG IrpBufferLength
; // 0x28
161 ULONG StackSize
; // 0x2C
162 } UNIQUE_ID_WORK_ITEM
, *PUNIQUE_ID_WORK_ITEM
; // 0x30
164 /* Memory allocation helpers */
165 #define AllocatePool(Size) ExAllocatePoolWithTag(PagedPool, Size, 'AtnM')
166 #define FreePool(P) ExFreePoolWithTag(P, 'AtnM')
169 #define MAX(a, b) ((a > b) ? a : b)
171 #define LETTER_POSITION 0xC
172 #define COLON_POSITION 0xD
173 #define DRIVE_LETTER_LENGTH 0x1C
177 extern UNICODE_STRING DosDevicesMount
;
178 extern PDEVICE_OBJECT gdeviceObject
;
179 extern UNICODE_STRING ReparseIndex
;
180 extern UNICODE_STRING DeviceFloppy
;
181 extern UNICODE_STRING DeviceMount
;
182 extern UNICODE_STRING DeviceCdRom
;
183 extern UNICODE_STRING SafeVolumes
;
184 extern UNICODE_STRING DosDevices
;
185 extern UNICODE_STRING DosGlobal
;
186 extern UNICODE_STRING Global
;
187 extern UNICODE_STRING Volume
;
188 extern KEVENT UnloadEvent
;
189 extern LONG Unloading
;
191 DRIVER_INITIALIZE DriverEntry
;
196 IN PDEVICE_OBJECT DeviceObject
,
201 MountMgrMountedDeviceArrival(
202 IN PDEVICE_EXTENSION Extension
,
203 IN PUNICODE_STRING SymbolicName
,
204 IN BOOLEAN FromVolume
208 MountMgrMountedDeviceRemoval(
209 IN PDEVICE_EXTENSION Extension
,
210 IN PUNICODE_STRING DeviceName
215 IN PDEVICE_EXTENSION DeviceExtension
,
216 IN PUNICODE_STRING SymbolicName
,
217 IN BOOLEAN DeviceNameGiven
,
218 OUT PDEVICE_INFORMATION
* DeviceInformation
222 MountMgrFreeDeadDeviceInfo(
223 IN PDEVICE_INFORMATION DeviceInformation
227 QueryDeviceInformation(
228 IN PUNICODE_STRING SymbolicName
,
229 OUT PUNICODE_STRING DeviceName OPTIONAL
,
230 OUT PMOUNTDEV_UNIQUE_ID
* UniqueId OPTIONAL
,
231 OUT PBOOLEAN Removable OPTIONAL
,
232 OUT PBOOLEAN GptDriveLetter OPTIONAL
,
233 OUT PBOOLEAN HasGuid OPTIONAL
,
234 IN OUT LPGUID StableGuid OPTIONAL
,
235 OUT PBOOLEAN Valid OPTIONAL
240 IN PDEVICE_INFORMATION DeviceInformation
245 MountmgrReadNoAutoMount(
246 IN PUNICODE_STRING RegistryPath
251 extern PWSTR DatabasePath
;
252 extern PWSTR OfflinePath
;
255 ReconcileThisDatabaseWithMaster(
256 IN PDEVICE_EXTENSION DeviceExtension
,
257 IN PDEVICE_INFORMATION DeviceInformation
261 WaitForRemoteDatabaseSemaphore(
262 IN PDEVICE_EXTENSION DeviceExtension
266 ReleaseRemoteDatabaseSemaphore(
267 IN PDEVICE_EXTENSION DeviceExtension
271 ChangeRemoteDatabaseUniqueId(
272 IN PDEVICE_INFORMATION DeviceInformation
,
273 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
274 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
278 ReconcileAllDatabasesWithMaster(
279 IN PDEVICE_EXTENSION DeviceExtension
283 DeleteFromLocalDatabase(
284 IN PUNICODE_STRING SymbolicLink
,
285 IN PMOUNTDEV_UNIQUE_ID UniqueId
289 DeleteRegistryDriveLetter(
290 IN PMOUNTDEV_UNIQUE_ID UniqueId
294 DeleteNoDriveLetterEntry(
295 IN PMOUNTDEV_UNIQUE_ID UniqueId
300 IN HANDLE RootDirectory
,
301 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation
,
302 IN PUNICODE_STRING FileName OPTIONAL
,
303 OUT PUNICODE_STRING SymbolicName
,
304 OUT PUNICODE_STRING VolumeName
309 IN PDEVICE_INFORMATION DeviceInformation
,
310 IN BOOLEAN MigrateDatabase
314 GetRemoteDatabaseEntry(
316 IN LONG StartingOffset
320 WriteRemoteDatabaseEntry(
323 IN PDATABASE_ENTRY Entry
332 AddRemoteDatabaseEntry(
334 IN PDATABASE_ENTRY Entry
338 DeleteRemoteDatabaseEntry(
340 IN LONG StartingOffset
345 ReconcileThisDatabaseWithMasterWorker(
351 DRIVER_DISPATCH MountMgrDeviceControl
;
355 IssueUniqueIdChangeNotifyWorker(
356 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
357 IN PMOUNTDEV_UNIQUE_ID UniqueId
361 WaitForOnlinesToComplete(
362 IN PDEVICE_EXTENSION DeviceExtension
366 RegisterForTargetDeviceNotification(
367 IN PDEVICE_EXTENSION DeviceExtension
,
368 IN PDEVICE_INFORMATION DeviceInformation
372 SendOnlineNotification(
373 IN PUNICODE_STRING SymbolicName
377 IssueUniqueIdChangeNotify(
378 IN PDEVICE_EXTENSION DeviceExtension
,
379 IN PUNICODE_STRING DeviceName
,
380 IN PMOUNTDEV_UNIQUE_ID UniqueId
384 PostOnlineNotification(
385 IN PDEVICE_EXTENSION DeviceExtension
,
386 IN PUNICODE_STRING SymbolicName
391 IN PDEVICE_EXTENSION DeviceExtension
395 MountMgrNotifyNameChange(
396 IN PDEVICE_EXTENSION DeviceExtension
,
397 IN PUNICODE_STRING DeviceName
,
398 IN BOOLEAN ValidateVolume
403 MountMgrUniqueIdChangeRoutine(
404 IN PDEVICE_EXTENSION DeviceExtension
,
405 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
406 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
410 CreateNoDriveLetterEntry(
411 IN PMOUNTDEV_UNIQUE_ID UniqueId
415 HasNoDriveLetterEntry(
416 IN PMOUNTDEV_UNIQUE_ID UniqueId
421 MountMgrCreatePointWorker(
422 IN PDEVICE_EXTENSION DeviceExtension
,
423 IN PUNICODE_STRING SymbolicLinkName
,
424 IN PUNICODE_STRING DeviceName
428 QueryPointsFromSymbolicLinkName(
429 IN PDEVICE_EXTENSION DeviceExtension
,
430 IN PUNICODE_STRING SymbolicName
,
435 QueryPointsFromMemory(
436 IN PDEVICE_EXTENSION DeviceExtension
,
438 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
439 IN PUNICODE_STRING SymbolicName OPTIONAL
444 GlobalCreateSymbolicLink(
445 IN PUNICODE_STRING DosName
,
446 IN PUNICODE_STRING DeviceName
450 GlobalDeleteSymbolicLink(
451 IN PUNICODE_STRING DosName
455 QuerySuggestedLinkName(
456 IN PUNICODE_STRING SymbolicName
,
457 OUT PUNICODE_STRING SuggestedLinkName
,
458 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
462 QuerySymbolicLinkNamesFromStorage(
463 IN PDEVICE_EXTENSION DeviceExtension
,
464 IN PDEVICE_INFORMATION DeviceInformation
,
465 IN PUNICODE_STRING SuggestedLinkName
,
466 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks
,
467 OUT PUNICODE_STRING
* SymLinks
,
468 OUT PULONG SymLinkCount
,
473 PSAVED_LINK_INFORMATION
475 IN PDEVICE_EXTENSION DeviceExtension
,
476 IN PMOUNTDEV_UNIQUE_ID UniqueId
481 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
482 IN PUNICODE_STRING DosName
,
483 IN PUNICODE_STRING NewLink
488 IN PUNICODE_STRING SymbolicName
493 OUT PUNICODE_STRING VolumeName
,
494 IN PGUID VolumeGuid OPTIONAL
499 PUNICODE_STRING SymbolicName
503 DeleteSymbolicLinkNameFromMemory(
504 IN PDEVICE_EXTENSION DeviceExtension
,
505 IN PUNICODE_STRING SymbolicLink
,
506 IN BOOLEAN MarkOffline
510 MountMgrQuerySymbolicLink(
511 IN PUNICODE_STRING SymbolicName
,
512 IN OUT PUNICODE_STRING LinkTarget
515 #endif /* _MNTMGR_H_ */