进程监控,监视进程启动与退出最稳定的方法,不占CPU,不漏进程!

一些应用中,要用到判断某个进程或者所有进程的启动与退出事件。比如,我们做局部代理软件时,就要判断某个进程运行了没有,退出了没有。或者守护进程功能等。

很早以前,大家可能用得多一点的是用枚举进程,或者VMI来监视进程启动或退出。
但是这两种方法都存在着占用资源过高,VMI还在某些精简版的WIN系统中给禁用了从而引起监视不到问题出现。

后来经过大量市场测试,发现用回调函数PsSetCreateProcessNotifyRoutine来监视进程,稳定,可靠,不占CPU,不漏进程,适用于所有WIN系统。效率相当高。

这里放上例程下载地址:点这里下载

这里发上驱动层代码:

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegisterString)
{
	NTSTATUS status = STATUS_SUCCESS;
	//初始化各个历程
	pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
	pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
	pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
	pDriverObj->DriverUnload = DriverUnload;
	//创建,并出事换设备对象
	UNICODE_STRING strDevName;
	RtlInitUnicodeString(&strDevName, DEVICE_NAME);
	//创建设备对象
	PDEVICE_OBJECT pDevObj;
	status = IoCreateDevice(
		pDriverObj,
		sizeof(DEVICE_EXTENSION),//为设备国战结构申请空间
		&strDevName,
		FILE_DEVICE_UNKNOWN,
		0,
		FALSE,
		&pDevObj
		);
	if (!NT_SUCCESS(status))
	{
		return status;
	}
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
	//创建符号链接
	UNICODE_STRING strLinkName;
	RtlInitUnicodeString(&strLinkName, LINK_NAME);
	//创建 关联
	status = IoCreateSymbolicLink(&strLinkName, &strDevName);
	if (!NT_SUCCESS(status))
	{
		IoDeleteDevice(pDevObj);
		return status;
	}
	//将设备指针保存到全局变量中,方便后续使用
	g_pDeviceObject = pDevObj;
	//为了能够监视用户层进程,创建事件对象
	UNICODE_STRING szProcessEventString;
	RtlInitUnicodeString(&szProcessEventString, EVENT_NAME);
	//此函数待查
	pDevExt->ProcessEvent = IoCreateNotificationEvent(&szProcessEventString, &pDevExt->hProcessHandle);
	//设置非授信状态
	KeClearEvent(pDevExt->ProcessEvent);
	//设置回调函数历程
	status = PsSetCreateProcessNotifyRoutine(ProcessMonitorCallback, FALSE);
	return status;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值