http://hi.baidu.com/xbbsh/blog/item/b73d3125462201084c088db1.html

--------------------------------------------------

MFC任务管理器task manager----进程的挂起与恢复--NtSuspendProcess&&NtResumeProcess
2009-08-11 1:13

.h

pubilc:

typedef DWORD (WINAPI *NtSuspendProcess)(HANDLE ProcessHandle); 
typedef DWORD (WINAPI *NtResumeProcess)(HANDLE hProcess);

NtSuspendProcess m_NtSuspendProcess;
NtResumeProcess   m_NtResumeProcess;

.cpp:

void CPage2::OnBnClickedResume()
{
// TODO: 在此添加控件通知处理程序代码
int nIdx=m_list2.GetNextItem(-1,LVNI_SELECTED);
CString   process=m_list2.GetItemText(nIdx,1);

DWORD processID= _ttol(process.GetBuffer(0));

HANDLE hProcess = OpenProcess( PROCESS_SUSPEND_RESUME ,//暂停时用这个(P.._S.._R..)标志
   FALSE, (DWORD)processID );
if (hProcess)
{
   HMODULE h_module=LoadLibrary(L"ntdll.dll");
   m_NtResumeProcess=(NtResumeProcess)GetProcAddress(h_module,"NtResumeProcess");
   m_NtResumeProcess(hProcess);
}
}

太晚了 睡觉睡觉。。。。。。。

--------------------------------------------------

.h

#pragma once

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

#include <string>
#include <tchar.h>

//#include <ntifs.h>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")

void ErrorExit(LPTSTR lpszFunction);

//--------------------------------------------------
// for cpu 暂停

//方法1 不可关闭本程序,否则进程会退出
long DbgUiConnectToDbg_ntdll();

//long (*DbgUiConnectToDbg)();//这样会报重复定义
long DbgUiDebugActiveProcess_ntdll(HANDLE ProcessHandle);//暂停
long DbgUiStopDebugging_ntdll(HANDLE ProcessHandle);//恢复

//方法2 可关闭本程序
DWORD NtSuspendProcess_ntdll(HANDLE hProcess);//暂停
DWORD NtResumeProcess_ntdll(HANDLE hProcess);//恢复

//要先调用这个
void LoadNtDllFun();

//--------------------------------------------------

class win_proc_public
{
public:
    win_proc_public(void);
    ~win_proc_public(void);
public:

std::string GetExeFullName(HANDLE hProcess)
    {    
        std::string r = "";

//HANDLE hProcess = 0;
        char lpImageFileName[2049] = {0};
        DWORD nSize = 2048;

//hProcess = getm
        DWORD len = GetProcessImageFileName(hProcess, lpImageFileName, nSize);

if (len < 1)
        {
            //不能直接退出,因为有些权限是得不到的
            //ErrorExit("GetExeFullName: ");
        }

//len = GetModuleFileNameEx(hProcess, lpImageFileName, nSize);

r = lpImageFileName;
        r = DosDevicePath2LogicalPath(r.c_str());
        
        return r;
    }//

//将 "\Device\HarddiskVolume2" 等转换为 "D:\"
    //DosDevicePath2LogicalPath代码摘自:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/fileio/fs/obtaining_a_file_name_from_a_file_handle.htm
    std::string DosDevicePath2LogicalPath(LPCTSTR lpszDosPath)
    {
        std::string strResult = "";

// Translate path with device name to drive letters.
        TCHAR szTemp[MAX_PATH];
        szTemp[0] = '\0';

if ( lpszDosPath==NULL || !GetLogicalDriveStrings(_countof(szTemp)-1, szTemp) )
        {
            return strResult;
        }

TCHAR szName[MAX_PATH];
        TCHAR szDrive[3] = TEXT(" :");
        BOOL bFound = FALSE;
        TCHAR* p = szTemp;

do{
            // Copy the drive letter to the template string
            *szDrive = *p;

// Look up each device name
            if ( QueryDosDevice(szDrive, szName, _countof(szName)) )
            {
                UINT uNameLen = (UINT)_tcslen(szName);

if (uNameLen < MAX_PATH) 
                {
                    bFound = _tcsnicmp(lpszDosPath, szName, uNameLen) == 0;

if ( bFound )
                    {
                         // Reconstruct pszFilename using szTemp
                         // Replace device path with DOS path
                         TCHAR szTempFile[MAX_PATH];
                         _stprintf(szTempFile, TEXT("%s%s"), szDrive, lpszDosPath+uNameLen);
                         strResult = szTempFile;
                    }
                }
            }
            // Go to the next NULL character.
            while (*p++);
        } while (!bFound && *p); // end of string

return strResult;
    }//

void mainaaa()
    {
        GetProcessList( );
    }

BOOL GetProcessList( )
    {
        HANDLE hProcessSnap;
        HANDLE hProcess;
        PROCESSENTRY32 pe32;
        DWORD dwPriorityClass;

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        if( hProcessSnap == INVALID_HANDLE_VALUE )
        {
            return( FALSE );
        }

pe32.dwSize = sizeof( PROCESSENTRY32 );

if( !Process32First( hProcessSnap, &pe32 ) )
        {
            CloseHandle( hProcessSnap );                                     
            return( FALSE );
        }

do
        {
            printf( "\n\n"
            "=====================================================" );
            printf( "\nPROCESS NAME:  %5s", pe32.szExeFile);
            printf( "\n"
            "-----------------------------------------------------" );

dwPriorityClass = 0;
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
            //hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID );
            if( hProcess == NULL )
            {
                printf("erro");
            }
            else
            {
                dwPriorityClass = GetPriorityClass( hProcess );
                if( !dwPriorityClass )
                printf("erro");

//--------------------------------------------------
                //clq add 程序全路径

//char szFilePath[256] = {0};
                ////HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pe32.th32ProcessID);
                //if ( GetProcessImageFileName(hProcess,szFilePath,MAX_PATH)!=0 )
                //{
                //    //mystring strFilePath = CCommon::DosDevicePath2LogicalPath(szFilePath);
                //}

std::string exename = GetExeFullName(hProcess);
                printf( "\n  path              = %s", exename.c_str() );
                //--------------------------------------------------

//                CloseHandle( hProcess );
            }

printf( "\n  process ID        = %d", pe32.th32ProcessID );
            printf( "\n  thread count      = %d", pe32.cntThreads );
            printf( "\n  parent process ID = %d", pe32.th32ParentProcessID );
            printf( "\n  Priority Base     = %d", pe32.pcPriClassBase );
            if( dwPriorityClass )
            printf( "\n  Priority Class    = %d", dwPriorityClass );

} while( Process32Next( hProcessSnap, &pe32 ) );

CloseHandle( hProcessSnap );
        return( TRUE );

}//

public:
    static void test1()
    {
        win_proc_public proc;
        proc.mainaaa();

test2(4008);
    }//

static void test2(DWORD pid)
    {

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
        //if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time))
        //{
        //    return -1;
        //}

if (hProcess == NULL) return;

LoadNtDllFun();
        //DbgUiConnectToDbg_ntdll();
        //long r = DbgUiDebugActiveProcess_ntdll(hProcess);//暂停//调用后不能停止程序否则被停止的程序会被强制退出(相当于调试器停止?)

//::Sleep(5*60*1000);

//r = DbgUiStopDebugging_ntdll(hProcess);//恢复运行

NtSuspendProcess_ntdll(hProcess);//暂停
        NtResumeProcess_ntdll(hProcess);//恢复

}//
};
--------------------------------------------------

.cpp

#include "win_proc_public.h"

win_proc_public::win_proc_public(void)
{
}

win_proc_public::~win_proc_public(void)
{
}

//--------------------------------------------------
// for cpu 暂停

//方法1
long (__stdcall *DbgUiConnectToDbg_p)();//在 .h 这样会报重复定义
long (__stdcall *DbgUiDebugActiveProcess_p)(HANDLE ProcessHandle);//暂停
long (__stdcall *DbgUiStopDebugging_p)(HANDLE ProcessHandle);//恢复
//方法2
//NtResumeProcess
DWORD (WINAPI *NtResumeProcess_p)(HANDLE hProcess);//暂停
DWORD (WINAPI *NtSuspendProcess_p)(HANDLE hProcess);//恢复

void LoadNtDllFun()
{
    HMODULE dllhandle;
    //dwret:dword;
    //ProcessHandle: dword;
    //begin
    dllhandle = LoadLibrary("ntdll.dll");
    if (dllhandle != 0 )
    {
        DbgUiConnectToDbg_p       = (long (__stdcall *)())    GetProcAddress(dllhandle, "DbgUiConnectToDbg");
        DbgUiDebugActiveProcess_p = (long (__stdcall *)(HANDLE))GetProcAddress(dllhandle, "DbgUiDebugActiveProcess");
        DbgUiStopDebugging_p      = (long (__stdcall *)(HANDLE))GetProcAddress(dllhandle, "DbgUiStopDebugging");

//MyDbgUiConnectToDbg;
        //ProcessHandle:=OpenProcess(process_all_access, False, findprocess("winlogon.exe"));
        ////messagebox(0,pchar(inttohex(ProcessHandle,8)),"aa",0);
        //dwret:=MyDbgUiDebugActiveProcess(ProcessHandle);
        //if dwret<>0 then messagebox(0,pchar("保护失败"),"提示",0) else
        //messagebox(0,pchar("保护成功,来结束我吧!"),"提示",0)

NtResumeProcess_p       = (DWORD (__stdcall *)(HANDLE))GetProcAddress(dllhandle, "NtResumeProcess");
        NtSuspendProcess_p      = (DWORD (__stdcall *)(HANDLE))GetProcAddress(dllhandle, "NtSuspendProcess");

}

//CloseHandle(dllhandle);
}//

long DbgUiConnectToDbg_ntdll()
{
    return DbgUiConnectToDbg_p();
}//

long DbgUiDebugActiveProcess_ntdll(HANDLE ProcessHandle)
{
    return DbgUiDebugActiveProcess_p(ProcessHandle);
}//

long DbgUiStopDebugging_ntdll(HANDLE ProcessHandle)
{
    return DbgUiStopDebugging_p(ProcessHandle);
}//

DWORD NtResumeProcess_ntdll(HANDLE hProcess)//暂停
{
    return NtResumeProcess_p(hProcess);
}

DWORD NtSuspendProcess_ntdll(HANDLE hProcess)//恢复
{
    return NtSuspendProcess_p(hProcess);
}

/*
这个据说也成
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID );
if (hProcess)
{
HINSTANCE h_module = LoadLibrary(“ntdll.dll”);
NtProcess mProcess = (NtProcess)GetProcAddress(h_module, “NtResumeProcess”); //NtResumeProcess NtSuspendProcess
mProcess(hProcess);
}
其中processID为进程PID号码
休眠还是恢复,随你选择
*/

http://www.cnblogs.com/-clq/archive/2012/03/15/2397533.html

MFC任务管理器task manager----进程的挂起与恢复--NtSuspendProcess&&NtResumeProcess的更多相关文章

  1. linux进程的挂起和恢复

    进程的挂起及恢复 #ctrl+z:挂起,程序放到后台,程序没有结束. #jobs:查看被挂起的程序工作号 恢复进程执行时,有两种选择:fg命令将挂起的作业放回到前台执行:用bg命令将挂起的作业放到后台 ...

  2. C# 进程的挂起与恢复

    1. 源起: 仍然是模块化编程所引发的需求.产品经理难伺候,女产品经理更甚之~:p 纯属戏谑,技术方案与产品经理无关,芋头莫怪! VCU10项目重构,要求各功能模块以独立进程方式实现,比如:音视频转换 ...

  3. Linux中线程的挂起与恢复(进程暂停)

    http://www.linuxidc.com/Linux/2013-09/90156.htm 今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整 ...

  4. 【C#】调度程序进程已挂起,但消息仍在处理中;

    环境:WPF.弹窗,messageBox.show();错误信息:调度程序进程已挂起,但消息仍在处理中:解决方法:Dispatcher.BeginInvoke(new Action(()=>{  ...

  5. 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展

    [Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...

  6. Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。

    测试的代码主要功能:开启一个tcp服务器.然后设置了管理进程和工作进程start的回调进行更名.设置了pid_file保存了服务端启动的mast进程. <?php //创建Server对象,监听 ...

  7. Day035--Python--管道, Manager, 进程池, 线程切换

    管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process ...

  8. My To Do List (Task Manager)

    My To Do List (Task Manager) With everything that business owners deal with throughout their day, th ...

  9. Windows的任务管理器怎么显示进程的图标

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Windows的任务管理器怎么显示进程的图标.

随机推荐

  1. [转] npm命令概述

    PS:问题,nvm找不到正确的下载server NVM_NODEJS_ORG_MIRROR=http://nodejs.org/dist nvm ls-remote NVM_NODEJS_ORG_MI ...

  2. 树形dp练习

    /*poj 1463 最小点覆盖 匈牙利*/ #include<iostream> #include<cstdio> #include<cstring> #defi ...

  3. PL/SQL 批量SQL

    批量SQL包括: FORALL语句 BULK COLLECT子句 FORALL语句 FORALL具有如下结构: FORALL loop_counter IN bounds_clause [SAVE E ...

  4. Unity3D 5.0简单的射线检测实现跳跃功能

    这里是一个简单的跳跃,5.0和其他版本貌似不一样,并且,再起跳功能做的不完全. 不过一个基本的思路在这里. 1.首先,射线检测,这里是利用一个空对象,放到主角对象的下面 2.然后调节射线的位置,在主角 ...

  5. WPF Paragraph获取或修改文本内容

    一.说明 Paragraph继承自Block,Block继承自TextElement,在TextElement中 // // 摘要: // 获取表示元素中内容末尾的 System.Windows.Do ...

  6. rdlc报表

    也是第一次接触报表这个东西.现在在我理解,报表无非就是两个内容,格式和数据. 格式没有多少了解,就记录了,以后再续.数据的绑定和结果的显示是怎么实现的呢? 今天的主角就是rdlc这个文件和Report ...

  7. XCODE6 提交至 App Store

    新到一个公司,以前的苹果开发人员离职,临时接手他的苹果代码,需要修改并上线到APP STORE.  xcode6.0升级到最新的6.1后, 发现各种坑 1. 路径配置不对, 这个是个人习惯问题,之前的 ...

  8. Linux系统下分割tomcat日志

    在Linux系统下,tomcat日志catalina.out并不会像window系统下,按日期进行重写备份,因此在Linux系统下会造成日志文件过大的情况,本文介绍采用 cronolog工具进行如在w ...

  9. Queue学习

    Queue在Python中可以算作是一种容器,但是他和list,set,dict不一样. 1. Queue不是Python内置类型.它在Queue模块中定义. 2. 它不是iterator容器,他不能 ...

  10. 4 - 执行TestNG

    TestNG以如下几种方式被调用 命令行 ant Eclipse IntelliJ's IDEA 这部分对如何使用命令行方式调用TestNG进行阐述. 假设TestNG已经在你的classpath中, ...