Skip to content

Commit 34f862f

Browse files
committed
Issue #3: scope registry filter to the user of the process that installed it.
1 parent d891229 commit 34f862f

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

SynchronousAudioRouter/entry.cpp

+44-3
Original file line numberDiff line numberDiff line change
@@ -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

366399
NTSTATUS 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
}

SynchronousAudioRouter/sar.h

+3
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ typedef struct SarDriverExtension
165165
FAST_MUTEX mutex;
166166
RTL_GENERIC_TABLE controlContextTable;
167167
LARGE_INTEGER filterCookie;
168+
PTOKEN_USER filterUser;
168169
} SarDriverExtension;
169170

170171
typedef struct SarControlContext
@@ -408,6 +409,8 @@ BOOLEAN SarRemoveTableEntry(PRTL_GENERIC_TABLE table, PVOID key);
408409
PVOID SarGetTableEntry(PRTL_GENERIC_TABLE table, PVOID key);
409410
VOID SarInitializeTable(PRTL_GENERIC_TABLE table);
410411

412+
NTSTATUS SarCopyProcessUser(PEPROCESS process, PTOKEN_USER *outTokenUser);
413+
411414
#endif // KERNEL
412415

413416
#pragma warning(pop)

SynchronousAudioRouter/utility.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -512,3 +512,16 @@ PVOID SarGetTableEntry(PRTL_GENERIC_TABLE table, PVOID key)
512512

513513
return nullptr;
514514
}
515+
516+
NTSTATUS SarCopyProcessUser(PEPROCESS process, PTOKEN_USER *outTokenUser)
517+
{
518+
NT_ASSERT(process);
519+
NT_ASSERT(outTokenUser);
520+
521+
PACCESS_TOKEN token = PsReferencePrimaryToken(process);
522+
NTSTATUS status = SeQueryInformationToken(
523+
token, TokenUser, (PVOID *)outTokenUser);
524+
525+
PsDereferencePrimaryToken(token);
526+
return status;
527+
}

0 commit comments

Comments
 (0)