Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 10

Найти PID процесса и завершить его

15.02.2015, 18:18. Показов 2046. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Пишу минифильтр файловой системы и хочу блокировать доступ к определенным файлам (в kernel-mode). С этой задачей я справился, но приложение, связанное с этим файлом остается открытым. Например, пользователь пытается открыть secretfile.txt, выплывает окно "Доступ запрещен", но сам блокнот остается открытым. Как мне завершить процесс приложения? Я уже пробовал PsGetCurrentProcessId, но по видимому, он возвращает не совсем корректный PID. За основу взят пример из WDK (minispy). Вот последняя версия кода измененного minispy.sys:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
...
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; 
        }
...
}
....
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2015, 18:18
Ответы с готовыми решениями:

Закрытие процесса по его PID и заморозка процесса по его имени или PID
Нужны две вот такие функции закрытие процесса по его PID и заморозка процесса по его имени или PID. В Делфи я новичок, по этому без помощи...

Завершить процесс по PID процесса
Добрый день, прошу подсказать что у меня не так. Суть кода - запуск батника - проверка на наличие файла в папке - если файла нет -...

Состояние процесса по его pid
Подскажите функцию, которая возвращает состояние процесса.(выполняется, завершился и тд) Запускаю процесс функцией spawn(), которая...

7
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.02.2015, 20:11
Цитата Сообщение от Lag Посмотреть сообщение
TermFunction(PsGetCurrentProcessId);
Что-то я не вижу здесь вызова PsGetCurrentProcessId. Скобочки-то где ?


Кстати, когда система вылетит в "синий экран", после того, как какой-нибудь
winlogon.exe захочет открыть ваш суперсекретный файл, подумайте:
а так ли уж необходимо делать terminate процессу ?

И вообще, уничтожать самого себя нехорошо, хотя бы по причине
утечки ресурсов (в Вашем коде, например, после успешного вызова
ZwTerminateProcess хэндл процесса закрыт не будет).
0
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 10
15.02.2015, 20:52  [ТС]
А как нибудь можно это сделать? Есть мысль с белым списком, но, думаю, в нем много приложений окажется)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.02.2015, 21:01
Цитата Сообщение от Lag Посмотреть сообщение
А как нибудь можно это сделать?
Ключевой вопрос: зачем ?
Файл не открылся, секретные данные прочитаны не были.
0
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 10
15.02.2015, 21:05  [ТС]
Есть такое требование, не моя причуда
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.02.2015, 21:41
Как бы там ни было, процесс не должен прибивать сам себя из
какого-нибудь обработчика типа FS-callback, лучше зашедулить
work item какой-нибудь, и уже из него вызвать terminate.
0
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 10
15.02.2015, 21:51  [ТС]
Как бы там ни было, процесс не должен прибивать сам себя из
какого-нибудь обработчика типа FS-callback, лучше зашедулить
work item какой-нибудь, и уже из него вызвать terminate
А можно чуть поподробней про work item ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.02.2015, 00:03
Work item - это типа одноразовой callback-функции, которая вызывается в
контексте системного процесса и строго на PASSIVE_LEVEL. Причем вызывается,
как правило, не сразу, а спустя некоторое время (обычно очень небольшое).
Пример: вы находитесь в функции завершения IRP (completion routine) на
IRQL == DISPATCH_LEVEL, но хотите, к примеру, закрыть хэндл (ZwClose), а
это можно делать только на PASSIVE_LEVEL. Выход - позвать IoAllocateWorkItem/
IoQueueWorkItem(Ex), создав work item и передав ему хэндл одним из аргументов.
Рано или поздно work item сработает, вызовет вашу функцию, где вы закроете
хэндл на безопасном IRQL.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2015, 00:03
Помогаю со студенческими работами здесь

Завершение процесса по его PID
Пишу прожку, которая запускает и завершает процесы. Нужно что-бы она определила свой PID и по нему завершилась. Как грохнуть процесс по...

Определить заголовок(имя) окна, зная PID его процесса
Сабж! Уже 2ой день не могу найти - как? У меня известе PID и hwnd процесса, как узнать имя окна(то есть название окна, которое отображается...

Отследить запуск нового процесса и завершить его
Каким образом можно реализовать следующее: программа, которая будет отслеживать появление нового процесса и потом убивать его. Т.е. я...

Как узнать Handle или PID процесса, зная его имя и класс?
Как узнать Handle или PID процесса, зная его имя и класс?

Зная pid процесса (либо его заголовок), развернуть окно приложения на полный экран
Друзья, всем привет! Подскажите, в каком направлении двигаться, и какие функции использовать. У меня есть функция, вычисляющая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru