Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2015, 22:38   #1
Lag
Пользователь
 
Регистрация: 01.05.2010
Сообщений: 10
Печаль Найти процесс и завершить его

Добрый день! Пишу минифильтр файловой системы и хочу блокировать доступ к определенным файлам (в kernel-mode). С этой задачей я справился, но приложение, связанное с этим файлом остается открытым. Например, пользователь пытается открыть secretfile.txt, выплывает окно "Доступ запрещен", но сам блокнот остается открытым. Как мне завершить процесс приложения? Я уже пробовал PsGetCurrentProcessId, но по видимому, он возвращает не совсем корректный PID. За основу взят пример из WDK (minispy). Вот последняя версия кода измененного minispy.sys:
Код:
...
NTSTATUS TermFunction( HANDLE ProcessID )
  {
 NTSTATUS         ntStatus = STATUS_SUCCESS;
 HANDLE           hProcess;
 OBJECT_ATTRIBUTES ObjectAttributes;
 CLIENT_ID        ClientId;
 
 DbgPrint( "drvTerminateProcess( %u )", ProcessID );
 
 InitializeObjectAttributes( &ObjectAttributes, NULL, OBJ_INHERIT, NULL, NULL ); 
 
 ClientId.UniqueProcess = (HANDLE)ProcessID;
 ClientId.UniqueThread  = NULL; 
__try
     {
        ntStatus = ZwOpenProcess( &hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId );
        if( NT_SUCCESS(ntStatus) )
        {
            ntStatus = ZwTerminateProcess( hProcess, 0 );
            if( !NT_SUCCESS(ntStatus) )
                DbgPrint( "ZwTerminateProcess failed with status : %08X\n", ntStatus );
 
            ZwClose( hProcess );
        }
        else
            DbgPrint( "ZwOpenProcess failed with status : %08X\n", ntStatus );
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
     {
         ntStatus = STATUS_UNSUCCESSFUL;
         DbgPrint( "Exception caught in drvTerminateProcess()" );
     }
 
    return ntStatus;
 
    }
    ...
 
FLT_PREOP_CALLBACK_STATUS
SpyPreOperationCallback (
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext
)
{ 
UNICODE_STRING old_name;
PUNICODE_STRING new_old_name;
...
if (NT_SUCCESS( status )) {
 
        nameToUse = &nameInfo->Name;
 
        //
        //  Parse the name if requested
        //
 
        //Start of My func
        RtlInitUnicodeString( &old_name, L"\\Device\\HarddiskVolume2\\secretfile.txt" );
        new_old_name = &old_name;
        if(RtlCompareUnicodeString(nameToUse, new_old_name, FALSE) == 0){
            Data->IoStatus.Status = STATUS_ACCESS_DENIED;
 
            TermFunction(PsGetCurrentProcessId());
 
            return FLT_PREOP_COMPLETE; 
        }
...
}
....
}
Lag вне форума Ответить с цитированием
Старый 16.02.2015, 00:21   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

это совершенно хамское отношение к пользователю. Это у тебя к txt привязан блокнот. А у других - все совсем по другому. Word тоже txt открывает, есличо. А терминирование Worda означает безусловное закрытие всех рабочих документов и соответственно потерю неизвестного количества работы.

Так что ты вредительством занимаешься, а не делом)
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Завершить процесс по пути Maxxxtri23 Win Api 13 08.09.2011 15:01
[Вопрос]Как найти процесс приложения зная его заголовок? saylar_06 Общие вопросы Delphi 9 10.07.2011 21:17
Завершить процесс Roman®© Общие вопросы Delphi 5 01.02.2009 15:53
Завершить процесс doniyor Win Api 2 15.05.2008 21:52
Как завершить процесс, зная его имя Никки Win Api 6 14.01.2008 14:04