设为首页 收藏本站
查看: 1160|回复: 3

[经验分享] Windows下父进程监视子进程状态

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-1-6 10:48:29 | 显示全部楼层 |阅读模式
Linux下有功能强大ptrace,用于让父进程监视/修改/控制子进程的状态。Windows也提供了类似的接口,那就是Debuging API,用它可以编写用户级的调试器。

下面是一个例子,用以实现父进程创建并监视子进程运行状态。

#include <stddef.h>  
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <stdint.h>  
#include <assert.h>  
#include <windows.h>  

#define MAX_PARAM_LEN       4096  

int main( int argc, char ** argv )  
{  
    int i, j = 0, len;  
    char command_buf[MAX_PARAM_LEN];  

    STARTUPINFO si;  
    PROCESS_INFORMATION pi;  
    DEBUG_EVENT de;  
    BOOL stop = FALSE;  

    ZeroMemory( &si, sizeof(si) );  
    si.cb = sizeof(si);  
    ZeroMemory( &pi, sizeof(pi) );  

    if (argc<2) {  
        printf("Usage: %s <app_name> [arguments ...]\n", argv[0]);  
        return 0;  
    }  

    // Combine the module name and params into one string.  
    for (i = 1; i < argc; ++i) {  
        len = strlen(argv);  
        if (len >= MAX_PARAM_LEN - j - 1) {  
            printf("buffer overflow\n");  
            exit(-1);  
        }  
        j += _snprintf(command_buf + j, MAX_PARAM_LEN - j, "%s ", argv);  
        command_buf[j] = '\0';  // just for sure  
    }  

    if( !CreateProcess(NULL, command_buf, NULL, NULL, FALSE,            
        DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi ) ) {  
            printf( "CreateProcess failed (%d).\n", GetLastError() );  
            exit(-1);  
    }  

    while (TRUE) {  
        WaitForDebugEvent (&de, INFINITE);  

        switch (de.dwDebugEventCode) {  
        case EXCEPTION_DEBUG_EVENT:         /* exception */  
            switch (de.u.Exception.ExceptionRecord.ExceptionCode) {   
            case   EXCEPTION_INT_DIVIDE_BY_ZERO:    /* #DE */  
                // Do what the parent process want to do when the child process gets #DE interrupt.  
                TerminateProcess(pi.hProcess,1);   
                break;   
            case   EXCEPTION_BREAKPOINT:            /* #BP */  
                // Do what the parent process want to do when the child process gets #BP interrupt.  
                break;  

            default:   
                printf("Unknown Exception\n");   
                break;  
            }      

            ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_HANDLED);  
            continue;  

        case CREATE_PROCESS_DEBUG_EVENT:        /* child process created */  

            // Do what the parent process want to do when the child process was created.  
            break;  

        case EXIT_PROCESS_DEBUG_EVENT:          /* child process exits */  
            stop = TRUE;  

            // Do what the parent process want to do when the child process exits.  
            break;  

        default:  
            printf("Unknown Event!\n");  
            break;  
        }  

        if (TRUE == stop) {  
            //printf("Process exit\n");  
            break;  
        }  

        ContinueDebugEvent (de.dwProcessId, de.dwThreadId, DBG_CONTINUE);  

    } // end of loop  

    assert(stop);  

    CloseHandle( pi.hProcess );  
    CloseHandle( pi.hThread );  

    return 0;  
}  
程序参数为要监视的子进程及子进程的参数。注意一个正常的进程被创建出来后会先后收到CREATE_PROCESS_DEBUG_EVENT, EXCEPTION_DEBUG_EVENT中的EXCEPTION_BREAKPOINT和EXIT_PROCESS_DEBUG_EVENT。所以如果你不想子进程创建起来就出错,那就让处理断点的分支跳去执行ContinueDebugEvent(..., DBG_EXCEPTION_HANDLED)。

例子仅含框架,如要attach到已有进程请参见DebugActiveProcess,要修改子进程状态请参见RriteProcessMemory和WriteProcessMemory等函数。



一些参考资料:

Debugging API examples: http://www.debuginfo.com/examples/dbgexamples.html

Writing the Debugger's Main Loop: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681675(v=vs.85).aspx

Using the Windows Debugging API: http://www.howzatt.demon.co.uk/articles/SimpleDebugger.html

Debugging Functions: http://msdn.microsoft.com/en-us/library/ms679303

Win32调试API:http://hi.baidu.com/combojiang/b ... ebbfebf11f3654.html

利用Win32 Debug API打造自己的Debugger: http://hi.baidu.com/olhack/blog/ ... 50e86284352407.html

The Debugging Application Programming Interface: http://msdn.microsoft.com/en-us/library/ms809754.aspx

在主进程中捕获子进程的异常:http://blog.iyunv.com/simbi/article/details/3705719

Windows Debugging API: http://my.safaribooksonline.com/ ... mation/ch20lev1sec3


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-13355-1-1.html 上篇帖子: 能不能发给我Windows xp 的那张经典图片 右边一颗红树 一个房子 一条小路的那张 发到 下篇帖子: windows下rsync部署安装 Windows
发表于 2014-1-6 10:52:24 | 显示全部楼层
你不是仙人掌。又何須這麼堅強。╮

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-6 18:08:42 | 显示全部楼层
ぐ最后的等待、已经让我力不从心了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-6 21:42:14 | 显示全部楼层
爱情中的两个人,靠的太近与太远都不合适,少有人能把握这个度

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表