[Wine-patches] [eterhack] ntoskrnl.exe: Use etersoft_ioctl_* functions.
Alexander Morozov
amorozov на etersoft.ru
Чт Мар 31 19:25:02 MSD 2011
----------- следующая часть -----------
From 75d343bd96f6024f4119e9322a34d169029c9cc5 Mon Sep 17 00:00:00 2001
From: Alexander Morozov <amorozov на etersoft.ru>
Date: Thu, 31 Mar 2011 16:04:19 +0400
Subject: [eterhack] ntoskrnl.exe: Use etersoft_ioctl_* functions.
---
dlls/ntoskrnl.exe/ntoskrnl.c | 47 +++++++++---------------------------------
include/wine/etersoft.h | 5 ++++
2 files changed, 15 insertions(+), 37 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 942d608..c8b654b 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -46,6 +46,7 @@
#include "wine/server.h"
#include "wine/list.h"
#include "wine/debug.h"
+#include "wine/etersoft.h"
WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
WINE_DECLARE_DEBUG_CHANNEL(relay);
@@ -148,8 +149,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_STDCALL_FUNC( name, 4, \
@@ -517,38 +516,15 @@ 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;
+ DEFETER_FUNC( etersoft_ioctl_pre );
+ DEFETER_FUNC( etersoft_ioctl_post );
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)
{
@@ -575,12 +551,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;
}
diff --git a/include/wine/etersoft.h b/include/wine/etersoft.h
index 7d23cfb..42898ba 100644
--- a/include/wine/etersoft.h
+++ b/include/wine/etersoft.h
@@ -169,4 +169,9 @@ typedef int (*t_etersoft_ischarupper)(unsigned int cp, char x);
typedef int (*t_etersoft_garant_fix)(void **handle);
+typedef int (*t_etersoft_ioctl_pre)(unsigned long code, void *in_buff,
+ unsigned int pid, void **saved_ptr, char **data, void **process);
+
+typedef void (*t_etersoft_ioctl_post)(void *process, void *saved_ptr, char *data);
+
#endif
--
1.7.4.2
Подробная информация о списке рассылки Wine-patches