Looking back over this, the enter+acquire of the existing code is shared here, so replacing with exclusive will change behavior. For now, please ignore this patch.
On Fri, Apr 24, 2020 at 4:44 PM Shawn Hoffman <[email protected]> wrote: > > Signed-off-by: Shawn Hoffman <[email protected]> > --- > wintun.c | 12 ++++-------- > 1 file changed, 4 insertions(+), 8 deletions(-) > > diff --git a/wintun.c b/wintun.c > index 90e7930..00ac378 100644 > --- a/wintun.c > +++ b/wintun.c > @@ -884,15 +884,13 @@ TunDispatchDeviceControl(DEVICE_OBJECT *DeviceObject, > IRP *Irp) > switch (Stack->Parameters.DeviceIoControl.IoControlCode) > { > case TUN_IOCTL_REGISTER_RINGS: { > - KeEnterCriticalRegion(); > - ExAcquireResourceSharedLite(&TunDispatchCtxGuard, TRUE); > + > ExEnterCriticalRegionAndAcquireResourceExclusive(&TunDispatchCtxGuard); > #pragma warning(suppress : 28175) > TUN_CTX *Ctx = DeviceObject->Reserved; > Status = NDIS_STATUS_ADAPTER_NOT_READY; > if (Ctx) > Status = TunRegisterBuffers(Ctx, Irp); > - ExReleaseResourceLite(&TunDispatchCtxGuard); > - KeLeaveCriticalRegion(); > + ExReleaseResourceAndLeaveCriticalRegion(&TunDispatchCtxGuard); > break; > } > case TUN_IOCTL_FORCE_CLOSE_HANDLES: > @@ -913,14 +911,12 @@ _Use_decl_annotations_ > static NTSTATUS > TunDispatchClose(DEVICE_OBJECT *DeviceObject, IRP *Irp) > { > - KeEnterCriticalRegion(); > - ExAcquireResourceSharedLite(&TunDispatchCtxGuard, TRUE); > + ExEnterCriticalRegionAndAcquireResourceExclusive(&TunDispatchCtxGuard); > #pragma warning(suppress : 28175) > TUN_CTX *Ctx = DeviceObject->Reserved; > if (Ctx) > TunUnregisterBuffers(Ctx, > IoGetCurrentIrpStackLocation(Irp)->FileObject); > - ExReleaseResourceLite(&TunDispatchCtxGuard); > - KeLeaveCriticalRegion(); > + ExReleaseResourceAndLeaveCriticalRegion(&TunDispatchCtxGuard); > return NdisDispatchClose(DeviceObject, Irp); > } > > -- > 2.26.2.windows.1 >
