36200fc93ca319528d532c4b082b2935b151a131vboxsync; $Id$
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; @file
36200fc93ca319528d532c4b082b2935b151a131vboxsync; VBoxDrv - OS/2 assembly file, the first file in the link.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Permission is hereby granted, free of charge, to any person
36200fc93ca319528d532c4b082b2935b151a131vboxsync; obtaining a copy of this software and associated documentation
36200fc93ca319528d532c4b082b2935b151a131vboxsync; files (the "Software"), to deal in the Software without
36200fc93ca319528d532c4b082b2935b151a131vboxsync; restriction, including without limitation the rights to use,
36200fc93ca319528d532c4b082b2935b151a131vboxsync; copy, modify, merge, publish, distribute, sublicense, and/or sell
36200fc93ca319528d532c4b082b2935b151a131vboxsync; copies of the Software, and to permit persons to whom the
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Software is furnished to do so, subject to the following
36200fc93ca319528d532c4b082b2935b151a131vboxsync; conditions:
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The above copyright notice and this permission notice shall be
36200fc93ca319528d532c4b082b2935b151a131vboxsync; included in all copies or substantial portions of the Software.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
36200fc93ca319528d532c4b082b2935b151a131vboxsync; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
36200fc93ca319528d532c4b082b2935b151a131vboxsync; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
36200fc93ca319528d532c4b082b2935b151a131vboxsync; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
36200fc93ca319528d532c4b082b2935b151a131vboxsync; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
36200fc93ca319528d532c4b082b2935b151a131vboxsync; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
36200fc93ca319528d532c4b082b2935b151a131vboxsync; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
36200fc93ca319528d532c4b082b2935b151a131vboxsync; OTHER DEALINGS IN THE SOFTWARE.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;*******************************************************************************
36200fc93ca319528d532c4b082b2935b151a131vboxsync;* Header Files *
36200fc93ca319528d532c4b082b2935b151a131vboxsync;*******************************************************************************
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define RT_INCL_16BIT_SEGMENTS
36200fc93ca319528d532c4b082b2935b151a131vboxsync%include "iprt/asmdefs.mac"
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;*******************************************************************************
36200fc93ca319528d532c4b082b2935b151a131vboxsync;* Structures and Typedefs *
36200fc93ca319528d532c4b082b2935b151a131vboxsync;*******************************************************************************
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Request packet header.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTHDR
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Init request packet - input.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTINITIN
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync .data_1 resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .fpfnDevHlp resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .fpszArgs resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .data_2 resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Init request packet - output.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTINITOUT
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cUnits resb 1 ; block devs only.
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cbCode16 resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cbData16 resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .fpaBPBs resd 1 ; block devs only.
36200fc93ca319528d532c4b082b2935b151a131vboxsync .data_2 resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Open request packet.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTOPEN
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .sfn resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Close request packet.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTCLOSE
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .sfn resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; IOCtl request packet.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTIOCTL
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cat resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .fun resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .pParm resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .pData resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .sfn resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cbParm resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cbData resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Read/Write request packet
36200fc93ca319528d532c4b082b2935b151a131vboxsyncstruc PKTRW
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cb resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .unit resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cmd resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .status resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .res1 resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .link resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync .media resb 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .PhysTrans resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .cbTrans resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .start resd 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync .sfn resw 1
36200fc93ca319528d532c4b082b2935b151a131vboxsyncendstruc
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The two device headers.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment DATA16
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Some devhdr.inc stuff.
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DEVLEV_3 0180h
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DEV_30 0800h
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DEV_CHAR_DEV 8000h
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DEV_16MB 0002h
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DEV_IOCTL2 0001h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Some dhcalls.h stuff.
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DevHlp_VirtToLin 05bh
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DevHlp_SAVE_MESSAGE 03dh
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define DevHlp_PhysToVirt 015h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
b27991b512ea0b29ef75f62a9e54e4bba411f77evboxsync; Fast IOCtl category, also defined in SUPDrvIOC.h
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define SUP_CTL_CATEGORY_FAST 0c1h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;*******************************************************************************
36200fc93ca319528d532c4b082b2935b151a131vboxsync;* External Symbols *
36200fc93ca319528d532c4b082b2935b151a131vboxsync;*******************************************************************************
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern KernThunkStackTo32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern KernThunkStackTo16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern DOS16OPEN
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern DOS16CLOSE
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern DOS16WRITE
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern NAME(VBoxDrvInit)
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern NAME(VBoxDrvOpen)
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern NAME(VBoxDrvClose)
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern NAME(VBoxDrvIOCtl)
36200fc93ca319528d532c4b082b2935b151a131vboxsyncextern NAME(VBoxDrvIOCtlFast)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Device headers. The first one is the one we'll be opening and the
36200fc93ca319528d532c4b082b2935b151a131vboxsync; latter is only used for 32-bit initialization.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_VBoxDrvHdr1
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(g_VBoxDrvHdr2) wrt DATA16 ; NextHeader.off
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw DATA16 ; NextHeader.sel
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw DEVLEV_3 | DEV_30 | DEV_CHAR_DEV; SDevAtt
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvEP) wrt CODE16 ; StrategyEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; InterruptEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 'vboxdrv$' ; DevName
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevProtCS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevProtDS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevRealCS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevRealDS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd DEV_16MB | DEV_IOCTL2 ; SDevCaps
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsyncalign 4
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_VBoxDrvHdr2
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd 0ffffffffh ; NextHeader (NIL)
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw DEVLEV_3 | DEV_30 | DEV_CHAR_DEV; SDevAtt
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvInitEP) wrt CODE16 ; StrategyEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; InterruptEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 'vboxdr1$' ; DevName
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevProtCS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevProtDS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevRealCS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0 ; SDevRealDS
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd DEV_16MB | DEV_IOCTL2 ; SDevCaps
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Tristate 32-bit initialization indicator [0 = need init, -1 = init failed, 1 init succeeded].
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Check in the open path of the primary driver. The secondary driver will
36200fc93ca319528d532c4b082b2935b151a131vboxsync; open the primary one during it's init and thereby trigger the 32-bit init.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_fInitialized
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsyncalign 4
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Pointer to the device helper service routine
36200fc93ca319528d532c4b082b2935b151a131vboxsync; This is set during the initialization of the 2nd device driver.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_fpfnDevHlp
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Where we write to the log.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_offLogHead
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Where we read from the log.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_offLogTail
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; The size of the log. (power of two!)
36200fc93ca319528d532c4b082b2935b151a131vboxsync%define LOG_SIZE 16384
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_cchLogMax
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw LOG_SIZE
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; The log buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_szLog
36200fc93ca319528d532c4b082b2935b151a131vboxsync times LOG_SIZE db 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The init data.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment DATA16_INIT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_InitDataStart
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Far pointer to the device argument.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncg_fpszArgs:
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync%if 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Message table for the Save_Message device helper.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_MsgTab
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 1178 ; MsgId - 'MSG_REPLACEMENT_STRING'.
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 1 ; cMsgStrings
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(g_szInitText) ; MsgStrings[0]
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw seg NAME(g_szInitText)
36200fc93ca319528d532c4b082b2935b151a131vboxsync%else
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Far pointer to DOS16WRITE (corrected set before called).
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Just a temporary hack to work around a wlink issue.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_fpfnDos16Write
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw DOS16WRITE
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw seg DOS16WRITE
36200fc93ca319528d532c4b082b2935b151a131vboxsync%endif
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; Size of the text currently in the g_szInitText buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_cchInitText
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; The max size of text that can fit into the g_szInitText buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_cchInitTextMax
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw 512
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; The init text buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_szInitText
36200fc93ca319528d532c4b082b2935b151a131vboxsync times 512 db 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The 16-bit code segment.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The strategy entry point (vboxdrv$).
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; ss:bx -> request packet
36200fc93ca319528d532c4b082b2935b151a131vboxsync; ds:si -> device header
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Can clobber any registers it likes except SP.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncBEGINPROC VBoxDrvEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ebp, esp
36200fc93ca319528d532c4b082b2935b151a131vboxsync push es ; bp - 2
36200fc93ca319528d532c4b082b2935b151a131vboxsync push bx ; bp - 4
36200fc93ca319528d532c4b082b2935b151a131vboxsync and sp, 0fffch
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Check for the most frequent first.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [es:bx + PKTHDR.cmd], 10h ; Generic IOCtl
36200fc93ca319528d532c4b082b2935b151a131vboxsync jne near VBoxDrvEP_NotGenIOCtl
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Generic I/O Control Request.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_GenIOCtl:
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Fast IOCtl?
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [es:bx + PKTIOCTL.cat], SUP_CTL_CATEGORY_FAST
36200fc93ca319528d532c4b082b2935b151a131vboxsync jne VBoxDrvEP_GenIOCtl_Other
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Fast IOCtl.
5baba6ba887e1fa461283e38ce650b6c2113fe16vboxsync ; DECLASM(int) VBoxDrvIOCtlFast(uint16_t sfn, uint8_t iFunction)
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_GenIOCtl_Fast:
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; function.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx edx, byte [es:bx + PKTIOCTL.fun]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push edx ; 04h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; system file number.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx eax, word [es:bx + PKTIOCTL.sfn]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax ; 00h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; go to the 32-bit code
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_GenIOCtl_Fast_32) wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd NAME(VBoxDrvEP_GenIOCtl_Fast_32) ;wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw TEXT32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment TEXT32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_GenIOCtl_Fast_32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch stack to 32-bit.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, DATA32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov es, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; call the C code (don't cleanup the stack).
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvIOCtlFast)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch back the stack.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo16
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; jump back to the 16-bit code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_GenIOCtl_Fast_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvEP_GenIOCtl_Fast_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_GenIOCtl_Fast_16
36200fc93ca319528d532c4b082b2935b151a131vboxsync les bx, [bp - 4] ; Reload the packet pointer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync or eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz near VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; setup output stuff.
5baba6ba887e1fa461283e38ce650b6c2113fe16vboxsync xor eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [es:bx + PKTIOCTL.cbParm], eax ; update cbParm and cbData.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov sp, bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync retf
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Other IOCtl (slow)
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_GenIOCtl_Other:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov eax, [es:bx + PKTIOCTL.cbParm] ; Load cbParm and cbData
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax ; 1eh - in/out data size.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; 1ch - in/out parameter size.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push edx ; 18h - pointer to data size (filled in later).
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ecx ; 14h - pointer to param size (filled in later).
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; pData (convert to flat 32-bit)
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, word [es:bx + PKTIOCTL.pData + 2] ; selector
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp ax, 3 ; <= 3 -> nil selector...
36200fc93ca319528d532c4b082b2935b151a131vboxsync jbe .no_data
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx esi, word [es:bx + PKTIOCTL.pData] ; offset
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dl, DevHlp_VirtToLin
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far [NAME(g_fpfnDevHlp)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync jc near VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp .finish_data
36200fc93ca319528d532c4b082b2935b151a131vboxsync.no_data:
36200fc93ca319528d532c4b082b2935b151a131vboxsync xor eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync.finish_data:
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax ; 10h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; pParm (convert to flat 32-bit)
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, word [es:bx + PKTIOCTL.pParm + 2] ; selector
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp ax, 3 ; <= 3 -> nil selector...
36200fc93ca319528d532c4b082b2935b151a131vboxsync jbe .no_parm
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx esi, word [es:bx + PKTIOCTL.pParm] ; offset
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dl, DevHlp_VirtToLin
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far [NAME(g_fpfnDevHlp)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync jc near VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp .finish_parm
36200fc93ca319528d532c4b082b2935b151a131vboxsync.no_parm:
36200fc93ca319528d532c4b082b2935b151a131vboxsync xor eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync.finish_parm:
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax ; 0ch
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; function.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx edx, byte [es:bx + PKTIOCTL.fun]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push edx ; 08h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; category.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx ecx, byte [es:bx + PKTIOCTL.cat]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ecx ; 04h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; system file number.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx eax, word [es:bx + PKTIOCTL.sfn]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax ; 00h
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; go to the 32-bit code
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_GenIOCtl_Other_32) wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd NAME(VBoxDrvEP_GenIOCtl_Other_32) ;wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw TEXT32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment TEXT32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_GenIOCtl_Other_32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch stack to 32-bit.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, DATA32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov es, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; update in/out parameter pointers
36200fc93ca319528d532c4b082b2935b151a131vboxsync lea eax, [esp + 1ch]
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [esp + 14h], eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync lea edx, [esp + 1eh]
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [esp + 18h], edx
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; call the C code (don't cleanup the stack).
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvIOCtl)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch back the stack.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo16
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; jump back to the 16-bit code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_GenIOCtl_Other_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvEP_GenIOCtl_Other_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_GenIOCtl_Other_16
36200fc93ca319528d532c4b082b2935b151a131vboxsync les bx, [bp - 4] ; Reload the packet pointer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync or eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz near VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; setup output stuff.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov edx, esp
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov eax, [ss:edx + 1ch] ; output sizes.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [es:bx + PKTIOCTL.cbParm], eax ; update cbParm and cbData.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov sp, bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync retf
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Less Performance Critical Requests.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_NotGenIOCtl:
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [es:bx + PKTHDR.cmd], 0dh ; Open
36200fc93ca319528d532c4b082b2935b151a131vboxsync je VBoxDrvEP_Open
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [es:bx + PKTHDR.cmd], 0eh ; Close
36200fc93ca319528d532c4b082b2935b151a131vboxsync je VBoxDrvEP_Close
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [es:bx + PKTHDR.cmd], 00h ; Init
36200fc93ca319528d532c4b082b2935b151a131vboxsync je VBoxDrvEP_Init
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [es:bx + PKTHDR.cmd], 04h ; Read
36200fc93ca319528d532c4b082b2935b151a131vboxsync je near VBoxDrvEP_Read
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp near VBoxDrvEP_NotSupported
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Open Request. w/ ring-0 init.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_Open:
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [NAME(g_fInitialized)], 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync jne VBoxDrvEP_OpenOther
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; First argument, the system file number.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx eax, word [es:bx + PKTOPEN.sfn]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; go to the 32-bit code
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_Open_32) wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd NAME(VBoxDrvEP_Open_32) ;wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw TEXT32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment TEXT32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_Open_32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch stack to 32-bit.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, DATA32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov es, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; call the C code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvOpen)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch back the stack.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo16
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; jump back to the 16-bit code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_Open_32) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvEP_Open_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_Open_16
36200fc93ca319528d532c4b082b2935b151a131vboxsync les bx, [bp - 4] ; Reload the packet pointer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync or eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz near VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp near VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Initializing or failed init?
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_OpenOther:
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [NAME(g_fInitialized)], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync jne VBoxDrvEP_OpenFailed
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov byte [NAME(g_fInitialized)], -1
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvRing0Init)
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp byte [NAME(g_fInitialized)], 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync je VBoxDrvEP_Open
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_OpenFailed:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 0810fh ; error, done, init failed.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp near VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Close Request.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_Close:
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; First argument, the system file number.
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx eax, word [es:bx + PKTOPEN.sfn]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; go to the 32-bit code
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_Close_32) wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd NAME(VBoxDrvEP_Close_32) ;wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw TEXT32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment TEXT32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_Close_32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch stack to 32-bit.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, DATA32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov es, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; call the C code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvClose)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch back the stack.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo16
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; jump back to the 16-bit code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvEP_Close_32) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvEP_Close_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvEP_Close_16
36200fc93ca319528d532c4b082b2935b151a131vboxsync les bx, [bp - 4] ; Reload the packet pointer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync or eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz near VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp near VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Init Request.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; The other driver header will do this.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_Init:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov byte [es:bx + PKTINITOUT.cUnits], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTINITOUT.cbCode16], NAME(g_InitCodeStart) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTINITOUT.cbData16], NAME(g_InitDataStart) wrt DATA16
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dword [es:bx + PKTINITOUT.fpaBPBs], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp near VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Read Request.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Return log data.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_Read:
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Any log data available?
36200fc93ca319528d532c4b082b2935b151a131vboxsync xor dx, dx
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, [NAME(g_offLogTail)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp ax, [NAME(g_offLogHead)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync jz near .log_done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; create a temporary mapping of the physical buffer. Docs claims it trashes nearly everything...
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov cx, [es:bx + PKTRW.cbTrans]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push cx
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, [es:bx + PKTRW.PhysTrans + 2]
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov bx, [es:bx + PKTRW.PhysTrans]
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dh, 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dl, DevHlp_PhysToVirt
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far [NAME(g_fpfnDevHlp)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop bx ; bx = cbTrans
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync jc near .log_phystovirt_failed
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; es:di -> the output buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; setup the copy operation.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, [NAME(g_offLogTail)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync xor dx, dx ; dx tracks the number of bytes copied.
36200fc93ca319528d532c4b082b2935b151a131vboxsync.log_loop:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov cx, [NAME(g_offLogHead)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp ax, cx
36200fc93ca319528d532c4b082b2935b151a131vboxsync je .log_done
36200fc93ca319528d532c4b082b2935b151a131vboxsync jb .log_loop_before
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov cx, LOG_SIZE
36200fc93ca319528d532c4b082b2935b151a131vboxsync.log_loop_before: ; cx = end offset
36200fc93ca319528d532c4b082b2935b151a131vboxsync sub cx, ax ; cx = sequential bytes to copy.
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp cx, bx
36200fc93ca319528d532c4b082b2935b151a131vboxsync jbe .log_loop_min
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov cx, bx ; output buffer is smaller than available data.
36200fc93ca319528d532c4b082b2935b151a131vboxsync.log_loop_min:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov si, NAME(g_szLog)
36200fc93ca319528d532c4b082b2935b151a131vboxsync add si, ax ; ds:si -> the log buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync add dx, cx ; update output counter
36200fc93ca319528d532c4b082b2935b151a131vboxsync add ax, cx ; calc new offLogTail
36200fc93ca319528d532c4b082b2935b151a131vboxsync and ax, LOG_SIZE - 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync rep movsb ; do the copy
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [NAME(g_offLogTail)], ax ; commit the read.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp .log_loop
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync.log_done:
36200fc93ca319528d532c4b082b2935b151a131vboxsync les bx, [bp - 4] ; Reload the packet pointer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTRW.cbTrans], dx
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp near VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync.log_phystovirt_failed:
36200fc93ca319528d532c4b082b2935b151a131vboxsync les bx, [bp - 4] ; Reload the packet pointer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp VBoxDrvEP_GeneralFailure
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Return 'unknown command' error.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_NotSupported:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 08103h ; error, done, unknown command.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Return 'general failure' error.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_GeneralFailure:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 0810ch ; error, done, general failure.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp VBoxDrvEP_Done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Non-optimized return path.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvEP_Done:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov sp, bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync retf
36200fc93ca319528d532c4b082b2935b151a131vboxsyncENDPROC VBoxDrvEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The helper device entry point.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; This is only used to do the DosOpen on the main driver so we can
36200fc93ca319528d532c4b082b2935b151a131vboxsync; do ring-3 init and report failures.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvInitEP
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; The only request we're servicing is the 'init' one.
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp word [es:bx + PKTHDR.cmd], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync je near NAME(VBoxDrvInitEPServiceInitReq)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Ok, it's not the init request, just fail it.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 08103h ; error, done, unknown command.
36200fc93ca319528d532c4b082b2935b151a131vboxsync retf
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The 16-bit init code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16_INIT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME g_InitCodeStart
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;; The device name for DosOpen.
36200fc93ca319528d532c4b082b2935b151a131vboxsyncg_szDeviceName:
36200fc93ca319528d532c4b082b2935b151a131vboxsync db '\DEV\vboxdrv$', 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync; icsdebug can't see where stuff starts otherwise. (kDevTest)
36200fc93ca319528d532c4b082b2935b151a131vboxsyncint3
36200fc93ca319528d532c4b082b2935b151a131vboxsyncint3
36200fc93ca319528d532c4b082b2935b151a131vboxsyncint3
36200fc93ca319528d532c4b082b2935b151a131vboxsyncint3
36200fc93ca319528d532c4b082b2935b151a131vboxsyncint3
36200fc93ca319528d532c4b082b2935b151a131vboxsyncint3
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The Ring-3 init code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncBEGINPROC VBoxDrvInitEPServiceInitReq
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ebp, esp
36200fc93ca319528d532c4b082b2935b151a131vboxsync push es ; bp - 2
36200fc93ca319528d532c4b082b2935b151a131vboxsync push sp ; bp - 4
36200fc93ca319528d532c4b082b2935b151a131vboxsync push -1 ; bp - 6: hfOpen
36200fc93ca319528d532c4b082b2935b151a131vboxsync push 0 ; bp - 8: usAction
36200fc93ca319528d532c4b082b2935b151a131vboxsync and sp, 0fffch
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; check for the init package.
36200fc93ca319528d532c4b082b2935b151a131vboxsync cmp word [es:bx + PKTHDR.cmd], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync jne near .not_init
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Copy the data out of the init packet.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov eax, [es:bx + PKTINITIN.fpfnDevHlp]
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [NAME(g_fpfnDevHlp)], eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov edx, [es:bx + PKTINITIN.fpszArgs]
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [g_fpszArgs], edx
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Open the first driver, close it, and check status.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; APIRET _Pascal DosOpen(PSZ pszFname, PHFILE phfOpen, PUSHORT pusAction,
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; ULONG ulFSize, USHORT usAttr, USHORT fsOpenFlags,
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; USHORT fsOpenMode, ULONG ulReserved);
36200fc93ca319528d532c4b082b2935b151a131vboxsync push seg g_szDeviceName ; pszFname
36200fc93ca319528d532c4b082b2935b151a131vboxsync push g_szDeviceName
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ss ; phfOpen
36200fc93ca319528d532c4b082b2935b151a131vboxsync lea dx, [bp - 6]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push dx
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ss ; pusAction
36200fc93ca319528d532c4b082b2935b151a131vboxsync lea dx, [bp - 8]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push dx
36200fc93ca319528d532c4b082b2935b151a131vboxsync push dword 0 ; ulFSize
36200fc93ca319528d532c4b082b2935b151a131vboxsync push 0 ; usAttr = FILE_NORMAL
36200fc93ca319528d532c4b082b2935b151a131vboxsync push 1 ; fsOpenFlags = FILE_OPEN
36200fc93ca319528d532c4b082b2935b151a131vboxsync push 00040h ; fsOpenMode = OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY
36200fc93ca319528d532c4b082b2935b151a131vboxsync push dword 0 ; ulReserved
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far DOS16OPEN
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ax ; Quickly flush any text.
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvInitFlushText)
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync or ax, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz .done_err
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; APIRET APIENTRY DosClose(HFILE hf);
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov cx, [bp - 6]
36200fc93ca319528d532c4b082b2935b151a131vboxsync push cx
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far DOS16CLOSE
36200fc93ca319528d532c4b082b2935b151a131vboxsync or ax, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz .done_err ; This can't happen (I hope).
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Ok, we're good.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 00100h ; done, ok.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov byte [es:bx + PKTINITOUT.cUnits], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTINITOUT.cbCode16], NAME(g_InitCodeStart) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTINITOUT.cbData16], NAME(g_InitDataStart) wrt DATA16
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dword [es:bx + PKTINITOUT.fpaBPBs], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp .done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Init failure.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync.done_err:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 0810fh ; error, done, init failed.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov byte [es:bx + PKTINITOUT.cUnits], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTINITOUT.cbCode16], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTINITOUT.cbData16], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dword [es:bx + PKTINITOUT.fpaBPBs], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp .done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Not init, return 'unknown command'.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync.not_init:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [es:bx + PKTHDR.status], 08103h ; error, done, unknown command.
36200fc93ca319528d532c4b082b2935b151a131vboxsync jmp .done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Request done.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync.done:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov sp, bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync retf
36200fc93ca319528d532c4b082b2935b151a131vboxsyncENDPROC VBoxDrvInitEPServiceInitReq
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; The Ring-0 init code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncBEGINPROC VBoxDrvRing0Init
36200fc93ca319528d532c4b082b2935b151a131vboxsync push es
36200fc93ca319528d532c4b082b2935b151a131vboxsync push esi
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ebp, esp
36200fc93ca319528d532c4b082b2935b151a131vboxsync and sp, 0fffch
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Thunk the argument string pointer first.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx esi, word [g_fpszArgs] ; offset
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, [g_fpszArgs + 2] ; selector
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dl, DevHlp_VirtToLin
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far [NAME(g_fpfnDevHlp)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync jc near VBoxDrvRing0Init_done ; eax is non-zero on failure (can't happen)
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax ; 00h - pszArgs (for VBoxDrvInit).
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Do 16-bit init?
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Do 32-bit init
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvRing0Init_32) wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd NAME(VBoxDrvRing0Init_32) ;wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw TEXT32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment TEXT32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvRing0Init_32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch stack to 32-bit.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, DATA32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov es, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo32
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; call the C code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync call NAME(VBoxDrvInit)
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; switch back the stack and reload ds.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync call KernThunkStackTo16
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dx, seg NAME(g_fInitialized)
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, dx
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; jump back to the 16-bit code.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ;jmp far dword NAME(VBoxDrvRing0Init_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 066h
36200fc93ca319528d532c4b082b2935b151a131vboxsync db 0eah
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw NAME(VBoxDrvRing0Init_16) wrt CODE16
36200fc93ca319528d532c4b082b2935b151a131vboxsync dw CODE16_INIT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment CODE16_INIT
36200fc93ca319528d532c4b082b2935b151a131vboxsyncGLOBALNAME VBoxDrvRing0Init_16
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; check the result and set g_fInitialized on success.
36200fc93ca319528d532c4b082b2935b151a131vboxsync or eax, eax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jnz VBoxDrvRing0Init_done
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov byte [NAME(g_fInitialized)], 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsyncVBoxDrvRing0Init_done:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov sp, bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop esi
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop es
36200fc93ca319528d532c4b082b2935b151a131vboxsync ret
36200fc93ca319528d532c4b082b2935b151a131vboxsyncENDPROC VBoxDrvRing0Init
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; Flush any text in the text buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync;
36200fc93ca319528d532c4b082b2935b151a131vboxsyncBEGINPROC VBoxDrvInitFlushText
36200fc93ca319528d532c4b082b2935b151a131vboxsync push bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov bp, sp
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Anything in the buffer?
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, [NAME(g_cchInitText)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync or ax, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync jz .done
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync%if 1
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Write it to STDOUT.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; APIRET _Pascal DosWrite(HFILE hf, PVOID pvBuf, USHORT cbBuf, PUSHORT pcbBytesWritten);
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ax ; bp - 2 : cbBytesWritten
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov cx, sp
36200fc93ca319528d532c4b082b2935b151a131vboxsync push 1 ; STDOUT
36200fc93ca319528d532c4b082b2935b151a131vboxsync push seg NAME(g_szInitText) ; pvBuf
36200fc93ca319528d532c4b082b2935b151a131vboxsync push NAME(g_szInitText)
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ax ; cbBuf
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ss ; pcbBytesWritten
36200fc93ca319528d532c4b082b2935b151a131vboxsync push cx
36200fc93ca319528d532c4b082b2935b151a131vboxsync%if 0 ; wlink generates a non-aliased fixup here which results in 16-bit offset with the flat 32-bit selector.
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far DOS16WRITE
36200fc93ca319528d532c4b082b2935b151a131vboxsync%else
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; convert flat pointer to a far pointer using the tiled algorithm.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ds
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ax, DATA32 wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, ax
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov eax, g_pfnDos16Write wrt FLAT
36200fc93ca319528d532c4b082b2935b151a131vboxsync movzx eax, word [eax + 2] ; High word of the flat address (in DATA32).
36200fc93ca319528d532c4b082b2935b151a131vboxsync shl ax, 3
36200fc93ca319528d532c4b082b2935b151a131vboxsync or ax, 0007h
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ds
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov [NAME(g_fpfnDos16Write) + 2], ax ; Update the selector (in DATA16_INIT).
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; do the call
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far [NAME(g_fpfnDos16Write)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync%endif
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync%else ; alternative workaround for the wlink issue.
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Use the save message devhlp.
36200fc93ca319528d532c4b082b2935b151a131vboxsync push esi
36200fc93ca319528d532c4b082b2935b151a131vboxsync push ebx
36200fc93ca319528d532c4b082b2935b151a131vboxsync xor bx, bx
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov si, NAME(g_MsgTab)
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dx, seg NAME(g_MsgTab)
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov ds, dx
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov dl, DevHlp_SAVE_MESSAGE
36200fc93ca319528d532c4b082b2935b151a131vboxsync call far [NAME(g_fpfnDevHlp)]
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop ebx
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop esi
36200fc93ca319528d532c4b082b2935b151a131vboxsync%endif
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync ; Empty the buffer.
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov word [NAME(g_cchInitText)], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov byte [NAME(g_szInitText)], 0
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync.done:
36200fc93ca319528d532c4b082b2935b151a131vboxsync mov sp, bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync pop bp
36200fc93ca319528d532c4b082b2935b151a131vboxsync ret
36200fc93ca319528d532c4b082b2935b151a131vboxsyncENDPROC VBoxDrvInitFlushText
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync;;
36200fc93ca319528d532c4b082b2935b151a131vboxsync; This must be present
36200fc93ca319528d532c4b082b2935b151a131vboxsyncsegment DATA32
36200fc93ca319528d532c4b082b2935b151a131vboxsyncg_pfnDos16Write:
36200fc93ca319528d532c4b082b2935b151a131vboxsync dd DOS16WRITE ; flat
36200fc93ca319528d532c4b082b2935b151a131vboxsync
36200fc93ca319528d532c4b082b2935b151a131vboxsync