我有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,就像插入失敗一樣?
因爲我沒有驅動程序的源代碼,所以我不知道'DriverWrite'和你的DPC函數之間會發生什麼。是否有可能在這兩個步驟之間實際上使列表空了? –
@PP。 'IsListEmpty'返回true - >列表爲空。 '!IsListEmpty'返回true - >列表不爲空。 '! IsListEmpty'返回false - >列表爲空。 – johnye2e
@MatsPetersson不,不是。該列表僅在DriverWrite和DPC中「感動」。我知道我的源代碼中只有我在描述中顯示的行中存在「lh」關鍵字(並且在DriverEntry中:'InitializeListHead(&di-> lh);'我在想這個問題的原因是我不能從DPC訪問非分頁內存...... – johnye2e