Implémentation de ParserAutoInstallInfo
Le Moniteur réseau utilise la fonction d’exportation ParserAutoInstallInfo pour installer un analyseur. Lorsque la fonction ParserAutoInstallInfo est appelée, l’analyseur retourne une structure PF\_PARSERDLLINFO contenant toutes les informations dont le Moniteur réseau a besoin pour installer une DLL d’analyseur.
Remarque
Le Moniteur réseau conserve la liste des analyseurs existants dans le fichier Parser.ini et crée un fichier INI distinct pour chaque analyseur installé.
Pendant le processus d’installation, la DLL de l’analyseur doit identifier les éléments suivants :
- Le nombre d’analyseurs contenus dans la DLL, y compris le nom et le commentaire descriptif de chaque analyseur
- Les protocoles qui précèdent le protocole d’analyseur
- Les protocoles qui suivent le protocole d’analyseur
Remarque
Le Moniteur réseau utilise les informations des protocoles d’analyseur précédents et suivants pour mettre à jour les ensembles de transferts et les ensembles de suivis des analyseurs que votre DLL d’analyseur identifie.
La procédure suivante identifie les étapes nécessaires pour implémenter ParserAutoInstallInfo.
Pour implémenter ParserAutoInstallInfo
- Allouez une structure PF_PARSERDLLINFO à l’aide de la fonction HeapAlloc.
- Retournez la mémoire vers le tas à l’aide de la fonction HeapFree.
- N’oubliez pas que cet appel doit également allouer une structure PF_PARSERINFO pour chaque analyseur dans la DLL.
- Spécifiez le nombre d’analyseurs (généralement un) que la DLL contient dans le membre nParsers de PF_PARSERDLLINFO.
- Spécifiez un nom, un commentaire et un fichier d’aide facultatif dans les membres szProtocolName, szComment et szHelpFile de chaque structure PF_PARSERINFO.
- Spécifiez les protocoles qui précèdent chaque protocole DLL. L’une des conditions suivantes s’applique à un ensemble de transferts entrant.
- Si les protocoles précédents peuvent déterminer que votre protocole provient des données des protocoles précédents, définissez le membre pWhoHandsOffToMe de PF_PARSERINFO. Dans ce cas, votre protocole est ensuite ajouté aux ensembles de transferts des protocoles précédents.
- Si les protocoles précédents ne peuvent pas déterminer que votre protocole provient des données des protocoles précédents, définissez le membre pWhoCanPrecedeMe de PF_PARSERINFO. Dans ce cas, votre protocole est ensuite ajouté aux ensembles de suivis des protocoles.
- Spécifiez les protocoles qui suivent chaque protocole DLL. L’une des conditions suivantes s’applique à un ensemble de suivis sortant.
- Si votre protocole peut déterminer quels protocoles suivent en fonction des données de votre protocole, définissez le membre pWhoDoIHandOffTo de PF_PARSERINFO. Dans ce cas, ces protocoles sont ajoutés à l’ensemble de transferts de vos protocoles.
- Si votre protocole ne peut pas déterminer quels protocoles suivent en fonction des données de votre protocole, définissez le membre pWhoCanFollowMe de PF_PARSERINFO. Dans ce cas, ces protocoles sont ajoutés à l’ensemble de suivis de vos protocoles.
- Retournez la structure PF_PARSERDLLINFO vers le Moniteur réseau.
Voici une implémentation de base de la fonction ParserAutoInstallInfo. L’exemple de code est extrait de l’analyseur générique fourni par le Moniteur réseau.
#include <windows.h>
PPF_PARSERDLLINFO WINAPI ParserAutoInstallInfo()
{
/////////////////////////////////////////////////////////////////
//
// Allocate memory for PF_PARSERDLLINFO structure.
//
/////////////////////////////////////////////////////////////////
PPF_PARSERDLLINFO pParserDllInfo;
PPF_PARSERINFO pParserInfo;
DWORD NumProtocols;
DWORD NumParsers;
DWORD NumFollows;
NumParsers = 1;
pParserDllInfo = (PPF_PARSERDLLINFO)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof( PF_PARSERDLLINFO ) +
NumParsers * sizeof( PF_PARSERINFO) );
if( pParserDllInfo == NULL)
{
return NULL;
}
/////////////////////////////////////////////////////////////////
//
// Specify the number of parsers in the DLL.
//
/////////////////////////////////////////////////////////////////
pParserDllInfo->nParsers = NumParsers;
/////////////////////////////////////////////////////////////////
//
// Specify the name, comment, and Help file for each protocol.
//
/////////////////////////////////////////////////////////////////
pParserInfo = &(pParserDllInfo->ParserInfo[0]);
sprintf_s( pParserInfo->szProtocolName, MAX_PROTOCOL_NAME_LEN,
"TestProtocol" );
sprintf_s( pParserInfo->szComment, MAX_PROTOCOL_COMMENT_LEN,
"Test protocol for SDK" );
sprintf_s( pParserInfo->szHelpFile, MAX_PATH, "");
/////////////////////////////////////////////////////////////////
//
// Specify preceding protocols.
//
/////////////////////////////////////////////////////////////////
PPF_HANDOFFSET pHandoffSet;
PPF_HANDOFFENTRY pHandoffEntry;
// Allocate PF_HANDOFFSET structure.
NumHandoffs = 1;
pHandoffSet = (PPF_HANDOFFSET)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof( PF_HANDOFFSET ) +
NumHandoffs * sizeof( PF_HANDOFFENTRY) );
if( pHandoffSet == NULL )
{
return pParserDllInfo;
}
// Fill in handoff set
pParserInfo->pWhoHandsOffToMe = pHandoffSet;
pHandoffSet->nEntries = NumHandoffs;
// TCP PORT FFFF
pHandoffEntry = &(pHandoffSet->Entry[0]);
sprintf_s( pHandoffEntry->szIniFile, MAX_PATH, "TCPIP.INI" );
sprintf_s( pHandoffEntry->szIniSection, MAX_PATH, "TCP_HandoffSet" );
sprintf_s( pHandoffEntry->szProtocol, MAX_PROTOCOL_NAME_LEN,
"BLRPLATE" );
pHandoffEntry->dwHandOffValue = 0xFFFF;
pHandoffEntry->ValueFormatBase = HANDOFF_VALUE_FORMAT_BASE_DECIMAL;
/////////////////////////////////////////////////////////////////
//
// Specify the following protocols.
//
/////////////////////////////////////////////////////////////////
PPF_FOLLOWSET pFollowSet;
PPF_FOLLOWENTRY pFollowEntry;
// Allocate PF_FOLLOWSET structure
NumFollows = 1;
pFollowSet = (PPF_FOLLOWSET)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof( PF_FOLLOWSET ) +
NumFollows * sizeof( PF_FOLLOWENTRY) );
if( pFollowSet == NULL )
{
return pParserDllInfo;
}
// Fill in the follow set
pParserInfo->pWhoCanFollowMe = pFollowSet;
pFollowSet->nEntries = NumFollows;
// Add SMB
pFollowEntry = &(pFollowSet->Entry[0]);
sprintf_s( pFollowEntry->szProtocol, MAX_PROTOCOL_NAME_LEN, "SMB" );
/////////////////////////////////////////////////////////////////
//
// Return the PF_PARSERDLLINFO structure.
//
/////////////////////////////////////////////////////////////////
return pParserDllInfo;
}