📄 int86.c
字号:
/****************************************************************************** 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 bufferrseg - Place to store the real mode segment of the bufferroff - Place to store the real mode offset of the bufferREMARKS:This function returns the address and length of the global VESA transferbuffer that is used for communicating with the VESA BIOS functions fromWin16 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 valuesloaded 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 valuesloaded 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 valuesloaded 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -