DDK_HelloWorld卸载例程细化(驱动学习笔记四)
生活随笔
收集整理的這篇文章主要介紹了
DDK_HelloWorld卸载例程细化(驱动学习笔记四)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
DDK_HelloWorld卸載例程細(xì)化
- 0x0 藍(lán)屏
- 0x1 頭文件、cpp文件
- 0x2 PDEVICE_EXTENSION
0x0 藍(lán)屏
pDevobj正常,但是提示pDevExt為空指針從而導(dǎo)致藍(lán)屏,想了想覺得很奇怪,難道是PDEVICE_EXTENSION定義錯(cuò)了?反復(fù)查看定義未發(fā)現(xiàn)有什么不妥,
但是windbg中也顯示pDevobj->DeviceExtension為空,后來左右對比發(fā)現(xiàn)如下代碼:
在創(chuàng)建設(shè)備的時(shí)候,DEVICE_EXTENSION的大小竟然為0,難怪會是空指針!
將代碼改為如下后,加載驅(qū)動(dòng)便不再藍(lán)屏了:
根據(jù)dbg上查看到的信息發(fā)現(xiàn)是存儲pLinkName的內(nèi)存訪問錯(cuò)誤,反復(fù)檢查流程,發(fā)現(xiàn)邏輯并沒有什么問題,同時(shí)發(fā)現(xiàn)pDevExt->ustrSymLinkName和ustrDeviceName都是異常的內(nèi)存,因此懷疑是內(nèi)存已經(jīng)被釋放了?
我們找到ustrSymLinkName和ustrDeviceName被賦值的地方如下:
我們發(fā)現(xiàn)它們的賦值是在創(chuàng)建設(shè)備的過程中進(jìn)行的,檢查創(chuàng)建過程的值發(fā)現(xiàn)它們確確實(shí)實(shí)是被成功賦值了,可是為什么后面又沒有了呢?
我們看到該函數(shù)時(shí)位于內(nèi)存標(biāo)志位INIT的內(nèi)存區(qū)域的
書上對INIT內(nèi)存區(qū)域的描述是函數(shù)只是在加載的時(shí)候需要載入內(nèi)存,但是當(dāng)驅(qū)動(dòng)程序成功加載后,函數(shù)就會從內(nèi)存中卸載掉,如下:
我的理解是,如果把CreateDevice函數(shù)放在INIT內(nèi)存區(qū)域,函數(shù)內(nèi)的賦值操作也會保存在INIT內(nèi)存區(qū)域,那么在加載驅(qū)動(dòng)的時(shí)候,給符號和設(shè)備名進(jìn)行賦值的時(shí)候,一起正常。但是加載成功后,該段內(nèi)存區(qū)域即被釋放,所以當(dāng)卸載驅(qū)動(dòng)再次調(diào)用該段內(nèi)存區(qū)域時(shí),由于該內(nèi)存區(qū)域已經(jīng)被釋放了,所以導(dǎo)致了藍(lán)屏
因此,解決辦法是,把該函數(shù)放到PAGE內(nèi)存區(qū)域,即不再藍(lán)屏。
然而,事情沒有結(jié)束
在正常卸載掉驅(qū)動(dòng)后,再次把該函數(shù)改到INIT內(nèi)存區(qū)域,卸載驅(qū)動(dòng)也不會出現(xiàn)藍(lán)屏。這是否意味著,真正藍(lán)屏的原因是由于之前內(nèi)存中還保存著一些東西?按理來說,如果內(nèi)存中有符號名是無法再次創(chuàng)建驅(qū)動(dòng)成功的。
真正的原因還待進(jìn)一步去研究…
0x1 頭文件、cpp文件
根據(jù)觀察到的情況,通常,聲明、定義結(jié)構(gòu)體、重定義變量名放在頭文件中,具體實(shí)現(xiàn)放在CPP文件中
0x2 PDEVICE_EXTENSION
根據(jù)源代碼調(diào)用PDEVICE_EXTENSION時(shí)發(fā)現(xiàn)始終無法找到該結(jié)構(gòu)體,后來發(fā)現(xiàn)原來該結(jié)構(gòu)體需要自己定義,坑爹啊…如下:
typedef struct _DEVICE_EXTENSION {PDEVICE_OBJECT pDevice;UNICODE_STRING ustrDeviceName; // 設(shè)備名稱UNICODE_STRING ustrSymLinkName; // 符號鏈接名 }DEVICE_EXTENSION,*PDEVICE_EXTENSION;TO be continue…
總結(jié)
以上是生活随笔為你收集整理的DDK_HelloWorld卸载例程细化(驱动学习笔记四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2008r2 php mysql_Win
- 下一篇: 用MATLAB做周期三角波的傅里叶级数,