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

📄 vxwin.asm

📁 PNX系列设备驱动 PNX系列设备驱动
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;------------------------------------------------------------------------------
;	PROJECT	generic
;
;	FILE	vxwin.asm
;
;	AUTHOR	Tilakraj Roy ( TRC )
;
;	HISTORY	940511 TRC ( Created )
;		940827 TRC ( Catagoreised functions as locked and pageable )
;		940827 TRC ( added Hook/Unhook_Device_Service )
;		940921 TRC ( changed interrupt enabling for list functions )
;------------------------------------------------------------------------------
	.386p
	.xlist
	include	vmm.inc
	include	debug.inc
	include	shell.inc
	include	vpicd.inc
	include	vdmad.inc
	include dosmgr.inc
	include	configmg.inc
	include vtd.inc
;        include mmdevldr.inc
	include vwin32.inc
	.list

VXD_DATA_SEG
STATUS_SUCCESS	equ 0
STATUS_ERROR	equ 1
VXD_DATA_ENDS

VXD_INIT_CODE_SEG

;------------------------------------------------------------------------------
; FUNC	winAllocate_Device_CB_Area
;
; STATUS winAllocate_Device_CB_Area(WORD wSizeToAlocate ,PDWORD pdwDeviceCBOffset);
;
;------------------------------------------------------------------------------
BeginProc	_winAllocate_Device_CB_Area
ArgVar	wSizeToAllocate,WORD
ArgVar	pdwDeviceCBOffset,DWORD
	EnterProc
	push	esi
	VMMCall _Allocate_Device_CB_Area,<<wSizeToAllocate>,0>
	or	eax,eax
	jz	winAllocate_Device_CB_Area_Fail
	mov	esi,pdwDeviceCBOffset
	mov	[esi],eax
	mov	eax,STATUS_SUCCESS
	clc
	jmp	winAllocate_Device_CB_Area_Exit
winAllocate_Device_CB_Area_Fail:
	stc
	mov	eax,STATUS_ERROR
winAllocate_Device_CB_Area_Exit:
	pop	esi
	LeaveProc
	return
EndProc _winAllocate_Device_CB_Area
VXD_INIT_CODE_ENDS

;------------------------------------------------------------------------------
;				LOCKED CODE
;------------------------------------------------------------------------------
VXD_LOCKED_CODE_SEG


;------------------------------------------------------------------------------
; FUNC	winVPICD_Phys_EOI
;
; STATUS	winVPICD_Phys_EOI(DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Phys_EOI
ArgVar	dwIRQHandle, DWORD
	EnterProc
	mov	eax, dwIRQHandle
	VxDCall	VPICD_Phys_EOI
	mov	eax, STATUS_SUCCESS
	clc
	LeaveProc
	return
EndProc		_winVPICD_Phys_EOI
;------------------------------------------------------------------------------
; FUNC	winVPICD_Get_Complete_Status
;
; STATUS	winVPICD_Get_Complete_Status(DWORD dwIRQHandle, DWORD dwVMHandle, PDWORD pdwStatus);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Get_Complete_Status
ArgVar	dwIRQHandle, DWORD
ArgVar	dwVMHandle, DWORD
ArgVar	pdwStatus, DWORD
	EnterProc
	push	esi
	push	ebx
	mov	eax, dwIRQHandle
	mov	ebx, dwVMHandle
	VxDCall	VPICD_Get_Complete_Status
	mov	esi, pdwStatus
	mov	[esi], ecx
	mov	ax,  STATUS_SUCCESS
	clc
	pop	ebx
	pop	esi
	LeaveProc
	return
EndProc	_winVPICD_Get_Complete_Status

;------------------------------------------------------------------------------
; FUNC	winVPICD_Convert_Handle_To_IRQ
;
; STATUS	winVPICD_Convert_Handle_To_IRQ(DWORD dwIRQHandle, PBYTE pbIrqNumber);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Convert_Handle_To_IRQ
ArgVar	dwIRQHandle, DWORD
ArgVar	pIRQNumber, DWORD
	EnterProc
	push	esi
	mov	eax,dwIRQHandle
	VxDCall	VPICD_Convert_Handle_To_IRQ
	mov	eax,esi
	mov	esi,pIRQNumber
	mov	byte ptr [esi], al
	mov	eax, STATUS_SUCCESS
	clc
	pop	esi
	LeaveProc
	return
EndProc	_winVPICD_Convert_Handle_To_IRQ

;------------------------------------------------------------------------------
; FUNC	winVPICD_Set_Int_Request
;
; STATUS	winVPICD_Set_Int_Request(DWORD dwVMHandle, DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Set_Int_Request
ArgVar	dwVMHandle, DWORD
ArgVar	dwIRQHandle, DWORD
	EnterProc
	push	ebx
	mov	eax,dwIRQHandle
	mov	ebx,dwVMHandle
	VxDCall	VPICD_Set_Int_Request
	mov	eax, STATUS_SUCCESS
	clc
	pop	ebx
	LeaveProc
	return
EndProc	_winVPICD_Set_Int_Request

;------------------------------------------------------------------------------
; FUNC	winVPICD_Clear_Int_Request
;
; STATUS	winVPICD_Clear_Int_Request(DWORD dwVMHandle, DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Clear_Int_Request
ArgVar	dwVMHandle, DWORD
ArgVar	dwIRQHandle, DWORD
	EnterProc
	push	ebx

	mov	eax,dwIRQHandle
	mov	ebx,dwVMHandle
	VxDCall	VPICD_Clear_Int_Request
	mov	eax, STATUS_SUCCESS
	clc

	pop	ebx
	LeaveProc
	return
EndProc	_winVPICD_Clear_Int_Request

;------------------------------------------------------------------------------
; FUNC	winVPICD_Physically_Mask
;
; STATUS	winVPICD_Physically_Mask(DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Physically_Mask
ArgVar	dwIRQHandle, DWORD
	EnterProc
	mov	eax, dwIRQHandle
	VxDCall	VPICD_Physically_Mask
	mov	eax, STATUS_SUCCESS
	clc
	LeaveProc
	return
EndProc		_winVPICD_Physically_Mask

;------------------------------------------------------------------------------
; FUNC	winVPICD_Physically_Unmask
;
; STATUS	winVPICD_Physically_Unmask(DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Physically_Unmask
ArgVar	dwIRQHandle, DWORD
	EnterProc
	mov	eax, dwIRQHandle
	VxDCall	VPICD_Physically_Unmask
	mov	eax, STATUS_SUCCESS
	clc
	LeaveProc
	return
EndProc		_winVPICD_Physically_Unmask

;------------------------------------------------------------------------------
; FUNC	winVPICD_Set_Auto_Masking
;
; STATUS	winVPICD_Set_Auto_Masking(DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Set_Auto_Masking
ArgVar	dwIRQHandle, DWORD
	EnterProc
	mov	eax, dwIRQHandle
	VxDCall	VPICD_Set_Auto_Masking
	LeaveProc
	return
EndProc		_winVPICD_Set_Auto_Masking

;------------------------------------------------------------------------------
; FUNC	winTest_Sys_VM_Handle
;
; STATUS	winTest_Sys_VM_Handle(DWORD dwVMHandle);
;------------------------------------------------------------------------------
BeginProc	_winTest_Sys_VM_Handle
ArgVar	dwVMHandle, DWORD
	EnterProc
	push	ebx
	mov	ebx, dwVMHandle
	VMMCall Test_Sys_VM_Handle
	jnz	winTest_Sys_VM_Handle_Fail

	mov	eax, STATUS_SUCCESS
	clc
	jmp 	winTest_Sys_VM_Handle_Exit

winTest_Sys_VM_Handle_Fail:
	mov	eax, STATUS_ERROR
	stc
winTest_Sys_VM_Handle_Exit:
	pop	ebx
	LeaveProc
	return
EndProc	_winTest_Sys_VM_Handle

;VXD_LOCKED_CODE_ENDS

;VXD_PAGEABLE_CODE_SEG
;------------------------------------------------------------------------------
; FUNC	winDeallocate_Device_CB_Area	- Win 4.0 only
;
; STATUS winDeallocate_Device_CB_Area(DWORD dwDeviceOffset);
;
;------------------------------------------------------------------------------
BeginProc	_winDeallocate_Device_CB_Area
ArgVar	dwDeviceOffset,DWORD
	EnterProc
	VMMCall _Deallocate_Device_CB_Area,<<dwDeviceOffset>,0>
	or	eax,eax
	jz	winDeallocate_Device_CB_Area_Fail
	mov	eax,STATUS_SUCCESS
	clc
	jmp	winDeallocate_Device_CB_Area_Exit
winDeallocate_Device_CB_Area_Fail:
	stc
	mov	eax,STATUS_ERROR
winDeallocate_Device_CB_Area_Exit:
	LeaveProc
	return
EndProc _winDeallocate_Device_CB_Area
;------------------------------------------------------------------------------
; FUNC  winAllocate_GDT_Selector
;
; STATUS	winAllocate_GDT_Selector(DWORD dwDescHi, DWORD dwDescLo, PWORD pSelector);
;------------------------------------------------------------------------------
BeginProc	_winAllocate_GDT_Selector
ArgVar	dwDescHi, DWORD
ArgVar	dwDescLo, DWORD
ArgVar	pSelector, DWORD
	EnterProc
	push	esi
	mov	edx, dwDescHi
	mov	eax, dwDescLo
	VMMCall	_Allocate_GDT_Selector <edx,eax,0>
	or	eax,eax
	jz	winAllocate_GDT_Selector_Fail
	mov	esi, pSelector
	mov	word ptr [esi], ax
	mov	eax,STATUS_SUCCESS
	clc
	jmp	winAllocate_GDT_Selector_Exit

winAllocate_GDT_Selector_Fail:
	mov	eax, STATUS_ERROR
	stc

winAllocate_GDT_Selector_Exit:
	pop	esi
	LeaveProc
	return
EndProc	_winAllocate_GDT_Selector

;------------------------------------------------------------------------------
; FUNC  winFree_GDT_Selector
;
; STATUS	winFree_GDT_Selector( WORD wSelector );
;------------------------------------------------------------------------------
BeginProc	_winFree_GDT_Selector
ArgVar	wSelector, WORD

	EnterProc

	movzx	eax, wSelector
	VMMCall	_Free_GDT_Selector < eax, 0 >

	LeaveProc
	return
EndProc	_winFree_GDT_Selector

;------------------------------------------------------------------------------
; FUNC  winPageAllocate
;
; DWORD	winPageAllocate(DWORD dwPages, DWORD dwType, DWORD dwVM,
;	DWORD dwAlignMask, DWORD dwMinPages, DWORD dwMaxPages, PDWORD pdwPhysAddx,
;	DWORD dwFlags, PDWORD pdwHandle );
;------------------------------------------------------------------------------
BeginProc	_winPageAllocate
ArgVar	dwPages, DWORD
ArgVar	dwType, DWORD
ArgVar	dwVM, DWORD
ArgVar	dwAlignMask, DWORD
ArgVar	dwMinPages, DWORD
ArgVar	dwMaxPages, DWORD
Argvar	pdwPhysAddx, DWORD
Argvar	dwFlags, DWORD
ArgVar	pdwHandle, DWORD
	EnterProc
	push edx
	push esi


    VMMCall _PageAllocate, <dwPages, dwType, dwVM, dwAlignMask, dwMinPages, \
		dwMaxPages, pdwPhysAddx, dwFlags >


	or	eax, eax
	jz	winPageAllocate_Exit

	mov	esi,pdwHandle
	mov	[esi],edx

winPageAllocate_Exit:
	pop	esi
	pop	edx

	LeaveProc
	return
EndProc	_winPageAllocate

;------------------------------------------------------------------------------
; FUNC  winPageFree	- Win 4.0 only
;
; STATUS	winPageFree( DWORD dwHandle );
;------------------------------------------------------------------------------
BeginProc	_winPageFree
ArgVar	dwHandle, DWORD
	EnterProc
	mov	eax, dwHandle
	VMMCall	_PageFree < eax, 0 >
	LeaveProc
	return
EndProc _winPageFree

;------------------------------------------------------------------------------
; FUNC  winBuildDescriptorDWORDS
;
; STATUS	winBuildDescriptorDWORDS(DWORD dwLinearAddx, DWORD dwLength, PDWORD pDescHi, PDWORD pDescLo);
;------------------------------------------------------------------------------
BeginProc	_winBuildDescriptorDWORDS
ArgVar	dwLinearAddx, DWORD
ArgVar	dwLength, DWORD
ArgVar	pDescHi, DWORD
ArgVar	pDescLo, DWORD
	EnterProc
	push	ebx
	push	ecx
	push	esi
	push	edi

	mov	edx, dwLinearAddx
	mov	ecx, dwLength

	VMMCall	_BuildDescriptorDWORDS, <edx, ecx, \
		<D_PRES + D_DATA + D_W + D_SEG>, 0, 0>

	or	eax,eax
	jz	winBuildDescriptorDWORDS_Fail

	mov	esi,pDescLo
	mov	[esi],eax

	mov	esi,pDescHi
	mov	[esi],edx

	mov	eax, STATUS_SUCCESS
	clc
	jmp	winBuildDescriptorDWORDS_Exit

winBuildDescriptorDWORDS_Fail:
	mov	eax, STATUS_ERROR
	stc

winBuildDescriptorDWORDS_Exit:
	pop	edi
	pop	esi
	pop	ecx
	pop	ebx
	LeaveProc
	return
EndProc	_winBuilddescriptorDWORDS
;------------------------------------------------------------------------------
; FUNC	winInstall__IO_Handler
;
; STATUS winInstall_IO_Handler(WORD wPort, DWORD dwCallback);
;------------------------------------------------------------------------------
BeginProc    _winInstall_IO_Handler
Argvar	wPort, WORD
Argvar	dwCallback, DWORD
	EnterProc
	push	esi

	movzx 	edx, wPort
	mov	esi, dwCallback
	VMMCall	Install_IO_Handler
	jc      winInstall_IO_Handler_Fail
	mov	eax,STATUS_SUCCESS
	clc
	jmp	winInstall_IO_Handler_Exit
winInstall_IO_Handler_Fail:
	mov	eax,STATUS_ERROR
	stc
winInstall_IO_Handler_Exit:
	pop 	esi
	LeaveProc
	return
EndProc _winInstall_IO_Handler

;------------------------------------------------------------------------------
; FUNC	winRemove_IO_Handler
;
; STATUS winRemove_IO_Handler ( WORD wPort );
;------------------------------------------------------------------------------
BeginProc    _winRemove_IO_Handler
Argvar	wPort, WORD
	EnterProc
	movzx	edx, wPort
	VMMCall	Remove_IO_Handler
	mov	eax,STATUS_SUCCESS
	clc
	LeaveProc
	return
EndProc _winRemove_IO_Handler

;------------------------------------------------------------------------------
; FUNC	winInstall_Mult_IO_Handlers
;
; STATUS winInstall_Mult_IO_Handlers(WINIOSTRUCT pVxDIoStruct);
;------------------------------------------------------------------------------
BeginProc    _winInstall_Mult_IO_Handlers
Argvar	pVxDIoStruct,DWORD
	EnterProc
	push	esi

	mov	esi,pVxDIoStruct
	VMMCall	Install_Mult_IO_Handlers
	jc      winInstall_Mult_IO_Handlers_Fail
	mov	eax,STATUS_SUCCESS
	clc
	jmp	winInstall_Mult_IO_Handlers_Exit
winInstall_Mult_IO_Handlers_Fail:
	mov	eax,STATUS_ERROR
	stc

winInstall_Mult_IO_Handlers_Exit:
	pop	esi
	LeaveProc
	return
EndProc _winInstall_Mult_IO_Handlers
;------------------------------------------------------------------------------
; FUNC	winGet_Sys_VM_Handle
;
; DWORD	winGet_Sys_VM_Handle(VOID);
;------------------------------------------------------------------------------
BeginProc	_winGet_Sys_VM_Handle
	EnterProc

	push	ebx

	VMMCall	Get_Sys_VM_Handle
	mov		eax, ebx

	pop		ebx

	LeaveProc
	return
EndProc _winGet_Sys_VM_Handle

;------------------------------------------------------------------------------
; FUNC	winGet_Cur_VM_Handle
;
; DWORD	winGet_Cur_VM_Handle(VOID);
;------------------------------------------------------------------------------
BeginProc	_winGet_Cur_VM_Handle
	EnterProc

	push	ebx

	VMMCall	Get_Cur_VM_Handle
	mov		eax, ebx

	pop		ebx

	LeaveProc
	return
EndProc _winGet_Cur_VM_Handle

;------------------------------------------------------------------------------
; FUNC	winVPICD_Virtualize_IRQ
;
; DWORD	winVPICD_Virtualize_IRQ(PVID pIRQDescriptors );
;------------------------------------------------------------------------------
BeginProc  _winVPICD_Virtualize_IRQ
ArgVar	pVxDIRQStruct,DWORD
	EnterProc
	push	esi
	push	edi

	mov	edi,pVxDIRQStruct
	VxDCall	VPICD_Virtualize_IRQ
	jc	winVPICD_Virtualize_IRQ_Fail
	clc
	jmp	winVPICD_Virtualize_IRQ_Exit

winVPICD_Virtualize_IRQ_Fail:
	xor	eax,eax
	stc
winVPICD_Virtualize_IRQ_Exit:
	pop	edi
	pop	esi
	LeaveProc
	return
EndProc	_winVPICD_Virtualize_IRQ

;------------------------------------------------------------------------------
; FUNC	winVPICD_Force_Default_Behavior	- Win 4.0 only
;
; STATUS	winVPICD_Force_Default_Behavior(DWORD dwIRQHandle);
;------------------------------------------------------------------------------
BeginProc	_winVPICD_Force_Default_Behavior

⌨️ 快捷键说明

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