当前位置:编程学习 > 汇编语言 >>

汇编语言中驱动程序的编译和连接

汇编语言中驱动程序的编译和连接

Kmdkit推荐的方法是把汇编源程序写成批处理bat文件,以天杀的ring0.sys为例
      把下面的代码存成ring0.bat

;@echo off
      ;goto make
      ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            .586P         ;   保护模式
            .model flat,stdcall
            option casemap:none
      ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      include \masm32\include\w2k\ntddk.inc
      ;   中断相关数据结构
      IDT_REG      STRUCT
         limit      WORD   ?
         base      DWORD   ?
      IDT_REG      ENDS

;   中断描述符
      INT_DESCRIPTOR      STRUCT
         offs0_15   WORD   ?
         sel         WORD   ?
         paramcnt   BYTE   ?
         attrs      BYTE   ?
         offs16_31   WORD   ?
      INT_DESCRIPTOR      ENDS

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      ; 代码段
      ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            .code
         szBuffer   db   16 dup(0)
      ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      MyIntFunc   proc
            push   edx
            call   eax
            iretd
      MyIntFunc   endp

;====================================================================
      AddMyInt   proc      uses edi
            local   @IDT

sidt   szBuffer
            mov      edi,(IDT_REG ptr [szBuffer]).base
            add      edi,21h*8

;   使用Int21中断,该中断在Win2k下没有使用
      ;      cli
            mov   eax,offset MyIntFunc
            mov   [edi],ax
            shr   eax,16
            mov   [edi+6],ax      ;   设置入口地址
            mov   [edi+2],cs      ;   设置段地址
         ;   设置Ring3可以访问
            mov   WORD ptr [edi+4],0EE00h
      ;      sti

ret
      AddMyInt   endp
      ;====================================================================
      WdmUnload   proc   DriverObject:DWORD
            local   @IDT

sidt   szBuffer
            mov      edi,(IDT_REG ptr [szBuffer]).base
            add      edi,21h*8
            xor   eax,eax
            mov   [edi],ax
            mov   [edi+6],ax      ;   设置入口地址
            mov   [edi+2],ax      ;   设置段地址
            mov   WORD ptr [edi+4],ax

ret
      WdmUnload   endp
      ;====================================================================
      DriverEntry      proc   DriverObj:DWORD,RegistryPath:DWORD


            mov      eax,DriverObj
            assume   eax:ptr DRIVER_OBJECT
            mov      [eax].DriverUnload,offset WdmUnload
            assume   eax:nothing
            invoke   AddMyInt

xor   eax,eax
            ret
      DriverEntry      endp
      ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      end DriverEntry

:make

set drv=ring0

\masm32\bin\ml /nologo /c /coff %drv%.bat
      \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys
      /subsystem:native

%drv%.obj

del %drv%.obj

echo.
      pause
      rem =====以上为ring0.bat的内容=============


      双击ring0.bat,就完成了编译连接工作,生成了ring0.sys 怎么样?简单吧?

Kmdkit巧妙地把批处理和asm文件结合起来,使编译更傻瓜化。
      需要修改代码时,在ring0.bat上点鼠标右键,点编辑。
      需要编译时直接双击它.
      需要注意的是,\masm32 和ring0.bat必须在一个磁盘上,如masm32安装在c:盘,ring0.bat也必须在c:盘

 


www.zzzyk.com,学习电脑知识的好地方          

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,