Menerapkan ParserAutoInstallInfo

Monitor Jaringan menggunakan fungsi ekspor ParserAutoInstallInfo untuk menginstal pengurai. Ketika ParserAutoInstallInfo dipanggil, pengurai mengembalikan struktur PF_PARSERDLLINFO yang berisi semua informasi yang diperlukan Monitor Jaringan untuk menginstal DLL pengurai.

Catatan

Monitor Jaringan menyimpan daftar pengurai yang ada dalam file Parser.ini , dan membuat file INI terpisah untuk setiap pengurai yang diinstal.

 

Selama proses penginstalan, DLL pengurai harus mengidentifikasi hal-hal berikut:

  • Jumlah pengurai di DLL—termasuk deskripsi nama dan komentar untuk setiap pengurai.
  • Protokol yang mendahului protokol pengurai.
  • Protokol yang mengikuti protokol pengurai.

Catatan

Monitor Jaringan menggunakan informasi protokol pengurai sebelumnya dan berikut untuk memperbarui set handoff dan mengikuti set pengurai yang diidentifikasi DLL pengurai Anda.

 

Prosedur berikut mengidentifikasi langkah-langkah yang diperlukan untuk mengimplementasikan ParserAutoInstallInfo.

Untuk mengimplementasikan ParserAutoInstallInfo

  1. Alokasikan struktur PF_PARSERDLLINFO menggunakan HeapAlloc.
  2. Kembalikan memori ke timbunan menggunakan HeapFree.
  3. Ketahuilah bahwa panggilan ini juga harus mengalokasikan struktur PF_PARSERINFO untuk setiap pengurai di DLL.
  4. Tentukan jumlah pengurai (biasanya satu) yang dimuat DLL di anggota nParsers dari PF_PARSERDLLINFO.
  5. Tentukan nama, komentar, dan file Bantuan opsional di anggota szProtocolName, szComment, dan szHelpFile dari setiap struktur PF_PARSERINFO.
  6. Tentukan protokol yang mendahului setiap protokol DLL. Salah satu kondisi berikut berlaku untuk set handoff masuk.
    • Jika protokol sebelumnya dapat menentukan bahwa protokol Anda mengikuti dari data dalam protokol sebelumnya, atur anggota p Siapa HandsOffToMe dari PF_PARSERINFO. Dalam hal ini, protokol Anda kemudian ditambahkan ke set handoff dari protokol sebelumnya.
    • Jika protokol sebelumnya tidak dapat menentukan bahwa protokol Anda mengikuti dari data dalam protokol sebelumnya, atur p Siapa CanPrecedeMe anggota PF_PARSERINFO. Dalam hal ini, protokol Anda kemudian ditambahkan ke kumpulan protokol berikut.
  7. Tentukan protokol yang mengikuti setiap protokol DLL. Salah satu kondisi berikut berlaku untuk set tindak lanjut keluar.
    • Jika protokol Anda dapat menentukan protokol mana yang diikuti berdasarkan data dalam protokol Anda, atur anggota PF_PARSERINFO p Siapa DoIHandOffTo. Dalam hal ini, protokol ini ditambahkan ke kumpulan handoff protokol Anda.
    • Jika protokol Anda tidak dapat menentukan protokol mana yang diikuti berdasarkan data dalam protokol Anda, atur anggota p Siapa CanFollowMe dari PF_PARSERINFO. Dalam hal ini, protokol ini ditambahkan ke kumpulan protokol Anda berikut.
  8. Mengembalikan struktur PF_PARSERDLLINFO ke Monitor Jaringan.

Berikut ini adalah implementasi dasar ParserAutoInstallInfo. Contoh kode diambil dari pengurai generik yang disediakan Network Monitor.

#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;

}