|  | /* | 
|  | * BIOS interrupt 13h handler | 
|  | * | 
|  | * Copyright 1997 Andreas Mohr | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | */ | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include <sys/types.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | #include "winbase.h" | 
|  | #include "winioctl.h" | 
|  | #include "miscemu.h" | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(int); | 
|  |  | 
|  | static void DIOCRegs_2_CONTEXT( DIOC_REGISTERS *pIn, CONTEXT86 *pCxt ) | 
|  | { | 
|  | memset( pCxt, 0, sizeof(*pCxt) ); | 
|  | /* Note: segment registers == 0 means that CTX_SEG_OFF_TO_LIN | 
|  | will interpret 32-bit register contents as linear pointers */ | 
|  |  | 
|  | pCxt->ContextFlags=CONTEXT86_INTEGER|CONTEXT86_CONTROL; | 
|  | pCxt->Eax = pIn->reg_EAX; | 
|  | pCxt->Ebx = pIn->reg_EBX; | 
|  | pCxt->Ecx = pIn->reg_ECX; | 
|  | pCxt->Edx = pIn->reg_EDX; | 
|  | pCxt->Esi = pIn->reg_ESI; | 
|  | pCxt->Edi = pIn->reg_EDI; | 
|  |  | 
|  | /* FIXME: Only partial CONTEXT86_CONTROL */ | 
|  | pCxt->EFlags = pIn->reg_Flags; | 
|  | } | 
|  |  | 
|  | static void CONTEXT_2_DIOCRegs( CONTEXT86 *pCxt, DIOC_REGISTERS *pOut ) | 
|  | { | 
|  | memset( pOut, 0, sizeof(DIOC_REGISTERS) ); | 
|  |  | 
|  | pOut->reg_EAX = pCxt->Eax; | 
|  | pOut->reg_EBX = pCxt->Ebx; | 
|  | pOut->reg_ECX = pCxt->Ecx; | 
|  | pOut->reg_EDX = pCxt->Edx; | 
|  | pOut->reg_ESI = pCxt->Esi; | 
|  | pOut->reg_EDI = pCxt->Edi; | 
|  |  | 
|  | /* FIXME: Only partial CONTEXT86_CONTROL */ | 
|  | pOut->reg_Flags = pCxt->EFlags; | 
|  | } | 
|  |  | 
|  | /********************************************************************** | 
|  | *	    INT_Int13Handler (WPROCS.119) | 
|  | * | 
|  | * Handler for int 13h (disk I/O). | 
|  | */ | 
|  | void WINAPI INT_Int13Handler( CONTEXT86 *context ) | 
|  | { | 
|  | HANDLE hVWin32; | 
|  | DIOC_REGISTERS regs; | 
|  | DWORD dwRet; | 
|  |  | 
|  | hVWin32 = CreateFileA("\\\\.\\VWIN32", GENERIC_READ|GENERIC_WRITE, | 
|  | 0, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0); | 
|  |  | 
|  | if(hVWin32!=INVALID_HANDLE_VALUE) | 
|  | { | 
|  | CONTEXT_2_DIOCRegs( context, ®s); | 
|  |  | 
|  | if(!DeviceIoControl(hVWin32, VWIN32_DIOC_DOS_INT13, | 
|  | ®s, sizeof regs, ®s, sizeof regs, &dwRet, NULL)) | 
|  | DIOCRegs_2_CONTEXT(®s, context); | 
|  | else | 
|  | SET_CFLAG(context); | 
|  |  | 
|  | CloseHandle(hVWin32); | 
|  | } | 
|  | else | 
|  | { | 
|  | ERR("Failed to open device VWIN32\n"); | 
|  | SET_CFLAG(context); | 
|  | } | 
|  | } |