實作 DllMain 剖析器
網路監視器會使用 DllMain 匯出函式來識別剖析器是否存在,並釋放網路監視器用來儲存剖析器相關資訊的資源。
當網路監視器第一次呼叫 DllMain 時,剖析器 DLL 會呼叫 CreateProtocol 來執行下列動作:
- 指定剖析器偵測到的通訊協定。
- 提供網路監視器呼叫之其餘剖析器匯出函式的進入點。
當網路監視器上次呼叫DllMain 時,DllMain會呼叫DestroyProtocol來釋放網路監視器用來儲存剖析器相關資訊的所有資源。
下列程式會識別實作 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。
傳回 TRUE ,因為 DllMain 剖析器函式必須一律傳回 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;
}