PAGE 58,132
;******************************************************************************
TITLE VWFD 
;******************************************************************************
;
;   (C) Copyright MICROSOFT Corp., 1990
;
;   Title:      VWFD.ASM 
;
;   Version:    3.00
;
;   Date:       15-Nov-1990 
;
;   Author:     Neil Sandlin
;
;
;------------------------------------------------------------------------------
;
;   Change log:
;
;      DATE     REV                 DESCRIPTION
;   ----------- --- -----------------------------------------------------------
;
;==============================================================================

        .386p

;******************************************************************************
;                             I N C L U D E S
;******************************************************************************

        .XLIST
        INCLUDE VMM.Inc
        INCLUDE Debug.Inc
        INCLUDE VDD.Inc
        INCLUDE VWFD.Inc
        .LIST


VWFD_CB_DATA STRUC

VWFD_State  dd  ?

VWFD_CB_DATA ENDS


;******************************************************************************
;                V I R T U A L   D E V I C E   D E C L A R A T I O N
;******************************************************************************

Declare_Virtual_Device VWFD, 3, 0, VWFD_Control, VWFD_Dev_ID,, \
                                    VWFD_API_PROC , VWFD_API_Proc


;******************************************************************************
;                         L O C A L   D A T A
;******************************************************************************

VxD_LOCKED_DATA_SEG
        ALIGN   4

VWFD_CB_Offset  dd  0
VDD_VMType_Proc dd  0

VxD_LOCKED_DATA_ENDS


VxD_ICODE_SEG

;******************************************************************************
;
;   VWFD_Sys_Crit_Init
;
;   DESCRIPTION:
;       This routine gets some "VM BLOCK" memory.
;   
;
;==============================================================================

BeginProc VWFD_Sys_Crit_Init

        push    ebx
        VMMCall _Allocate_Device_CB_Area, <<SIZE VWFD_CB_DATA>, 0>
        test    eax, eax
        jnz     SHORT VWFD_CB_OK
        Debug_Out "VWFD: Allocate_Device_CB_Area failed"
        VMMCall Fatal_Memory_Error

VWFD_CB_OK:
        mov     [VWFD_CB_Offset], eax
        pop     ebx
        
        clc
        ret


EndProc VWFD_Sys_Crit_Init

;******************************************************************************
;
;   VWFD_Device_Init
;
;   DESCRIPTION:
;       This routine hooks the service that specifies the windowed
;       state of a virtual machine.
;   
;
;==============================================================================

BeginProc VWFD_Device_Init

        mov     eax, VDD_Set_VMType         ; hook this service
        mov     esi, OFFSET32 VWFD_Set_VMType ; with this little front end
        VMMCall Hook_Device_Service         ; grab it
        jc      SHORT not_hooked            ; huh?
        mov     [VDD_VMType_Proc], esi
  
not_hooked:
        clc
        ret


EndProc VWFD_Device_Init

VxD_ICODE_ENDS



;******************************************************************************


VxD_LOCKED_CODE_SEG

;******************************************************************************
;
;   VWFD_Control
;
;   DESCRIPTION:
;
;       This is a call-back routine to handle the messages that are sent
;       to VxD's to control system operation. 
;
;
;==============================================================================

BeginProc VWFD_Control

        Control_Dispatch Sys_Critical_Init, VWFD_Sys_Crit_Init
        Control_Dispatch Device_Init, VWFD_Device_Init
        clc
        ret

EndProc VWFD_Control

;******************************************************************************
;
;   VWFD_Set_VMType
;
;   DESCRIPTION:
;       This routine keeps track of the windowed state of each VM.
;   
;
;==============================================================================

BeginProc VWFD_Set_VMType

        pushad
        mov     esi, ebx                    ; vm block
        add     esi, [VWFD_CB_Offset]       ; point to our area
        mov     [esi.VWFD_State], eax       ; save the current state
        popad
        jmp     [VDD_VMType_Proc]           ; chain to real handler

EndProc VWFD_Set_VMType


VxD_LOCKED_CODE_ENDS


VxD_CODE_SEG

BeginDoc
;******************************************************************************
;
;   VWFD_API_Proc
;
;   DESCRIPTION:
;
;       This is the exported API procedure that is callable from VM's. 
;       An application needs only to use INT 2Fh, AX=1684h, BX=device ID
;       and a call back address is returned. Then, when the
;       address is called, eventually it ends up here. 
;
;   ENTRY:
;       ebp -> Client data area
;       ebx -> Current VMCB
;
;
;==============================================================================
EndDoc

BeginProc VWFD_API_Proc

        push    ebx                             ; save ebx

        movzx   eax, WORD PTR [ebp.Client_BX]   ; Get requested VMID
        or      eax, eax                        ; non-zero?
        jz      short vmcb_ok                   ; zero, ebx is correct
vmid_scan:
        cmp     eax, [ebx.CB_VMID]              ; found it?
        je      short vmcb_ok                   ; yes
        VMMCall Get_Next_VM_Handle              ; get next
        VMMCall Test_Cur_VM_Handle              ; back to start of list?
        jne     vmid_scan                       ; no
        jmp     short VWFD_API_Invalid         ; return carry

vmcb_ok:
        mov     esi, ebx                        ; vm block
        add     esi, [VWFD_CB_Offset]          ; point to our area
        mov     edx, [esi.VWFD_State]          ; get the state

        and     [ebp.Client_Flags], NOT CF_Mask ; clear VM's carry flag

        mov     [ebp.Client_AX], dx             ;
        shr     dx, 16
        mov     [ebp.Client_DX], dx

        jmp     SHORT VWFD_exit

VWFD_API_Invalid:
        or      [ebp.Client_Flags], CF_Mask

VWFD_exit:
        pop     ebx                             ; restore ebx
        ret

EndProc VWFD_API_Proc

VxD_CODE_ENDS

        END

