32 #if defined(ALLOC_PRAGMA) 33 #pragma alloc_text(INIT, MountmgrReadNoAutoMount) 34 #pragma alloc_text(INIT, DriverEntry) 38 GUID MountedDevicesGuid = {0x53F5630D, 0xB6BF, 0x11D0, {0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B}};
45 #define Cunc_LETTER_POSITION 4 94 for (NextEntry = DeviceInformation->SymbolicLinksListHead.
Flink;
95 NextEntry != &DeviceInformation->SymbolicLinksListHead;
96 NextEntry = NextEntry->
Flink)
122 DriveLetter->Buffer =
AllocatePool(DriveLetter->MaximumLength);
123 if (!DriveLetter->Buffer)
250 *GptDriveLetter =
TRUE;
261 sizeof(GptAttributes),
285 else if (GptAttributes.
GptAttributes & GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER)
287 *GptDriveLetter =
FALSE;
345 &StorageDeviceNumber,
346 sizeof(StorageDeviceNumber),
672 for (NextEntry = DeviceExtension->DeviceListHead.
Flink;
673 NextEntry != &(DeviceExtension->DeviceListHead);
674 NextEntry = NextEntry->
Flink)
687 if (!DeviceNameGiven)
693 if (NextEntry == &(DeviceExtension->DeviceListHead))
708 FreePool(DeviceInformation->SymbolicName.Buffer);
724 while (!
IsListEmpty(&(DeviceInformation->SymbolicLinksListHead)))
726 NextEntry =
RemoveHeadList(&(DeviceInformation->SymbolicLinksListHead));
734 while (!
IsListEmpty(&(DeviceInformation->ReplicatedUniqueIdsListHead)))
736 NextEntry =
RemoveHeadList(&(DeviceInformation->ReplicatedUniqueIdsListHead));
743 while (!
IsListEmpty(&(DeviceInformation->AssociatedDevicesHead)))
745 NextEntry =
RemoveHeadList(&(DeviceInformation->AssociatedDevicesHead));
753 FreePool(DeviceInformation->SymbolicName.Buffer);
754 if (DeviceInformation->KeepLinks)
756 FreePool(DeviceInformation->UniqueId);
758 FreePool(DeviceInformation->DeviceName.Buffer);
761 if (DeviceInformation->TargetDeviceNotificationEntry)
777 while (!
IsListEmpty(&(SavedLinkInformation->SymbolicLinksListHead)))
779 NextEntry =
RemoveHeadList(&(SavedLinkInformation->SymbolicLinksListHead));
789 FreePool(SavedLinkInformation->UniqueId);
814 if (DeviceExtension->RegistryPath.Buffer)
816 FreePool(DeviceExtension->RegistryPath.Buffer);
817 DeviceExtension->RegistryPath.Buffer =
NULL;
845 while (!
IsListEmpty(&(DeviceExtension->OfflineDeviceListHead)))
847 NextEntry =
RemoveHeadList(&(DeviceExtension->OfflineDeviceListHead));
853 while (!
IsListEmpty(&(DeviceExtension->SavedLinksListHead)))
855 NextEntry =
RemoveHeadList(&(DeviceExtension->SavedLinksListHead));
861 while (!
IsListEmpty(&(DeviceExtension->UniqueIdWorkerItemListHead)))
863 NextEntry =
RemoveHeadList(&(DeviceExtension->UniqueIdWorkerItemListHead));
885 if (DeviceExtension->DriveLetterData)
887 FreePool(DeviceExtension->DriveLetterData);
888 DeviceExtension->DriveLetterData =
NULL;
954 BOOLEAN HasGuid, HasGptDriveLetter, Valid, UseOnlyIfThereAreNoOtherLinks, IsDrvLetter, IsOff, IsVolumeName, LinkError;
958 if (!DeviceInformation)
996 for (NextEntry = DeviceExtension->OfflineDeviceListHead.
Flink;
997 NextEntry != &(DeviceExtension->OfflineDeviceListHead);
998 NextEntry = NextEntry->
Flink)
1008 if (NextEntry != &(DeviceExtension->OfflineDeviceListHead))
1023 DeviceInformation->
UniqueId = UniqueId;
1024 DeviceInformation->
DeviceName = TargetDeviceName;
1028 if (DeviceExtension->DriveLetterData && UniqueId->
UniqueIdLength == DeviceExtension->DriveLetterData->UniqueIdLength)
1040 &UseOnlyIfThereAreNoOtherLinks);
1056 for (NextEntry = DeviceExtension->DeviceListHead.
Flink;
1057 NextEntry != &(DeviceExtension->DeviceListHead);
1058 NextEntry = NextEntry->
Flink)
1069 if (NextEntry != &(DeviceExtension->DeviceListHead))
1071 if (SuggestedLinkName.
Buffer)
1089 (SuggestedLinkName.
Buffer) ? &SuggestedLinkName :
NULL,
1090 UseOnlyIfThereAreNoOtherLinks,
1150 for (
i = 0;
i < SymLinkCount;
i++)
1171 if (SuggestedLinkName.
Buffer)
1186 IsDrvLetter =
FALSE;
1188 IsVolumeName =
FALSE;
1190 for (
i = 0;
i < SymLinkCount;
i++)
1195 IsVolumeName =
TRUE;
1217 if ((SavedLinkInformation && !
RedirectSavedLink(SavedLinkInformation, &(SymLinks[
i]), &TargetDeviceName)) ||
1218 !SavedLinkInformation)
1231 IsDrvLetter =
FALSE;
1249 if (!SymlinkInformation)
1256 SymlinkInformation->
Name = SymLinks[
i];
1266 NextEntry = NextEntry->
Flink)
1274 if (SavedLinkInformation)
1298 if (!SymlinkInformation)
1321 else if ((DeviceExtension->NoAutoMount || DeviceInformation->
Removable) &&
1322 DeviceExtension->AutomaticDriveLetter &&
1346 if (!SymlinkInformation)
1352 SymlinkInformation->
Name = DriveLetter;
1363 if (!ManuallyRegistered)
1388 if (DeviceExtension->NoAutoMount || IsDrvLetter)
1422 if (DeviceExtension->AutomaticDriveLetter)
1428 NextEntry = DeviceExtension->DeviceListHead.
Flink;
1430 while (CurrentDevice != DeviceInformation)
1437 NextEntry = NextEntry->
Flink;
1465 for (NextEntry = DeviceExtension->DeviceListHead.
Flink;
1466 NextEntry != &(DeviceExtension->DeviceListHead);
1467 NextEntry = NextEntry->
Flink)
1478 if (NextEntry != &(DeviceExtension->DeviceListHead))
1484 if (!SavedLinkInformation)
1545 for (NextEntry = DeviceExtension->DeviceListHead.
Flink;
1546 NextEntry != &(DeviceExtension->DeviceListHead);
1547 NextEntry = NextEntry->
Flink)
1556 DeviceEntry = DeviceEntry->
Flink;
1590 for (NextEntry = DeviceExtension->OfflineDeviceListHead.
Flink;
1591 NextEntry != &(DeviceExtension->OfflineDeviceListHead);
1592 NextEntry = NextEntry->
Flink)
1671 Irp->IoStatus.Information = 0;
1690 Irp->IoStatus.Information = 0;
1722 Irp->IoStatus.Information = 0;
1729 NextEntry = DeviceExtension->IrpListHead.Flink;
1735 ListIrp->Cancel =
TRUE;
1736 ListIrp->CancelIrql =
OldIrql;
1737 ListIrp->CancelRoutine =
NULL;
1743 NextEntry = NextEntry->
Flink;
1745 while (NextEntry != &(DeviceExtension->IrpListHead));
1750 Irp->IoStatus.Information = 0;
1787 Irp->IoStatus.Information = 0;
1833 DeviceExtension->EpicNumber = 1;
1839 DeviceExtension->WorkerReferences = -1;
1844 DeviceExtension->OnlineNotificationCount = 1;
1846 DeviceExtension->RegistryPath.Length =
RegistryPath->Length;
1847 DeviceExtension->RegistryPath.MaximumLength =
RegistryPath->Length +
sizeof(
WCHAR);
1848 DeviceExtension->RegistryPath.Buffer =
AllocatePool(DeviceExtension->RegistryPath.MaximumLength);
1849 if (!DeviceExtension->RegistryPath.Buffer)
1870 &(DeviceExtension->NotificationEntry));
_In_ PVOID NotificationStructure
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
NTSTATUS NTAPI MountMgrCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PMOUNTDEV_UNIQUE_ID UniqueId
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
VOID MountMgrFreeMountedDeviceInfo(IN PDEVICE_INFORMATION DeviceInformation)
const GUID GUID_DEVICE_INTERFACE_ARRIVAL
#define STATUS_INSUFFICIENT_RESOURCES
UNICODE_STRING DosDevices
#define FILE_DEVICE_NETWORK
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define OBJ_CASE_INSENSITIVE
#define PsGetCurrentThread()
VOID DeleteFromLocalDatabase(IN PUNICODE_STRING SymbolicLink, IN PMOUNTDEV_UNIQUE_ID UniqueId)
VOID MountMgrFreeDeadDeviceInfo(IN PDEVICE_INFORMATION DeviceInformation)
#define UNREFERENCED_PARAMETER(P)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSTATUS GlobalDeleteSymbolicLink(IN PUNICODE_STRING DosName)
#define FILE_DIRECTORY_FILE
NTSTATUS NTAPI MountMgrShutdown(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI MountMgrCancel(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID SendOnlineNotification(IN PUNICODE_STRING SymbolicName)
_In_ PNDIS_STRING _In_ PNDIS_STRING SymbolicName
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
BOOLEAN IsDriveLetter(PUNICODE_STRING SymbolicName)
BOOLEAN HasDriveLetter(IN PDEVICE_INFORMATION DeviceInformation)
VOID RegisterForTargetDeviceNotification(IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_INFORMATION DeviceInformation)
NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
NTSTATUS NTAPI IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName)
IN PVOID IN PVOID IN USHORT IN USHORT Size
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES
#define InsertTailList(ListHead, Entry)
NTSTATUS CreateNewVolumeName(OUT PUNICODE_STRING VolumeName, IN PGUID VolumeGuid OPTIONAL)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define OBJ_KERNEL_HANDLE
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
VOID MountMgrFreeSavedLink(IN PSAVED_LINK_INFORMATION SavedLinkInformation)
BOOLEAN HasNoDriveLetterEntry(IN PMOUNTDEV_UNIQUE_ID UniqueId)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_Inout_ PUNICODE_STRING LinkTarget
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
_In_ PDEVICE_OBJECT DeviceObject
#define IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
#define STATUS_NOT_A_DIRECTORY
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
BOOLEAN MountmgrReadNoAutoMount(IN PUNICODE_STRING RegistryPath)
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
#define MOUNTMGR_IS_VOLUME_NAME(s)
#define FILE_REMOVABLE_MEDIA
NTSTATUS MountMgrMountedDeviceArrival(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING SymbolicName, IN BOOLEAN ManuallyRegistered)
_In_ PVOID _In_ ULONG Event
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
struct _MOUNTDEV_NAME MOUNTDEV_NAME
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
UNICODE_STRING DeviceMount
#define IoCompleteRequest
UNICODE_STRING DeviceFloppy
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
NTSYSAPI NTSTATUS NTAPI RtlCreateRegistryKey(_In_ ULONG RelativeTo, _In_ PWSTR Path)
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
PDEVICE_OBJECT gdeviceObject
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
#define IOCTL_MOUNTDEV_QUERY_STABLE_GUID
NTSTATUS NTAPI IoSetSystemPartition(IN PUNICODE_STRING VolumeNameString)
struct _LIST_ENTRY * Flink
struct _MOUNTDEV_UNIQUE_ID MOUNTDEV_UNIQUE_ID
VOID NTAPI KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit)
VOID NTAPI PsSetThreadHardErrorsAreDisabled(IN PETHREAD Thread, IN BOOLEAN HardErrorsAreDisabled)
#define NT_SUCCESS(StatCode)
#define IsRecognizedPartition(PartitionType)
#define ObDereferenceObject
struct _DeviceInfo DeviceInfo
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
VOID NTAPI IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
NTSTATUS QuerySuggestedLinkName(IN PUNICODE_STRING SymbolicName, OUT PUNICODE_STRING SuggestedLinkName, OUT PBOOLEAN UseOnlyIfThereAreNoOtherLinks)
VOID MountMgrMountedDeviceRemoval(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING DeviceName)
NTSTATUS QuerySymbolicLinkNamesFromStorage(IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_INFORMATION DeviceInformation, IN PUNICODE_STRING SuggestedLinkName, IN BOOLEAN UseOnlyIfThereAreNoOtherLinks, OUT PUNICODE_STRING *SymLinks, OUT PULONG SymLinkCount, IN BOOLEAN HasGuid, IN LPGUID Guid)
BOOLEAN IsOffline(PUNICODE_STRING SymbolicName)
#define FILE_READ_ATTRIBUTES
#define STATUS_UNSUCCESSFUL
NTSTATUS NTAPI IoUnregisterPlugPlayNotification(_In_ PVOID NotificationEntry)
_In_ WDFDEVICE AssociatedDevice
VOID CreateNoDriveLetterEntry(IN PMOUNTDEV_UNIQUE_ID UniqueId)
static const WCHAR Cunc[]
NTSTATUS CreateNewDriveLetterName(OUT PUNICODE_STRING DriveLetter, IN PUNICODE_STRING DeviceName, IN UCHAR Letter, IN PMOUNTDEV_UNIQUE_ID UniqueId OPTIONAL)
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
#define InterlockedDecrement
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
BOOLEAN NTAPI PsGetThreadHardErrorsAreDisabled(IN PETHREAD Thread)
#define RTL_REGISTRY_ABSOLUTE
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
#define AllocatePool(Size)
#define InterlockedExchange
VOID ReconcileThisDatabaseWithMaster(IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_INFORMATION DeviceInformation)
UNICODE_STRING DosDevicesMount
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
DRIVER_DISPATCH MountMgrDeviceControl
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
PSAVED_LINK_INFORMATION RemoveSavedLinks(IN PDEVICE_EXTENSION DeviceExtension, IN PMOUNTDEV_UNIQUE_ID UniqueId)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define KeInitializeEvent(pEvt, foo, foo2)
#define InterlockedIncrement
#define STATUS_OBJECT_NAME_NOT_FOUND
#define STATUS_BUFFER_OVERFLOW
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSTATUS NTAPI MountMgrMountedDeviceNotification(IN PVOID NotificationStructure, IN PVOID Context)
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
NTSTATUS GlobalCreateSymbolicLink(IN PUNICODE_STRING DosName, IN PUNICODE_STRING DeviceName)
NTSTATUS FindDeviceInfo(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING SymbolicName, IN BOOLEAN DeviceNameGiven, OUT PDEVICE_INFORMATION *DeviceInformation)
#define InitializeListHead(ListHead)
const GUID GUID_DEVICE_INTERFACE_REMOVAL
static OUT PIO_STATUS_BLOCK IoStatusBlock
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
NTSTATUS NTAPI IoRegisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
_Must_inspect_result_ _Inout_opt_ PUNICODE_STRING VolumeName
struct tagContext Context
NTSTATUS NTAPI MountMgrCleanup(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define SYMBOLIC_LINK_QUERY
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
#define InitializeObjectAttributes(p, n, a, r, s)
NTSTATUS NTAPI IoRegisterPlugPlayNotification(_In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory, _In_ ULONG EventCategoryFlags, _In_opt_ PVOID EventCategoryData, _In_ PDRIVER_OBJECT DriverObject, _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, _Inout_opt_ PVOID Context, _Out_ PVOID *NotificationEntry)
VOID NTAPI MountMgrUnload(IN struct _DRIVER_OBJECT *DriverObject)
#define RtlCopyMemory(Destination, Source, Length)
#define FILE_DEVICE_SECURE_OPEN
NTSTATUS QueryDeviceInformation(IN PUNICODE_STRING SymbolicName, OUT PUNICODE_STRING DeviceName OPTIONAL, OUT PMOUNTDEV_UNIQUE_ID *UniqueId OPTIONAL, OUT PBOOLEAN Removable OPTIONAL, OUT PBOOLEAN GptDriveLetter OPTIONAL, OUT PBOOLEAN HasGuid OPTIONAL, IN OUT LPGUID StableGuid OPTIONAL, OUT PBOOLEAN Valid OPTIONAL)
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
VOID SendLinkCreated(IN PUNICODE_STRING SymbolicName)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
VOID IssueUniqueIdChangeNotify(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING DeviceName, IN PMOUNTDEV_UNIQUE_ID UniqueId)
#define IOCTL_VOLUME_GET_GPT_ATTRIBUTES
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define Cunc_LETTER_POSITION
NTSYSAPI NTSTATUS NTAPI ZwOpenSymbolicLinkObject(_Out_ PHANDLE SymbolicLinkHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define RTL_QUERY_REGISTRY_DIRECT
#define RtlCompareMemory(s1, s2, l)
#define IOCTL_DISK_GET_PARTITION_INFO_EX
#define IRP_MJ_DEVICE_CONTROL
UNICODE_STRING DeviceCdRom
BOOLEAN RedirectSavedLink(IN PSAVED_LINK_INFORMATION SavedLinkInformation, IN PUNICODE_STRING DosName, IN PUNICODE_STRING NewLink)
PULONG MinorVersion OPTIONAL