[MOUNTMGR] Rectify "NoAutoMount" usage (#7030)

This "NoAutoMount" member was not consistently used. Sometimes it was
used correctly, some other times it was used as "not NoAutoMount" i.e.
"AutoMount" enabled.
Fix this consistently throughout the source, and fix also some comments.
This commit is contained in:
Hermès Bélusca-Maïto 2024-06-11 20:53:58 +02:00
parent 2aad6b133f
commit 5f26356079
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
4 changed files with 44 additions and 55 deletions

View file

@ -1641,12 +1641,12 @@ ReconcileThisDatabaseWithMaster(IN PDEVICE_EXTENSION DeviceExtension,
WorkItem->DeviceInformation = DeviceInformation;
QueueWorkItem(DeviceExtension, WorkItem, &(WorkItem->DeviceExtension));
/* If there's no automount, and automatic letters
* all volumes to find those online and notify there presence
*/
/* If the worker thread isn't started yet, automatic drive letter is
* enabled but automount disabled, manually set mounted volumes online.
* Otherwise, they will be set online during database reconciliation. */
if (DeviceExtension->WorkerThreadStatus == 0 &&
DeviceExtension->AutomaticDriveLetter == 1 &&
DeviceExtension->NoAutoMount == FALSE)
DeviceExtension->AutomaticDriveLetter &&
DeviceExtension->NoAutoMount)
{
OnlineMountedVolumes(DeviceExtension, DeviceInformation);
}

View file

@ -94,7 +94,6 @@ MountmgrWriteNoAutoMount(IN PDEVICE_EXTENSION DeviceExtension)
REG_DWORD,
&Value,
sizeof(Value));
}
/*
@ -115,16 +114,17 @@ MountMgrSetAutoMount(IN PDEVICE_EXTENSION DeviceExtension,
return STATUS_INVALID_PARAMETER;
}
/* Only change if there's a real difference */
/* Change the state only if there is a real difference
* with the user-provided NewState (normalized) */
SetState = (PMOUNTMGR_SET_AUTO_MOUNT)Irp->AssociatedIrp.SystemBuffer;
if (SetState->NewState == !DeviceExtension->NoAutoMount)
if ((SetState->NewState != Enabled) == DeviceExtension->NoAutoMount)
{
Irp->IoStatus.Information = 0;
return STATUS_SUCCESS;
}
/* Set new state; ! on purpose */
DeviceExtension->NoAutoMount = !SetState->NewState;
/* Set new state */
DeviceExtension->NoAutoMount = (SetState->NewState != Enabled);
Irp->IoStatus.Information = 0;
return MountmgrWriteNoAutoMount(DeviceExtension);
}
@ -480,7 +480,7 @@ MountMgrNextDriveLetterWorker(IN PDEVICE_EXTENSION DeviceExtension,
return STATUS_OBJECT_NAME_NOT_FOUND;
}
/* Now, mark we have assigned a letter (assumption) */
/* Now, assume we will assign a letter */
DeviceInformation->LetterAssigned =
DriveLetterInfo->DriveLetterWasAssigned = TRUE;
@ -501,39 +501,35 @@ MountMgrNextDriveLetterWorker(IN PDEVICE_EXTENSION DeviceExtension,
NextEntry = NextEntry->Flink;
}
/* If we didn't find a drive letter online
* ensure this is not a no drive entry
* by querying GPT attributes & database
*/
/* If we didn't find a drive letter online, ensure this is not
* a no-drive entry by querying GPT attributes & database */
if (NextEntry == &(DeviceInformation->SymbolicLinksListHead))
{
if (!GptDriveLetter || HasNoDriveLetterEntry(DeviceInformation->UniqueId))
{
DriveLetterInfo->DriveLetterWasAssigned = FALSE;
DriveLetterInfo->CurrentDriveLetter = 0;
goto Release;
}
}
/* No, ensure that the device is not automounted nor removable */
if (!DeviceExtension->NoAutoMount && !Removable)
/* If automount is disabled, and the device is not removable
* but needs a drive letter, don't assign one and bail out */
if (DeviceExtension->NoAutoMount && !Removable)
{
if (DriveLetterInfo->DriveLetterWasAssigned)
{
DriveLetterInfo->DriveLetterWasAssigned = FALSE;
DriveLetterInfo->CurrentDriveLetter = 0;
goto Release;
}
}
/* Stop now if we don't need to assign the drive a letter */
if (!DriveLetterInfo->DriveLetterWasAssigned)
{
goto Release;
}
/* Now everything is fine, start processing */
/* Now everything is fine, begin drive letter assignment */
if (RtlPrefixUnicodeString(&DeviceFloppy, &TargetDeviceName, TRUE))
{
@ -559,7 +555,6 @@ MountMgrNextDriveLetterWorker(IN PDEVICE_EXTENSION DeviceExtension,
{
DriveLetterInfo->DriveLetterWasAssigned = FALSE;
DriveLetterInfo->CurrentDriveLetter = 0;
goto Release;
}
@ -775,7 +770,7 @@ MountMgrAssignDriveLetters(IN PDEVICE_EXTENSION DeviceExtension)
&DriveLetterInformation);
}
/* If it was the system volume */
/* If it's the system volume */
if (NT_SUCCESS(Status) && RtlEqualUnicodeString(&SystemVolumeName, &(DeviceInformation->DeviceName), TRUE))
{
/* Keep track of it */
@ -788,16 +783,19 @@ MountMgrAssignDriveLetters(IN PDEVICE_EXTENSION DeviceExtension)
DeviceInformation->UniqueId->UniqueIdLength + sizeof(MOUNTDEV_UNIQUE_ID));
}
/* If it was not automount, ensure it gets mounted */
if (!DeviceExtension->NoAutoMount)
/* Ensure it gets mounted if automount is disabled */
if (DeviceExtension->NoAutoMount)
{
DeviceExtension->NoAutoMount = TRUE;
/* Temporarily re-enable automount for the
* worker to mount and set a drive letter */
DeviceExtension->NoAutoMount = FALSE;
MountMgrNextDriveLetterWorker(DeviceExtension,
&(DeviceInformation->DeviceName),
&DriveLetterInformation);
DeviceExtension->NoAutoMount = FALSE;
/* And re-disable automount */
DeviceExtension->NoAutoMount = TRUE;
}
}
}
@ -2700,12 +2698,12 @@ MountMgrDeviceControl(IN PDEVICE_OBJECT DeviceObject,
break;
case IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS:
// NOTE: On Win7+, this is handled during driver re-initialization.
DeviceExtension->AutomaticDriveLetter = TRUE;
Status = STATUS_SUCCESS;
MountMgrAssignDriveLetters(DeviceExtension);
ReconcileAllDatabasesWithMaster(DeviceExtension);
WaitForOnlinesToComplete(DeviceExtension);
Status = STATUS_SUCCESS;
break;
case IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED:

View file

@ -19,7 +19,7 @@ typedef struct _DEVICE_EXTENSION
PVOID NotificationEntry;
KSEMAPHORE DeviceLock;
KSEMAPHORE RemoteDatabaseLock;
ULONG AutomaticDriveLetter;
BOOLEAN AutomaticDriveLetter;
LIST_ENTRY IrpListHead;
ULONG EpicNumber;
LIST_ENTRY SavedLinksListHead;
@ -240,12 +240,6 @@ HasDriveLetter(
IN PDEVICE_INFORMATION DeviceInformation
);
CODE_SEG("INIT")
BOOLEAN
MountmgrReadNoAutoMount(
IN PUNICODE_STRING RegistryPath
);
/* database.c */
extern PWSTR DatabasePath;

View file

@ -835,26 +835,27 @@ MountMgrUnload(IN PDRIVER_OBJECT DriverObject)
IoDeleteDevice(gdeviceObject);
}
/*
* @implemented
*/
/**
* @brief Retrieves the "NoAutoMount" setting.
* @return TRUE if AutoMount is disabled; FALSE if AutoMount is enabled.
**/
CODE_SEG("INIT")
BOOLEAN
MountmgrReadNoAutoMount(IN PUNICODE_STRING RegistryPath)
MountmgrReadNoAutoMount(
_In_ PUNICODE_STRING RegistryPath)
{
NTSTATUS Status;
ULONG Result, Default = 0;
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
/* Retrieve data from registry */
RtlZeroMemory(QueryTable, sizeof(QueryTable));
/* Simply read data from register */
QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
QueryTable[0].Name = L"NoAutoMount";
QueryTable[0].EntryContext = &Result;
QueryTable[0].DefaultType = REG_NONE;
QueryTable[0].DefaultType = REG_DWORD;
QueryTable[0].DefaultData = &Default;
QueryTable[0].DefaultLength = sizeof(ULONG);
QueryTable[0].DefaultLength = sizeof(Default);
Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
RegistryPath->Buffer,
@ -862,9 +863,7 @@ MountmgrReadNoAutoMount(IN PUNICODE_STRING RegistryPath)
NULL,
NULL);
if (!NT_SUCCESS(Status))
{
return (Default != 0);
}
Result = Default;
return (Result != 0);
}
@ -1258,7 +1257,7 @@ MountMgrMountedDeviceArrival(IN PDEVICE_EXTENSION DeviceExtension,
DeviceInformation->SuggestedDriveLetter = 0;
}
/* Else, it's time to set up one */
else if ((DeviceExtension->NoAutoMount || DeviceInformation->Removable) &&
else if ((!DeviceExtension->NoAutoMount || DeviceInformation->Removable) &&
DeviceExtension->AutomaticDriveLetter &&
(HasGptDriveLetter || DeviceInformation->SuggestedDriveLetter) &&
!HasNoDriveLetterEntry(UniqueId))
@ -1316,16 +1315,14 @@ MountMgrMountedDeviceArrival(IN PDEVICE_EXTENSION DeviceExtension,
RtlCopyMemory(NewUniqueId->UniqueId, UniqueId->UniqueId, UniqueId->UniqueIdLength);
}
/* If device's offline or valid, skip its notifications */
/* If the device is offline or valid, skip its notifications */
if (IsOff || Valid)
{
DeviceInformation->SkipNotifications = TRUE;
}
/* In case device is valid and is set to no automount,
* set it offline.
*/
if (DeviceExtension->NoAutoMount || IsDrvLetter)
/* If automount is enabled or the device already mounted, set it offline */
if (!DeviceExtension->NoAutoMount || IsDrvLetter)
{
IsOff = !DeviceInformation->SkipNotifications;
}
@ -1337,7 +1334,7 @@ MountMgrMountedDeviceArrival(IN PDEVICE_EXTENSION DeviceExtension,
/* Finally, release the exclusive lock */
KeReleaseSemaphore(&(DeviceExtension->DeviceLock), IO_NO_INCREMENT, 1, FALSE);
/* If device is not offline, notify its arrival */
/* If the device is not offline, notify its arrival */
if (!IsOff)
{
SendOnlineNotification(SymbolicName);