UINT32 PrvScenarioFastStreamInjectionDeleteFwpmObjects(_In_ const FWPM_FILTER* pFilter) { ASSERT(pFilter); UINT32 status = NO_ERROR; HANDLE engineHandle = 0; HANDLE enumHandle = 0; UINT32 entryCount = 0; FWPM_FILTER** ppFilters = 0; FWPM_FILTER_CONDITION* pFilterConditions = 0; UINT32 numFilterConditions = 0; FWPM_FILTER_ENUM_TEMPLATE filterEnumTemplate = {0}; GUID calloutKey = {0}; HlprFwpmFilterConditionPrune(pFilter->filterCondition, pFilter->numFilterConditions, &pFilterConditions, &numFilterConditions); calloutKey = WFPSAMPLER_CALLOUT_FAST_STREAM_INJECTION; calloutKey.Data4[7] = HlprFwpmLayerGetIDByKey(&(pFilter->layerKey)); /// Uniquely identifies the callout used filterEnumTemplate.providerKey = (GUID*)&WFPSAMPLER_PROVIDER; filterEnumTemplate.layerKey = pFilter->layerKey; filterEnumTemplate.enumType = FWP_FILTER_ENUM_FULLY_CONTAINED; filterEnumTemplate.flags = FWP_FILTER_ENUM_FLAG_INCLUDE_BOOTTIME | FWP_FILTER_ENUM_FLAG_INCLUDE_DISABLED; filterEnumTemplate.numFilterConditions = pFilterConditions ? numFilterConditions : pFilter->numFilterConditions; filterEnumTemplate.filterCondition = pFilterConditions ? pFilterConditions : pFilter->filterCondition; filterEnumTemplate.actionMask = FWP_ACTION_FLAG_CALLOUT; filterEnumTemplate.calloutKey = &calloutKey; status = HlprFwpmEngineOpen(&engineHandle); HLPR_BAIL_ON_FAILURE(status); status = HlprFwpmFilterCreateEnumHandle(engineHandle, &filterEnumTemplate, &enumHandle); HLPR_BAIL_ON_FAILURE(status); status = HlprFwpmFilterEnum(engineHandle, enumHandle, 0xFFFFFFFF, &ppFilters, &entryCount); HLPR_BAIL_ON_FAILURE(status); if(ppFilters) { for(UINT32 filterIndex = 0; filterIndex < entryCount; filterIndex++) { HlprFwpmFilterDeleteByKey(engineHandle, &(ppFilters[filterIndex]->filterKey)); HlprFwpmCalloutDeleteByKey(engineHandle, &(ppFilters[filterIndex]->action.calloutKey)); } FwpmFreeMemory((VOID**)&ppFilters); } HLPR_BAIL_LABEL: if(engineHandle) { if(enumHandle) HlprFwpmFilterDestroyEnumHandle(engineHandle, &enumHandle); HlprFwpmEngineClose(&engineHandle); } HLPR_DELETE_ARRAY(pFilterConditions); return status; }
/** @helper_function="HlprLogError" Purpose: Log an error message to the console. <br> <br> Notes: <br> <br> MSDN_Ref: <br> */ VOID HlprLogError(_In_ PCWSTR pMessage, ...) { ASSERT(pMessage); UINT32 status = NO_ERROR; PCWSTR pFormatMessage = L"ERROR: %s\n"; PWSTR pActualMessage = 0; size_t size = 0; size_t actualSize = 11; /// Size of format Message and room for NULL Terminator '\0' WCHAR pLogMessage[MAX_CHARS] = {0}; va_list argumentList; va_start(argumentList, pMessage); status = StringCchVPrintf(pLogMessage, MAX_CHARS, pMessage, argumentList); if(status != NO_ERROR) { wprintf(L"HlprLogError : StringCchVPrintf() [status: %#x]", status); HLPR_BAIL; } status = StringCchLength(pLogMessage, STRSAFE_MAX_CCH, &size); if(status != NO_ERROR) { wprintf(L"HlprLogError : StringCchLength() [status: %#x]", status); HLPR_BAIL; } actualSize += size; HLPR_NEW_ARRAY(pActualMessage, WCHAR, actualSize); HLPR_BAIL_ON_ALLOC_FAILURE(pActualMessage, status); status = StringCchPrintf(pActualMessage, actualSize, pFormatMessage, pLogMessage); if(status != NO_ERROR) { wprintf(L"HlprLogError : StringCchPrintf() [status: %#x]", status); HLPR_BAIL; } wprintf(pActualMessage); HLPR_BAIL_LABEL: va_end(argumentList); HLPR_DELETE_ARRAY(pActualMessage); return; }
/** @framework_function="MIDL_user_free" Purpose: RPC stub routine to free allocated memory. <br> <br> Notes: <br> <br> MSDN_Ref: HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA378651.aspx <br> HTTP://MSDN.Microsoft.com/En-US/Library/Windows/Desktop/AA378716.aspx <br> */ VOID __RPC_USER MIDL_user_free(/* _Inout_ */ _Pre_maybenull_ _Post_invalid_ VOID* pBuffer) { HLPR_DELETE_ARRAY(pBuffer); return; }