⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _dispatch.asm

📁 linux ip fiter source
💻 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 + -