Всем привет. Бьюсь с перезаписью MDL в стандартном Dispatch-обработчике в драйвере. Цель — перезапись Irp->MdlAddress.
pSrcMdl = IoAllocateMdl((PVOID)&Data, 2048, FALSE, FALSE, NULL);
if(pSrcMdl)
{
MmBuildMdlForNonPagedPool(pSrcMdl);
pAddress = MmGetSystemAddressForMdlSafe(pSrcMdl, NormalPagePriority);
__try
{
pDstDddress = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
if (pDstDddress)
{
memset(pDstDddress, 0, 2048);
for (i = 1; i < 2048; i++)
{
if (MmIsAddressValid(pAddress))
*pDstDddress = *pAddress;
pAddress++;
pDstDddress++;
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER){}
IoFreeMdl(pSrcMdl);
}
В результате — BSOD с кодом BAD_POOL_CALLER.
Получается как в анекдоте про Петьку и Васильваныча: "...нутром чувствую, что литр, а доказать не могу". Вижу, что проблемы с выделением памяти, но что делаю неправильно?