首页
论坛
课程
招聘
[原创]发个RadASM用的标准控制驱动模版
2010-1-13 23:57 5812

[原创]发个RadASM用的标准控制驱动模版

2010-1-13 23:57
5812
使用方法: 把下面的内容用记事本另存为"RadASM\Masm\Templates\标准控制驱动.tpl"即可,方便写控制设备对象驱动。

Driver (.sys)
Driver
标准控制驱动框架
[*BEGINPRO*]
[*BEGINDEF*]
[MakeDef]
Menu=0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
1=4,O,$B\RC.EXE /v,1
2=3,O,$B\ML.EXE /nologo /c /coff /I"$I",2
3=16,O,$B\LINK.EXE /nologo /driver /base:0x10000 /align:32 /subsystem:native /out:"$16",3
4=0,0,,5
5=rsrc.obj,O,$B\CVTRES.EXE,rsrc.res
6=*.obj,O,$B\ML.EXE /c /coff /nologo /I"$I",*.asm
7=0,0,"$E\OllyDbg",5
[MakeFiles]
0=Driver.rap
1=Driver.rc
2=Driver.asm
3=Driver.obj
4=Driver.res
5=Driver.exe
6=Driver.def
7=Driver.dll
8=Driver.txt
9=Driver.lib
10=Driver.mak
11=Driver.hla
12=Driver.com
13=Driver.ocx
14=Driver.idl
15=Driver.tlb
16=Driver.sys
[Resource]
[StringTable]
[Accel]
[VerInf]
[Group]
Group=Added files,Assembly,Resources,Misc,Modules
1=2
2=2
[*ENDDEF*]
[*BEGINTXT*]
Driver.Asm
.386

.model flat, stdcall

option casemap:none

include driver.inc

.const
CCOUNTED_UNICODE_STRING "\\Device\\devVirtToPhys", g_usDeviceName, 4 ;驱动程序名称

CCOUNTED_UNICODE_STRING "\\??\\slVirtToPhys", g_usSymbolicLinkName, 4;符号连接名称



.code

GetPhysicalAddress proc uses esi edi pInputBuffer,inBufLength,pOutputBuffer,outBufLength

;四个参数分别为用户层的输入数据指针,输入长度,输出数据指针,输出长度
;你可以在下面的代码中使用。

;下面的代码你可能有用
; invoke PsGetCurrentProcess ;取用户层进程EPROCES
; invoke PsGetCurrentThread ;取用户层线程EPROCESS

;you code




;mov eax ,STATUS_BUFFER_TOO_SMALL ;缓冲区长度不足
mov eax,STATUS_SUCCESS
ret

GetPhysicalAddress endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; 调度创建关闭
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

;当用户模式用:
; CreateFile, 让设备处理
; CloseHandle,关闭设备句柄


mov eax, pIrp
assume eax:ptr _IRP
mov [eax].IoStatus.Status, STATUS_SUCCESS
and [eax].IoStatus.Information, 0
assume eax:nothing
fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
mov eax, STATUS_SUCCESS
ret

DispatchCreateClose endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;这里是应用程序发出DeviceIoControl指令时,驱动处理子程序。
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DispatchControl proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

local status:NTSTATUS
LOCAL pInputBuffer,inBufLength,pOutputBuffer,outBufLength


;pIrp
mov esi, pIrp
assume esi:ptr _IRP

;pIrp_Stack
IoGetCurrentIrpStackLocation esi
mov edi, eax
assume edi:ptr IO_STACK_LOCATION
;IoGetCurrentIrpStackLocation宏取出_IRP结构的IO_STACK_LOCATION的指针(指向I/O stack)。
;这个栈的层次取决于这个IRP需要经过多少层的驱动处理。我们的单层驱动程序在这里只有一个值。

push [edi].Parameters.DeviceIoControl.InputBufferLength
pop inBufLength

push [edi].Parameters.DeviceIoControl.OutputBufferLength
pop outBufLength


push [esi].AssociatedIrp.SystemBuffer
pop pInputBuffer

push [esi].UserBuffer
pop pOutputBuffer


;判断用户层的驱动控制码,这里设置的是800h,在inc文件里定义
.if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_GET_PHYS_ADDRESS

invoke GetPhysicalAddress,pInputBuffer,inBufLength,pOutputBuffer,outBufLength

mov status, eax

.else
mov status, STATUS_INVALID_DEVICE_REQUEST

.endif

assume edi:nothing

push status
pop [esi].IoStatus.Status

push outBufLength
pop [esi].IoStatus.Information

assume esi:nothing

fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
mov eax, status
ret

DispatchControl endp


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; 驱动程序卸载回调函数
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverUnload proc pDriverObject:PDRIVER_OBJECT

invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName

mov eax, pDriverObject
invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject

ret

DriverUnload endp


.code

;.code INIT
;所有这样标记的代码将被放入PE文件的INIT节区中,表明是Discardable的。
;在驱动程序初始化后,这部分代码就再也用不着了。
;INIT节区中的代码可以在DriverEntry过程返回后被丢弃,系统会自己决定在合适的时候丢弃它。



;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; 驱动入口
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
;

local status:NTSTATUS
local pDeviceObject:PDEVICE_OBJECT

mov status, STATUS_DEVICE_CONFIGURATION_ERROR


;创建虚拟设备
invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, addr pDeviceObject

.if eax == STATUS_SUCCESS

;建立符号链接
invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName

.if eax == STATUS_SUCCESS

mov eax, pDriverObject
assume eax:ptr DRIVER_OBJECT;指定pDriverObject的参数的类型为DRIVER_OBJECT结构


;指定用户模式下卸载驱动时的处理地址
mov [eax].DriverUnload, offset DriverUnload

;指定用户模式调用CreateFile时的处理地址
mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],offset DispatchCreateClose

;指定用户模式调用CloseHandle时的处理地址
mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],offset DispatchCreateClose

;指定用户模式调用DeviceIoControl时的处理地址
mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],offset DispatchControl


assume eax:nothing
mov status, STATUS_SUCCESS
.else
invoke IoDeleteDevice, pDeviceObject

.endif
.endif

mov eax, status
ret


DriverEntry endp
end DriverEntry

[*ENDTXT*]
[*BEGINTXT*]
Driver.Inc
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; 要用到的头文件定义
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include w2k\ntstatus.inc
include w2k\ntddk.inc
include w2k\ntoskrnl.inc
include w2k\w2kundoc.inc

includelib \RadASM\masm32\lib\w2k\ntoskrnl.lib

include \RadASM\masm32\Macros\Strings.mac


;控制代码

IOCTL_GET_PHYS_ADDRESS equ CTL_CODE(FILE_DEVICE_UNKNOWN, 800h, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

[*ENDTXT*]
[*ENDPRO*]


实现的效果如下图:







[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

上传的附件:
  • 1.jpg (44.22kb,235次下载)
  • 2.jpg (31.25kb,232次下载)
  • 3.jpg (49.26kb,234次下载)
  • 4.jpg (74.16kb,235次下载)
收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 30
活跃值: 活跃值 (1210)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 活跃值 41 2010-1-14 00:14
2
0
膜拜非安全兄弟,呵呵…
雪    币: 579
活跃值: 活跃值 (58)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
非安全 活跃值 17 2010-1-14 00:28
3
0
雪    币: 357
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
linkyang 活跃值 2010-1-15 13:52
4
0
支持下,太强了!
雪    币: 579
活跃值: 活跃值 (58)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
非安全 活跃值 17 2010-1-15 15:13
5
0
呵呵,小弟菜鸟,可能有什么错误,欢迎指正!
雪    币: 56
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
黑天鹅 活跃值 2010-1-16 00:09
6
0
为什么那么像我发的驱动框架 代码不像 但差不多注释都一样咧  

http://bbs.eyuyan.com/dispbbs.asp?BoardID=124&ID=204465&replyID=&skin=1

如果不是请见谅。我只是看注释很像所以....
上传的附件:
雪    币: 579
活跃值: 活跃值 (58)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
非安全 活跃值 17 2010-1-16 05:27
7
0
呵呵,我是在你的代码基础上修改成RadASM通用框架的

之前驱动一直不得其法,非常感谢你!
雪    币: 166
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孑弈 活跃值 2010-1-16 08:24
8
0
都都,支持!只要有代码就有收获!
雪    币: 56
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
黑天鹅 活跃值 2010-1-16 12:33
9
0
恩。呵呵。改了就应该发出来  最讨厌的就是改了别人东西还非说是自己的人。。
雪    币: 352
活跃值: 活跃值 (11)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
hopy 活跃值 8 2010-1-16 12:58
10
0
good!!!!
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
阳小子 活跃值 1 2010-1-17 13:44
11
0
不错,很好,支持了。
游客
登录 | 注册 方可回帖
返回