سؤال

I am attempting to sandbox potentially malicious code by executing it within a MAF plugin launched in its own process:

    var x = token.Activate<Ix>(new AddInProcess(), AddInSecurityLevel.Internet);

This seems to work well except that when handling a StackOverflowException a dialog is shown: "AddInProcess.exe has stopped working". This makes it very hard to test

    [TestMethod]
    public void TestStackOverflow() {
        var host = new Host(Environment.CurrentDirectory
            + "/../../../build/pipeline");
        host.Run("foo");
        host.Tick();
        Thread.Sleep(1000);
        host.Monitors.Count.Should().Be(0);
        host.Shutdown();
    }

If I click the "close" button before the Sleep expires, the test succeeds, otherwise it fails. This indicates that the process does not exit until the "close" button is pressed. Given I am expecting the process to terminate, how can I make sure it does so without raising this dialog? I have tried setting my OS to "never check for solutions" but the dialog still comes up. Setting it to "automatically check for solutions" avoids the dialog but takes up to ten seconds which is not desirable... and I would rather avoid an OS setting.

AddInProcess.exe has stopped working

هل كانت مفيدة؟

المحلول

You can call SetErrorMode somewhere inside the addin process like so:

    [Flags]
    enum ErrorModes : uint {
        SYSTEM_DEFAULT = 0x0,
        SEM_FAILCRITICALERRORS = 0x0001,
        SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
        SEM_NOGPFAULTERRORBOX = 0x0002,
        SEM_NOOPENFILEERRORBOX = 0x8000
    }

    [DllImport( "kernel32.dll" )]
    static extern ErrorModes SetErrorMode( ErrorModes uMode );

    var em = SetErrorMode( 0 );
    SetErrorMode( em | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOOPENFILEERRORBOX );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top