实现 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;
}