Moved handlers for int25 and int26 to winedos.

diff --git a/dlls/kernel/kernel32.spec b/dlls/kernel/kernel32.spec
index b0d3515..e9dd6cf 100644
--- a/dlls/kernel/kernel32.spec
+++ b/dlls/kernel/kernel32.spec
@@ -1053,8 +1053,7 @@
 @ cdecl DOSMEM_GetBlock(long ptr) DOSMEM_GetBlock
 @ cdecl DOSMEM_GetDPMISegments() DOSMEM_GetDPMISegments
 @ cdecl DOSMEM_Init(long) DOSMEM_Init
-@ stdcall INT_Int25Handler(ptr) INT_Int25Handler
-@ stdcall INT_Int26Handler(ptr) INT_Int26Handler  
+@ cdecl DRIVE_OpenDevice(long long) DRIVE_OpenDevice
 @ cdecl LOCAL_Alloc(long long long) LOCAL_Alloc
 @ cdecl LOCAL_Compact(long long long) LOCAL_Compact
 @ cdecl LOCAL_CountFree(long) LOCAL_CountFree
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
index e09aca0..c469f56 100644
--- a/dlls/ntdll/Makefile.in
+++ b/dlls/ntdll/Makefile.in
@@ -51,8 +51,6 @@
 	$(TOPOBJDIR)/msdos/dosmem.c \
 	$(TOPOBJDIR)/msdos/dpmi.c \
 	$(TOPOBJDIR)/msdos/int21.c \
-	$(TOPOBJDIR)/msdos/int25.c \
-	$(TOPOBJDIR)/msdos/int26.c \
 	$(TOPOBJDIR)/msdos/ioports.c \
 	$(TOPOBJDIR)/msdos/ppdev.c \
 	$(TOPOBJDIR)/msdos/vxd.c \
diff --git a/dlls/winedos/Makefile.in b/dlls/winedos/Makefile.in
index 350e50f..b6a5ccd 100644
--- a/dlls/winedos/Makefile.in
+++ b/dlls/winedos/Makefile.in
@@ -28,6 +28,8 @@
 	int1a.c \
 	int20.c \
 	int21.c \
+	int25.c \
+	int26.c \
 	int29.c \
 	int2a.c \
 	int2f.c \
diff --git a/dlls/winedos/dosexe.h b/dlls/winedos/dosexe.h
index 306e725..f3978d2 100644
--- a/dlls/winedos/dosexe.h
+++ b/dlls/winedos/dosexe.h
@@ -148,6 +148,14 @@
 /* int21.c */
 extern void WINAPI DOSVM_Int21Handler(CONTEXT86*);
 
+/* int25.c */
+BOOL DOSVM_RawRead( BYTE, DWORD, DWORD, BYTE *, BOOL );
+void WINAPI DOSVM_Int25Handler( CONTEXT86 * );
+
+/* int26.c */
+BOOL DOSVM_RawWrite( BYTE, DWORD, DWORD, BYTE *, BOOL );
+void WINAPI DOSVM_Int26Handler( CONTEXT86 * );
+
 /* int29.c */
 extern void WINAPI DOSVM_Int29Handler(CONTEXT86*);
 
diff --git a/dlls/winedos/int25.c b/dlls/winedos/int25.c
new file mode 100644
index 0000000..0bcff1d
--- /dev/null
+++ b/dlls/winedos/int25.c
@@ -0,0 +1,112 @@
+/*
+ * DOS interrupt 25h 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 "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include "msdos.h"
+#include "miscemu.h"
+#include "drive.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(int);
+
+
+/***********************************************************************
+ *           DOSVM_RawRead
+ *
+ * Read raw sectors from a device.
+ */
+BOOL DOSVM_RawRead(BYTE drive, DWORD begin, DWORD nr_sect, BYTE *dataptr, BOOL fake_success)
+{    
+    int fd;
+
+    if ((fd = DRIVE_OpenDevice( drive, O_RDONLY )) != -1)
+    {
+        lseek( fd, begin * 512, SEEK_SET );
+        /* FIXME: check errors */
+        read( fd, dataptr, nr_sect * 512 );
+        close( fd );
+    }
+    else
+    {
+        memset( dataptr, 0, nr_sect * 512 );
+        if (fake_success)
+        {
+            /* FIXME: explain what happens here */
+            if (begin == 0 && nr_sect > 1) *(dataptr + 512) = 0xf8;
+            if (begin == 1) *dataptr = 0xf8;
+        }
+        else
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	    DOSVM_Int25Handler (WINEDOS16.137)
+ *
+ * Handler for int 25h (absolute disk read).
+ */
+void WINAPI DOSVM_Int25Handler( CONTEXT86 *context )
+{
+    WCHAR drivespec[4] = {'A', ':', '\\', 0};
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
+    DWORD begin;
+    DWORD length;
+
+    drivespec[0] += AL_reg( context );
+
+    if (GetDriveTypeW( drivespec ) == DRIVE_NO_ROOT_DIR || 
+        GetDriveTypeW( drivespec ) == DRIVE_UNKNOWN)
+    {
+        SET_CFLAG( context );
+        SET_AX( context, 0x0201 ); /* unknown unit */
+        return;
+    }
+
+    if (CX_reg( context ) == 0xffff)
+    {
+        begin   = *(DWORD *)dataptr;
+        length  = *(WORD *)(dataptr + 4);
+        dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context,
+                                              *(WORD *)(dataptr + 8), 
+                                              *(DWORD *)(dataptr + 6) );
+    }
+    else
+    {
+        begin  = DX_reg( context );
+        length = CX_reg( context );
+    }
+
+    TRACE( "abs diskread, drive %d, sector %ld, "
+           "count %ld, buffer %p\n",
+           AL_reg( context ), begin, length, dataptr );
+
+    DOSVM_RawRead( AL_reg( context ), begin, length, dataptr, TRUE );
+    RESET_CFLAG( context );
+}
diff --git a/dlls/winedos/int26.c b/dlls/winedos/int26.c
new file mode 100644
index 0000000..4709680
--- /dev/null
+++ b/dlls/winedos/int26.c
@@ -0,0 +1,101 @@
+/*
+ * DOS interrupt 26h 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 "config.h"
+
+#include <stdlib.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include "msdos.h"
+#include "miscemu.h"
+#include "drive.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(int);
+
+
+/***********************************************************************
+ *           DOSVM_RawWrite
+ *
+ * Write raw sectors to a device.
+ */
+BOOL DOSVM_RawWrite(BYTE drive, DWORD begin, DWORD nr_sect, BYTE *dataptr, BOOL fake_success)
+{
+    int fd;
+
+    if ((fd = DRIVE_OpenDevice( drive, O_RDONLY )) != -1)
+    {
+        lseek( fd, begin * 512, SEEK_SET );
+        /* FIXME: check errors */
+        write( fd, dataptr, nr_sect * 512 );
+        close( fd );
+    }
+    else if (!fake_success)
+        return FALSE;
+
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	    DOSVM_Int26Handler (WINEDOS16.138)
+ *
+ * Handler for int 26h (absolute disk read).
+ */
+void WINAPI DOSVM_Int26Handler( CONTEXT86 *context )
+{
+    WCHAR drivespec[4] = {'A', ':', '\\', 0};
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
+    DWORD begin;
+    DWORD length;
+
+    drivespec[0] += AL_reg( context );
+
+    if (GetDriveTypeW( drivespec ) == DRIVE_NO_ROOT_DIR || 
+        GetDriveTypeW( drivespec ) == DRIVE_UNKNOWN)
+    {
+        SET_CFLAG( context );
+        SET_AX( context, 0x0201 ); /* unknown unit */
+        return;
+    }
+
+    if (CX_reg( context ) == 0xffff)
+    {
+        begin   = *(DWORD *)dataptr;
+        length  = *(WORD *)(dataptr + 4);
+        dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context,
+                                              *(WORD *)(dataptr + 8), 
+                                              *(DWORD *)(dataptr + 6) );
+    }
+    else
+    {
+        begin  = DX_reg( context );
+        length = CX_reg( context );
+    }
+
+    TRACE( "abs diskwrite, drive %d, sector %ld, "
+           "count %ld, buffer %p\n",
+           AL_reg( context ), begin, length, dataptr );
+
+    DOSVM_RawWrite( AL_reg( context ), begin, length, dataptr, TRUE );
+    RESET_CFLAG( context );
+}
diff --git a/dlls/winedos/interrupts.c b/dlls/winedos/interrupts.c
index 1706ee4..8013f0f 100644
--- a/dlls/winedos/interrupts.c
+++ b/dlls/winedos/interrupts.c
@@ -24,17 +24,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(int);
 
-/***********************************************************************
- *		DOSVM_Int25Handler (WINEDOS16.137)
- *		DOSVM_Int26Handler (WINEDOS16.138)
- *
- * FIXME: Interrupt handlers for interrupts implemented in other DLLs.
- *        These functions should be removed when the interrupt handlers have
- *        been moved to winedos.
- */
-void WINAPI DOSVM_Int25Handler( CONTEXT86 *context ) { INT_Int25Handler(context); }
-void WINAPI DOSVM_Int26Handler( CONTEXT86 *context ) { INT_Int26Handler(context); }
-
 static FARPROC16     DOSVM_Vectors16[256];
 static FARPROC48     DOSVM_Vectors48[256];
 static const INTPROC DOSVM_VectorsBuiltin[] =
diff --git a/include/miscemu.h b/include/miscemu.h
index 1078947..2ebf7af 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -175,6 +175,7 @@
     WORD int48_sel;
 };
 
+/* msdos/dosmem.c */
 extern struct DPMI_segments DOSMEM_dpmi_segments;
 extern const struct DPMI_segments *DOSMEM_GetDPMISegments(void);
 
@@ -196,17 +197,10 @@
 extern DWORD IO_inport( int port, int count );
 extern void IO_outport( int port, int count, DWORD value );
 
-/* msdos/int25.c */
-extern void WINAPI INT_Int25Handler(CONTEXT86*);
-
-/* msdos/int26.c */
-extern void WINAPI INT_Int26Handler(CONTEXT86*);
-
 /* msdos/dpmi.c */
 extern BOOL DPMI_LoadDosSystem(void);
 
 /* misc/ppdev.c */
-
 extern BOOL IO_pp_outp(int port, DWORD* res);
 extern int IO_pp_inp(int port, DWORD* res);
 extern char IO_pp_init(void);
diff --git a/msdos/int25.c b/msdos/int25.c
deleted file mode 100644
index 3f83eef..0000000
--- a/msdos/int25.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * DOS interrupt 25h 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 "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#include "msdos.h"
-#include "miscemu.h"
-#include "drive.h"
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(int);
-
-
-/**********************************************************************
- *	    INT_Int25Handler (WPROCS.137)
- *
- * Handler for int 25h (absolute disk read).
- */
-void WINAPI INT_Int25Handler( CONTEXT86 *context )
-{
-    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
-    DWORD begin, length;
-
-    if (!DRIVE_IsValid(LOBYTE(context->Eax)))
-    {
-        SET_CFLAG(context);
-        SET_AX( context, 0x0201 );        /* unknown unit */
-        return;
-    }
-
-    if (LOWORD(context->Ecx) == 0xffff)
-    {
-        begin   = *(DWORD *)dataptr;
-        length  = *(WORD *)(dataptr + 4);
-        dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context,
-					*(WORD *)(dataptr + 8), *(DWORD *)(dataptr + 6) );
-    }
-    else
-    {
-        begin  = LOWORD(context->Edx);
-        length = LOWORD(context->Ecx);
-    }
-    TRACE("int25: abs diskread, drive %d, sector %ld, "
-                 "count %ld, buffer %p\n",
-          LOBYTE(context->Eax), begin, length, dataptr);
-
-    DRIVE_RawRead(LOBYTE(context->Eax), begin, length, dataptr, TRUE);
-    RESET_CFLAG(context);
-}
diff --git a/msdos/int26.c b/msdos/int26.c
deleted file mode 100644
index a6b92d6..0000000
--- a/msdos/int26.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * DOS interrupt 26h 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 "config.h"
-
-#include <stdlib.h>
-#include <fcntl.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#include "msdos.h"
-#include "miscemu.h"
-#include "drive.h"
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(int);
-
-/**********************************************************************
- *	    INT_Int26Handler (WPROCS.138)
- *
- * Handler for int 26h (absolute disk read).
- */
-void WINAPI INT_Int26Handler( CONTEXT86 *context )
-{
-    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
-    DWORD begin, length;
-
-    if (!DRIVE_IsValid(LOBYTE(context->Eax)))
-    {
-        SET_CFLAG(context);
-        SET_AX( context, 0x0201 );        /* unknown unit */
-        return;
-    }
-
-    if (LOWORD(context->Ecx) == 0xffff)
-    {
-        begin   = *(DWORD *)dataptr;
-        length  = *(WORD *)(dataptr + 4);
-        dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context,
-                                        *(WORD *)(dataptr + 8), *(DWORD *)(dataptr + 6) );
-    }
-    else
-    {
-        begin  = LOWORD(context->Edx);
-        length = LOWORD(context->Ecx);
-    }
-
-    TRACE("int26: abs diskwrite, drive %d, sector %ld, "
-                 "count %ld, buffer %p\n",
-                 AL_reg(context), begin, length, dataptr );
-
-    DRIVE_RawWrite(LOBYTE(context->Eax), begin, length, dataptr, TRUE);
-    RESET_CFLAG(context);
-}