摘要: 今天在調(diào)試驅(qū)動(dòng)的時(shí)候,發(fā)現(xiàn)一個(gè)開始覺得很奇怪的問題,就是調(diào)用RtlStringCbPrintfW函數(shù)來格式化WCHAR字符串時(shí),一定藍(lán)屏,提示
IRQL_NOT_LESS_OR_EQUAL,并且比較郁悶的是,在虛擬機(jī)上有時(shí)不會(huì)出現(xiàn),有時(shí)會(huì)出現(xiàn),但在真正的主機(jī)上一定會(huì)出現(xiàn)(Windows xp sp2)。
一般出現(xiàn)IRQL_NOT_LESS_OR_EQUAL,是IRQL在級(jí)別高的地方調(diào)用了分頁內(nèi)存,所以,我就想到把當(dāng)前的IRQL打出來看看,發(fā)現(xiàn)在進(jìn)入函數(shù)
的時(shí)候,當(dāng)前的IRQL是0(PASSIVE_LEVEL),而在執(zhí)行這段代碼的地方,IRQL是2(DISPATCH_LEVEL),是什么原因使得IRQL發(fā)生了變化呢?
仔細(xì)查看代碼后,發(fā)現(xiàn)了原因,因?yàn)樵趫?zhí)行這段代碼之前,通過NdisAcquireSpinLock獲取旋轉(zhuǎn)鎖,而在旋轉(zhuǎn)鎖釋放之前,其中的代碼是跑在
IRQL=2的,另外,RtlStringCbPrintfW需要處理分頁內(nèi)存(PagedPool),但在IRQL=2的情況下,是只能處理非分頁內(nèi)存的(NonpagedPool),所以,
閱讀全文