win驱动下进程操作相关函数

1。先要声名一些函数(已经导出)

// 1. 声明要使函数
NTKERNELAPI NTSTATUS PsSuspendProcess(PEPROCESS pEProcess);
NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS pEProcess);
NTKERNELAPI NTSTATUS PsResumeProcess(PEPROCESS pEProcess);
NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId(IN PEPROCESS pEProcess);

// 根据PID返回进程EPROCESS,失败返回NULL
PEPROCESS LookupProcess(HANDLE hPid)
{
    PEPROCESS pEProcess = NULL;
    if (NT_SUCCESS(PsLookupProcessByProcessId(
        hPid, &pEProcess)))
        return pEProcess;
    return NULL;
}

//挂起进程
BOOLEAN KernelSuspendProcess(ULONG Id)
{
    //1. 先根据ID得到EPORCESS
    PEPROCESS pEProcess;
    if ((pEProcess = LookupProcess((HANDLE)Id) )!= NULL)
    {
        //2. 暂停进程
        if (NT_SUCCESS(PsSuspendProcess(pEProcess)))
            return FALSE;
    }
    return TRUE;

}

//恢复进程
BOOLEAN KernelResumeProcess(ULONG Id)
{
    //1. 先根据ID得到EPORCESS
    PEPROCESS pEProcess;
    if ((pEProcess = LookupProcess((HANDLE)Id)) != NULL)
    {
        //2. 暂停进程
        if (NT_SUCCESS(PsResumeProcess(pEProcess)))
            return FALSE;
    }
    return TRUE;

}

//结束进程
void KernelKillProcess() {
    HANDLE            hProcess = NULL;
    CLIENT_ID         ClientId = { 0 };
    OBJECT_ATTRIBUTES objAttribut =
    { sizeof(OBJECT_ATTRIBUTES) };
    ClientId.UniqueProcess = (HANDLE)1234; // PID
    ClientId.UniqueThread = 0;
    // 打开进程,如果句柄有效,则结束进程
    ZwOpenProcess(
        &hProcess,    // 返回打开后的句柄
        1,            // 访问权限
        &objAttribut, // 对象属性
        &ClientId);   // 进程ID结构
    if (hProcess) {
        ZwTerminateProcess(hProcess, 0);
        ZwClose(hProcess);
    };
}

//遍历进程
VOID EnumProcess() {
    PEPROCESS pEProc = NULL;
    // 循环遍历进程(假设线程的最大值不超过0x25600)
    ULONG i = 0;
    for (i = 4; i<0x25600; i = i + 4) {
        // a.根据PID返回PEPROCESS
        pEProc = LookupProcess((HANDLE)i);
        if (!pEProc) continue;
        // b. 打印进程信息
        DbgPrint("EPROCESS=%p PID=%ld PPID=%ld Name=%s\n",
            pEProc, (UINT32)PsGetProcessId(pEProc),
            (UINT32)PsGetProcessInheritedFromUniqueProcessId(pEProc),
            PsGetProcessImageFileName(pEProc));
        // c. 将进程对象引用计数减1
        ObDereferenceObject(pEProc);
        DbgPrint("\n");
    }
}

注意这里不是那种普通的通过链遍历得到的。因为有可能故意断链。这里通过暴力的遍历(同时进程id都是偶数)

原文地址:http://blog.51cto.com/haidragon/2131418

时间: 2024-11-02 23:10:06

win驱动下进程操作相关函数的相关文章

Linux 下进程操作,----进程的创建与控制

---恢复内容开始--- 进程是一个程序一次执行的过程,是操作系统动态执行的基本单元. 进程的概念主要有两点:第一,进程是一个实体.每个进程都有自己的虚拟地址空间,包括文本区.数据区.和堆栈区.文本区域存储处理器执行的代码:数据区存储变量和动态分配的内存:堆栈区存储着活动进程调用的指令和本地变量.第二,进程是一个"执行中的程序",它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度和消亡的过程,

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

linux下查找进程及终止进程操作的相关命令

使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程.这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号.首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word1)ps a 显示现行终端机下的所有程序,包括其他用户的程序.2)ps -A 显示所有程序.3)ps c 列出程序时,显示

win/linux 下使用 psutil 获取进程 CPU / memory / IO 占用信息

psutil - A cross-platform process and system utilities module for Python 1. 安装 pip 安装即可. windows 下需要安装 vs2008,否则报错: Unable to find vcvarsall.bat 如果已经安装 vs2010 / vs2012 则需要设置环境变量,VS90COMNTOOLS 指向已有的 vs 变量. vs2010 设置如下: VS90COMNTOOLS = %VS100COMNTOOLS%

基于AFD驱动的进程流量控制

基于AFD驱动的进程流量控制 摘要:目前有些软件可以监控进程流量,功能实现的都很多错的.对于进程流量的控制很很多种方案,每一种方案也都有其缺点.比如有应用层基于LSP来做的,也有通过TDI和NDIS中间层来做的.其实现的效果和复杂度也各不相同.而我们要讨论的是一种基于AFD驱动来做的一种进程流量控制方案.     关键词:AFD 进程流量  控制驱动 1.   总述 目前有些软件可以监控进程流量,功能实现的都很多错的.对于进程流量的控制很很多种方案,每一种方案也都有其缺点.比如有应用层基于LSP

win环境下,django+postgresql配置

先下载postgresql的python包,选择合适自己的python版本和平台32位还是64位,http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下载win环境下postgresql接口,http://www.stickpeople.com/projects/python/win-psycopg/ 设置django settings.py DATABASES项 注:第2步如果不操作就会出现from psycopg2._psycopg import

win server core 基本命令操作

win server core 基本命令 刚安装好的WIN SERVER CORE 桌面上没有任何图标,想要运行DOS环境,按下CTRL+ALT+DELETE,任务管理器里新建任务CMD即可打开DOS界面. 查看计算机名称:hostname 更改计算机名称:netdom renamecomputer computername(现计算机名称) /newname:computername(新计算机名称) 更改本地连接的IP地址,子网掩码,网关信息: netsh interface ipv4 set

进程操作篇atexit execl exit fprintf fscanf getpid nice get priority printf setpid system vfork wait waitpid

atexit(设置程序正常结束前调用的函数) 相关函数 _exit,exit,on_exit 表头文件 #include<stdlib.h> 定义函数 int atexit (void (*function)(void)); 函数说明 atexit()用来设置一个程序正常结束前调用的函数.当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序. 返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中. 范例 #

Process Monitor监控进程操作注册表如何实现?

http://zhidao.baidu.com/link?url=Kqav4qkQSprC5FnpHPOGJvhqvY9fJ9-Vdx9g_SWh4w5VOusdRJo4Vl7qIdrG4LwRJvraB9s9UipTVOgp7NJvLGIXiaXwWjQz5LP0TX_ixyC Process Monitor监控进程操作注册表如何实现?  2014-09-14 14:485203751 | 浏览 1092 次 操作系统 Process Monitor这个工具是微软的一个监控进程注册表操作,文件