@@ -314,22 +314,34 @@ NTSTATUS SarIrpDeviceControl(PDEVICE_OBJECT deviceObject, PIRP irp)
314314 UNICODE_STRING filterAltitude;
315315
316316 RtlUnicodeStringInit (&filterAltitude, L" 360000" );
317- ExAcquireFastMutex (&extension->mutex );
317+ KeEnterCriticalRegion ();
318+ ExAcquireFastMutexUnsafe (&extension->mutex );
318319
319320 if (extension->filterCookie .QuadPart ) {
320- ExReleaseFastMutex (&extension->mutex );
321+ ExReleaseFastMutexUnsafe (&extension->mutex );
322+ KeLeaveCriticalRegion ();
321323 ntStatus = STATUS_RESOURCE_IN_USE;
322324 break ;
323325 }
324326
327+ ntStatus = SarCopyProcessUser (
328+ PsGetCurrentProcess (), &extension->filterUser );
329+
330+ if (!NT_SUCCESS (ntStatus)) {
331+ ExReleaseFastMutexUnsafe (&extension->mutex );
332+ KeLeaveCriticalRegion ();
333+ break ;
334+ }
335+
325336 ntStatus = CmRegisterCallbackEx (
326337 SarRegistryCallback,
327338 &filterAltitude,
328339 deviceObject->DriverObject ,
329340 extension,
330341 &extension->filterCookie ,
331342 nullptr );
332- ExReleaseFastMutex (&extension->mutex );
343+ ExReleaseFastMutexUnsafe (&extension->mutex );
344+ KeLeaveCriticalRegion ();
333345 break ;
334346 }
335347 case SAR_SEND_FORMAT_CHANGE_EVENT:
@@ -361,6 +373,27 @@ VOID SarUnload(PDRIVER_OBJECT driverObject)
361373 if (extension->filterCookie .QuadPart ) {
362374 CmUnRegisterCallback (extension->filterCookie );
363375 }
376+
377+ if (extension->filterUser ) {
378+ ExFreePool (extension->filterUser );
379+ }
380+ }
381+
382+ BOOL SarFilterMatchesCurrentProcess (SarDriverExtension *extension)
383+ {
384+ PTOKEN_USER tokenUser = nullptr ;
385+ NTSTATUS status = SarCopyProcessUser (PsGetCurrentProcess (), &tokenUser);
386+
387+ if (!NT_SUCCESS (status)) {
388+ return FALSE ;
389+ }
390+
391+ BOOL isMatch = RtlEqualSid (
392+ extension->filterUser ->User .Sid ,
393+ tokenUser->User .Sid );
394+
395+ ExFreePool (tokenUser);
396+ return isMatch;
364397}
365398
366399NTSTATUS SarFilterMMDeviceQuery (
@@ -530,6 +563,10 @@ NTSTATUS SarRegistryCallback(PVOID context, PVOID argument1, PVOID argument2)
530563 break ;
531564 }
532565
566+ if (!SarFilterMatchesCurrentProcess (extension)) {
567+ break ;
568+ }
569+
533570 return SarFilterMMDeviceQuery (
534571 queryInfo, &wrapperRegistrationPath);
535572 }
@@ -556,6 +593,10 @@ NTSTATUS SarRegistryCallback(PVOID context, PVOID argument1, PVOID argument2)
556593 break ;
557594 }
558595
596+ if (!SarFilterMatchesCurrentProcess (extension)) {
597+ break ;
598+ }
599+
559600 return SarFilterMMDeviceEnum (
560601 queryInfo, &wrapperRegistrationPath);
561602 }
0 commit comments