Masm中呼叫ZwOpenSection時應該注意的問題 (1千字)

看雪資料發表於2015-11-15

標 題: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的朋友估計很難發現這個地方的毛病。

相關文章