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