標 題:Masm中呼叫ZwOpenSection時應該注意的問題 (1千字)
發信人:夜月
時 間:2003-3-5 13:00:05
詳細資訊:
用Masm呼叫ZwOpenSection時應該注意的問題
由於自己用Masm寫的程式碼一直不能成功呼叫ZwOpenSection,總是返回80000002H錯誤,於是這幾天一直在用S-ice跟蹤自己的程式碼,從入口引數上來看,Masm編譯的和VC編譯的沒什麼區別,可是呼叫的結果卻總是一個不成功,一個成功,於是只好跟蹤到ntdll.dll的內部,看看是如何出的錯,發現有兩個需要注意的地方:
進入ntdll.dll後,跟蹤一段時間(F8+F10),會遇到如下語句:
804C15FC: TEST
BL,03
此時D ebx,可以發現EBX是指向obj_attr結構的指標,聯絡上下,得出該指標地址必須作4位元組的對齊
然後還有一處:
8049AEEE: TEST CL,01
此時D ecx,可以發現此時ecx是指向unicode字串"\Device\PhysicalMemory",聯絡上下,得出該指標地址必須作2位元組的對齊
於是在ReadBios.asm裡頭作如下修改:
EVEN
;EVEN偽指令,2位元組對齊
szPhyMemW
db 05Ch,000h,064h,000h,065h,000h,076h,000h,069h,000h,063h,000h
db
065h,000h,05Ch,000h,070h,000h,068h,000h,079h,000h,073h,000h,069h,000h,063h,000h
db
061h,000h,06Ch,000h,06Dh,000h,065h,000h,06Dh,000h,06Fh,000h,072h,000h,079h,000h
db
23 dup (0)
ALIGN 4
;ALIGN偽指令,4位元組對齊
obj_name
UNICODE_STRING < >
新增這兩個偽指令後,程式執行完全正常,可以正常呼叫ZwOpenSection開啟實體記憶體物件。
由於以前從來沒有看到過這個tips,Google也沒有搜尋到,故寫作此文,希望能給使用ASM的朋友一點幫助,由於MS
C++的編譯器在背後幫我們完成了資料對齊的操作,所以,使用VC的朋友估計很難發現這個地方的毛病。