无法添加标注驱动程序 [英] Unable to add Callout driver
本文介绍了无法添加标注驱动程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
大家好,
我尝试执行以下操作:
- Open Engine
- 添加提供程序
- 添加子图层
- 添加Collout
- Open Engine
- Add Provider
- Add Sublayer
- Add Collout
but the FWP_E_LAYER_NOT_FOUND error (The layer does not exist.) has been occurred during call
dwFwAPiRetCode = ::FwpmSubLayerAdd0( m_hEngineHandle, &SubLayer, NULL );
推荐答案
以下代码将为您提供帮助.我很抱歉您实际上是从对FwpmSubLayerAdd0的调用中返回了FWP_E_LAYER_NOT_FOUND.此API通常会因FWP_E_NULL_POINTER,FWP_E_ALREADY_EXISTS或RPC_S_UNKNOWN_IF而失败.
The following code should help you out. I'm leery that you are actually getting FWP_E_LAYER_NOT_FOUND returned from the call to FwpmSubLayerAdd0. this API normally will fail with FWP_E_NULL_POINTER, FWP_E_ALREADY_EXISTS, or RPC_S_UNKNOWN_IF.
/**
@helper_function="HlprFwpmEngineOpen"
Purpose: Wrapper for the FwpmEngineOpen API <br>
<br>
Notes: <br>
<br>
MSDN_Ref: HTTP://MSDN.Microsoft.com/En-Us/Library/aa364040.aspx <br>
*/
UINT32 HlprFwpmEngineOpen(__out HANDLE* pEngineHandle,
__in const UINT32 sessionFlags) /* FWPM_SESSION_FLAG_NONDYNAMIC */
{
UINT32 status = NO_ERROR;
if(pEngineHandle)
{
FWPM_SESSION0 session;
ZeroMemory(&session,
sizeof(FWPM_SESSION));
session.displayData.name = L"WFPSampler's User Mode Session";
session.flags = sessionFlags;
status = FwpmEngineOpen(0,
RPC_C_AUTHN_WINNT,
0,
&session,
pEngineHandle);
if(status != NO_ERROR)
HlprLogError(L"HlprFwpmEngineOpen : FwpmEngineOpen() [status: %#x]",
status);
}
else
{
status = ERROR_INVALID_PARAMETER;
HlprLogError(L"HlprFwpmEngineOpen() [status: %#x][pEngineHandle: %#p]",
status,
pEngineHandle);
}
return status;
}
/**
@helper_function="HlprFwpmProviderAddDefaultGlobal"
Purpose: Add a default provider to associate with all of this program's WFP
objects. <br>
<br>
Notes: <br>
<br>
MSDN_Ref: HTTP://MSDN.Microsoft.com/En-Us/Library/aa364180.aspx <br>
*/
UINT32 HlprFwpmProviderAddDefaultGlobal(__in HANDLE engineHandle)
{
UINT32 status = NO_ERROR;
if(engineHandle)
{
FWPM_PROVIDER provider;
ZeroMemory(&provider,
sizeof(FWPM_PROVIDER));
provider.providerKey = WFPSAMPLER_PROVIDER;
provider.displayData.name = (PWSTR)g_pCompanyName;
provider.displayData.description = (PWSTR)g_pBinaryDescription;
provider.flags = FWPM_PROVIDER_FLAG_PERSISTENT;
provider.serviceName = (PWSTR)g_pServiceName;
status = FwpmProviderAdd(engineHandle,
&provider,
0);
if(status != NO_ERROR)
{
if(status == FWP_E_ALREADY_EXISTS)
{
HlprLogInfo(L"Provider Already Exists");
status = NO_ERROR;
}
else
HlprLogError(L"HlprFwpmProviderAddDefaultGlobal : FwpmProviderAdd() [status: %#x]",
status);
}
}
else
{
status = ERROR_INVALID_PARAMETER;
HlprLogError(L"HlprFwpmProviderAddDefaultGlobal() [status: %#x]",
status);
}
return status;
}
/**
@helper_function="HlprFwpmSubLayerAddDefaultGlobal"
Purpose: Add a default sublayer to associate with all of this program's filters. <br>
<br>
Notes: <br>
<br>
MSDN_Ref: HTTP://MSDN.Microsoft.com/En-Us/Library/aa364207.aspx <br>
*/
UINT32 HlprFwpmSubLayerAddDefaultGlobal(__in HANDLE engineHandle)
{
UINT32 status = NO_ERROR;
if(engineHandle)
{
FWPM_SUBLAYER subLayer;
ZeroMemory(&subLayer,
sizeof(FWPM_SUBLAYER));
subLayer.subLayerKey = WFPSAMPLER_SUBLAYER;
subLayer.displayData.name = L"WFP Sampler's default subLayer";
subLayer.flags = FWPM_SUBLAYER_FLAG_PERSISTENT;
subLayer.providerKey = (GUID*)&WFPSAMPLER_PROVIDER;
subLayer.weight = 0x7FFF;
status = FwpmSubLayerAdd(engineHandle,
&subLayer,
0);
if(status != NO_ERROR)
{
if(status == FWP_E_ALREADY_EXISTS)
{
HlprLogInfo(L"SubLayer Already Exists");
status = NO_ERROR;
}
else
HlprLogError(L"HlprFwpmSubLayerAddDefaultGlobal : FwpmSubLayerAdd() [status: %#x]",
status);
}
}
else
{
status = ERROR_INVALID_PARAMETER;
HlprLogError(L"HlprFwpmSubLayerAddDefaultGlobal() [status: %#x]",
status);
}
return status;
}
/**
@helper_function="HlprFwpmCalloutAdd"
Purpose: Wrapper for the FwpmCalloutAdd API <br>
<br>
Notes: Callout ID is written to pCallout->calloutId. <br>
<br>
MSDN_Ref: HTTP://MSDN.Microsoft.com/En-Us/Library/aa364010.aspx <br>
*/
UINT32 HlprFwpmCalloutAdd(__in const HANDLE engineHandle,
__inout FWPM_CALLOUT* pCallout)
{
UINT32 status = NO_ERROR;
if(engineHandle &&
pCallout)
{
status = FwpmCalloutAdd(engineHandle,
pCallout,
0,
&(pCallout->calloutId));
if(status != NO_ERROR)
{
if(status == FWP_E_ALREADY_EXISTS)
{
HlprLogInfo(L"Callout Already Exists");
status = NO_ERROR;
}
else
HlprLogError(L"HlprFwpmCalloutAdd : FwpmCalloutAdd() [status: %#x]",
status);
}
}
else
{
status = ERROR_INVALID_PARAMETER;
HlprLogError(L"HlprFwpmCalloutAdd() [status: %#x][engineHandle: %#p][pCallout: %#p]",
status,
engineHandle,
pCallout);
}
return status;
}
UINT32 PrvScenarioBasicActionAddFwpmObjects(__in const TUPLE_DATA* pTupleData,
__in_opt const GUID* pLayerKey,
__in const BOOLEAN useCallout,
__in const BOOLEAN persistent,
__in const FWP_ACTION_TYPE actionType,
__in_opt const PC_BASIC_ACTION_DATA* pPCBasicActionContext = 0)
{
UINT32 status = NO_ERROR;
if(pTupleData)
{
HANDLE engineHandle = 0;
const UINT32 NUM_CONDITIONS = pTupleData->tupleCount;
FWPM_FILTER_CONDITION* pFilterConditions = 0;
FWPM_PROVIDER_CONTEXT* pProviderContext = 0;
FWPM_CALLOUT* pCallout = 0;
FWP_BYTE_BLOB byteBlob;
FWPM_FILTER filter;
ZeroMemory(&byteBlob,
sizeof(FWP_BYTE_BLOB));
ZeroMemory(&filter,
sizeof(FWPM_FILTER));
if(pLayerKey == 0)
pLayerKey = PrvBasicActionScenarioGetDefaultLayer(pTupleData);
if(NUM_CONDITIONS)
{
pFilterConditions = HlprFwpmFilterConditionCreateFromTupleData(pTupleData,
pLayerKey);
HLPR_BAIL_ON_NULL_POINTER_WITH_STATUS(pFilterConditions,
status);
}
status = HlprGUIDPopulate(&(filter.filterKey));
HLPR_BAIL_ON_FAILURE(status);
filter.displayData.name = L"WFPSampler's Basic Scenario Filter";
filter.flags = persistent ? FWPM_FILTER_FLAG_PERSISTENT : 0;
filter.providerKey = (GUID*)&WFPSAMPLER_PROVIDER;
filter.layerKey = *pLayerKey;
filter.subLayerKey = WFPSAMPLER_SUBLAYER;
filter.weight.type = FWP_UINT8;
filter.weight.uint8 = 0xF;
filter.numFilterConditions = NUM_CONDITIONS;
filter.filterCondition = pFilterConditions;
filter.action.type = actionType;
if(useCallout ||
actionType & FWP_ACTION_FLAG_CALLOUT)
{
FWP_ACTION_TYPE newActionType = FWP_ACTION_CALLOUT_TERMINATING;
HLPR_NEW(pCallout,
FWPM_CALLOUT);
HLPR_BAIL_ON_ALLOC_FAILURE(pCallout,
status);
if(actionType == FWP_ACTION_PERMIT)
{
pCallout->calloutKey = WFPSAMPLER_CALLOUT_BASIC_ACTION_PERMIT;
pCallout->displayData.name = L"WFPSampler's Basic Permit Callout";
pCallout->displayData.description = L"Causes callout invocation which returns FWP_ACTION_PERMIT";
}
else if(actionType == FWP_ACTION_BLOCK)
{
pCallout->calloutKey = WFPSAMPLER_CALLOUT_BASIC_ACTION_BLOCK;
pCallout->displayData.name = L"WFPSampler's Basic Block Callout";
pCallout->displayData.description = L"Causes callout invocation which returns FWP_ACTION_BLOCK";
}
else
{
pCallout->calloutKey = WFPSAMPLER_CALLOUT_BASIC_ACTION_RANDOM;
pCallout->displayData.name = L"WFPSampler's Basic Random Action Callout";
pCallout->displayData.description = L"Testing Purposes Only!!! Causes callout invocation which randomly chooses an action to return.";
newActionType = FWP_ACTION_CALLOUT_UNKNOWN;
}
pCallout->calloutKey.Data4[7] = HlprFwpmLayerGetID(pLayerKey); /// Uniquely identifies the layer the callout will use
pCallout->flags = persistent ? FWPM_CALLOUT_FLAG_PERSISTENT : 0;
pCallout->providerKey = (GUID*)&WFPSAMPLER_PROVIDER;
pCallout->applicableLayer = *pLayerKey;
filter.action.type = newActionType;
filter.action.calloutKey = pCallout->calloutKey;
}
if(filter.action.type == FWP_ACTION_CALLOUT_UNKNOWN)
{
HLPR_NEW(pProviderContext,
FWPM_PROVIDER_CONTEXT);
HLPR_BAIL_ON_ALLOC_FAILURE(pProviderContext,
status);
byteBlob.size = sizeof(PC_BASIC_ACTION_DATA);
byteBlob.data = (BYTE*)pPCBasicActionContext;
status = HlprGUIDPopulate(&(pProviderContext->providerContextKey));
HLPR_BAIL_ON_FAILURE(status);
pProviderContext->displayData.name = L"WFPSampler's Basic Random Action Provider Context";
pProviderContext->displayData.description = L"Testing Purposes Only!!!";
pProviderContext->flags = persistent ? FWPM_PROVIDER_CONTEXT_FLAG_PERSISTENT : 0;
pProviderContext->providerKey = (GUID*)&WFPSAMPLER_PROVIDER;
pProviderContext->type = FWPM_GENERAL_CONTEXT;
pProviderContext->dataBuffer = &byteBlob;
pCallout->flags |= FWPM_CALLOUT_FLAG_USES_PROVIDER_CONTEXT;
filter.flags |= FWPM_FILTER_FLAG_HAS_PROVIDER_CONTEXT;
filter.providerContextKey = pProviderContext->providerContextKey;
}
status = HlprFwpmEngineOpen(&engineHandle);
HLPR_BAIL_ON_FAILURE(status);
status = HlprFwpmTransactionBegin(engineHandle);
HLPR_BAIL_ON_FAILURE(status);
if(pCallout)
{
status = HlprFwpmCalloutAdd(engineHandle,
pCallout);
HLPR_BAIL_ON_FAILURE(status);
}
if(pProviderContext)
{
status = HlprFwpmProviderContextAdd(engineHandle,
pProviderContext);
HLPR_BAIL_ON_FAILURE(status);
}
status = HlprFwpmFilterAdd(engineHandle,
&filter);
HLPR_BAIL_ON_FAILURE(status);
status = HlprFwpmTransactionCommit(engineHandle);
HLPR_BAIL_ON_FAILURE(status);
HLPR_BAIL_LABEL:
if(engineHandle)
{
if(status != NO_ERROR)
HlprFwpmTransactionAbort(engineHandle);
HlprFwpmEngineClose(&engineHandle);
}
if(pFilterConditions)
HlprFwpmFilterConditionDestroy(&pFilterConditions,
NUM_CONDITIONS);
HLPR_DELETE(pCallout);
HLPR_DELETE(pProviderContext);
}
else
{
status = ERROR_INVALID_PARAMETER;
HlprLogError(L"PrvScenarioBasicActionAddFwpmObjects() [status: %#x][pTupleData: %#p]",
status,
pTupleData);
}
return status;
}
希望对您有帮助
这篇关于无法添加标注驱动程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文