Implementacja obsługi wyjątków bezpośrednio w jądrze ma pewien czynnik ograniczający: nie możemy przewidzieć, co zrobi każdy inny fuzzer, aby odzyskać dane. Powinniśmy dążyć do bardziej elastycznego rozwiązania, więc dlaczego nie pozwolić każdemu fuzzerowi ustawić własny program obsługi wyjątków? Podczas gdy każdy fuzzer może zaimplementować strategię odzyskiwania, która jest optymalna dla jego specyfiki, dobrze jest mieć domyślny zestaw programów obsługi, które są w stanie odzyskać dane z prostych przypadków, dzięki czemu wszystkie fuzzery mogą z tego skorzystać.
Rozszerzamy klasę Fuzzer, aby dodać ogólną obsługę wyjątków. W on_boot dodawane jest wywołanie install_idt (1), aby wstrzyknąć obsługę wyjątków i skonfigurować nowy IDT gościa. Metoda install_idt przyjmuje liczbę wektorów (domyślnie 30) i wywołuje make_vector_handler (2) dla każdej wartości z zakresu od 0 do liczby wektorów. Wpisy zwrócone przez make_vector_handler są używane przez install_idt do wygenerowania nowego IDT (3). Metoda make_vector_handler generuje kod asemblera do obsługi określonego numeru wektora i wstrzykuje go do gościa (4), ale go nie wykonuje. Następnie zwraca wpis IDT wskazujący na obsługę (5). Domyślnie kod wygenerowany przez make_vector_handler po prostu wysyła pustą odpowiedź i przywraca poprzedni stan kontekstu (6). Bez dalszych modyfikacji możemy ponownie przetestować poprzedni fuzzer MSR:
Widzimy, że liczba ponownych uruchomień zmalała, co poprawiło szybkość rozmycia.