Rilevare eccezioni dal processo figlio

1

Sto cercando qualsiasi informazione. (Conosco alcuni C ++ con win32 e C #)

L'idea:

L'idea è di aiutare un programma con caricamento di file mancanti. Alla fine volevo vedere se potevo avere il mio programma lanciare un semplice eseguibile c ++ che richiede una dll che stampa "Hello World" sullo standard output. La stranezza sarebbe che la dll non è presente nella cartella. Il programma c ++ invece di crash è sospeso e il programma principale deve richiedere la dll da qualche fonte . Una volta caricata la DLL, il processo di stampa riprende e continua a funzionare.

Esempio di esecuzione.

MainProcess => start("a.exe");
a.exe => LoadLibrary("test.dll");
OS responds with "file does not exist".
MainProcess catches said exception.

MainProcess suspends a.exe like in questo esempio

MainProcess finds dll.
MainProcess dispatches the exception.
MainProcess tells gets a.exe to attempt loading again.

Ci sono casi in cui questo genere di cose non funzionerebbe? Un genitore può catturare eccezioni destinate ai bambini?

Come si farebbe?

Inoltre è possibile dire esattamente di quali file sarà necessario un processo prima di eseguirlo?

    
posta Dimitry Rakhlei 01.04.2016 - 21:17
fonte

2 risposte

1

Also is it possible to tell exactly which files a process will need before running it?

Questo non è fattibile. Innanzitutto, ci sono molte API che caricano i file. Avresti bisogno di scansionare ognuno di loro. Quindi, dovresti capire quale sarebbe il parametro appropriato in runtime . Considera questo codice:

char foo[100]
scanf("%s",foo);
FILE* fp = open(foo)

Bene, eccoti qui. Come prevedi cosa potrebbe inserire l'utente?

("Ehi", potresti dire, "Ho taggato la mia domanda C++ . Cosa c'è con scanf !?" Beh, vedi, è esattamente questo. È un codice C ++ legale, quindi dovresti cerca un codice come quello , non solo std::cout .)

Anche se potessi ignorarlo, che dire delle librerie di terze parti? Caricano i file. Per la maggior parte degli sviluppatori, la maggior parte dei file è probabilmente caricata sotto le copertine.

Ma dimmi che ignori tutto ... test solo per le cose esplicitamente elencate nel file. Ma sei in un processo separato e l'utente ha appena fatto un DEL importantlibrary.dll .

Ora, in un sistema vincolato, potresti evitare l'inserimento dell'utente ed evitare le modifiche al file system, e potresti pensare di stare bene. Ma dovresti comunque tenere traccia di ogni percorso di codice, con ogni serie di possibili input, fino a quando il programma smette di funzionare.

Il che significa che devi dimostrare che il tuo programma smetterà di funzionare. Ops. Questo è spesso [ link possibile).

Ora, se parli solo di DLL caricate da un EXE al caricamento (e non dinamicamente in fase di runtime, che è potenzialmente trattabile.

    
risposta data 01.04.2016 - 22:11
fonte
0

In .NET ci sono meccanismi in giro per facilitare il caricamento delle librerie. Per citare l'articolo MSDN:

The .NET Framework provides the AppDomain.AssemblyResolve event for applications that require greater control over assembly loading. By handling this event, your application can load an assembly into the load context from outside the normal probing paths, select which of several assembly versions to load, emit a dynamic assembly and return it, and so on.

Ciò ti consentirà di cercare l'assembly da caricare (o persino scaricarlo da un server.)

    
risposta data 01.04.2016 - 22:09
fonte

Leggi altre domande sui tag