Найти текущий PID и завершить его в режиме ядра

Мой драйвер минифильтра файловой системы для Windows 7x64 должен иметь доступ к некоторым файлам. Я понял, но связанное приложение все еще работает. Я хочу завершить процесс с этим приложением. Например, когда пользователь пытается открыть файл *.txt, файл и связанная с ним копия блокнота должны быть закрыты. Я использовал пример из WDK (Minispy) и функций ZwTerminateProcess и PsGetCurrentProcessId. Теперь, когда пользователь входит в каталог мониторинга, мой минифильтр закрывает explorer.exe. Пример кода:

minispy.c...

    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 ответов

Другие вопросы по тегам