BSOD при перезаписи MDL
От: A.Pastukhov  
Дата: 09.11.09 05:44
Оценка:
Всем привет. Бьюсь с перезаписью 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.
Получается как в анекдоте про Петьку и Васильваныча: "...нутром чувствую, что литр, а доказать не могу". Вижу, что проблемы с выделением памяти, но что делаю неправильно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.