У меня есть 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, как будто вставка не удалась?
Это может быть неправильный ответ, но он слишком сложен для комментария, поэтому я пишу его как ответ, для правильного форматирования и т.д .:
Чтение документов для 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
также.
может указывать, что он действительно обновляет голову, если это единственная вещь в списке.
(Гах, просто заметил комментарий, сказав, что ты решил это).
Других решений пока нет …