AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

驱动程序的编译和连接

51自学网 http://www.51zixue.net
下载ring0.bat...
    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:盘

 

 

 
上一篇:驱动程序的动态加载  下一篇:关于在8086/88内存寻址方式