小華的部落格: 2008/4/27 - 2008/5/4

搜尋此網誌

網頁

星期五, 5月 02, 2008

WinDbg 查看Log

最近拿WinDbg查看一些藍底白字的Log,順便做一下筆記:

ㄧ般藍屏看到下面的描述如下:
STOP : 0x000000D1 (0x00000080 , 0x0000001d , 0x00000001,0x83c74674)

當Dumpfile從WinDbg中開啟並查看所看到的描述如下:

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1) <--錯誤代碼

Arg1: 00000080, memory referenced <--參考的記憶體位址
Arg2: 0000001d, IRQL <--目前的IRQL
Arg3: 00000001, value 0 = read operation, 1 = write operation <--讀/寫發生問題
Arg4: 83c74674, address which referenced memory <--有問題的Code的記憶體位址

從下面範例可以得知,記憶體位址83c74674h的地方是要把EAX值寫入到某個記憶體位址中,而這個記憶體位址在0x0023:0x00000080的地方,而寫入時發生錯誤:

83c74674 0100 add dword ptr [eax],eax ds:0023:00000080=????????

另外還可以看到下面的描述:
FOLLOWUP_IP: mssmbios!SMBiosACPIProcessACPIData+f2
8ce6b6f0 85c0 test eax,eax

結論1: 看起來是mssmbios.sys 出錯,錯誤的原因可能是ACPI code的寫入問題,所以要查看看BIOS是否有去動態更新ACPI table或是ACPI 出錯而造成這個藍屏。


另一個案例
SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (7e)

Arg1: c0000005, The exception code that was not handled
Arg2: fac41750, The address that the exception occurred at
Arg3: fafb4430, Exception Record Address
Arg4: fafb 412c , Context Record Address

IMAGE_NAME: intelppm.sys
fac41750 0f 32 rdmsr

結論2:看樣子是RDMSR造成的問題。


使用WinDbg開啟Dump file的方式如下:










開啟後鍵入!analyze -v ,就可以查看相關資訊,另外要注意的事情是要安裝好symbol files,相關的WinDbg指令/安裝/設定方式請參考微軟網站說明。

Reference
微軟網站

星期三, 4月 30, 2008

S3/S4 測試工具開發

源由:


前幾個星期為了解一個VS Mode (設定1分鐘後關閉螢幕) bug 所以自己寫了一個Win32工具去檢查CMOS RTC alarm 和RTC interrupt 的設定值還有監控RTC Enable bit設定值(PMBase),而這個問題的徵狀是當系統從S4 Resume後,等個10秒後就會看到螢幕被關閉。


追蹤後發現這應該是Vista的計時器的問題,他所謂的一分鐘是指"當OS沒收到任何event後開始計時",所以當進入S4的時候計時器可能已經跑了35秒,而當系統從S4 Resume後計時器會繼續計時,因此等個10幾秒就進入VS mode了。


會被開這條Bug是因為開Bug的人認為計時器應該重新計算,所以參考了一些其他機種做法後決定,使用相同的解決方式去解決(Notify Power button)這個問題。


而在此時我們的T學長看到我個工具,因此問我說有沒有辦法寫一個自動進入S3/S4且可以定時wakeup的工具...


原本在Vista底下就已經有工具可以測試,而我們的客戶也有撰寫一個工具也可達到這個功能,另外ALi也有一個類似的工具也做的到這個功能,因此是有機會可以自行開發出來這個工具。


實驗ㄧ過程:

原先我想的很單純,在BIOS角度就是去設定好RTC alarm時間,然後去改變RTC Enable bit,接著呼叫API讓系統進入S3/S4就應該可以了,不過實驗後發現OS會把RTC Enable 清除,所以就算我設定了也沒有用 >.<


實驗二過程:

秉持著研究的精神,所以我認為OS會去清除RTC enable bit就代表OS才能決定這個bit的狀態,我沒辦法透過Ring 0層的AP直接去修改暫存器值,因此他ㄧ定有方式去控制; 查詢了相關資訊後發現有API可以做這些事情,因此問題就只是在如何用這些API而已。


結論:

經過實驗過後,這些API真的可以達到我需要的功能,所以也只能說Windows真的管很多,想要偷偷修改暫存器都不行, 呵呵!


相關的API:

CreateWaitableTimer
SetWaitableTimer
SetSuspendState
WaitForSingleObject
CancelWaitableTimer
CloseHandle

隨便寫的程式,所以畫面看起來很難看 ^^!

Reference
Microsoft 網站