ntoskrnl.exe: Use etersoft_ioctl_* functions.
authorAlexander Morozov <amorozov@etersoft.ru>
Thu, 31 Mar 2011 12:04:19 +0000 (16:04 +0400)
committerTest Robot <wine-patches-test@office.etersoft.ru>
Thu, 31 Mar 2011 16:46:18 +0000 (20:46 +0400)
dlls/ntoskrnl.exe/ntoskrnl.c
include/wine/etersoft.h

index 03247cd75561f4ab2c4ad5b5006859dc6df24d80..29188c74d8b1f20efc53163f7382cbe86234a573 100644 (file)
@@ -45,6 +45,8 @@
 #include "wine/server.h"
 #include "wine/list.h"
 #include "wine/debug.h"
+#define ETERSOFT_IOCTL
+#include "wine/etersoft.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
 WINE_DECLARE_DEBUG_CHANNEL(relay);
@@ -146,8 +148,6 @@ struct HandleInstance
 #define IOCTL_WINE_DRIVER_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x101, \
         METHOD_BUFFERED, FILE_ANY_ACCESS)
 
-#define UPKEY_NKEY_DATA_SIZE 65535
-
 #ifdef __i386__
 #define DEFINE_FASTCALL1_ENTRYPOINT( name ) \
     __ASM_GLOBAL_FUNC( name, \
@@ -529,38 +529,13 @@ static NTSTATUS process_ioctl( DEVICE_OBJECT *device, ULONG code, void *in_buff,
     HANDLE process = NULL;
     CHAR *data = NULL;
     void *saved_ptr = NULL;
-    ULONG offset = 0, offset2 = 0;
 
     TRACE( "ioctl %x device %p in_size %u out_size %u\n", code, device, in_size, *out_size );
 
-    /* HACK for UPKey.sys and NKey.sys */
-    if (0x3fc == code) offset = 2;
-    else if (0x222040 == code || 0x222044 == code || 0x222048 == code ||
-             0x22204c == code || 0x222050 == code || 0x222060 == code ||
-             0x222080 == code || 0x2220c0 == code || 0x222100 == code ||
-             0x222104 == code || 0x222108 == code || 0x222110 == code ||
-             0x222118 == code || 0x222120 == code ||
-             0x3e8 == code || 0x3e9 == code || 0x44c == code || 0x456 == code)
-        offset = 8;
-    else if (0x2220d8 == code)
-    {
-        offset = 14;
-        offset2 = 8;
-    }
-    if (offset && in_buff)
-    {
-        data = HeapAlloc( GetProcessHeap(), 0, UPKEY_NKEY_DATA_SIZE );
-        if (data == NULL) return STATUS_NO_MEMORY;
-        saved_ptr = *(void**)((char *)in_buff + offset);
-        *(void**)((char *)in_buff + offset) = data;
-        if (offset2)
-            *(void**)((char *)in_buff + offset2) = data +
-                    (*(char**)((char *)in_buff + offset2) - (char *)saved_ptr);
-        process = OpenProcess( PROCESS_ALL_ACCESS, FALSE, get_pid() );
-        if (process != NULL)
-            NtReadVirtualMemory( process, saved_ptr, data, UPKEY_NKEY_DATA_SIZE, NULL );
-    }
-
+    LOADETER_FUNC( etersoft_ioctl_pre );
+    if (etersoft_ioctl_pre && etersoft_ioctl_pre( code, in_buff, get_pid(),
+            &saved_ptr, &data, &process ))
+        return STATUS_UNSUCCESSFUL;
     file = ExAllocatePool( NonPagedPool, sizeof(*file) );
     if (file == NULL)
     {
@@ -587,12 +562,9 @@ static NTSTATUS process_ioctl( DEVICE_OBJECT *device, ULONG code, void *in_buff,
     KeQueryTickCount( &count );  /* update the global KeTickCount */
     status = IoCallDriver( device, irp );
 end:
-    if (process)
-    {
-        NtWriteVirtualMemory( process, saved_ptr, data, UPKEY_NKEY_DATA_SIZE, NULL );
-        CloseHandle( process );
-    }
-    if (data) HeapFree( GetProcessHeap(), 0, data );
+    LOADETER_FUNC( etersoft_ioctl_post );
+    if (etersoft_ioctl_post)
+        etersoft_ioctl_post( process, saved_ptr, data );
     *out_size = (status >= 0) ? iosb.Information : 0;
     return status;
 }
index 7b6f051f73a624af32a8fc2d7152111d70bfcf0b..706a6b44f27993c6f1713faaeeb5eb66a2719597 100644 (file)
@@ -193,4 +193,11 @@ static int (*etersoft_garant_fix)(void **handle);
 static int (*etersoft_get_dll_handle)(const void *wname, void **handle);
 #endif
 
+#ifdef ETERSOFT_IOCTL
+static int (*etersoft_ioctl_pre)(unsigned long code, void *in_buff,
+        unsigned int pid, void **saved_ptr, char **data, void **process);
+
+static void (*etersoft_ioctl_post)(void *process, void *saved_ptr, char *data);
+#endif
+
 #endif