Verwenden einer Legende für eine ausführliche Überprüfung
Wenn eine Legende eine ausführliche Überprüfung durchführt, kann die Beschriftungsfunktion klassifizierenFn eine beliebige Kombination der festen Datenfelder, der Metadatenfelder und aller unformatierten Paketdaten, die an sie übergeben werden, sowie alle relevanten Daten überprüfen, die in einem Kontext gespeichert wurden, der dem Filter oder dem Datenfluss zugeordnet 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 Calloutfunktion klassifizierenFn im actionType-Member der Struktur zurückgeben soll, auf die durch den klassifizierungOut-Parameter verwiesen wird. Weitere Informationen zu diesen Aktionen finden Sie in der struktur FWPS_ACTION0 .
Wenn eine Legende eine zusätzliche Verarbeitung von Paketdaten außerhalb der klassifizierenFn-Beschriftungsfunktion ausführen muss, bevor sie bestimmen kann, ob die Daten zulässig oder blockiert werden sollen, müssen die Paketdaten geschrieben werden, bis die Verarbeitung der Daten abgeschlossen ist. Informationen zum Pendieren von Paketdaten finden Sie unter Typen von Legenden und FwpsPendOperation0.
Auf einigen Filterebenen ist der layerData-Parameter , der von der Filter-Engine an die Legendenfunktion klassifizierenFn einer Legende übergeben wird , NULL.
Informationen zum Durchführen einer tiefen Überprüfung von Datenstromdaten finden Sie unter Verwenden eines Callouts für die tiefe Überprüfung von Streamdaten.