Вызов ExAllocatePoolWithTag никогда не возвращается
У меня возникли некоторые проблемы с моим драйвером virtualHBA на Windows Server 2016. Я запустил тест поддержки HLK crashdump. 3 раза из 10 тест пройден. В этих трех неудачных тестах аварийный дамп зависает на 0% при получении полного дампа, или дампа ядра, или минидампа.
Ядро отладки моего кода, я обнаружил, что вызов ExAllocatePoolWithTag()
для выделения буфера никогда не возвращается.
Ниже приведено утверждение, которое никогда не возвращается.
pDeviceExtension->pcmdbuf=(struct mycmdrsp *)ExAllocatePoolWithTag(NonPagedPoolCacheAligned,pcmdqSignalSize,((ULONG)'TA1'));
Я искал в Интернете по этому поводу. Однако все найденные страницы фокусируются на этой функции, возвращающей NULL, которая в моем случае никогда не возвращается.
Любая помощь о том, как двигаться вперед, будет принята с благодарностью.
Заранее спасибо.
1 ответ
Вы не можете выделить память в режиме аварийного дампа. Вы работаете на HIGH_LEVEL с отключенными прерываниями, и поэтому вы вызываете этот API с неправильным IRQL.
Типичным решением для аппаратного адаптера является установка RequestedDumpBufferSize в структуре PORT_CONFIGURATION_INFORMATION во время обычного вызова HwFindAdapter. Затем при повторном вызове в режиме аварийного дампа вы используете поле CrashDumpRegion, чтобы получить выделение буфера дампа. Затем вам нужно написать свой собственный распределитель "только режим аварийного дампа", чтобы выделить буферы из этой области памяти.
Это огромная боль, особенно учитывая, что трудно / невозможно узнать, сколько памяти вам в конечном итоге понадобится. Я обычно вычисляю некоторые минимальные накладные расходы конфигурации (то есть 1 канал, 8 запросов ввода-вывода за раз и т. Д.), А затем добавляю в реестр настраиваемую слякоть. Единственное преимущество заключается в том, что обстановка урезана, так что вам не нужно быть в пении, танцевальной конфигурации.