无法添加标注驱动程序 [英] Unable to add Callout driver

查看:347
本文介绍了无法添加标注驱动程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我尝试执行以下操作:

  1. Open Engine
  2. 添加提供程序
  3. 添加子图层
  4. 添加Collout
  1. Open Engine
  2. Add Provider
  3. Add Sublayer
  4. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆