Я пишу минифильтр, чтобы заблокировать выполнение приложения. Минифильтр запросит сканирование файла в IRP_MJ_CREATE для приложений пользовательского режима. Приложение пользовательского режима проверяет, разрешено ли выполнение файла PE (.exe / .dll / etc) или нет.
В настоящее время, когда приложения пользовательского режима говорят «нет», минифильтр выдаст статус «Отказано в доступе» и отменит открытие файла. (Да, используя FltCancelFileOpen
)
Проблема при выдаче возвращенного значения «отказано в доступе» заключается в том, что с точки зрения пользователя они получат окно сообщения из системы, например:
Другой пример, когда блокируется загрузка определенной библиотеки DLL, появляется другое окно сообщения:
Что я хочу сделать, так это запретить открывать, но подавить окно сообщения и получить собственное уведомление, которое представляет собой удобное сообщение об ошибке, указывающее, что приложения были заблокированы. Пример подобен функции Windows 8 smartscreen, которая уведомляет пользователя о запуске заблокированного exe без какого-либо сообщения, сообщающего, что доступ запрещен или аналогичен.
Как я могу это сделать?
Давайте возьмем пример DLL. Вы получаете эту ошибку, потому что в Windows есть код, эквивалентный
if (!LoadLibrary(szDllName))
{
MessageBox("Application Error", ...);
}
else
{
DllMain = GetProcAddress("DllMain");
DllMain(DLL_PROCESS_ATTACH);
Итак, если вы не хотите, чтобы была взята первая ветвь кода, вам следует разрешить загрузку DLL. Там нет третьего варианта.
Пример Windows 8 вводит в заблуждение. Если вы Microsoft, конечно, вы можете добавить этот третий вариант.
[редактировать] Подумав, вы отменили операцию, используяFltCancelFileOpen
? Если нет, то как ты это сделал?