假设您希望停止从可移动驱动器启动的任何进程,这似乎是一个外壳挂钩的应用程序。我在过去半小时内编写了以下代码,似乎测试正常。请记住,编写钩子是一个不平凡的过程,而全局钩子需要编写 DLL。这是钩子 DLL 的相关内容:
BOOL __declspec(dllexport) __stdcall InstallShellHook ()
{
lpfnHookProc = (HOOKPROC) ShellFunc ;
BOOL bRetVal = FALSE;
if (hShellHook == NULL)
{
hShellHook = SetWindowsHookEx (WH_SHELL,
lpfnHookProc,
hInstance,
NULL);
return TRUE;
}
return FALSE;
}
LRESULT CALLBACK ShellFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND hWndNew;
char szBuff [_MAX_PATH];
char szDrive [_MAX_DRIVE];
switch (nCode)
{
case HSHELL_WINDOWCREATED:
hWndNew = (HWND)wParam;
GetWindowModuleFileName (hWndNew, szBuff, _MAX_PATH);
_splitpath (szBuff, szDrive, NULL, NULL, NULL);
if (GetDriveType (szDrive) == DRIVE_REMOVABLE)
{
PostMessage (hWndNew, WM_CLOSE, 0, 0);
}
break;
default:
break;
}
return 0;
}
我已经测试了这段代码,它是从一个简单的对话框测试平台安装的,它允许我从我的硬盘驱动器启动任何窗口应用程序,但会立即关闭我从 USB 密钥启动的任何应用程序。
请注意,此解决方案适用于所有 GUI 进程(即非控制台),但要求它们在*窗口上响应 WM_CLOSE。更激进的通用解决方案可能需要您将 hwnd 解析为 hprocess 并调用 TerminateProcess:我提供的解决方案是“更友好”(链接的 DLL 将被卸载等),但不太通用。
如果您想了解编写系统范围挂钩的基础知识,可以在我的网站here 上找到它们。请注意,上面的代码不是生产质量的代码,我将它破解成一个旧的 ANSI dll,因此缺乏对 Unicode 的支持,或者任何接近体面的调试能力的东西。但它显示了基本思想。