www.pudn.com > litth_virldisk.zip > AsyncQue.asm


.386p 
 
.xlist 
	 
	include vmm.inc 
	include blockdev.inc 
	include ior.inc 
	include	iop.inc 
	include dcb.inc 
 
MASM=1 
 
	include ifs.inc 
	include ifsmgr.inc	 
	include ilb.inc 
 
	include debug.inc 
	include med.inc		; required for iodebug.inc 
;	include iodebug.inc     ; various IOS assertions (like AssertIOP) 
	 
.list 
 
memcpy	proto C, pd:ptr, ps:ptr, size_t:DWORD 
 
VXD_LOCKED_DATA_SEG 
 
extrn	milb:DWORD 
 
public	hFile 
	hFile	dw	0 
 
 
VXD_LOCKED_DATA_ENDS 
 
;;;;;;;;;;;;;;;;;;; 
 
VXD_LOCKED_CODE_SEG 
 
	OnCDRomIOCtl proto stdcall, IOR_ptr:DWORD 
 
;;;========================================== 
 
PAGE 
SUBTTL OnAsyncRequest 
 
BeginProc   OnAsyncRequest,esp 
ArgVar		IOP_ptr, DWORD 
 
	TRAP 
	EnterProc 
	 
	mov		ebx, IOP_ptr 
;	AssertIOP  
 
.ERRNZ	IOR_READ - 0 
.ERRNZ	IOR_WRITE - 1 
.ERRNZ	IOR_VERIFY - 2 
.ERRNZ	IOR_MEDIA_CHECK_RESET - 06H 
 
	mov		[ebx].IOP_ior.IOR_status, IORS_SUCCESS 
 
	mov		eax, DCB_DEV_IO_ACTIVE 
	or		[ebx].IOP_physical_dcb.DCB_device_flags, eax 
	 
	movzx		eax, [ebx].IOP_ior.IOR_func 
	cmp		eax, IOR_FORMAT 
	ja		On_Call_Down 
	 
	cmp		eax, IOR_READ 
	je		Read_cd 
		 
	cmp		eax, IOR_MEDIA_CHECK_RESET 
	je		Media_check	 
 
	cmp		eax, IOR_GEN_IOCTL 
	je		Gen_IOctl 
 
	cmp		eax, IOR_COMPUTE_GEOM 
	je		Compute_geom 
 
On_Call_Down: 
	 
	mov		eax, DCB_DEV_IO_ACTIVE 
	xor		[ebx].IOP_physical_dcb.DCB_device_flags, eax 
 
	cmp		[ebx].IOP_ior.IOR_func, IOR_RESTART_QUEUE 
	jne		@F 
	mov		[ebx].IOP_ior.IOR_status, IORS_SUCCESS 
	jmp		Callback_next 
		 
@@: 
	mov		[ebx].IOP_ior.IOR_status, IORS_INVALID_COMMAND 
 
On_Call_Back: 
	 
	mov		eax, DCB_DEV_IO_ACTIVE 
	xor		[ebx].IOP_physical_dcb.DCB_device_flags, eax 
 
Callback_next: 
 
	mov		eax, [ebx].IOP_callback_ptr 
	sub		eax, size IOP_callback_entry 
	mov		[ebx].IOP_callback_ptr, eax 
	 
	push		ebx 
	call    		dword ptr [eax]   
	add		esp, 4 
	 
	LeaveProc	; deallocute local variable 
	Return 
 
Media_check: 
 
	mov		[ebx].IOP_ior.IOR_status, IORS_NOT_READY 
	jmp		On_Call_Back 
 
Read_cd: 
 
	cmp		[ebx].IOP_ior.IOR_start_addr, 10h 
	jb		invalid_sector 
 
	movzx		eax, hFile 
	Test		eax, eax 
	jnz		@F 
;	call 		OpenImgFile  // 用于打开镜像文件的 OpenImgFile 函数未建立。 
;				         可以通过呼叫 0 级文件系统建立。 
	test		ax,ax 
	jz		@F 
@@: 
	mov		[ebx].IOP_ior.IOR_status, IORS_NO_MEDIA 
	jmp		On_Call_Back 
 
invalid_sector: 
 
	mov		[ebx].IOP_ior.IOR_status, IORS_INVALID_SECTOR 
	jmp		On_Call_Back 
 
Gen_IOctl: 
 
	invoke		OnCDRomIOCtl, addr [ebx.IOP_ior] 
 
	jmp		On_Call_Back 
 
Compute_geom: 
	mov		[ebx].IOP_ior.IOR_status, IORS_SUCCESS 
	jmp		On_Call_Back 
 
EndProc	OnAsyncRequest 
 
VXD_LOCKED_CODE_ENDS 
 
end