DllMain パーサーの実装
ネットワーク モニターは 、DllMain エクスポート関数を使用してパーサーの存在を識別し、Network Monitor がパーサーに関する情報を格納するために使用するリソースを解放します。
ネットワーク モニターが 初めて DllMain を呼び出すと、パーサー DLL は CreateProtocol を 呼び出して次の操作を行います。
- パーサーが検出するプロトコルを指定します。
- Network Monitor が呼び出す残りのパーサー エクスポート関数のエントリ ポイントを指定します。
ネットワーク モニターが最後に DllMain を 呼び出すと、 DllMain は DestroyProtocol を呼び出して、Network Monitor がパーサーに関する情報を格納するために使用するすべてのリソースを解放します。
次の手順では、 DllMain を実装するために必要な手順を示します。
DllMain を実装するには
CreateProtocol 関数とグローバル Attach 変数の ENTRYPOINTS 構造体を指定します。 Attach 変数は、実行中のプロトコル インスタンスの数を追跡するために使用されます。
オペレーティング システムが設定する Command パラメーターの値を確認します。
Command パラメーターが DLL_PROCESS_ATTACH に設定され、Attach が 0 の場合は、CreateProtocol を呼び出して、次のエクスポート関数のプロトコル名とエントリ ポイントを指定します。
- [登録]
- 登録解除
- RecognizeFrame
- AttachProperties
- FormatProperties (ネットワーク モニターにプロトコル プロパティが表示される場合にのみ必要)。
Command パラメーターが DLL_PROCESS_DETACH に設定され、Attach が 0 の場合は、CreateProtocol が返すインスタンス ハンドルを使用して DestroyProtocol を呼び出します。
DllMain パーサー関数は常に TRUE を返す必要があるため、TRUE を返します。
DllMain の基本的な実装を次に示します。 このコード例では、case ステートメントを使用して Command パラメーターの値をトラップし、CreateProtocol または DestroyProtocol を呼び出す必要があるかどうかを判断します。
#include <windows.h>
// Entry point structure for parser export functions and global
// Attach variable.
ENTRYPOINTS EntryPoints =
{
Register,
Deregister,
RecognizeFrame,
AttachProperties,
FormatProperties
};
DWORD Attached = 0;
BOOL WINAPI DllMain(HANDLE hInstance, ULONG Command, LPVOID Reserved)
{
switch(Command)
{
// Call CreateProtocol.
case DLL_PROCESS_ATTACH:
// Loading parser DLL.
if(Attached == 0)
{
hProtocol = CreateProtocol( "ProtocolName",
&EntryPoints,
ENTRYPOINTS_SIZE);
}
Attached++;
break;
// Call DestroyProtocol.
case DLL_PROCESS_DETACH:
// Unloading parser DLL.
Attached--;
if(Attached == 0)
{
DestroyProtocol( hProtocol);
}
break;
}
return TRUE;
}