Указатель невыгружаемой памяти

У меня есть 2 объявленные структуры:

struct irp_list {
IRP *irp;
LIST_ENTRY lh;
};

а также

struct dev_info {
...
LIST_ENTRY lh;
...
};

Внутри функции DriverWrite (IRP_MJ_WRITE) я делаю:

struct irp_list *il;
struct dev_info *di = (struct dev_info*)device->DeviceExtension;

if (!(il = ExAllocatePool(NonPagedPool, sizeof(*il)))) {
ret = STATUS_NO_MEMORY;
DbgPrint("[uart] UartWrite can't handle irp...\n");
goto error;
}

il->irp = irp;  // store DriverWrite irp

InsertTailList(&di->lh, &il->lh);   // this insert is not failing...
irp->IoStatus.Information = 0;
IoMarkIrpPending(irp);

return STATUS_PENDING;

Внутри функции DPC я пытаюсь получить доступ к невыгружаемой памяти il с помощью:

struct dev_info* di;
di = (struct dev_info*)device->DeviceExtension;

if(!IsListEmpty(&di->lh))
{
// code never reached
}

Я знаю, что DPC может только читать не выгружаемую память, но почему IsListEmpty всегда возвращает FALSE, как будто вставка не удалась?

2

Решение

Это может быть неправильный ответ, но он слишком сложен для комментария, поэтому я пишу его как ответ, для правильного форматирования и т.д .:

Чтение документов для InsertTailList:

VOID InsertTailList(
_Inout_  PLIST_ENTRY ListHead,
_Inout_  PLIST_ENTRY Entry
);

InsertTailList обновления ListHead->Blink указать на Entry, Это
обновления Entry->Blink указать на старую последнюю запись в списке, и
наборы Entry->Flink в ListHead, Flink из прошлого последнего
запись обновлена, чтобы указывать на Entry также.

куда IsListEmpty говорит:

IsListEmpty возвращается TRUE если в настоящее время нет записей в
список и ЛОЖЬ в противном случае.

замечания

IsListEmpty возвращается TRUE если ListHead->Flink относится к
ListHead,

Я не уверен, что все это понимаю, но мне кажется, ListHead->Flink не обновляется InsertListTail (что кажется довольно странным). Хотя предложение

Flink предыдущей последней записи обновляется, чтобы указать на Entry также.

может указывать, что он действительно обновляет голову, если это единственная вещь в списке.

(Гах, просто заметил комментарий, сказав, что ты решил это).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]