#include <ntifs.h>
#include <mountdev.h>
#include <ntddvol.h>
+#include <ntdddisk.h>
#include <wdmguid.h>
#include <ndk/psfuncs.h>
#include <ntdddisk.h>
-/* Enter FIXME */
-#ifdef IsEqualGUID
-#undef IsEqualGUID
+#ifdef __GNUC__
+#define INIT_SECTION __attribute__((section ("INIT")))
+#else
+#define INIT_SECTION /* Done via alloc_text for MSC */
#endif
-#define IsEqualGUID(rguid1, rguid2) (!RtlCompareMemory(rguid1, rguid2, sizeof(GUID)))
-
-#define FILE_READ_PROPERTIES 0x00000008
-#define FILE_WRITE_PROPERTIES 0x00000010
-
-#define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
-/* Leave FIXME */
-
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject; // 0x0
UNICODE_STRING DeviceName; // 0x2C
BOOLEAN KeepLinks; // 0x34
UCHAR SuggestedDriveLetter; // 0x35
- BOOLEAN Volume; // 0x36
+ BOOLEAN ManuallyRegistered; // 0x36
BOOLEAN Removable; // 0x37
BOOLEAN LetterAssigned; // 0x38
BOOLEAN NeedsReconcile; // 0x39
typedef struct _DATABASE_ENTRY
{
ULONG EntrySize; // 0x00
- ULONG DatabaseOffset; // 0x04
+ ULONG EntryReferences; // 0x04
USHORT SymbolicNameOffset; // 0x08
USHORT SymbolicNameLength; // 0x0A
USHORT UniqueIdOffset; // 0x0C
UNICODE_STRING String; // 0x0C
} ASSOCIATED_DEVICE_ENTRY, *PASSOCIATED_DEVICE_ENTRY; // 0x14
+typedef struct _DEVICE_INFORMATION_ENTRY
+{
+ LIST_ENTRY DeviceInformationEntry; // 0x00
+ PDEVICE_INFORMATION DeviceInformation; // 0x08
+} DEVICE_INFORMATION_ENTRY, *PDEVICE_INFORMATION_ENTRY; // 0x0C
+
typedef struct _ONLINE_NOTIFICATION_WORK_ITEM
{
- WORK_QUEUE_ITEM; // 0x00
+ WORK_QUEUE_ITEM WorkItem; // 0x00
PDEVICE_EXTENSION DeviceExtension; // 0x10
UNICODE_STRING SymbolicName; // 0x14
} ONLINE_NOTIFICATION_WORK_ITEM, *PONLINE_NOTIFICATION_WORK_ITEM; // 0x1C
+typedef struct _RECONCILE_WORK_ITEM_CONTEXT
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PDEVICE_INFORMATION DeviceInformation;
+} RECONCILE_WORK_ITEM_CONTEXT, *PRECONCILE_WORK_ITEM_CONTEXT;
+
typedef struct _RECONCILE_WORK_ITEM
{
LIST_ENTRY WorkerQueueListEntry; // 0x00
PIO_WORKITEM WorkItem; // 0x08
PWORKER_THREAD_ROUTINE WorkerRoutine; // 0x0C
PVOID Context; // 0x10
- PDEVICE_EXTENSION DeviceExtension; // 0x14
- PDEVICE_INFORMATION DeviceInformation; // 0x18
+ RECONCILE_WORK_ITEM_CONTEXT; // 0x14
} RECONCILE_WORK_ITEM, *PRECONCILE_WORK_ITEM; // 0x1C
typedef struct _MIGRATE_WORK_ITEM
IN PDEVICE_INFORMATION DeviceInformation
);
+INIT_SECTION
+BOOLEAN
+MountmgrReadNoAutoMount(
+ IN PUNICODE_STRING RegistryPath
+);
+
/* database.c */
extern PWSTR DatabasePath;
OUT PUNICODE_STRING VolumeName
);
+HANDLE
+OpenRemoteDatabase(
+ IN PDEVICE_INFORMATION DeviceInformation,
+ IN BOOLEAN MigrateDatabase
+);
+
+PDATABASE_ENTRY
+GetRemoteDatabaseEntry(
+ IN HANDLE Database,
+ IN LONG StartingOffset
+);
+
+NTSTATUS
+WriteRemoteDatabaseEntry(
+ IN HANDLE Database,
+ IN LONG Offset,
+ IN PDATABASE_ENTRY Entry
+);
+
+NTSTATUS
+CloseRemoteDatabase(
+ IN HANDLE Database
+);
+
+NTSTATUS
+AddRemoteDatabaseEntry(
+ IN HANDLE Database,
+ IN PDATABASE_ENTRY Entry
+);
+
+NTSTATUS
+DeleteRemoteDatabaseEntry(
+ IN HANDLE Database,
+ IN LONG StartingOffset
+);
+
+VOID
+NTAPI
+ReconcileThisDatabaseWithMasterWorker(
+ IN PVOID Parameter
+);
+
/* device.c */
DRIVER_DISPATCH MountMgrDeviceControl;
IN PMOUNTDEV_UNIQUE_ID UniqueId
);
+VOID
+UpdateReplicatedUniqueIds(
+ IN PDEVICE_INFORMATION DeviceInformation,
+ IN PDATABASE_ENTRY DatabaseEntry
+);
+
+BOOLEAN
+IsUniqueIdPresent(
+ IN PDEVICE_EXTENSION DeviceExtension,
+ IN PDATABASE_ENTRY DatabaseEntry
+);
+
/* point.c */
NTSTATUS
MountMgrCreatePointWorker(
IN BOOLEAN MarkOffline
);
+NTSTATUS
+MountMgrQuerySymbolicLink(
+ IN PUNICODE_STRING SymbolicName,
+ IN OUT PUNICODE_STRING LinkTarget
+);
+
#endif /* _MNTMGR_H_ */