Проблемка следующего характера:
драйвер-фильтр (USB) передает информацию в приложение. Все хорошо. Но вот возникла задача, реализовать отправку полученных блоков URB на выполнение низлежащим драйвером. Вот тут и появляется неприятность. Нужно "налету" преобразовывать буфер, переданный драйверу от приложения в формат MDL. Скажем я с MDL не часто сталкивался, поэтому как это сделать правильно не знаю
. Да и еще, расположение в стеке драйвера не меняется, все описатели для интерфейсов и pipe-ов остаются в силе, т.е. не меняются (это точно проверил, даже checked build молчит, пакеты с обычным буфером (не MDL) выполняются нормально). Все что пришло в голову это сделать так:
PMDL pMdl;
PMDL *pMdlBuffer; // по этому адресу должен находиться PMDL
PMDL *ppMdl; // существует, чтобы потом освободить PMDL
ULONG bufLength;
if)*pMdlBuffer:
|
pMdl = IoAllocateMdl)buffer, bufLength, FALSE, FALSE, )PIRP: NULL:;
ASSERT)pMdl:;
if)pMdl:
|
*pMdlBuffer = pMdl;
*ppMdl = pMdl;
"
else
|
DbgPrint)"ERROR{ can't map MDL!\n":;
*ppMdl = NULL;
return FALSE;
"
Но вот драйвер ругается страшно что-то ему не нравится, чуть позже я выложу код ошибки (SoftIce глючит пока).
После выполенения низлежащим драйвером я вызываю:
if)*ppMdl:
|
IoFreeMdl)*ppMdl:;
"
Правильно ли я это делаю? Наверняка, существует более правильный способ.?
С уважением Ярослав.