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


.386p 
 
.xlist 
	include vmm.inc 
 
	include debug.inc 
	include ilb.inc 
	include aep.inc 
	include isp.inc 
	include	ddb.inc 
	include dcb.inc 
	include portddb.inc 
	 
;	include	iodebug.inc	; dragon debug stuff 
	include	configmg.inc	; used to process the dev node 
	include	opttest.inc	; optimized test, or, and and macros 
.list 
 
memcpy proto C, lpd:PTR, lps:DWORD, size_t:DWORD 
 
 
VXD_LOCKED_CODE_SEG 
 
extrn	milb:DWORD 
extrn	OnAsyncRequest:near 
 
BeginProc	Port_Async_Request, esp ;处理系统事件 
ArgVar	AEPPtr, DWORD 
 
	TRAP 
	EnterProc 
	 
	mov		ebx, AEPPtr 
	mov		[ebx.AEP_result], AEP_SUCCESS 
 
	mov		si, [ebx.AEP_func] 
 
	cmp		si, AEP_INITIALIZE 
	je		AEP_Init 
	cmp 		si, AEP_Boot_Complete 
	je		AEP_BootComplete 
	cmp		si, AEP_CONFIG_DCB 
	je		AEP_ConfigDcb 
	cmp		si, AEP_IOP_TIMEOUT 
	je		AEP_IopTimeOut 
	cmp		si, AEP_DEVICE_INQUIRY 
	je		AEP_DeviceInquiry 
			 
	mov		[ebx.AEP_result],AEP_FAILURE 
	 
	LeaveProc 
	Return	 
 
EndProc		Port_Async_Request 
 
VXD_LOCKED_CODE_ENDS 
 
;================================================== 
 
VXD_PAGEABLE_DATA_SEG 
 
	public	DevCount 
		DevCount	db	0 
 
	vendor			db	" Yan.J.F  VCDRom Driver     ",0,0 
 
	BDF_Removable 		EQU	4 
 
VXD_PAGEABLE_DATA_ENDS 
 
;================================================== 
 
VXD_PAGEABLE_CODE_SEG 
 
 
BeginProc	AEP_Init 
 
	TRAP 
	EnterProc 
 
	sub 	esp, size ISP_ddb_create 
	mov		edi, esp 
	 
	mov	[edi].ISP_ddb_hdr.ISP_func, ISP_CREATE_DDB 
	mov	[edi].ISP_ddb_size, size DDB; 
	mov	[edi].ISP_ddb_flags, 0 
	 
	push	edi 
	call	[milb.ILB_service_rtn] 
	movzx	eax, [edi].ISP_ddb_hdr.ISP_result 
	add	esp, size ISP_ddb_create + 4 
	cmp	eax, 0 
	jne	@F 
 
	 
m_exit: 
;;;;;;;;;;;// not deallocate!!!!!!!!!	 
	LeaveProc 
	Return 
 
@@: 
	mov		[ebx.AEP_result],AEP_FAILURE 
	jmp		m_exit 
	 
EndProc	AEP_Init 
 
;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
BeginProc	AEP_ConfigDcb 
 
	TRAP 
	EnterProc 
 
	mov 	esi, [ebx].AEP_d_c_dcb 
 
 
	inc		[DevCount] 
 
	mov		[esi].DCB_device_type, DCB_type_cdrom ; 我是光驱 
	mov		[esi].DCB_disk_bpb_flags, DCBF_DISK_BPB_USEFAKE 
	or		[esi].DCB_device_flags, DCB_DEV_REMOVABLE 
	or		[esi].DCB_tsd_flags, DCB_TSD_ACTUAL_PRE_SET 
 
;;;;;;;;;;;;;;;;;;;;;; 
 
	mov		[esi].DCB_max_xfer_len, 08000H 
	mov		[esi].DCB_max_sg_elements, 16 
	 
	push 	esi 
	push	edi 
 
	mov		esi, edi	 
	sub		esp, size ISP_calldown_insert 
	mov		edi, esp 
	 
	mov		[edi].ISP_func, ISP_insert_calldown 
	mov		[edi].ISP_i_cd_flags, DCB_dmd_small_memory 
	or		[edi].ISP_i_cd_flags, DCB_dmd_physical 
	or		[edi].ISP_i_cd_flags, DCB_dmd_load_eject_media 
	mov		[edi].ISP_i_cd_dcb, esi 
	mov		al, [ebx.AEP_lgn] 
	mov		[edi].ISP_i_cd_lgn, al 
	mov		[edi].ISP_i_cd_req, offset32 OnAsyncRequest ;挂接客户呼叫处理过程 
	mov		eax, [ebx.AEP_ddb] 
	mov		[edi].ISP_i_cd_ddb, eax 
	mov		[edi].ISP_i_cd_expan_len, 0 
	push	edi 
	call	[milb.ILB_Service_rtn] 
	add		esp, size ISP_calldown_insert + 4 
	 
	pop		edi 
	pop		esi 
 
c_exit:	 
 
	LeaveProc 
	Return 
 
failed_exit: 
	mov		[ebx].AEP_result, AEP_FAILURE 
	jmp		c_exit 
	 
EndProc	AEP_ConfigDcb 
 
;;;;;;;;;;;;;;;;;;;; 
	 
BeginProc	AEP_BootComplete 
 
	TRAP 
	EnterProc 
	 
	cmp 	[DevCount], 0 ;我只建立一个虚拟光驱 
	je		@F 
	 
	LeaveProc 
	Return 
 
@@: 
	mov 	[ebx.AEP_result], AEP_FAILURE 
 
EndProc	AEP_BootComplete 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
BeginProc	AEP_IopTimeOut 
	 
	TRAP 
	 
	Return 
	 
EndProc	AEP_IopTimeOut 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
BeginProc	AEP_DeviceInquiry ;填写虚拟光驱信息 
	 
	TRAP 
	EnterProc 
	 
	mov 	esi, [ebx.AEP_i_d_dcb] 
;	AssertDCB       this macro in the  
 
	movzx	ecx, [esi].DCB_unit_on_ctl 
	cmp 	ecx, 0 
	jne		@F 
	 
	mov		[esi].DCB_inquiry_flags, DCB_type_cdrom 
	invoke	memcpy, addr [esi].DCB_vendor_id, near32 ptr [vendor], 28 
	 
q_exit:	 
	LeaveProc 
	Return 
 
@@: 
	mov		[ebx.AEP_result], AEP_NO_MORE_DEVICES 
	jmp		q_exit	 
 
EndProc	AEP_DeviceInquiry 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
 
VXD_PAGEABLE_CODE_ENDS 
 
end