mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
2.8 KiB
147 lines
2.8 KiB
page ,132
|
|
title client16.asm - 16-bit client support routines
|
|
|
|
|
|
;**********************************************************************
|
|
;** Microsoft Windows **
|
|
;** Copyright(c) Microsoft Corp., 1993-1994 **
|
|
;**********************************************************************
|
|
;
|
|
;
|
|
; client16.asm
|
|
;
|
|
; VXDLIB routines for dealing with 16-bit clients.
|
|
;
|
|
; The following functions are exported by this module:
|
|
;
|
|
; VxdMapSegmentOffsetToFlat
|
|
;
|
|
;
|
|
; FILE HISTORY:
|
|
; KeithMo 27-Jan-1994 Created.
|
|
;
|
|
;
|
|
|
|
.386p
|
|
include vmm.inc
|
|
include shell.inc
|
|
include vwin32.inc
|
|
include debug.inc
|
|
|
|
|
|
;***
|
|
;*** Locked code segment.
|
|
;***
|
|
|
|
VXD_LOCKED_CODE_SEG
|
|
|
|
;;;
|
|
;;; Public functions.
|
|
;;;
|
|
|
|
;*******************************************************************
|
|
;
|
|
; NAME: VxdMapSegmentOffsetToFlat
|
|
;
|
|
; SYNOPSIS: Maps a segment/offset pair to the corresponding flat
|
|
; pointer.
|
|
;
|
|
; ENTRY: VirtualHandle - VM handle.
|
|
;
|
|
; UserSegment - Segment value.
|
|
;
|
|
; UserOffset - Offset value
|
|
;
|
|
; RETURNS: LPVOID - The flat pointer, -1 if unsuccessful.
|
|
;
|
|
; NOTES: This routine was more-or-less stolen from the Map_Flat
|
|
; source in dos386\vmm\vmmutil.asm.
|
|
;
|
|
; HISTORY:
|
|
; KeithMo 27-Jan-1994 Created.
|
|
;
|
|
;********************************************************************
|
|
BeginProc _VxdMapSegmentOffsetToFlat, PUBLIC, CCALL, ESP
|
|
|
|
ArgVar VirtualHandle, DWORD
|
|
ArgVar UserSegment, DWORD
|
|
ArgVar UserOffset, DWORD
|
|
|
|
EnterProc
|
|
SaveReg <ebx, ecx, edx, esi>
|
|
|
|
;;;
|
|
;;; Capture the parameters.
|
|
;;;
|
|
|
|
mov ebx, VirtualHandle ; (EBX) = VM handle
|
|
movzx eax, word ptr UserSegment ; (EAX) = segment
|
|
movzx esi, word ptr UserOffset ; (ESI) = offset
|
|
|
|
;;;
|
|
;;; Short-circuit for NULL pointer. This is OK.
|
|
;;;
|
|
|
|
or eax, eax
|
|
jz vmsotf_Exit
|
|
|
|
;;;
|
|
;;; Determine if the current virtual machine is running in V86
|
|
;;; mode or protected mode.
|
|
;;;
|
|
|
|
test [ebx.CB_VM_Status], VMStat_PM_Exec
|
|
jz vmsotf_V86Mode
|
|
|
|
;;;
|
|
;;; The target virtual machine is in protected mode. Map the
|
|
;;; selector to a flat pointer, then add the offset.
|
|
;;;
|
|
|
|
VMMCall _SelectorMapFlat <ebx, eax, 0>
|
|
cmp eax, 0FFFFFFFFh
|
|
je vmsotf_Exit
|
|
|
|
add eax, esi
|
|
|
|
;;;
|
|
;;; If the pointer is within the first 1Meg+64K, add in the
|
|
;;; high-linear offset.
|
|
;;;
|
|
|
|
cmp eax, 00110000h
|
|
jae short vmsotf_Exit
|
|
|
|
vmsotf_AddHighLinear:
|
|
|
|
add eax, [ebx.CB_High_Linear]
|
|
|
|
;;;
|
|
;;; Cleanup stack & return.
|
|
;;;
|
|
|
|
vmsotf_Exit:
|
|
|
|
RestoreReg <esi, edx, ecx, ebx>
|
|
LeaveProc
|
|
Return
|
|
|
|
;;;
|
|
;;; The target virtual machine is in V86 mode. Map the segment/offset
|
|
;;; pair to a linear address.
|
|
;;;
|
|
|
|
vmsotf_V86Mode:
|
|
|
|
shl eax, 4
|
|
add eax, esi
|
|
jmp vmsotf_AddHighLinear
|
|
|
|
EndProc _VxdMapSegmentOffsetToFlat
|
|
|
|
|
|
VXD_LOCKED_CODE_ENDS
|
|
|
|
|
|
END
|
|
|