创建/结束进程回调 PsSetCreateProcessNotifyRoutine

PsSetCreateProcessNotifyRoutine

PsSetCreateProcessNotifyRoutine添加或者移除一个驱动支持的回调例程(也可以成为函数)。

当一个进程被创建或者删除时,一系列的例程将会被调用。PS:相当于把例程加入到一个链表中,当进程被创建或者删除时,所有的例程都会被调用(应该是这个意思)

NTSTATUS
PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, 例程函数的入口地址,
IN BOOLEAN Remove  FALSE时,添加例程到链表, TRUE,从链表中删除该例程
);

返回值:

STATUS_SUCCESS 例程被注册到系统中
STATUS_INVALID_PARAMETER 例程已被注册过,所以此例程是多余的,或者已经达到了注册个数的上限。
评注:
最高级的驱动可以调用 PsSetCreateProcessNotifyRoutine 去设置他们的进程创建通知例程,声明如下:

VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);

ParentId和ProcessId 用于确定进程,Create参数表明进程是创建还是删除。

一个IFS或最高级的system-profiling驱动可能注册一个process-creation回调去追踪全系统的创建和删除进程而不是驱动的内部的,
对于Vista和其后的版本,系统可以创建高达64个系统创建回调。

一个驱动在卸载前,必须移除所有它注册过的例程,你可以通过调用PsSetCreateProcessNotify (Remove = TRUE)去移除例程。

当Create为True时,例程在新创建的进程(ProcessId句柄指定)的初始化线程被创建后被调用。

当Create为False时,例程在进程的最后一个线程被关闭,进程的地址空间将被释放时调用。

进程的进程通知例程运行在IRQL = PASSIVE_LEVEL,当一个进程被创建,例程运行在新创建的进程的线程上下文中。

当进程被删除时,例程运行在进程的最后一个线程(将要退出进程)中。
时间: 2024-08-29 07:27:05

创建/结束进程回调 PsSetCreateProcessNotifyRoutine的相关文章

centos7用shell创建守护进程,并设置为系统服务,开机自动启动

首先是创建shell守护进程:(shouhu.sh) #!/bin/bash test(){         while true         do                 ls ./  >> 123.txt                 sleep 5                              done } case $1 in start)         path="/root/shouhu.pid"         if [ -f $p

linux创建守护进程

守护进程deamon 是一个后台进程,无需用户输入就能运行,用来在系统后台提供某种服务. 常见的守护进程有Wbe服务器.邮件服务器以及数据库服务器等等.守护进程不能控制终端,所以任何的输入和输出都需要做特殊处理. 创建守护进程的过程并不复杂,首先执行fork(),将父进程退出. 一个守护进程是从shell脚本或者命令启动,守护进程和应用程序不同的地方是守护进程不是交互式的,它在后台运行,不控制终端. 守护进程既不需要从标准输入设备读入信息,也不需要从标准输出设备输出信息. 下一步是在子进程中调用

linux之Deamon进程创建及其进程exit,_exit,return之间的区别

Dameon进程又被称做守护进程,一般来说他有以下2个特点: 1.生命周期非常长,一旦启动,一般不会终止,直到系统推出,不过dameon进程可以通过stop或者发送信号将其杀死 2.在后台执行,不跟任何控制终端关联,终端信号比如:SIGINT,SIGQUIT,SIGTSTP,以及关闭终端都不会影响deamon 如何编写Daemon进程,需要遵循以下规则: (1)执行fork()函数,父进程退出,子进程继续 执行这一步,原因有二: ·父进程有可能是进程组的组长(在命令行启动的情况下),从而不能够执

启动和结束进程

今天,我们来了解一下,在应用程序中,如何启动一个进程,然后把这个进程结束掉.实现这一功能有替代方案,即使用.NET库中的System::Diagnostics::Process类来完成.在Win32中,启动一个进程可以理解为创建进程,所以可以调用CreateProcess函数,结束进程则调用TerminateProcess函数. 唯一标识一个进程的是PID,而我们要对进程进行各项操作,进程也存在于内存中,也可以视为一种资源,我们知识,操作图标资源有HICON,操作位图资源有HBITMAP,同样道

创建守护进程步骤与setsid() -- linux deamon进程

原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器mys

Linux系统编程——进程的控制:结束进程、等待进程结束

结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 return: 结束当前函数 而我们可以通过 exit() 或 _exit() 来结束当前进程. 所需头文件: #include <stdlib.h> void exit(int value); 功能: 结束调用此函数的进程. 参数: status:返回给父进程的参数(低 8 位有效),至于这个参数是多

C#中各种结束进程的方法

  Process类的CloseMainWindow, Kill, Close: 1.Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过关闭程序主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4.它的本质就是向主窗体发送WM_CLOSE消息(Process.MainWindowsHandle可以返回主窗体的句柄).这个可以在.NET Framework源代码中看出来 public bool CloseMainWindow() { In

swoole创建工作进程,执行滞后工作

一,创建守候进程,因为这里不需要Server,也没有Client,数据交换通过redis进行 <?php namespace Kuba\Saas; require_once __DIR__ . '/Core/ErrorHandle.php'; use \Swoole\Timer; use \Swoole\Process; use Kuba\Saas\Core\ErrorHandle; final class Services { private $m_workers = []; private

C语言创建守护进程

守护进程最大的特点就是不受终端控制,并且在后台运行.linux上很多应用都是以守护进程的方式存在的,比如常用的crond.把应用做成守护进程的好处就是可以脱离终端,不会因为终端的关闭而挂掉,会随着系统的存在而存在. 创建守护进程有以下几个要点: <1> 创建子进程,杀掉父进程. 这么做主要是为了确保进行操作<2>的进程不是会话组长,因为会话组组长调用setsid会失败. <2> 调用setsid() 每个进程都属于一个进程组,进程组号就是进程组组长的pid.多个进程组属