• 标 题:Masm中调用ZwOpenSection时应该注意的问题 (1千字)
  • 作 者:夜月
  • 时 间:2003-3-5 13:00:05
  • 链 接:http://bbs.pediy.com

用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的朋友估计很难发现这个地方的毛病。