15,473
社区成员




#include <Windows.h>
#include <gdcommon/cpplug.h>
#define CLASS_NAME L"GdSessionMonWnd"
static HMODULE gs_hThisModule = NULL;
static DWORD gs_dwPlugType = PT_UNKNOWN;
BOOL WINAPI DllMain(HMODULE hThisModule, DWORD dwReason, LPVOID reserved)
{
if (DLL_PROCESS_ATTACH == dwReason)
{
gs_hThisModule = hThisModule;
DisableThreadLibraryCalls(hThisModule);
}
return TRUE;
}
static void _BroadcastSessionEnd()
{
static DWORD s_dwLastNotify = 0;
if (GetTickCount() - s_dwLastNotify > 10000) // 10秒内可能出现多个,没必要广播多次
{
CPPLUGLOG_WARNW(L"向插件系统广播 PMC_SESSIONEND");
CpPlugBroadcastNotify(PMC_SESSIONEND);
}
s_dwLastNotify = GetTickCount();
}
static LRESULT CALLBACK _WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_QUERYENDSESSION)
{
_BroadcastSessionEnd();
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
static void WINAPI _MessageLoop()
{
WNDCLASSEX wcex = {sizeof(wcex)};
wcex.lpszClassName = CLASS_NAME;
wcex.hInstance = gs_hThisModule;
wcex.lpfnWndProc = _WndProc;
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
if (RegisterClassExW(&wcex))
{
HWND hWindow = CreateWindowExW(
0,
CLASS_NAME,
CLASS_NAME,
WS_OVERLAPPEDWINDOW,
0,
0,
0,
0,
NULL,
NULL,
gs_hThisModule,
NULL
);
if (IsWindow(hWindow))
{
UpdateWindow(hWindow);
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
}
static DWORD WINAPI _SessionMonThread(void* lpParam)
{
if (PT_PROXY == gs_dwPlugType)
{
_MessageLoop();
}
else
{
for ( ; ;)
{
if (GetSystemMetrics(SM_SHUTTINGDOWN))
{
_BroadcastSessionEnd();
break;
}
Sleep(SEC_TOMILLISEC(1)); // 快一点,可能有电脑关机特别迅速
}
}
return 0;
}
BOOL WINAPI CpPlugStart(DWORD dwPlugType)
{
gs_dwPlugType = dwPlugType;
CPPLUGLOG_CLOSETHREAD(_SessionMonThread, NULL, L"SESSION监测线程");
return TRUE;
}
// 32位服务插件
void WINAPI PR_b35bdb82() {}
// 32位代理插件
void WINAPI PR_5fe0a478() {}
// 64位服务插件
void WINAPI PR_26e6dcd5() {}
// 64位代理插件
void WINAPI PR_ca5da32f() {}