MCPcopy Create free account
hub / github.com/BeneficialCode/WinArk / EnumMiniFilterOperations

Function EnumMiniFilterOperations

KernelLibrary/SysMon.cpp:831–895  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

829}
830
831NTSTATUS EnumMiniFilterOperations(MiniFilterData* pData, OperationInfo* pInfo) {
832 NTSTATUS status = STATUS_SUCCESS;
833
834 WCHAR name[128] = { 0 };
835 WCHAR filterName[128] = { 0 };
836 if (pData->Length < sizeof(filterName) / sizeof(WCHAR)) {
837 RtlCopyMemory(name, pData->Name, pData->Length * sizeof(WCHAR));
838 name[pData->Length] = L'\0';
839 }
840 ULONG offset = pData->OperationsOffset;
841 ULONG filtersCount = { 0 };
842 ULONG size = 0;
843 PFILTER_FULL_INFORMATION pFullInfo = nullptr;
844 PFLT_FILTER* ppFltList = nullptr;
845 status = FltEnumerateFilters(nullptr, 0, &filtersCount);
846 if ((status == STATUS_BUFFER_TOO_SMALL) && filtersCount) {
847 size = sizeof(PFLT_FILTER) * filtersCount;
848 ppFltList = (PFLT_FILTER*)ExAllocatePoolWithTag(NonPagedPool, size, 'tsil');
849 if (ppFltList) {
850 status = FltEnumerateFilters(ppFltList, size, &filtersCount);
851 for (decltype(filtersCount) i = 0; NT_SUCCESS(status) && (i < filtersCount); i++) {
852 status = FltGetFilterInformation(ppFltList[i], FilterFullInformation, nullptr, 0, &size);
853 if ((status == STATUS_BUFFER_TOO_SMALL) && size) {
854 pFullInfo = (PFILTER_FULL_INFORMATION)ExAllocatePoolWithTag(NonPagedPool, size, 'ofni');
855 if (pFullInfo) {
856 status = FltGetFilterInformation(ppFltList[i], FilterFullInformation, pFullInfo, size, &size);
857 if (NT_SUCCESS(status)) {
858 if (pFullInfo->FilterNameLength < sizeof(filterName)/sizeof(WCHAR)) {
859 RtlCopyMemory(filterName, pFullInfo->FilterNameBuffer,
860 pFullInfo->FilterNameLength);
861 filterName[pFullInfo->FilterNameLength/sizeof(WCHAR)] = L'\0';
862 }
863 if (!_wcsicmp(filterName, name)) {
864 PFLT_OPERATION_REGISTRATION* ppOperationReg = (PFLT_OPERATION_REGISTRATION*)((PUCHAR)ppFltList[i] + offset);
865 PFLT_OPERATION_REGISTRATION pOperationReg = *ppOperationReg;
866 int j = 0;
867 for (j = 0; pOperationReg->MajorFunction != IRP_MJ_OPERATION_END; j++,pOperationReg++) {
868 pInfo[j].FilterHandle = ppFltList[i];
869 pInfo[j].Flags = pOperationReg->Flags;
870 pInfo[j].MajorFunction = pOperationReg->MajorFunction;
871 pInfo[j].PostOperation = pOperationReg->PostOperation;
872 pInfo[j].PreOperation = pOperationReg->PreOperation;
873 }
874 pInfo[j].MajorFunction = pOperationReg->MajorFunction;
875 break;
876 }
877 }
878 ExFreePool(pFullInfo);
879 pFullInfo = nullptr;
880 }
881 }
882 }
883 ExFreePoolWithTag(ppFltList, 'tsil');
884 ppFltList = nullptr;
885 }
886 }
887 if(pFullInfo!=nullptr)
888 ExFreePool(pFullInfo);

Callers 2

RefreshMethod · 0.85
AntiRootkitDeviceControlFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected