[PATCH 0/3] MR10690: android: refactoring and cleanup changes (part of !10569)
This MR contains a subset of changes extracted from MR !10569. Included changes: 1. Simplify client PID handling in Android driver * Pass PID explicitly via `ioctl_android_dequeueBuffer` instead of thread-local `driver_data` * Remove `ioctl_params` wrapper and pass IRP directly * Remove implicit `client_id` propagation through ioctl dispatch and Java calls * Restrict PID usage to `dequeueBuffer` where it is actually required 2. Simplify Android initialization and AHardwareBuffer handling * Load AHardwareBuffer symbols together with other Android APIs in `load_android_libs()` * Remove separate `init_ahardwarebuffers()` path * Treat libandroid and AHardwareBuffer as part of standard platform API 3. Switch `java_*` variables to direct linking * Replace dlsym-based resolution with direct references (`java_vm`, `java_object`, `java_gdt_sel`) * Remove indirect pointer layer and simplify initialization logic Reason: This MR is split out from !10569 to simplify review by isolating refactoring and cleanup changes from functional fixes. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10690
From: Twaik Yont <9674930+twaik@users.noreply.github.com> wineandroid.so is already linked against ntdll by the build system, so there is no need to resolve java_vm, java_object and java_gdt_sel via dlsym() at runtime. Replace the indirect pointers (p_java_*) with direct references to the exported symbols. This simplifies the code and removes unnecessary runtime linking. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- dlls/wineandroid.drv/android.h | 6 +++--- dlls/wineandroid.drv/device.c | 18 ++++++------------ dlls/wineandroid.drv/init.c | 23 ++++------------------- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 00061cf2812..8aee7b22406 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -184,9 +184,9 @@ union event_data int send_event( const union event_data *data ); -extern JavaVM **p_java_vm; -extern jobject *p_java_object; -extern unsigned short *p_java_gdt_sel; +extern JavaVM *java_vm; +extern jobject java_object; +extern unsigned short java_gdt_sel; /* string helpers */ diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index 77050337273..b04210bc7fe 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -235,11 +235,11 @@ static inline void wrap_java_call(void) { __asm__( "mov %0,%%fs" :: "r" (java_ static inline void unwrap_java_call(void) { __asm__( "mov %0,%%fs" :: "r" (orig_fs) ); } static inline void init_java_thread( JavaVM *java_vm ) { - java_fs = *p_java_gdt_sel; + java_fs = java_gdt_sel; __asm__( "mov %%fs,%0" : "=r" (orig_fs) ); __asm__( "mov %0,%%fs" :: "r" (java_fs) ); (*java_vm)->AttachCurrentThread( java_vm, &jni_env, 0 ); - if (!*p_java_gdt_sel) __asm__( "mov %%fs,%0" : "=r" (java_fs) ); + if (!java_gdt_sel) __asm__( "mov %%fs,%0" : "=r" (java_fs) ); __asm__( "mov %0,%%fs" :: "r" (orig_fs) ); } @@ -571,14 +571,12 @@ static int status_to_android_error( unsigned int status ) static jobject load_java_method( jmethodID *method, const char *name, const char *args ) { - jobject object = *p_java_object; - if (!*method) { jclass class; wrap_java_call(); - class = (*jni_env)->GetObjectClass( jni_env, object ); + class = (*jni_env)->GetObjectClass( jni_env, java_object ); *method = (*jni_env)->GetMethodID( jni_env, class, name, args ); unwrap_java_call(); if (!*method) @@ -587,7 +585,7 @@ static jobject load_java_method( jmethodID *method, const char *name, const char return NULL; } } - return object; + return java_object; } static void create_desktop_view(void) @@ -1067,9 +1065,7 @@ NTSTATUS android_dispatch_ioctl( void *arg ) NTSTATUS android_java_init( void *arg ) { - JavaVM *java_vm; - - if (!(java_vm = *p_java_vm)) return STATUS_UNSUCCESSFUL; /* not running under Java */ + if (!java_vm) return STATUS_UNSUCCESSFUL; /* not running under Java */ init_java_thread( java_vm ); create_desktop_view(); @@ -1078,9 +1074,7 @@ NTSTATUS android_java_init( void *arg ) NTSTATUS android_java_uninit( void *arg ) { - JavaVM *java_vm; - - if (!(java_vm = *p_java_vm)) return STATUS_UNSUCCESSFUL; /* not running under Java */ + if (!java_vm) return STATUS_UNSUCCESSFUL; /* not running under Java */ wrap_java_call(); (*java_vm)->DetachCurrentThread( java_vm ); diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 303655cde58..4ce07e3fd9f 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -84,7 +84,7 @@ void init_monitors( int width, int height ) wine_dbgstr_rect( &rect ), wine_dbgstr_rect( &monitor_rc_work )); /* if we're notified from Java thread, update registry */ - if (*p_java_vm) NtUserCallNoParam( NtUserCallNoParam_DisplayModeChanged ); + if (java_vm) NtUserCallNoParam( NtUserCallNoParam_DisplayModeChanged ); } @@ -168,7 +168,7 @@ void set_screen_dpi( DWORD dpi ) */ static void fetch_display_metrics(void) { - if (*p_java_vm) return; /* for Java threads it will be set when the top view is created */ + if (java_vm) return; /* for Java threads it will be set when the top view is created */ SERVER_START_REQ( get_window_rectangles ) { @@ -364,27 +364,12 @@ static void load_android_libs(void) #undef DECL_FUNCPTR #undef LOAD_FUNCPTR -JavaVM **p_java_vm = NULL; -jobject *p_java_object = NULL; -unsigned short *p_java_gdt_sel = NULL; - static HRESULT android_init( void *arg ) { struct init_params *params = arg; pthread_mutexattr_t attr; jclass class; - jobject object; JNIEnv *jni_env; - JavaVM *java_vm; - void *ntdll; - - if (!(ntdll = dlopen( "ntdll.so", RTLD_NOW ))) return STATUS_UNSUCCESSFUL; - - p_java_vm = dlsym( ntdll, "java_vm" ); - p_java_object = dlsym( ntdll, "java_object" ); - p_java_gdt_sel = dlsym( ntdll, "java_gdt_sel" ); - - object = *p_java_object; init_ahardwarebuffers(); @@ -396,7 +381,7 @@ static HRESULT android_init( void *arg ) register_window_callback = params->register_window_callback; start_device_callback = params->start_device_callback; - if ((java_vm = *p_java_vm)) /* running under Java */ + if (java_vm) /* running under Java */ { #ifdef __i386__ WORD old_fs; @@ -404,7 +389,7 @@ static HRESULT android_init( void *arg ) #endif load_android_libs(); (*java_vm)->AttachCurrentThread( java_vm, &jni_env, 0 ); - class = (*jni_env)->GetObjectClass( jni_env, object ); + class = (*jni_env)->GetObjectClass( jni_env, java_object ); (*jni_env)->RegisterNatives( jni_env, class, methods, ARRAY_SIZE( methods )); (*jni_env)->DeleteLocalRef( jni_env, class ); #ifdef __i386__ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10690
From: Twaik Yont <9674930+twaik@users.noreply.github.com> Move AHardwareBuffer symbol loading into load_android_libs() and drop the separate init_ahardwarebuffers() path. libandroid is part of the public NDK API surface, so both the library itself and the AHardwareBuffer interfaces it provides are expected to be available on all supported Android systems. Load these symbols together with the rest of the Android APIs instead of treating them as an optional or separately initialized component. This simplifies initialization and removes redundant code paths. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- dlls/wineandroid.drv/android.h | 15 ++++++++++- dlls/wineandroid.drv/device.c | 49 ++-------------------------------- dlls/wineandroid.drv/init.c | 25 ++++++++++++++--- 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 8aee7b22406..0bd25de8e9e 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -46,6 +46,20 @@ DECL_FUNCPTR( __android_log_print ); DECL_FUNCPTR( ANativeWindow_fromSurface ); DECL_FUNCPTR( ANativeWindow_release ); + +#ifdef __ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ +extern struct AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(struct ANativeWindowBuffer* anwb) __INTRODUCED_IN(26); + +DECL_FUNCPTR( AHardwareBuffer_describe ); +DECL_FUNCPTR( AHardwareBuffer_acquire ); +DECL_FUNCPTR( AHardwareBuffer_release ); +DECL_FUNCPTR( AHardwareBuffer_lock ); +DECL_FUNCPTR( AHardwareBuffer_unlock ); +DECL_FUNCPTR( AHardwareBuffer_recvHandleFromUnixSocket ); +DECL_FUNCPTR( AHardwareBuffer_sendHandleToUnixSocket ); +DECL_FUNCPTR( ANativeWindowBuffer_getHardwareBuffer ); +#endif + #undef DECL_FUNCPTR @@ -119,7 +133,6 @@ enum android_window_messages WM_ANDROID_REFRESH = WM_WINE_FIRST_DRIVER_MSG, }; -extern void init_ahardwarebuffers(void); extern HWND get_capture_window(void); extern void init_monitors( int width, int height ); extern void set_screen_dpi( DWORD dpi ); diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index b04210bc7fe..570aab818ab 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -22,10 +22,10 @@ #pragma makedep unix #endif -#include "config.h" - #define __ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ +#include "config.h" + #include <assert.h> #include <errno.h> #include <stdio.h> @@ -48,19 +48,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(android); -#define DECL_FUNCPTR(f) static typeof(f) * p##f = NULL - -struct AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(struct ANativeWindowBuffer* anwb) __INTRODUCED_IN(26); - -DECL_FUNCPTR( AHardwareBuffer_describe ); -DECL_FUNCPTR( AHardwareBuffer_acquire ); -DECL_FUNCPTR( AHardwareBuffer_release ); -DECL_FUNCPTR( AHardwareBuffer_lock ); -DECL_FUNCPTR( AHardwareBuffer_unlock ); -DECL_FUNCPTR( AHardwareBuffer_recvHandleFromUnixSocket ); -DECL_FUNCPTR( AHardwareBuffer_sendHandleToUnixSocket ); -DECL_FUNCPTR( ANativeWindowBuffer_getHardwareBuffer ); - #ifndef SYNC_IOC_WAIT #define SYNC_IOC_WAIT _IOW('>', 0, __s32) #endif @@ -484,38 +471,6 @@ void register_native_window( HWND hwnd, struct ANativeWindow *win, BOOL opengl ) NtQueueApcThread( thread, register_window_callback, (ULONG_PTR)hwnd, (ULONG_PTR)win, opengl ); } -#define LOAD_FUNCPTR(lib, func) do { \ - const char *err; \ - dlerror(); \ - p##func = dlsym( lib, #func ); \ - if (!p##func) \ - { \ - err = dlerror(); \ - ERR( "can't find symbol %s: %s\n", #func, err ? err : "unknown error" ); \ - abort(); \ - } \ -} while (0) -void init_ahardwarebuffers(void) -{ - void *libandroid; - - if (!(libandroid = dlopen( "libandroid.so", RTLD_NOW ))) - { - const char *err = dlerror(); - ERR( "failed to dlopen libandroid.so: %s\n", err ? err : "unknown error" ); - abort(); - } - - LOAD_FUNCPTR( libandroid, AHardwareBuffer_describe ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_acquire ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_release ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_lock ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_unlock ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_recvHandleFromUnixSocket ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_sendHandleToUnixSocket ); - LOAD_FUNCPTR( libandroid, ANativeWindowBuffer_getHardwareBuffer ); -} - /* get the capture window stored in the desktop process */ HWND get_capture_window(void) { diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 4ce07e3fd9f..0dbd6c11785 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -22,6 +22,8 @@ #pragma makedep unix #endif +#define __ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ + #include "config.h" #include <stdarg.h> @@ -335,12 +337,20 @@ static const JNINativeMethod methods[] = #define DECL_FUNCPTR(f) typeof(f) * p##f = NULL #define LOAD_FUNCPTR(lib, func) do { \ if ((p##func = dlsym( lib, #func )) == NULL) \ - { ERR( "can't find symbol %s\n", #func); return; } \ + { ERR( "can't find symbol %s\n", #func); abort(); return; } \ } while(0) DECL_FUNCPTR( __android_log_print ); DECL_FUNCPTR( ANativeWindow_fromSurface ); DECL_FUNCPTR( ANativeWindow_release ); +DECL_FUNCPTR( AHardwareBuffer_describe ); +DECL_FUNCPTR( AHardwareBuffer_acquire ); +DECL_FUNCPTR( AHardwareBuffer_release ); +DECL_FUNCPTR( AHardwareBuffer_lock ); +DECL_FUNCPTR( AHardwareBuffer_unlock ); +DECL_FUNCPTR( AHardwareBuffer_recvHandleFromUnixSocket ); +DECL_FUNCPTR( AHardwareBuffer_sendHandleToUnixSocket ); +DECL_FUNCPTR( ANativeWindowBuffer_getHardwareBuffer ); static void load_android_libs(void) { @@ -349,16 +359,26 @@ static void load_android_libs(void) if (!(libandroid = dlopen( "libandroid.so", RTLD_GLOBAL ))) { ERR( "failed to load libandroid.so: %s\n", dlerror() ); + abort(); return; } if (!(liblog = dlopen( "liblog.so", RTLD_GLOBAL ))) { ERR( "failed to load liblog.so: %s\n", dlerror() ); + abort(); return; } LOAD_FUNCPTR( liblog, __android_log_print ); LOAD_FUNCPTR( libandroid, ANativeWindow_fromSurface ); LOAD_FUNCPTR( libandroid, ANativeWindow_release ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_describe ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_acquire ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_release ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_lock ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_unlock ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_recvHandleFromUnixSocket ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_sendHandleToUnixSocket ); + LOAD_FUNCPTR( libandroid, ANativeWindowBuffer_getHardwareBuffer ); } #undef DECL_FUNCPTR @@ -371,7 +391,7 @@ static HRESULT android_init( void *arg ) jclass class; JNIEnv *jni_env; - init_ahardwarebuffers(); + load_android_libs(); pthread_mutexattr_init( &attr ); pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); @@ -387,7 +407,6 @@ static HRESULT android_init( void *arg ) WORD old_fs; __asm__( "mov %%fs,%0" : "=r" (old_fs) ); #endif - load_android_libs(); (*java_vm)->AttachCurrentThread( java_vm, &jni_env, 0 ); class = (*jni_env)->GetObjectClass( jni_env, java_object ); (*jni_env)->RegisterNatives( jni_env, class, methods, ARRAY_SIZE( methods )); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10690
From: Twaik Yont <9674930+twaik@users.noreply.github.com> Pass the client pid explicitly through ioctl_android_dequeueBuffer instead of relying on thread-local driver_data propagation. The pid is only required for handle duplication in dequeueBuffer, so there is no need to thread it through the generic ioctl dispatch path or Java window management calls. This simplifies the dispatch path and makes pid usage explicit at the single call site that requires it. This also prepares the code for execution without a Wine TEB, where thread-local state and helpers like wine_server_fd_to_handle will not be available. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- dlls/wineandroid.drv/WineActivity.java | 12 ++++++------ dlls/wineandroid.drv/device.c | 27 +++++++++----------------- dlls/wineandroid.drv/dllmain.c | 3 +-- dlls/wineandroid.drv/unixlib.h | 8 -------- 4 files changed, 16 insertions(+), 34 deletions(-) diff --git a/dlls/wineandroid.drv/WineActivity.java b/dlls/wineandroid.drv/WineActivity.java index 3bb27c13f93..6488188b93a 100644 --- a/dlls/wineandroid.drv/WineActivity.java +++ b/dlls/wineandroid.drv/WineActivity.java @@ -782,7 +782,7 @@ public void create_desktop_view() wine_config_changed( getResources().getConfiguration().densityDpi ); } - public void create_window( int hwnd, boolean is_desktop, boolean opengl, int parent, int pid ) + public void create_window( int hwnd, boolean is_desktop, boolean opengl, int parent ) { WineWindow win = get_window( hwnd ); if (win == null) @@ -806,7 +806,7 @@ public void destroy_window( int hwnd ) if (win != null) win.destroy(); } - public void set_window_parent( int hwnd, int parent, int pid ) + public void set_window_parent( int hwnd, int parent ) { WineWindow win = get_window( hwnd ); if (win == null) return; @@ -839,9 +839,9 @@ public void createDesktopView() runOnUiThread( new Runnable() { public void run() { create_desktop_view(); }} ); } - public void createWindow( final int hwnd, final boolean is_desktop, final boolean opengl, final int parent, final int pid ) + public void createWindow( final int hwnd, final boolean is_desktop, final boolean opengl, final int parent ) { - runOnUiThread( new Runnable() { public void run() { create_window( hwnd, is_desktop, opengl, parent, pid ); }} ); + runOnUiThread( new Runnable() { public void run() { create_window( hwnd, is_desktop, opengl, parent ); }} ); } public void destroyWindow( final int hwnd ) @@ -849,9 +849,9 @@ public void destroyWindow( final int hwnd ) runOnUiThread( new Runnable() { public void run() { destroy_window( hwnd ); }} ); } - public void setParent( final int hwnd, final int parent, final int pid ) + public void setParent( final int hwnd, final int parent ) { - runOnUiThread( new Runnable() { public void run() { set_window_parent( hwnd, parent, pid ); }} ); + runOnUiThread( new Runnable() { public void run() { set_window_parent( hwnd, parent ); }} ); } public void setCursor( final int id, final int width, final int height, diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index 570aab818ab..0032224560d 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -143,6 +143,7 @@ struct ioctl_android_dequeueBuffer { struct ioctl_header hdr; HANDLE handle; + DWORD pid; int buffer_id; int generation; }; @@ -209,12 +210,6 @@ static inline BOOL is_in_desktop_process(void) return thread != NULL; } -static inline DWORD current_client_id(void) -{ - DWORD client_id = NtUserGetThreadInfo()->driver_data; - return client_id ? client_id : GetCurrentProcessId(); -} - #ifdef __i386__ /* the Java VM uses %fs/%gs for its own purposes, so we need to wrap the calls */ static WORD orig_fs, java_fs; @@ -561,7 +556,6 @@ static NTSTATUS createWindow_ioctl( void *data, DWORD in_size, DWORD out_size, U jobject object; struct ioctl_android_create_window *res = data; struct native_win_data *win_data; - DWORD pid = current_client_id(); if (in_size < sizeof(*res)) return STATUS_INVALID_PARAMETER; @@ -570,10 +564,10 @@ static NTSTATUS createWindow_ioctl( void *data, DWORD in_size, DWORD out_size, U TRACE( "hwnd %08x opengl %u parent %08x\n", res->hdr.hwnd, res->hdr.opengl, res->parent ); - if (!(object = load_java_method( &method, "createWindow", "(IZZII)V" ))) return STATUS_NOT_SUPPORTED; + if (!(object = load_java_method( &method, "createWindow", "(IZZI)V" ))) return STATUS_NOT_SUPPORTED; wrap_java_call(); - (*jni_env)->CallVoidMethod( jni_env, object, method, res->hdr.hwnd, res->is_desktop, res->hdr.opengl, res->parent, pid ); + (*jni_env)->CallVoidMethod( jni_env, object, method, res->hdr.hwnd, res->is_desktop, res->hdr.opengl, res->parent ); unwrap_java_call(); return STATUS_SUCCESS; } @@ -671,7 +665,7 @@ static NTSTATUS dequeueBuffer_ioctl( void *data, DWORD in_size, DWORD out_size, int sv[2] = { -1, -1 }; HANDLE local = 0; OBJECT_ATTRIBUTES attr = { .Length = sizeof(attr) }; - CLIENT_ID cid = { .UniqueProcess = UlongToHandle( current_client_id() ) }; + CLIENT_ID cid = { .UniqueProcess = UlongToHandle( res->pid ) }; HANDLE process; if (!ahb) @@ -901,7 +895,6 @@ static NTSTATUS setWindowParent_ioctl( void *data, DWORD in_size, DWORD out_size jobject object; struct ioctl_android_set_window_parent *res = data; struct native_win_data *win_data; - DWORD pid = current_client_id(); if (in_size < sizeof(*res)) return STATUS_INVALID_PARAMETER; @@ -909,10 +902,10 @@ static NTSTATUS setWindowParent_ioctl( void *data, DWORD in_size, DWORD out_size TRACE( "hwnd %08x parent %08x\n", res->hdr.hwnd, res->parent ); - if (!(object = load_java_method( &method, "setParent", "(III)V" ))) return STATUS_NOT_SUPPORTED; + if (!(object = load_java_method( &method, "setParent", "(II)V" ))) return STATUS_NOT_SUPPORTED; wrap_java_call(); - (*jni_env)->CallVoidMethod( jni_env, object, method, res->hdr.hwnd, res->parent, pid ); + (*jni_env)->CallVoidMethod( jni_env, object, method, res->hdr.hwnd, res->parent ); unwrap_java_call(); return STATUS_SUCCESS; } @@ -988,8 +981,7 @@ static const ioctl_func ioctl_funcs[] = NTSTATUS android_dispatch_ioctl( void *arg ) { - struct ioctl_params *params = arg; - IRP *irp = params->irp; + IRP *irp = arg; IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); DWORD code = (irpsp->Parameters.DeviceIoControl.IoControlCode - ANDROID_IOCTL(0)) >> 2; @@ -1002,11 +994,9 @@ NTSTATUS android_dispatch_ioctl( void *arg ) if (in_size >= sizeof(*header)) { irp->IoStatus.Information = 0; - NtUserGetThreadInfo()->driver_data = params->client_id; irp->IoStatus.Status = func( irp->AssociatedIrp.SystemBuffer, in_size, irpsp->Parameters.DeviceIoControl.OutputBufferLength, &irp->IoStatus.Information ); - NtUserGetThreadInfo()->driver_data = 0; } else irp->IoStatus.Status = STATUS_INVALID_PARAMETER; } @@ -1105,11 +1095,12 @@ static int dequeueBuffer( struct ANativeWindow *window, struct ANativeWindowBuff res.hdr.hwnd = HandleToLong( win->hwnd ); res.hdr.opengl = win->opengl; + res.pid = GetCurrentProcessId(); res.handle = 0; res.buffer_id = -1; res.generation = 0; - ret = android_ioctl( IOCTL_DEQUEUE_BUFFER, &res, sizeof(res.hdr), &res, &size ); + ret = android_ioctl( IOCTL_DEQUEUE_BUFFER, &res, size, &res, &size ); if (ret) return ret; if (size < sizeof(res)) return -EINVAL; diff --git a/dlls/wineandroid.drv/dllmain.c b/dlls/wineandroid.drv/dllmain.c index d9cd94338a0..7f6d04e83df 100644 --- a/dlls/wineandroid.drv/dllmain.c +++ b/dlls/wineandroid.drv/dllmain.c @@ -37,8 +37,7 @@ static HANDLE stop_event; static NTSTATUS WINAPI ioctl_callback( DEVICE_OBJECT *device, IRP *irp ) { - struct ioctl_params params = { .irp = irp, .client_id = HandleToUlong(PsGetCurrentProcessId()) }; - NTSTATUS status = ANDROID_CALL( dispatch_ioctl, ¶ms ); + NTSTATUS status = ANDROID_CALL( dispatch_ioctl, irp ); IoCompleteRequest( irp, IO_NO_INCREMENT ); return status; } diff --git a/dlls/wineandroid.drv/unixlib.h b/dlls/wineandroid.drv/unixlib.h index 46c59f8f201..39a4df58283 100644 --- a/dlls/wineandroid.drv/unixlib.h +++ b/dlls/wineandroid.drv/unixlib.h @@ -39,14 +39,6 @@ struct init_params }; -/* android_ioctl params */ -struct ioctl_params -{ - struct _IRP *irp; - DWORD client_id; -}; - - /* android_register_window params */ struct register_window_params { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10690
@julliard Hi, just a gentle ping on this PR — would appreciate a review when you have a moment. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10690#note_137089
participants (2)
-
Twaik Yont -
Twaik Yont (@twaik)