2

私は宣言された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 を返すのはなぜですか?

4

1 に答える 1