为什么没有触发JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS?

时间:2013-06-27 15:03:14

标签: c# winapi

我通过c#

创建一份工作
    public WindowsJob()
    {
        m_handle = Kernel32Dll.CreateJobObject(IntPtr.Zero, null);
        SetJobInformation();
        SetJobCompletionPort();
    }

    private void SetJobInformation()
    {
        var info = new Win32Define.JOBOBJECT_BASIC_LIMIT_INFORMATION
        {
            LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,

        };

        var extendedInfo = new Win32Define.JOBOBJECT_EXTENDED_LIMIT_INFORMATION
        {
            BasicLimitInformation = info
        };

        int length = Marshal.SizeOf(typeof(Win32Define.JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
        IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
        Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);

        if (!Kernel32Dll.SetInformationJobObject(m_handle
            , Win32Define.JobObjectInfoType.JobObjectExtendedLimitInformation
            , extendedInfoPtr, (uint)length))
            throw new Exception(string.Format("Unable to set information.  Error: {0}", Marshal.GetLastWin32Error()));
    }

我可以抓住JOB_OBJECT_MSG_NEW_PROCESS,JOB_OBJECT_MSG_EXIT_PROCESS,JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO,但我无法抓住JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS (我写了一个c#程序,它抛出新的System.Exception(“未处理”)来自杀,它被JOB_OBJECT_MSG_EXIT_PROCESS捕获而不是JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS)。

我尝试了本机程序,它也无法被JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS捕获。

为什么呢?在那里我犯了什么错误?

1 个答案:

答案 0 :(得分:0)

如果我们查看JOBOBJECT_ASSOCIATE_COMPLETION_PORT的文档,它看起来是发送进程退出通知的结构,我们发现只有一组有限的退出代码被视为异常退出。

例如,要使用STATUS_ACCESS_VIOLATION退出进程,请尝试以下C ++程序,看看是否收到异常退出通知。

void main()
{
    int* p = nullptr;
    *p = 42;
}

在我的测试中,以未处理的异常退出的.NET应用程序具有退出代码255,这不是被列为异常退出的那些代码之一。