Skip to content

Commit 659be05

Browse files
committed
passive only - videoprt
1 parent aeae7a1 commit 659be05

2 files changed

Lines changed: 43 additions & 31 deletions

File tree

win32ss/drivers/videoprt/resource.c

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,15 +1009,25 @@ VideoPortVerifyAccessRanges(
10091009
/* If releasing VGA device resources, clear tracked ranges */
10101010
if (DeviceExtension->IsVgaDriver)
10111011
{
1012-
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
1013-
if (VgaRanges)
1012+
/* Mutexes can only be acquired at PASSIVE_LEVEL */
1013+
if (KeGetCurrentIrql() == PASSIVE_LEVEL)
10141014
{
1015-
ExFreePoolWithTag(VgaRanges, TAG_VIDEO_PORT);
1016-
VgaRanges = NULL;
1015+
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
1016+
if (VgaRanges)
1017+
{
1018+
ExFreePoolWithTag(VgaRanges, TAG_VIDEO_PORT);
1019+
VgaRanges = NULL;
1020+
}
1021+
NumOfVgaRanges = 0;
1022+
VgaDeviceExtension = NULL;
1023+
KeReleaseMutex(&VgaSyncLock, FALSE);
1024+
}
1025+
else
1026+
{
1027+
/* Can't acquire mutex at elevated IRQL; skip VGA tracking cleanup */
1028+
WARN_(VIDEOPRT, "VideoPortVerifyAccessRanges: Cannot release VGA resources at IRQL %d\n",
1029+
KeGetCurrentIrql());
10171030
}
1018-
NumOfVgaRanges = 0;
1019-
VgaDeviceExtension = NULL;
1020-
KeReleaseMutex(&VgaSyncLock, FALSE);
10211031
}
10221032
return NO_ERROR;
10231033
}
@@ -1188,25 +1198,28 @@ VideoPortVerifyAccessRanges(
11881198
/* Track VGA access ranges on success for fallback handling */
11891199
if (DeviceExtension->IsVgaDriver)
11901200
{
1191-
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
1192-
if (VgaRanges)
1201+
if (KeGetCurrentIrql() == PASSIVE_LEVEL)
11931202
{
1194-
ExFreePoolWithTag(VgaRanges, TAG_VIDEO_PORT);
1195-
VgaRanges = NULL;
1196-
NumOfVgaRanges = 0;
1197-
}
1198-
if (NumAccessRanges)
1199-
{
1200-
SIZE_T sz = NumAccessRanges * sizeof(VIDEO_ACCESS_RANGE);
1201-
VgaRanges = ExAllocatePoolWithTag(PagedPool, sz, TAG_VIDEO_PORT);
1203+
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
12021204
if (VgaRanges)
12031205
{
1204-
RtlCopyMemory(VgaRanges, AccessRanges, sz);
1205-
NumOfVgaRanges = NumAccessRanges;
1206-
VgaDeviceExtension = DeviceExtension;
1206+
ExFreePoolWithTag(VgaRanges, TAG_VIDEO_PORT);
1207+
VgaRanges = NULL;
1208+
NumOfVgaRanges = 0;
1209+
}
1210+
if (NumAccessRanges)
1211+
{
1212+
SIZE_T sz = NumAccessRanges * sizeof(VIDEO_ACCESS_RANGE);
1213+
VgaRanges = ExAllocatePoolWithTag(PagedPool, sz, TAG_VIDEO_PORT);
1214+
if (VgaRanges)
1215+
{
1216+
RtlCopyMemory(VgaRanges, AccessRanges, sz);
1217+
NumOfVgaRanges = NumAccessRanges;
1218+
VgaDeviceExtension = DeviceExtension;
1219+
}
12071220
}
1221+
KeReleaseMutex(&VgaSyncLock, FALSE);
12081222
}
1209-
KeReleaseMutex(&VgaSyncLock, FALSE);
12101223
}
12111224
/* Leave VGA detect phase after first successful claim */
12121225
DeviceExtension->IsVgaDetect = FALSE;

win32ss/drivers/videoprt/videoprt.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,6 @@ IntVideoPortFindAdapter(
566566
/* If we released VGA resources, reclaim them so VGA fallback still works */
567567
if (VgaResourcesReleased)
568568
{
569-
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
570569
if (VgaDeviceExtension && VgaRanges && NumOfVgaRanges)
571570
{
572571
INFO_(VIDEOPRT, "Reclaiming VGA resources after failed probe\n");
@@ -577,7 +576,6 @@ IntVideoPortFindAdapter(
577576
WARN_(VIDEOPRT, "Failed to reclaim VGA resources after probe failure\n");
578577
}
579578
}
580-
KeReleaseMutex(&VgaSyncLock, FALSE);
581579
}
582580
Status = STATUS_UNSUCCESSFUL;
583581
goto Failure;
@@ -660,7 +658,6 @@ IntVideoPortFindAdapter(
660658
}
661659

662660
/* Attempt to reclaim VGA resources after probing if a VGA device exists */
663-
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
664661
if (VgaDeviceExtension && VgaRanges && NumOfVgaRanges)
665662
{
666663
VP_STATUS vr;
@@ -672,17 +669,21 @@ IntVideoPortFindAdapter(
672669
{
673670
/* Another driver has taken VGA resources; drop fallback state */
674671
WARN_(VIDEOPRT, "VGA reclaim failed (vpStatus=0x%X); releasing fallback state\n", vr);
675-
ExFreePoolWithTag(VgaRanges, TAG_VIDEO_PORT);
676-
VgaRanges = NULL;
677-
NumOfVgaRanges = 0;
678-
VgaDeviceExtension = NULL;
672+
if (KeGetCurrentIrql() == PASSIVE_LEVEL)
673+
{
674+
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
675+
ExFreePoolWithTag(VgaRanges, TAG_VIDEO_PORT);
676+
VgaRanges = NULL;
677+
NumOfVgaRanges = 0;
678+
VgaDeviceExtension = NULL;
679+
KeReleaseMutex(&VgaSyncLock, FALSE);
680+
}
679681
}
680682
else
681683
{
682684
INFO_(VIDEOPRT, "VGA reclaim succeeded\n");
683685
}
684686
}
685-
KeReleaseMutex(&VgaSyncLock, FALSE);
686687

687688
INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
688689
return STATUS_SUCCESS;
@@ -695,7 +696,6 @@ IntVideoPortFindAdapter(
695696
/* Explicitly reclaim VGA resources on complete failure */
696697
if (VgaResourcesReleased)
697698
{
698-
KeWaitForMutexObject(&VgaSyncLock, Executive, KernelMode, FALSE, NULL);
699699
if (VgaDeviceExtension && VgaRanges && NumOfVgaRanges)
700700
{
701701
INFO_(VIDEOPRT, "Final reclaim attempt of VGA resources during failure cleanup\n");
@@ -706,7 +706,6 @@ IntVideoPortFindAdapter(
706706
WARN_(VIDEOPRT, "VGA reclaim failed during failure cleanup\n");
707707
}
708708
}
709-
KeReleaseMutex(&VgaSyncLock, FALSE);
710709
}
711710
IoDeleteDevice(DeviceObject);
712711
return Status;

0 commit comments

Comments
 (0)