d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; $Id$
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;; @file
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync; IPRT - DevHelp_GetDOSVar, Ring-0 Driver, OS/2.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; Copyright (c) 1999-2007 knut st. osmundsen <bird-src-spam@anduin.net>
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; Permission is hereby granted, free of charge, to any person
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; obtaining a copy of this software and associated documentation
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; files (the "Software"), to deal in the Software without
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; restriction, including without limitation the rights to use,
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; copy, modify, merge, publish, distribute, sublicense, and/or sell
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; copies of the Software, and to permit persons to whom the
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; Software is furnished to do so, subject to the following
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; conditions:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; The above copyright notice and this permission notice shall be
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; included in all copies or substantial portions of the Software.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; OTHER DEALINGS IN THE SOFTWARE.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;*******************************************************************************
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;* Header Files *
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;*******************************************************************************
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync%define RT_INCL_16BIT_SEGMENTS
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync%include "iprt/asmdefs.mac"
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync%include "iprt/err.mac"
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;*******************************************************************************
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;* External Symbols *
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;*******************************************************************************
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncextern KernThunkStackTo32
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncextern KernThunkStackTo16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncextern NAME(g_fpfnDevHlp)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;*******************************************************************************
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;* Defined Constants And Macros *
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;*******************************************************************************
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync%define DevHlp_GetDOSVar 24h
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncBEGINCODE
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; Jump table used by RTR0Os2DHQueryDOSVar
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncDosVarJumpTab:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd 0 ; 0 - Reserved
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1600 ; 1 - GIS
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1616 ; 2 - LIS
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd 0 ; 3 - Reserved
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1616 ; 4 - VectorSDF
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1616 ; 5 - VectorReboot
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1616 ; 6 - VectorMSATS
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; 7 - YieldFlag (Resched)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; 8 - TCYieldFlag (TCResched)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; 9 - DOSTable
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1616 ; a - VectorDEKKO
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; b - CodePgBuff
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd Load1616 ; c - VectorRIPL
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; d - InterruptLevel
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; e - DevClassTables
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ; f - DMQS_Sel
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd AsIs ;10 - APMInfo
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd LoadWord ;11 - APM_Length (length of above structure)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncDosVarJumpTabEnd:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync%define DosVarJumpTabSize (DosVarJumpTabEnd - DosVarJumpTab) / 4
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; Unified DevHelp_GetDOSVar -> Far 16:16 pointer wrapper.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; @param iVar [ebp + 08h] Variable.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; @param iMember [ebp + 0ch] Member.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync; @param pfp [ebp + 10h] Where to store the variable address (pointer to 16:16).
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncBEGINPROC_EXPORTED RTR0Os2DHQueryDOSVar
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; switch stack first.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync call KernThunkStackTo16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; normal prolog.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync push ebp
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov ebp, esp
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync push dword [NAME(g_fpfnDevHlp)] ; ebp - 4
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync push ebx ; save ebx
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync push es ; save es
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; setup the devhelp call and switch to
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov eax, [ebp + 08h] ; iVar (8-bit)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov ecx, [ebp + 0ch] ; iMember (16-bit)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov dl, DevHlp_GetDOSVar
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; jump to the 16-bit code.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ;jmp far dword NAME(RTR0Os2DHQueryDOSVar_16) wrt CODE16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync db 066h
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync db 0eah
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dw NAME(RTR0Os2DHQueryDOSVar_16) wrt CODE16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dw CODE16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncBEGINCODE16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncGLOBALNAME RTR0Os2DHQueryDOSVar_16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync call far [ss:ebp - 4]
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ;jmp far dword NAME(RTR0Os2DHQueryDOSVar) wrt FLAT
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync db 066h
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync db 0eah
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dd NAME(RTR0Os2DHQueryDOSVar_32) ;wrt FLAT
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync dw TEXT32 wrt FLAT
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncBEGINCODE
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncGLOBALNAME RTR0Os2DHQueryDOSVar_32
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jc Error1
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; Make ax:ebx contain the pointer and take action according
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; to the variable jump table.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ;
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync and ebx, 0000ffffh ; clean high part of ebx
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync movzx ecx, byte [ebp + 08] ; iVar
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync cmp ecx, DosVarJumpTabSize
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jg Error2
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp [DosVarJumpTab + ecx * 4]
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; Load Word at ax:ebx.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncLoadWord:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov es, ax
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync movzx edx, word [es:ebx]
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp StoreIt
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; Load selector at ax:ebx.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncLoad1600:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov es, ax
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync movzx edx, word [es:ebx]
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync shl edx, 16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp StoreIt
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; Load 16:16 ptr at ax:ebx.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncLoad1616:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov es, ax
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov edx, dword [es:ebx]
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp StoreIt
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; Move ax:bx into edx.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncAsIs:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov dx, ax
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync shl edx, 16
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov dx, bx
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp StoreIt
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncError2:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov eax, VERR_INVALID_PARAMETER
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp Done
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncError1:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov eax, VERR_GENERAL_FAILURE
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync jmp Done
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncStoreIt:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov ecx, [ebp + 10h]
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync mov [ecx], edx
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync xor eax, eax ; return success (VINF_SUCCESS == 0)
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncDone:
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync pop es
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync pop ebx
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync leave
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ; switch stack back and return.
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync push eax
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync call KernThunkStackTo32
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync pop eax
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync ret
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsyncENDPROC RTR0Os2DHQueryDOSVar
d1c5a03c19683c719b94496bb998fde2f2e5e622vboxsync