Предполагая, что вы хотите остановить ЛЮБОЙ запуск процесса со съемного диска, похоже, это приложение для перехвата оболочки. За последние полчаса я написал следующий код, и похоже, что все в порядке. Имейте в виду, что написание ловушки - нетривиальный процесс, а глобальная ловушка требует написания 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-ключа.
Обратите внимание, что это решение работает для всех процессов с графическим интерфейсом (т.е. не консольных), но требует, чтобы они отвечали на WM_CLOSE в окне верхнего уровня. Более агрессивное общее решение, вероятно, потребует от вас преобразования hwnd в hprocess и вызова TerminateProcess: решение, которое я предоставил, является «более добрым» (связанные DLL будут выгружены и т. Д.), Но менее общим.
Если вы хотите знать основы написания общесистемного хука, вы можете найти их на моем сайте здесь . Обратите внимание, что вышеприведенный код не относится к качеству производственного кода, я взломал его на старую библиотеку ANSI, которую я использовал, отсюда и отсутствие поддержки Unicode или чего-то похожего на приличную возможность отладки. Это показывает основную идею, хотя.