| 798 | } |
| 799 | |
| 800 | bool RemoveObCallbackNotify(POBJECT_TYPE objectType, ULONG callbackListOffset, void* handle) { |
| 801 | PLIST_ENTRY callbackListHead = nullptr; |
| 802 | PLIST_ENTRY nextEntry = nullptr; |
| 803 | POB_CALLBACK_ENTRY callbackEntry = nullptr; |
| 804 | ULONG count = 0; |
| 805 | |
| 806 | if (!objectType) { |
| 807 | return false; |
| 808 | } |
| 809 | |
| 810 | callbackListHead = (PLIST_ENTRY)((PUCHAR)objectType + callbackListOffset); |
| 811 | nextEntry = callbackListHead->Flink; |
| 812 | int i = 0; |
| 813 | while (nextEntry != callbackListHead) { |
| 814 | callbackEntry = CONTAINING_RECORD(nextEntry, OB_CALLBACK_ENTRY, EntryItemList); |
| 815 | if (ExAcquireRundownProtection(&callbackEntry->RundownProtect)) { |
| 816 | if (callbackEntry->RegistrationHandle == handle) { |
| 817 | break; |
| 818 | } |
| 819 | i++; |
| 820 | ExReleaseRundownProtection(&callbackEntry->RundownProtect); |
| 821 | } |
| 822 | nextEntry = nextEntry->Flink; |
| 823 | } |
| 824 | if (callbackEntry && callbackEntry->RegistrationHandle == handle) { |
| 825 | callbackEntry->RegistrationHandle->Count = 0; |
| 826 | RemoveEntryList(nextEntry); |
| 827 | } |
| 828 | return false; |
| 829 | } |
| 830 | |
| 831 | NTSTATUS EnumMiniFilterOperations(MiniFilterData* pData, OperationInfo* pInfo) { |
| 832 | NTSTATUS status = STATUS_SUCCESS; |
no test coverage detected