2

我的 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; 
        }
...
}
....
}

任何想法?(如果我的英语不好,请原谅)

4

0 回答 0