Uniform SYS/VXD Handling 6/6: Implement hwinterface for inpout32

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Sun Jul 10 09:36:25 CDT 2005


       Changelog:
       wine/configure.ac, (new dir) dlls/hwinterface.sys/:
       hwinterface implemenation for inpout32
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.371
diff -u -r1.371 configure.ac
--- wine/configure.ac	1 Jul 2005 19:15:26 -0000	1.371
+++ wine/configure.ac	10 Jul 2005 13:28:27 -0000
@@ -1577,6 +1578,7 @@
 dlls/glu32/Makefile
 dlls/glut32/Makefile
 dlls/hhctrl.ocx/Makefile
+dlls/hwinterface.sys/Makefile
 dlls/iccvid/Makefile
 dlls/icmp/Makefile
 dlls/ifsmgr.vxd/Makefile
--- /dev/null	2005-03-19 20:36:14.000000000 +0100
+++ wine/dlls/hwinterface.sys/Makefile.in	2005-07-10 15:28:36.000000000 +0200
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = hwinterface.sys
+IMPORTS   = kernel32 ntdll
+
+C_SRCS = \
+	hwinterface.c
+
+ at MAKE_DLL_RULES@
+
+### Dependencies:
--- /dev/null	2005-03-19 20:36:14.000000000 +0100
+++ wine/dlls/hwinterface.sys/hwinterface.sys.spec	2005-07-10 15:28:27.000000000 +0200
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(ptr long ptr long ptr long ptr ptr) HWINTERFACE_DeviceIoControl
--- /dev/null	2005-03-19 20:36:14.000000000 +0100
+++ wine/dlls/hwinterface.sys/hwinterface.c	2005-07-09 23:24:18.000000000 +0200
@@ -0,0 +1,107 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */
+/*
+  Wine implementation of hwinterface.sys (http://www.logix4u.net/inpout32.htm)
+  
+  Copyright Uwe Bonnes 2005
+
+  hwinterface allows direct port access from user space
+  hwinterface.sys is mostly called from inpout32.dll
+
+  A more straightforward implementation would reimplement inpout32.
+  However this implementation is usefull for checking the loading of rewritten .sys file with wine
+*/
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "winnls.h"
+#include "ntstatus.h"
+#include "winternl.h"
+#include "wine/debug.h"
+#include "winioctl.h"
+
+#define IOCTL_READ_PORT_UCHAR    CTL_CODE(40000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_WRITE_PORT_UCHAR   CTL_CODE(40000, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+HMODULE hdosvm=NULL;
+DWORD (WINAPI *pDOSVM_inport)( int port, int size );
+void (WINAPI *pDOSVM_outport)( int port, int size, DWORD value );
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+/******************************************************************************
+ *  DllMain
+ *
+ * HWINTERFACE entry point.
+ *
+ */
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID lpReserved)
+{
+    switch (reason)
+    {
+    case DLL_PROCESS_ATTACH: {
+	TRACE("DLL_PROCESS_ATTACH: \n");
+	hdosvm = LoadLibraryA( "winedos.dll" );
+	if(hdosvm) {
+	    pDOSVM_inport = (void*)GetProcAddress(hdosvm, "inport");
+	    pDOSVM_outport = (void*)GetProcAddress(hdosvm, "outport");
+	    if (pDOSVM_inport && pDOSVM_outport) {
+		TRACE("Loading okay\n");
+		return TRUE;
+	    }
+	    else
+		FreeLibrary(hdosvm);
+	    return FALSE;
+	    break;
+	}
+    }
+    case DLL_PROCESS_DETACH:
+	TRACE("DLL_PROCESS_DETACH\n");
+	FreeLibrary(hdosvm);
+	break;
+    }
+    
+    return TRUE;
+}
+
+
+NTSTATUS WINAPI HWINTERFACE_DeviceIoControl(HANDLE hdevice, DWORD IoControlCode,
+					    LPVOID InputBuffer, DWORD InputBufferSize,
+					    LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+					    LPDWORD lpcbBytesReturned,
+					    LPOVERLAPPED lpOverlapped)
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS; 
+    
+    TRACE("(0x%08lx,%p,%ld,%p,%ld,%p,%p): stub\n",
+          IoControlCode,
+          InputBuffer,InputBufferSize,
+          lpvOutBuffer,cbOutBuffer,
+          lpcbBytesReturned,
+          lpOverlapped );
+    switch (IoControlCode)
+    {
+    case IOCTL_READ_PORT_UCHAR:
+	TRACE("IOCTL_READ_PORT_UCHAR\n");
+	if(InputBufferSize > 1 && cbOutBuffer >0) 
+	    ((PBYTE)lpvOutBuffer)[0] = (BYTE) pDOSVM_inport(((PUSHORT)InputBuffer)[0], 1);
+	else
+	    ntStatus = STATUS_BUFFER_TOO_SMALL;
+	break;
+    case IOCTL_WRITE_PORT_UCHAR :
+	TRACE("IOCTL_WRITE_PORT_UCHAR\n");
+	if(InputBufferSize > 2) 
+	    pDOSVM_outport(((PUSHORT)InputBuffer)[0], 1, ((PBYTE)InputBuffer)[2]);
+	else
+	    ntStatus = STATUS_BUFFER_TOO_SMALL;
+	break;
+    default:
+	ntStatus = STATUS_UNSUCCESSFUL;
+	FIXME("unknown IOCTL 0x%08lx\n", IoControlCode);
+    }
+    return ntStatus;
+}



More information about the wine-patches mailing list