/**************************************************************************** * * SciTech OS Portability Manager Library * * ======================================================================== * * The contents of this file are subject to the SciTech MGL Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.scitechsoft.com/mgl-license.txt * * Software distributed under the License is distributed on an * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. * * The Initial Developer of the Original Code is SciTech Software, Inc. * All Rights Reserved. * * ======================================================================== * * Language: ANSI C * Environment: 32-bit Windows NT device drivers. * * Description: Implementation for the real mode software interrupt * handling functions. * ****************************************************************************/ #include "pmapi.h" #include "drvlib/os/os.h" #include "sdd/sddhelp.h" #include "mtrr.h" #include "oshdr.h" /*----------------------------- Implementation ----------------------------*/ /**************************************************************************** REMARKS: We do have limited BIOS access under Windows NT device drivers. ****************************************************************************/ ibool PMAPI PM_haveBIOSAccess(void) { // Return false unless we have full buffer passing! return false; } /**************************************************************************** PARAMETERS: len - Place to store the length of the buffer rseg - Place to store the real mode segment of the buffer roff - Place to store the real mode offset of the buffer REMARKS: This function returns the address and length of the global VESA transfer buffer that is used for communicating with the VESA BIOS functions from Win16 and Win32 programs under Windows. ****************************************************************************/ void * PMAPI PM_getVESABuf( uint *len, uint *rseg, uint *roff) { // No buffers supported under Windows NT (Windows XP has them however if // we ever decide to support this!) return NULL; } /**************************************************************************** REMARKS: Issue a protected mode software interrupt. ****************************************************************************/ int PMAPI PM_int386( int intno, PMREGS *in, PMREGS *out) { PMSREGS sregs; PM_segread(&sregs); return PM_int386x(intno,in,out,&sregs); } /**************************************************************************** REMARKS: Map a real mode pointer to a protected mode pointer. ****************************************************************************/ void * PMAPI PM_mapRealPointer( uint r_seg, uint r_off) { // Not used for Windows NT drivers! return NULL; } /**************************************************************************** REMARKS: Allocate a block of real mode memory ****************************************************************************/ void * PMAPI PM_allocRealSeg( uint size, uint *r_seg, uint *r_off) { // Not supported in NT drivers (void)size; (void)r_seg; (void)r_off; return NULL; } /**************************************************************************** REMARKS: Free a block of real mode memory. ****************************************************************************/ void PMAPI PM_freeRealSeg( void *mem) { // Not supported in NT drivers (void)mem; } /**************************************************************************** REMARKS: Issue a real mode interrupt (parameters in DPMI compatible structure) ****************************************************************************/ void PMAPI DPMI_int86( int intno, DPMI_regs *regs) { // Not used in NT drivers } /**************************************************************************** REMARKS: Call a V86 real mode function with the specified register values loaded before the call. The call returns with a far ret. ****************************************************************************/ void PMAPI PM_callRealMode( uint seg, uint off, RMREGS *regs, RMSREGS *sregs) { // TODO!! #if 0 CLIENT_STRUCT saveRegs; /* Bail if we do not have BIOS access (ie: the VxD was dynamically * loaded, and not statically loaded. */ if (!_PM_haveBIOS) return; TRACE("SDDHELP: Entering PM_callRealMode()\n"); Begin_Nest_V86_Exec(); LoadV86Registers(&saveRegs,regs,sregs); Simulate_Far_Call(seg, off); Resume_Exec(); ReadV86Registers(&saveRegs,regs,sregs); End_Nest_Exec(); TRACE("SDDHELP: Exiting PM_callRealMode()\n"); #endif } /**************************************************************************** REMARKS: Issue a V86 real mode interrupt with the specified register values loaded before the interrupt. ****************************************************************************/ int PMAPI PM_int86( int intno, RMREGS *in, RMREGS *out) { // TODO!! #if 0 RMSREGS sregs = {0}; CLIENT_STRUCT saveRegs; ushort oldDisable; /* Disable pass-up to our VxD handler so we directly call BIOS */ TRACE("SDDHELP: Entering PM_int86()\n"); if (disableTSRFlag) { oldDisable = *disableTSRFlag; *disableTSRFlag = 0; } Begin_Nest_V86_Exec(); LoadV86Registers(&saveRegs,in,&sregs); Exec_Int(intno); ReadV86Registers(&saveRegs,out,&sregs); End_Nest_Exec(); /* Re-enable pass-up to our VxD handler if previously enabled */ if (disableTSRFlag) *disableTSRFlag = oldDisable; TRACE("SDDHELP: Exiting PM_int86()\n"); #else *out = *in; #endif return out->x.ax; } /**************************************************************************** REMARKS: Issue a V86 real mode interrupt with the specified register values loaded before the interrupt. ****************************************************************************/ int PMAPI PM_int86x( int intno, RMREGS *in, RMREGS *out, RMSREGS *sregs) { // TODO!! #if 0 CLIENT_STRUCT saveRegs; ushort oldDisable; /* Bail if we do not have BIOS access (ie: the VxD was dynamically * loaded, and not statically loaded. */ if (!_PM_haveBIOS) { *out = *in; return out->x.ax; } /* Disable pass-up to our VxD handler so we directly call BIOS */ TRACE("SDDHELP: Entering PM_int86x()\n"); if (disableTSRFlag) { oldDisable = *disableTSRFlag; *disableTSRFlag = 0; } Begin_Nest_V86_Exec(); LoadV86Registers(&saveRegs,in,sregs); Exec_Int(intno); ReadV86Registers(&saveRegs,out,sregs); End_Nest_Exec(); /* Re-enable pass-up to our VxD handler if previously enabled */ if (disableTSRFlag) *disableTSRFlag = oldDisable; TRACE("SDDHELP: Exiting PM_int86x()\n"); #else *out = *in; #endif return out->x.ax; }