CI/CD и динамический фаззинг для Windows-драйверов — это ад. Поднять полноценный Windows-раннер ради одного E2E-теста — слишком жирно: окружение недетерминированно, холодный старт тянется вечность, а ресурсы улетают в трубу. И с фаззингом KMDF-драйвера та же беда — снимки состояния восстанавливаются медленно, BSOD ловить неудобно. Корень зла — стандартная установка Windows с GUI, сервисами и телеметрией, которая для тестов не нужна.
Решение — Windows PE (Windows Preinstallation Environment). Это официальная обрезка системы, живёт целиком в RAM, жрёт от 512 МБ, не содержит DirectX, PowerShell и Explorer. Загружается с правами NT AUTHORITY\SYSTEM — идеальная песочница. Чтобы запускать виртуалку за миллисекунды, нужно агрессивно твикнуть BCD через bcdedit: bootstatuspolicy ignoreallfailures (игнорировать ошибки выключения), recoveryenabled no (отключить восстановление), таймаут 0. Для unsigned драйверов — testsigning yes, hypervisorlaunchtype off (гасит VBS/HVCI), isolatedcontext no.
Для эмуляции в QEMU лучше брать старую машину pc (i440FX) — у неё плоская PCI-шина, с которой WinPE дружит без глюков, в отличие от q35 с PCIe-деревом. На ноутбуке с WHPX — -accel whpx -cpu Skylake-Client-IBRS, без host и без hv-* флагов (они ломают KDNET). KDNET — отладка ядра по UDP напрямую через контроллер, минуя NDIS. Задаётся busparams 0.16.0, если сетевуха e1000 висит на адресе 0x10. Другие карты (e1000e, virtio-net) без инжекта драйверов в boot.wim не взлетят.
Сам WinPE абсолютно идемпотентен — все изменения живут только в RAM. Постоянные правки делаются офлайн через DISM. Чтобы ускорить загрузку, можно отключить инициализацию сети через unattend.xml (с <EnableNetwork>false</EnableNetwork>), а штатную оболочку cmd.exe заменить на свой агент через winpeshl.ini (файл X:\Windows\System32\winpeshl.ini). Важно: когда этот агент завершается, WinPE автоматически ребутится. Если в QEMU добавить -no-reboot, то при попытке перезагрузки эмулятор просто выключится и вернёт управление хосту — идеально для фаззера.
Если сеть отвалилась из-за тестируемого драйвера, спасает SAC (Special Administration Console) — эмулируем COM1 через сокет TCP на хосте, конфиг в BCD: ems on, порт 1, 115200 бод. Это даёт консоль напрямую, без графики и сетевых стеков. Ещё один граб: Hyper-V enlightenments (hv-relaxed, hv-vapic) в KVM ломают KDNET — ядро перестаёт доверять обычным PCI-прерываниям, отладчик молча отключается и зависает на "Waiting to reconnect...". Решение — не добавлять ни одного hv-* флага в QEMU, и всё стабильно взлетает.