8 #include <ndk/psfuncs.h>
16 #define IsEqualGUID(rguid1, rguid2) (RtlCompareMemory(rguid1, rguid2, sizeof(GUID)) == sizeof(GUID))
18 #define FILE_READ_PROPERTIES 0x00000008
19 #define FILE_WRITE_PROPERTIES 0x00000010
21 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
24 typedef struct _DEVICE_EXTENSION
26 PDEVICE_OBJECT DeviceObject
; // 0x0
27 PDRIVER_OBJECT DriverObject
; // 0x4
28 LIST_ENTRY DeviceListHead
; // 0x8
29 LIST_ENTRY OfflineDeviceListHead
; // 0x10
30 PVOID NotificationEntry
; // 0x18
31 KSEMAPHORE DeviceLock
; // 0x1C
32 KSEMAPHORE RemoteDatabaseLock
; // 0x30
33 ULONG AutomaticDriveLetter
; // 0x44
34 LIST_ENTRY IrpListHead
; // 0x48
35 ULONG EpicNumber
; // 0x50
36 LIST_ENTRY SavedLinksListHead
; // 0x54
37 BOOLEAN ProcessedSuggestions
; // 0x5C
38 BOOLEAN NoAutoMount
; // 0x5D
39 LIST_ENTRY WorkerQueueListHead
; // 0x60
40 KSEMAPHORE WorkerSemaphore
; // 0x68
41 LONG WorkerReferences
; // 0x7C
42 KSPIN_LOCK WorkerLock
; // 0x80
43 LIST_ENTRY UniqueIdWorkerItemListHead
; // 0x84
44 PMOUNTDEV_UNIQUE_ID DriveLetterData
; // 0x8C
45 UNICODE_STRING RegistryPath
; // 0x90
46 LONG WorkerThreadStatus
; // 0x98
47 LIST_ENTRY OnlineNotificationListHead
; // 0x9C
48 ULONG OnlineNotificationWorkerActive
; // 0xA4
49 ULONG OnlineNotificationCount
; // 0xA8
50 KEVENT OnlineNotificationEvent
; // 0xAC
51 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
; // 0xBC
53 typedef struct _DEVICE_INFORMATION
55 LIST_ENTRY DeviceListEntry
; // 0x00
56 LIST_ENTRY SymbolicLinksListHead
; // 0x08
57 LIST_ENTRY ReplicatedUniqueIdsListHead
; // 0x10
58 LIST_ENTRY AssociatedDevicesHead
; // 0x18
59 UNICODE_STRING SymbolicName
; // 0x20
60 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x28
61 UNICODE_STRING DeviceName
; // 0x2C
62 BOOLEAN KeepLinks
; // 0x34
63 UCHAR SuggestedDriveLetter
; // 0x35
64 BOOLEAN Volume
; // 0x36
65 BOOLEAN Removable
; // 0x37
66 BOOLEAN LetterAssigned
; // 0x38
67 BOOLEAN NeedsReconcile
; // 0x39
68 BOOLEAN NoDatabase
; // 0x3A
69 BOOLEAN SkipNotifications
; // 0x3B
70 ULONG Migrated
; // 0x3C
71 LONG MountState
; // 0x40
72 PVOID TargetDeviceNotificationEntry
; // 0x44
73 PDEVICE_EXTENSION DeviceExtension
; // 0x48
74 } DEVICE_INFORMATION
, *PDEVICE_INFORMATION
; // 0x4C
76 typedef struct _SYMLINK_INFORMATION
78 LIST_ENTRY SymbolicLinksListEntry
; // 0x00
79 UNICODE_STRING Name
; // 0x08
80 BOOLEAN Online
; // 0x10
81 } SYMLINK_INFORMATION
, *PSYMLINK_INFORMATION
; // 0x14
83 typedef struct _SAVED_LINK_INFORMATION
85 LIST_ENTRY SavedLinksListEntry
; // 0x0
86 LIST_ENTRY SymbolicLinksListHead
; // 0x8
87 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x10
88 } SAVED_LINK_INFORMATION
, *PSAVED_LINK_INFORMATION
; // 0x14
90 typedef struct _UNIQUE_ID_REPLICATE
92 LIST_ENTRY ReplicatedUniqueIdsListEntry
; // 0x0
93 PMOUNTDEV_UNIQUE_ID UniqueId
; // 0x8
94 } UNIQUE_ID_REPLICATE
, *PUNIQUE_ID_REPLICATE
; // 0xC
96 typedef struct _DATABASE_ENTRY
98 ULONG EntrySize
; // 0x00
99 ULONG DatabaseOffset
; // 0x04
100 USHORT SymbolicNameOffset
; // 0x08
101 USHORT SymbolicNameLength
; // 0x0A
102 USHORT UniqueIdOffset
; // 0x0C
103 USHORT UniqueIdLength
; // 0x0E
104 } DATABASE_ENTRY
, *PDATABASE_ENTRY
; // 0x10
106 typedef struct _ASSOCIATED_DEVICE_ENTRY
108 LIST_ENTRY AssociatedDevicesEntry
; // 0x00
109 PDEVICE_INFORMATION DeviceInformation
; // 0x08
110 UNICODE_STRING String
; // 0x0C
111 } ASSOCIATED_DEVICE_ENTRY
, *PASSOCIATED_DEVICE_ENTRY
; // 0x14
113 typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
115 WORK_QUEUE_ITEM
; // 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
122 LIST_ENTRY WorkerQueueListEntry
; // 0x00
123 PIO_WORKITEM WorkItem
; // 0x08
124 PWORKER_THREAD_ROUTINE WorkerRoutine
; // 0x0C
125 PVOID Context
; // 0x10
126 PDEVICE_EXTENSION DeviceExtension
; // 0x14
127 PDEVICE_INFORMATION DeviceInformation
; // 0x18
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
233 extern PWSTR DatabasePath
;
234 extern PWSTR OfflinePath
;
237 ReconcileThisDatabaseWithMaster(
238 IN PDEVICE_EXTENSION DeviceExtension
,
239 IN PDEVICE_INFORMATION DeviceInformation
243 WaitForRemoteDatabaseSemaphore(
244 IN PDEVICE_EXTENSION DeviceExtension
248 ReleaseRemoteDatabaseSemaphore(
249 IN PDEVICE_EXTENSION DeviceExtension
253 ChangeRemoteDatabaseUniqueId(
254 IN PDEVICE_INFORMATION DeviceInformation
,
255 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
256 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
260 ReconcileAllDatabasesWithMaster(
261 IN PDEVICE_EXTENSION DeviceExtension
265 DeleteFromLocalDatabase(
266 IN PUNICODE_STRING SymbolicLink
,
267 IN PMOUNTDEV_UNIQUE_ID UniqueId
271 DeleteRegistryDriveLetter(
272 IN PMOUNTDEV_UNIQUE_ID UniqueId
276 DeleteNoDriveLetterEntry(
277 IN PMOUNTDEV_UNIQUE_ID UniqueId
282 IN HANDLE RootDirectory
,
283 IN PFILE_REPARSE_POINT_INFORMATION ReparsePointInformation
,
284 IN PUNICODE_STRING FileName OPTIONAL
,
285 OUT PUNICODE_STRING SymbolicName
,
286 OUT PUNICODE_STRING VolumeName
291 DRIVER_DISPATCH MountMgrDeviceControl
;
295 IssueUniqueIdChangeNotifyWorker(
296 IN PUNIQUE_ID_WORK_ITEM WorkItem
,
297 IN PMOUNTDEV_UNIQUE_ID UniqueId
301 WaitForOnlinesToComplete(
302 IN PDEVICE_EXTENSION DeviceExtension
306 RegisterForTargetDeviceNotification(
307 IN PDEVICE_EXTENSION DeviceExtension
,
308 IN PDEVICE_INFORMATION DeviceInformation
312 SendOnlineNotification(
313 IN PUNICODE_STRING SymbolicName
317 IssueUniqueIdChangeNotify(
318 IN PDEVICE_EXTENSION DeviceExtension
,
319 IN PUNICODE_STRING DeviceName
,
320 IN PMOUNTDEV_UNIQUE_ID UniqueId
324 PostOnlineNotification(
325 IN PDEVICE_EXTENSION DeviceExtension
,
326 IN PUNICODE_STRING SymbolicName
331 IN PDEVICE_EXTENSION DeviceExtension
335 MountMgrNotifyNameChange(
336 IN PDEVICE_EXTENSION DeviceExtension
,
337 IN PUNICODE_STRING DeviceName
,
338 IN BOOLEAN ValidateVolume
343 MountMgrUniqueIdChangeRoutine(
344 IN PDEVICE_EXTENSION DeviceExtension
,
345 IN PMOUNTDEV_UNIQUE_ID OldUniqueId
,
346 IN PMOUNTDEV_UNIQUE_ID NewUniqueId
350 CreateNoDriveLetterEntry(
351 IN PMOUNTDEV_UNIQUE_ID UniqueId
355 HasNoDriveLetterEntry(
356 IN PMOUNTDEV_UNIQUE_ID UniqueId
361 MountMgrCreatePointWorker(
362 IN PDEVICE_EXTENSION DeviceExtension
,
363 IN PUNICODE_STRING SymbolicLinkName
,
364 IN PUNICODE_STRING DeviceName
368 QueryPointsFromSymbolicLinkName(
369 IN PDEVICE_EXTENSION DeviceExtension
,
370 IN PUNICODE_STRING SymbolicName
,
375 QueryPointsFromMemory(
376 IN PDEVICE_EXTENSION DeviceExtension
,
378 IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL
,
379 IN PUNICODE_STRING SymbolicName OPTIONAL
384 GlobalCreateSymbolicLink(
385 IN PUNICODE_STRING DosName
,
386 IN PUNICODE_STRING DeviceName
390 GlobalDeleteSymbolicLink(
391 IN PUNICODE_STRING DosName
395 QuerySuggestedLinkName(
396 IN PUNICODE_STRING SymbolicName
,
397 OUT PUNICODE_STRING SuggestedLinkName
,
398 OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks
402 QuerySymbolicLinkNamesFromStorage(
403 IN PDEVICE_EXTENSION DeviceExtension
,
404 IN PDEVICE_INFORMATION DeviceInformation
,
405 IN PUNICODE_STRING SuggestedLinkName
,
406 IN BOOLEAN UseOnlyIfThereAreNoOtherLinks
,
407 OUT PUNICODE_STRING
* SymLinks
,
408 OUT PULONG SymLinkCount
,
413 PSAVED_LINK_INFORMATION
415 IN PDEVICE_EXTENSION DeviceExtension
,
416 IN PMOUNTDEV_UNIQUE_ID UniqueId
421 IN PSAVED_LINK_INFORMATION SavedLinkInformation
,
422 IN PUNICODE_STRING DosName
,
423 IN PUNICODE_STRING NewLink
428 IN PUNICODE_STRING SymbolicName
433 OUT PUNICODE_STRING VolumeName
,
434 IN PGUID VolumeGuid OPTIONAL
439 PUNICODE_STRING SymbolicName
443 DeleteSymbolicLinkNameFromMemory(
444 IN PDEVICE_EXTENSION DeviceExtension
,
445 IN PUNICODE_STRING SymbolicLink
,
446 IN BOOLEAN MarkOffline
449 #endif /* _MNTMGR_H_ */