程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 驅動程序的編譯和連接

驅動程序的編譯和連接

編輯:匯編語言

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:盤

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved