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

📄 vxwin.asm

📁 wince host 和 target PCI驱动程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	EnterProc
	VMMCall	_SelectorMapFlat < dwVMHandle, dwSelector, dwFlags >
	LeaveProc
	return
EndProc _winSelectorMapFlat

BeginProc _dbgOutput 
	push	ebp
	mov		ebp, esp

	pushfd
	pushad

	mov		esi, dword ptr [ebp+8]

	VMMCall	Out_Debug_String 

	popad
	popfd
	pop		ebp

	clc
	ret
EndProc	_dbgOutput

;------------------------------------------------------------------------------
; Routines for reading PCI configuration via bios.
; 
;------------------------------------------------------------------------------


;------------------------------------------------------------------------------
;
; Check for the presences of PCI BIOS Int 1Ah
;
; Returns: NC if BIOS is present.
;BOOL	pciCheckBIOS ( VOID );
;
;------------------------------------------------------------------------------
BeginProc	_pciCheckBIOS
Argvar	pbLastBus, DWORD
ArgVar	pbMajorVersion, DWORD
ArgVar	pbMinorVersion, DWORD
	EnterProc
	Mov	AH, 0B1h
	Mov	AL, 01h
	Push	Dword Ptr 1Ah
	VMMCall	Exec_VxD_Int

	cmp	EDX, 020494350h ; " ICP"
	jne	pciCheckBIOS_fail

	mov	eax,1

	mov		esi, pbLastBus
	mov		byte ptr [esi], cl

	mov		esi, pbMajorVersion
	mov		byte ptr [esi], bh

	mov		esi, pbMinorVersion
	mov		byte ptr [esi], bl

	jmp	pciCheckBIOS_exit

pciCheckBIOS_fail :
	xor		eax, eax

pciCheckBIOS_exit :
	LeaveProc
	return
EndProc		_pciCheckBIOS

;------------------------------------------------------------------------------
;
; pciFindDevice - Search PCI BIOS for a PCI Device 
;
;BOOL pciFindDevice ( WORD wDeviceID, WORD wVendorID, WORD wIndex, PBYTE pbBus, 
;		PBYTE pbDevFunc )
;------------------------------------------------------------------------------
BeginProc	_pciFindDevice
ArgVar	wDeviceID, WORD
ArgVar	wVendorID, WORD
ArgVar	wIndex, WORD
Argvar	pbBus, DWORD
ArgVar	pbDevFunc, DWORD
	EnterProc
	push	esi
	push	edx
	
	Mov		AH, 0b1h
	Mov 	AL, 02h
	mov		cx, wDeviceID
	mov		dx, wVendorID
	Mov		SI, wIndex
	Push	Dword Ptr 1Ah
	VMMCall	Exec_VxD_Int
	jc		pciFindDevice_fail

	mov		esi, pbBus
	mov		byte ptr [esi], bh

	mov		esi, pbDevFunc
	mov		byte ptr [esi], bl
	mov		eax, 1
	jmp		pciFindDevice_exit 


pciFindDevice_fail:
	xor	eax, eax

pciFindDevice_exit :
	pop		edx
	pop		esi
	LeaveProc
	return 
EndProc	_pciFindDevice


;------------------------------------------------------------------------------
;
; pciFindClass - Search PCI BIOS for a PCI Device by Class
;
;BOOL pciFindClass ( DWORD dwClass, WORD wIndex, PBYTE pbBus, 
;		PBYTE pbDevFunc )
;------------------------------------------------------------------------------
BeginProc	_pciFindClass
ArgVar	dwClass, DWORD
ArgVar	wIndex, WORD
Argvar	pbBus, DWORD
ArgVar	pbDevFunc, DWORD
	EnterProc
	push	esi
	push	edx
	
	Mov		AH, 0b1h
	Mov 	AL, 03h
	mov		ecx, dwClass
	Mov		SI, wIndex
	Push	Dword Ptr 1Ah
	VMMCall	Exec_VxD_Int
	jc		pciFindClass_fail

	mov		esi, pbBus
	mov		byte ptr [esi], bh

	mov		esi, pbDevFunc
	mov		byte ptr [esi], bl
	mov		eax, 1
	jmp		pciFindClass_exit 


pciFindClass_fail:
	xor	eax, eax

pciFindClass_exit :
	pop		edx
	pop		esi
	LeaveProc
	return 
EndProc	_pciFindClass


;------------------------------------------------------------------------------
;
; Read PCI Config
;
; In:	AL = Size to read (byte, word, dword)
;	BH = BUS
;	BL = Device	
;	CL = Function
;	DI = Configuration Register Address
;
; Out:	ECX = Value Read
;BOOL pciReadConfigDW ( BYTE bBus, BYTE bDevFunc, WORD wRegNum, 
;	PDWORD pdwValue)
;------------------------------------------------------------------------------
BeginProc	_pciReadConfigDW
ArgVar	bBus, BYTE
ArgVar	bDevFunc, BYTE
Argvar	wRegNum, WORD
ArgVar	pdwValue, DWORD
	EnterProc
	push	edi
	push	esi
	push	ecx

	mov		ah, 0b1h
	mov		al, 0ah
	mov		bh, bBus
	mov		bl, bDevFunc
	mov		di, wRegNum

	Push	Dword Ptr 1Ah
	VMMCall	Exec_VxD_Int
	jc		pciReadConfigDW_fail

	mov		esi, pdwValue
	mov		dword ptr [esi], ecx
	mov		eax, 1
	jmp		pciReadConfigDW_exit

pciReadConfigDW_fail :
	xor		eax, eax

pciReadConfigDW_exit :
	pop		ecx
	pop		esi
	pop		edi
	LeaveProc
	return
EndProc	_pciReadConfigDW


;------------------------------------------------------------------------------
;
; Write PCI Config
;
; In:	AL = Size to write (byte, word, dword)
;	BH = BUS
;	BL = Device	
;	CL = Function
;	EDX = Value to Write
;	DI = Configuration Register Address
;
; Out:	ECX = Value Read
;
;BOOL	pciWriteConfigDW ( BYTE bBus, BYTE bDevFunc, WORD wRegNum, 
;	DWORD dwValue)
;------------------------------------------------------------------------------
BeginProc	_pciWriteConfigDW
ArgVar	bBus, BYTE
ArgVar	bDevFunc, BYTE
Argvar	wRegNum, WORD
ArgVar	dwValue, DWORD
	EnterProc
	push	edi
	push	esi
	push	ecx

	mov		ah, 0b1h
	mov		al, 0dh
	mov		bh, bBus
	mov		bl, bDevFunc
	mov		di, wRegNum
	mov		ecx, dwValue

	Push	Dword Ptr 1Ah
	VMMCall	Exec_VxD_Int
	jc		pciWriteConfigDW_fail

	mov		eax, 1
	jmp		pciReadConfigDW_exit

pciWriteConfigDW_fail :
	xor		eax, eax

pciWriteConfigDW_exit :
	pop		ecx
	pop		esi
	pop		edi
	LeaveProc
	return
EndProc	_pciWriteConfigDW

;------------------------------------------------------------------------------
; FUNC	winCall_Priority_VM_Event
;
; BOOL winCall_Priority_VM_Event ( 
;	DWORD dwPriorityBoost,
;	DWORD dwVMHandle,
;	DWORD dwFlags,
;	PVOID pvCallbackContext,
;	VOID (*pFunc)(VOID), 
;	DWORD dwTimeOut,
;	PDWORD pdwEventHandle );
;------------------------------------------------------------------------------

BeginProc	_winCall_Priority_VM_Event
ArgVar	dwPriorityBoost,DWORD 
ArgVar	dwVMHandle,DWORD 
ArgVar	dwFlags,DWORD 
ArgVar	pvCallbackContext, DWORD 
ArgVar	pFunc, DWORD 
ArgVar	dwTimeOut, DWORD 
ArgVar	pdwEventHandle, DWORD

	EnterProc
	push	edi
	push	esi
	push	edx

	mov		eax, dwPriorityBoost
	mov		ebx, dwVMHandle
	mov		ecx, dwFlags
	mov		edx, pvCallbackContext
	mov		esi, pFunc
	mov		edi, dwTimeOut

	VMMCall	Call_Priority_VM_Event

	mov		eax, esi
	mov		esi, pdwEventHandle
	mov		[esi], eax

	pop		edx
	pop		esi
	pop		edi
	LeaveProc
	return
EndProc		_winCall_Priority_VM_Event

;------------------------------------------------------------------------------
; FUNC	winCancel_Priority_VM_Event
;
; BOOL winCancel_Priority_VM_Event ( DWORD dwEventHandle );
;------------------------------------------------------------------------------
BeginProc	_winCancel_Priority_VM_Event
ArgVar	dwEventHandle,DWORD 
	EnterProc
	push	esi
	mov	esi, dwEventHandle
	VMMCall	Cancel_Priority_VM_Event
	pop	esi
	LeaveProc
	return
EndProc		_winCancel_Priority_VM_Event

;------------------------------------------------------------------------------
; FUNC	winSchedule_Global_Event
;
; BOOL winSchedule_Global_Event ( VOID (*pFunc)(VOID),
;	PVOID pvCallbackContext, PDWORD pdwEventHandle );
;------------------------------------------------------------------------------

BeginProc	_winSchedule_Global_Event
ArgVar	dwCallbackAddress, DWORD
ArgVar	dwCallbackContext, DWORD
ArgVar	pdwHandle, DWORD

	EnterProc
	push	edi
	push	esi
	push	edx

	mov		esi, dwCallbackAddress
	mov		edx, dwCallbackContext

	VMMCall	Schedule_Global_Event
	mov		eax, esi
	mov		esi, pdwHandle
	mov		[esi], eax

	pop		edx
	pop		esi
	pop		edi
	LeaveProc

	return
EndProc		_winSchedule_Global_Event

;------------------------------------------------------------------------------
; FUNC	winSchedule_VM_Event
;
; BOOL winSchedule_VM_Event ( 
;	DWORD	VMHandle,
;	VOID (*pFunc)(VOID),
;	PVOID pvCallbackContext,
;	PDWORD pdwEventHandle );
;------------------------------------------------------------------------------

BeginProc	_winSchedule_VM_Event
ArgVar	dwVMHandle, DWORD
ArgVar	dwCallbackAddress, DWORD
ArgVar	dwCallbackContext, DWORD
ArgVar	pdwHandle, DWORD

	EnterProc
	push	edi
	push	esi
	push	edx
	push	ebx

	mov		ebx, dwVMHandle
	mov		esi, dwCallbackAddress
	mov		edx, dwCallbackContext

	VMMCall	Schedule_VM_Event
	mov		eax, esi
	mov		esi, pdwHandle
	mov		[esi], eax

	pop		ebx
	pop		edx
	pop		esi
	pop		edi
	LeaveProc

	return
EndProc		_winSchedule_VM_Event

BeginProc	_winVWIN32_DIOCCompletionRoutine
ArgVar	dwEvent, DWORD
	EnterProc

	mov		ebx, dwEvent
	VxDCall	VWIN32_DIOCCompletionRoutine

	LeaveProc
	return
EndProc _winVWIN32_DIOCCompletionRoutine

BeginProc	_winVWIN32_PulseWin32Event
ArgVar	dwEvent, DWORD
	EnterProc

	mov		eax, dwEvent
	VxDCall	_VWIN32_PulseWin32Event

	LeaveProc
	return
EndProc _winVWIN32_PulseWin32Event

BeginProc	_winVWIN32_SetWin32Event
ArgVar	dwEvent, DWORD
	EnterProc

	mov		eax, dwEvent
	VxDCall	_VWIN32_SetWin32Event

	LeaveProc
	return
EndProc _winVWIN32_SetWin32Event


BeginProc	_winVWIN32_CloseVxDHandle
ArgVar	dwHandle, DWORD
	EnterProc

	mov		eax, dwHandle
	VxDCall	_VWIN32_CloseVxDHandle

	LeaveProc
	return
EndProc _winVWIN32_CloseVxDHandle

BeginProc	_winVWIN32_GetCurrentProcessHandle
	EnterProc

	VxDCall	VWIN32_GetCurrentProcessHandle
	; eax returns the current process handle
	LeaveProc
	return
EndProc _winVWIN32_GetCurrentProcessHandle

;------------------------------------------------------------------------------
;DWORD winVWIN32_SysErrorBox ( PVOID pVSEB );
;------------------------------------------------------------------------------
BeginProc	_winVWIN32_SysErrorBox
ArgVar	pVSEB, DWORD
	EnterProc
	
	mov		ebx, pVSEB

	VxDCall	VWIN32_SysErrorBox
	; eax returns the current process handle
	LeaveProc
	return
EndProc _winVWIN32_SysErrorBox

;debugging code
;
;
BeginProc	_winIn_Debug_Chr
ArgVar	pbInput, DWORD
	EnterProc
	push	ebx

	VMMCall	In_Debug_Chr
	mov		ebx, pbInput
	mov		byte ptr [ebx], al

	pop	ebx
	LeaveProc
	return
EndProc	_winIn_Debug_Chr

;------------------------------------------------------------------------------
;VOID	winStallProcessorExecution ( DWORD TimeInMicroSeconds )
; 1 Count in edx:eax = .8 uS
; Number of Counts edx:eax = TimeInUSeconds * 10 / 8;
;------------------------------------------------------------------------------
BeginProc	_winStallProcessorExecution
ArgVar	TimeInMicroSeconds, DWORD

LocalVar	Count, DWORD
LocalVar	SavedHI, DWORD
LocalVar	SavedLO, DWORD

	EnterProc
	push	eax
	push	edx

	mov		eax, [TimeInMicroSeconds]
	mov		edx, 0ah
	mul		edx
	shr		eax, 3
	xor		ecx, ecx

	; ecx holds the count that we need to loop
	mov		Count, eax

	VxDcall VTD_Get_Real_Time

	mov		[SavedHI], edx
	mov		[SavedLO], eax


winStallProcessorExecutionLoop :
	
	VxDcall VTD_Get_Real_Time

	push	eax
	push	edx

	

	sub		eax, [SavedLO]

	; subtrace without borrow
	sub		edx, [SavedHI]

	add		ecx, eax

	pop		edx
	pop		eax

	mov		[SavedHI], edx
	mov		[SavedLO], eax

Trace_Out " [ VTD_Get_Real_Time : #EDX : #EAX  : #ECX ] "

	cmp		Count, ecx

	jnb		winStallProcessorExecutionLoop	


	pop	edx
	pop	eax

	LeaveProc
	return
EndProc	_winStallProcessorExecution

VXD_LOCKED_CODE_ENDS
	end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -