| 829 | } |
| 830 | |
| 831 | NTSTATUS 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); |
no outgoing calls
no test coverage detected