2013-08-25 32 views
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,就像插入失敗一樣?

+0

因爲我沒有驅動程序的源代碼,所以我不知道'DriverWrite'和你的DPC函數之間會發生什麼。是否有可能在這兩個步驟之間實際上使列表空了? –

+0

@PP。 'IsListEmpty'返回true - >列表爲空。 '!IsListEmpty'返回true - >列表不爲空。 '! IsListEmpty'返回false - >列表爲空。 – johnye2e

+0

@MatsPetersson不,不是。該列表僅在DriverWrite和DPC中「感動」。我知道我的源代碼中只有我在描述中顯示的行中存在「lh」關鍵字(並且在DriverEntry中:'InitializeListHead(&di-> lh);'我在想這個問題的原因是我不能從DPC訪問非分頁內存...... – johnye2e

回答

1

這可能不是一個正確的答案,但它是一個評論有點太複雜了,所以我寫它作爲一個答案,正確的格式,等:

讀取文檔的InsertTailList

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

InsertTailList更新ListHead->Blink指向Entry。它 更新Entry->Blink指向列表中舊的最後一個條目,並且 集合Entry->FlinkListHead。前一個 條目的Flink更新爲也指向Entry

其中IsListEmpty說:

IsListEmpty返回TRUE目前是否在 列表和FALSE否則沒有條目。

備註

IsListEmpty返回TRUE如果ListHead->Flink指回 ListHead

現在,我不知道如果我理解這一切,但對我來說,好像ListHead->Flink不受InsertListTail更新(這似乎很奇怪)。儘管句子

上一個最後一個條目的Flink也更新爲指向Entry

可能表明它確實更新了頭部,如果它是列表中唯一的東西。

(Gah,剛剛發現評論說你已經解決了它)。

+0

我不能將此標記爲答案,因爲我的問題是DPC和調度例程之間的同步,但是要感謝文檔的明確引用。雖然,「InsertListTail」更新了「Flink」。 – johnye2e

+0

@johnye2eÖ是的,我也得出了這個結論。 –