📄 _dispatch.asm
字号:
;====================================================================
; Win32 控制处理函数
;====================================================================
_Dispatch proc uses edi esi ebx DriverObject:DWORD,_Irp:DWORD
; 这里用 EDI 保存 _Irp, ESI 保存 IO_STACK_LOCATION
mov edi,_Irp
mov (_IRP ptr [edi]).IoStatus.Information,0
mov (_IRP ptr [edi]).IoStatus.Status,STATUS_SUCCESS
mov esi,(_IRP PTR [edi]).Tail.Overlay.CurrentStackLocation
movzx eax,(IO_STACK_LOCATION ptr [esi]).MajorFunction
.if eax == IRP_MJ_CREATE ; 处理IRP_MJ_CREATE
.elseif eax == IRP_MJ_CLOSE ; 处理IRP_MJ_CLOSE
.elseif eax == IRP_MJ_DEVICE_CONTROL ; 处理我们的控制消息
mov eax,(IO_STACK_LOCATION ptr [esi]).Parameters.DeviceIoControl.IoControlCode
.if eax == CTL_Start ; 启动 HOOK
invoke _SetIpFilterHook,addr IPfilterProc ; 安装过滤
.elseif eax == CTL_Stop ; 停止 HOOK
invoke _SetIpFilterHook,NULL ; 停止过滤
.elseif eax == CTL_Read ; 读取 缓冲区
; 缓冲区大小
mov ecx,(IO_STACK_LOCATION ptr [esi]).Parameters.DeviceIoControl.OutputBufferLength
mov edi,(_IRP ptr [edi]).UserBuffer ; 输出缓冲区
.if ecx > sizeof szBuffer ; 输出缓冲区大于我们的缓冲区长度则只拷贝我们的
mov ecx,sizeof szBuffer
.endif
lea esi,szBuffer ; 拷贝缓冲区到用户内存
rep movsb
.elseif eax == CTL_Write ; 设置 缓冲区
mov ecx,(IO_STACK_LOCATION ptr [esi]).Parameters.DeviceIoControl.InputBufferLength
.if ecx > sizeof szBuffer ; 输出缓冲区大于我们的缓冲区长度则只拷贝我们的
mov ecx,sizeof szBuffer
.endif
mov esi,(_IRP ptr [edi]).AssociatedIrp.SystemBuffer ; 输入缓冲区
lea edi,szBuffer ; 拷贝用户内存到缓冲区
rep movsb
.endif
.endif
invoke IoCompleteRequest,_Irp,IO_NO_INCREMENT
mov eax,STATUS_SUCCESS
ret
_Dispatch endp
;====================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -