驱动开发,进程创建及 销毁的监视

The PsSetCreateProcessNotifyRoutine routine adds a driver-supplied callback routine to, or removes it from, a list of routines to be called whenever a process is created or deleted.
NTSTATUS
 PsSetCreateProcessNotifyRoutine(
   IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
   IN BOOLEAN  Remove
   );
#include <ntddk.h>
 



//进程监视回调函数
VOID ProcessMonitorCallback(
						IN HANDLE hParentId,
						IN HANDLE hProcessId, 
						IN BOOLEAN bCreate)
{
	NTSTATUS status;
	HANDLE procHandle = NULL;
	CLIENT_ID ClientId;
	
	OBJECT_ATTRIBUTES Obja;
	Obja.Length = sizeof(Obja);
	Obja.RootDirectory = 0;
	Obja.ObjectName = 0;
	Obja.Attributes = 0;
	Obja.SecurityDescriptor = 0;
	Obja.SecurityQualityOfService = 0;
	
	ClientId.UniqueProcess = (HANDLE)hProcessId;
	ClientId.UniqueThread = 0;
	//不管创建什么程序都关闭程序
 if(bCreate)   //bCreate 为True表示创建程序
 {
 //调用函数ZwOpenProcess函数,通过进程pid号获得进程句柄
	
	status = ZwOpenProcess(&procHandle, PROCESS_ALL_ACCESS, &Obja, &ClientId);
	if(status == STATUS_INVALID_PARAMETER_MIX)
	 DbgPrint("STATUS_INVALID_PARAMETER_MIX\n");
	else if(status == STATUS_INVALID_CID)
	 DbgPrint("STATUS_INVALID_CID\n");
	else if(status == STATUS_INVALID_PARAMETER)
	 DbgPrint("STATUS_INVALID_PARAMETER\n");
	else if(status == STATUS_ACCESS_DENIED)
	 DbgPrint("STATUS_ACCESS_DENIED\n");
	else 
		DbgPrint("STATUS_SUCCESS\n");
		
	if(procHandle != NULL)
		status = ZwTerminateProcess(procHandle,1);
	else
	{
		DbgPrint("failed to ZwOpenProcess...\n");
		return ;
	}
	//这里是我来判断没有成功结束进程用的
	switch(status)
	{
	 case STATUS_SUCCESS:
		DbgPrint("process %u has beed killed ...\n",hProcessId);
		break;
	 case STATUS_OBJECT_TYPE_MISMATCH:
		DbgPrint("failed to kill %u process,The specified handle is not a process handle. \n",hProcessId);
		break;
	 case STATUS_INVALID_HANDLE:
		DbgPrint("failed to kill %u process,The specified handle is not valid.\n",hProcessId);
		break;
	 case STATUS_ACCESS_DENIED:
		DbgPrint("failed to kill %u process,The driver cannot access the specified process object.\n",hProcessId);
		break;
	 case STATUS_PROCESS_IS_TERMINATING:
		DbgPrint("failed to kill %u process,The specified process is already terminating.\n",hProcessId);
		break;
	 default:
		break;
	}
	
		
	
 }
}
//驱动卸载函数
void DriverUnload(PDRIVER_OBJECT pDriveObj)
{
//取消监视
	PsSetCreateProcessNotifyRoutine(ProcessMonitorCallback,TRUE);
	DbgPrint("driver unloaded ...\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegisterString)
{
	NTSTATUS status = STATUS_SUCCESS;
	//驱动卸载处理
    //如果不进行控制输入,无需创建驱动软链接
	pDriverObj->DriverUnload = DriverUnload;
	status = PsSetCreateProcessNotifyRoutine(ProcessMonitorCallback,FALSE);
	return status;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值