diff options
Diffstat (limited to 'libdha')
-rw-r--r-- | libdha/sysdep/libdha_win32.c | 38 | ||||
-rw-r--r-- | libdha/sysdep/pci_win32.c | 22 |
2 files changed, 57 insertions, 3 deletions
diff --git a/libdha/sysdep/libdha_win32.c b/libdha/sysdep/libdha_win32.c index e19a224a4c..5f325dd532 100644 --- a/libdha/sysdep/libdha_win32.c +++ b/libdha/sysdep/libdha_win32.c @@ -5,6 +5,9 @@ */ #include <windows.h> +#include <ddk/ntddk.h> +#include "../dhahelperwin/dhahelper.h" + /* This is the request structure that applications use to request services from the MAPDEV VxD. @@ -32,9 +35,20 @@ typedef struct _MapDevRequest #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType)<<16) | ((Access)<<14) | ((Function)<<2) | (Method) ) + +int IsWinNT(){ + OSVERSIONINFO OSVersionInfo; + OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&OSVersionInfo); + return OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT; +} + +static HANDLE hDriver = INVALID_HANDLE_VALUE; + + /* Memory Map a piece of Real Memory */ void *map_phys_mem(unsigned long base, unsigned long size) { - + if(!IsWinNT()){ HANDLE hDevice ; PVOID inBuf[1] ; /* buffer for struct pointer to VxD */ DWORD RetInfo[2] ; /* buffer to receive data from VxD */ @@ -63,6 +77,26 @@ void *map_phys_mem(unsigned long base, unsigned long size) { fprintf(stderr, "Failed to map device\n") ; exit(1) ; } return (void*)req.mdr_LinearAddress ; + } + else{ + dhahelper_t dhahelper_priv; + DWORD dwBytesReturned; + dhahelper_priv.size = size; + dhahelper_priv.base = base; + if(hDriver==INVALID_HANDLE_VALUE)hDriver = CreateFile("\\\\.\\DHAHELPER",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if (!DeviceIoControl(hDriver, IOCTL_DHAHELPER_MAPPHYSTOLIN, &dhahelper_priv,sizeof(dhahelper_t), &dhahelper_priv, sizeof(dhahelper_t),&dwBytesReturned, NULL)){ + printf("unable to map thre requested memory region\n"); + return NULL; + } + else return dhahelper_priv.ptr; + } } -void unmap_phys_mem(void *ptr, unsigned long size) { } +void unmap_phys_mem(void *ptr, unsigned long size) { + if(IsWinNT()){ + dhahelper_t dhahelper_priv; + DWORD dwBytesReturned; + dhahelper_priv.ptr = ptr; + DeviceIoControl(hDriver, IOCTL_DHAHELPER_UNMAPPHYSADDR, &dhahelper_priv,sizeof(dhahelper_t), NULL, 0, &dwBytesReturned, NULL); + } +} diff --git a/libdha/sysdep/pci_win32.c b/libdha/sysdep/pci_win32.c index 1c88cb13e8..a4a08077eb 100644 --- a/libdha/sysdep/pci_win32.c +++ b/libdha/sysdep/pci_win32.c @@ -4,15 +4,35 @@ Modified for readability by Nick Kurshev */ #include <windows.h> +#include <ddk/ntddk.h> +#include "../dhahelperwin/dhahelper.h" + +static HANDLE hDriver; +extern int IsWinNT(); + + + -/* Nothing to do for Win9x. For WinNT I have no solution */ static __inline__ int enable_os_io(void) { + if(IsWinNT()){ + DWORD dwBytesReturned; + hDriver = CreateFile("\\\\.\\DHAHELPER",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if(!DeviceIoControl(hDriver, IOCTL_DHAHELPER_ENABLEDIRECTIO, NULL,0, NULL, 0, &dwBytesReturned, NULL)){ + printf("unable to enable directio please install dhahelper.sys\n"); + return(1); + } + } return(0); } static __inline__ int disable_os_io(void) { + if(IsWinNT()){ + DWORD dwBytesReturned; + DeviceIoControl(hDriver, IOCTL_DHAHELPER_DISABLEDIRECTIO, NULL,0, NULL, 0, &dwBytesReturned, NULL); + CloseHandle(hDriver); + } return(0); } |