Windows Minifilter驱动 - 获取进程ID, 进程名字和线程ID (5)

在minifilter里面可能有好几种获取调用进程id,名字和线程的办法。我这里有一种:

使用

PsSetCreateProcessNotifyRoutine 和

PsSetLoadImageNotifyRoutine

这是两个API,我们可以借助它们获取进程信息。具体看:http://msdn.microsoft.com/en-us/library/windows/hardware/ff559951(v=vs.85).aspx


PsSetLoadImageNotifyRoutine

可以使用这个函数设置一个通知回调,每当操作系统新加载一个影像文件的时候,回调函数会被调用。

比如在DriverEntry里面调用:

PsSetLoadImageNotifyRoutine(MyMiniFilterLoadImage);
回调函数:

VOID 
MyMiniFilterLoadImage( __in_opt PUNICODE_STRING FullImageName, __in HANDLE ProcessId, __in PIMAGE_INFO ImageInfo )
{
    UNREFERENCED_PARAMETER(ImageInfo);

    if (FullImageName)
    {
        DbgPrint("MyMiniFilterLoadImage, image name: %wZ, pid: %d\n", FullImageName, ProcessId);
    }
    else
        DbgPrint("MyMiniFilterLoadImage, image name: null, pid: %d\n", ProcessId);
}
这样,当用户新启动一个进程的时候,这个函数就会被调用,里面可以获取进程名和进程id,还有个ImageInfo。


PsSetCreateProcessNotifyRoutine

我们可以使用这个函数来设置一个回调函数。每当操作系统创建一个进程或者关闭一个进程的时候,回调都会被调用。

DriverEntry调用:

PsSetCreateProcessNotifyRoutine(MyMiniFilterProcessNotify, FALSE);

具体回调:

VOID
MyMiniFilterProcessNotify(
IN HANDLE  ParentId,
IN HANDLE  ProcessId,
IN BOOLEAN  Create
)
{
    DbgPrint("MyMiniFilterProcessNotify, pid: %d, tid: %d, create: %d\n", ParentId, ProcessId, Create);
}


IRP Event中获取进程ID和线程ID

比如在IRP_MJ_WRITE中获取:

        ULONG ProcessId = FltGetRequestorProcessId(Data);
        ULONG ThreadId = (ULONG)PsGetThreadId(Data->Thread);

        DbgPrint("IRP_MJ_WRITE, pid: %d, tid: %d\n", ProcessId, ThreadId);
注意:PsGetThreadId是个未公开API。调用需要小心一些。


如果我们想在IRP回调中获取进程名字。有个办法就是在PsSetLoadImageNotifyRoutine的回调函数里面把进程名和进程ID保存下来,比如保存到一个list。这样,在IRP回调里面可以用进程ID来获取进程名。


取消回调

在驱动被卸载之前,需要取消回调。不然会蓝屏。比如可以在FilterUnload那里取消。

PsSetCreateProcessNotifyRoutine(MyMiniFilterProcessNotify, TRUE);
    PsRemoveLoadImageNotifyRoutine(MyMiniFilterLoadImage);


完整代码:

/*++

Module Name:

    MyMiniFilter.c

Abstract:

    This is the main module of the MyMiniFilter miniFilter driver.

Environment:

    Kernel mode

--*/

#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>

#pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER, "Not valid for kernel mode drivers")


PFLT_FILTER gFilterHandle;
ULONG_PTR OperationStatusCtx = 1;

#define PTDBG_TRACE_ROUTINES            0x00000001
#define PTDBG_TRACE_OPERATION_STATUS    0x00000002

ULONG gTraceFlags = 0;


/*
#define PT_DBG_PRINT( _dbgLevel, _string )          \
    (FlagOn(gTraceFlags,(_dbgLevel)) ?              \
        DbgPrint _string :                          \
        ((int)0))*/

#define PT_DBG_PRINT( _dbgLevel, _string )          \
        DbgPrint _string
       
/*************************************************************************
    Prototypes
*************************************************************************/

DRIVER_INITIALIZE DriverEntry;
NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    );

NTSTATUS
MyMiniFilterInstanceSetup (
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
    _In_ DEVICE_TYPE VolumeDeviceType,
    _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
    );

VOID
MyMiniFilterInstanceTeardownStart (
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
    );

VOID
MyMiniFilterInstanceTeardownComplete (
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
    );

NTSTATUS
MyMiniFilterUnload (
    _In_ FLT_FILTER_UNLOAD_FLAGS Flags
    );

NTSTATUS
MyMiniFilterInstanceQueryTeardown (
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
    );

FLT_PREOP_CALLBACK_STATUS
MyMiniFilterPreOperation (
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );

VOID
MyMiniFilterOperationStatusCallback (
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_ PFLT_IO_PARAMETER_BLOCK ParameterSnapshot,
    _In_ NTSTATUS OperationStatus,
    _In_ PVOID RequesterContext
    );

FLT_POSTOP_CALLBACK_STATUS
MyMiniFilterPostOperation (
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _In_opt_ PVOID CompletionContext,
    _In_ FLT_POST_OPERATION_FLAGS Flags
    );

FLT_PREOP_CALLBACK_STATUS
MyMiniFilterPreOperationNoPostOperation (
    _Inout_ PFLT_
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MinifilterWindows操作系统中的一个内核模块,它可以对文件系统I/O操作进行监控和过滤,提供一定程度的文件系统访问控制和文件操作的修改能力。minifilter可以在文件系统级别实现对文件的读写访问控制、文件内容加密、文件过滤等功能。 minifilter的下载通常分为两个步骤:首先需要下载Windows Driver Kit(WDK)或Windows SDK,以获取minifilter开发所需的工具和库文件;其次,可以根据自己的具体需求编写或下载现有的minifilter源代码。 WDK或Windows SDK是微软提供的一套开发工具,它包含了开发Windows驱动程序所需的一系列工具、示例代码、库文件和文档等,可以用于minifilter开发及其他相关驱动程序的开发。 一般来说,在微软官网上可以找到WDK或Windows SDK的下载链接,用户可以根据自己的操作系统版本和开发环境选择合适的版本进行下载安装。安装完成后,用户可以在Windows开发环境中配置相应的环境变量,然后就可以使用WDK或Windows SDK提供的工具和库文件进行minifilter开发。 另外,也可以通过搜索引擎或开源社区等途径,找到已经编写好的minifilter源代码,并根据需要进行下载和修改。这种方式适用于一些常见的minifilter功能,如文件加密、病毒扫描等,可以节省开发时间和工作量。 总之,minifilter的下载需要获取Windows Driver Kit或Windows SDK,然后可以通过官方渠道或开源社区获取minifilter的源代码,以进行开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值