Freigeben über


Verwenden eines Callouts zur gründlichen Inspektion

Wenn ein Callout eine tiefgehende Inspektion durchführt, kann die callout-Funktion classifyFn jede Kombination der festen Datenfelder, der Metadatenfelder und aller an sie übergebenen Rohpaketdaten sowie alle relevanten Daten überprüfen, die in einem Kontext gespeichert wurden, der mit dem Filter oder dem Datenfluss verbunden ist.

Beispiel:

// classifyFn callout function
VOID NTAPI
 ClassifyFn(
    IN const FWPS_INCOMING_VALUES0  *inFixedValues,
    IN const FWPS_INCOMING_METADATA_VALUES0  *inMetaValues,
    IN OUT VOID  *layerData,
    IN const FWPS_FILTER0  *filter,
    IN UINT64  flowContext,
    IN OUT FWPS_CLASSIFY_OUT  *classifyOut
    )
{
  PNET_BUFFER_LIST rawData;
  ...

  // Test for the FWPS_RIGHT_ACTION_WRITE flag to check the rights
  // for this callout to return an action. If this flag is not set,
  // a callout can still return a BLOCK action in order to VETO a
  // PERMIT action that was returned by a previous filter. In this
  // example the function just exits if the flag is not set.
 if (!(classifyOut->rights & FWPS_RIGHT_ACTION_WRITE))
  {
    // Return without specifying an action
 return;
  }

  // Get the data fields from inFixedValues
  ...

  // Get any metadata fields from inMetaValues
  ...

  // Get the pointer to the raw data
 rawData = (PNET_BUFFER_LIST)layerData;

  // Get any filter context data from filter->context
  ...

  // Get any flow context data from flowContext
  ...

  // Inspect the various data sources to determine
  // the action to be taken on the data
  ...

  // If the data should be permitted...
 if (...) {

    // Set the action to permit the data
 classifyOut->actionType = FWP_ACTION_PERMIT;

    // Check whether the FWPS_RIGHT_ACTION_WRITE flag should be cleared
 if (filter->flags & FWPS_FILTER_FLAG_CLEAR_ACTION_RIGHT)
    {
       // Clear the FWPS_RIGHT_ACTION_WRITE flag
 classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
    }

 return;
  }

  ...

  // If the data should be blocked...
 if (...) {

    // Set the action to block the data
 classifyOut->actionType = FWP_ACTION_BLOCK;

    // Clear the FWPS_RIGHT_ACTION_WRITE flag
 classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;

 return;
  }

  ...

  // If the decision to permit or block should be passed
  // to the next filter in the filter engine...
 if (...) {

    // Set the action to continue with the next filter
 classifyOut->actionType = FWP_ACTION_CONTINUE;

 return;
  }

  ...
}

Der Wert in filter->action.type bestimmt, welche Aktionen die Callout-Funktion classifyFn im actionType-Element der Struktur zurückgeben soll, auf die der classifyOut-Parameter verweist. Weitere Informationen zu diesen Aktionen finden Sie in der FWPS_ACTION0 Struktur.

Wenn ein Callout eine zusätzliche Verarbeitung von Paketdaten außerhalb seiner classifyFn-Callout-Funktion ausführen muss, bevor es bestimmen kann, ob die Daten zulässig oder blockiert werden sollen, muss es die Paketdaten zurückstellen, bis die Verarbeitung der Daten abgeschlossen ist. Informationen über das Anhängen von Paketdaten finden Sie unter Typen von Anrufen und FwpsPendOperation0.

Bei einigen Filterebenen ist der layerData-Parameter, der vom Filtermodul an die classifyFn Callout-Funktion übergeben wird, NULL.

Informationen zum Durchführen einer tiefen Inspektion von Streamingdaten finden Sie unter Verwenden eines Callouts zur tiefen Inspektion von Streamingdaten.