Module: wine Branch: master Commit: cc395391ed51e55a8f13150a4eb62f50417d1436 URL: https://source.winehq.org/git/wine.git/?a=commit;h=cc395391ed51e55a8f13150a4...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Nov 12 19:02:20 2019 +0100
winebus: Reference PDOs added to DEVICE_RELATIONS structure.
Fixes crash caused by 81cda52d153.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/tests/driver.c | 2 -- dlls/winebus.sys/main.c | 19 +++++++++++++++++++ include/ddk/wdm.h | 1 + 3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 67f22a4b2b..a0f63ade79 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -62,8 +62,6 @@ static void *create_caller_thread;
static PETHREAD create_irp_thread;
-void WINAPI ObfReferenceObject( void *obj ); - NTSTATUS WINAPI ZwQueryInformationProcess(HANDLE,PROCESSINFOCLASS,void*,ULONG,ULONG*);
static void kvprintf(const char *format, __ms_va_list ap) diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c index b4599b6889..7b05d4ce84 100644 --- a/dlls/winebus.sys/main.c +++ b/dlls/winebus.sys/main.c @@ -31,6 +31,7 @@ #include "ddk/wdm.h" #include "ddk/hidport.h" #include "ddk/hidtypes.h" +#include "wine/asm.h" #include "wine/debug.h" #include "wine/unicode.h" #include "wine/list.h" @@ -41,6 +42,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(plugplay); WINE_DECLARE_DEBUG_CHANNEL(hid_report);
+#if defined(__i386__) && !defined(_WIN32) + +extern void * WINAPI wrap_fastcall_func1( void *func, const void *a ); +__ASM_STDCALL_FUNC( wrap_fastcall_func1, 8, + "popl %ecx\n\t" + "popl %eax\n\t" + "xchgl (%esp),%ecx\n\t" + "jmp *%eax" ); + +#define call_fastcall_func1(func,a) wrap_fastcall_func1(func,a) + +#else + +#define call_fastcall_func1(func,a) func(a) + +#endif + struct product_desc { WORD vid; @@ -381,6 +399,7 @@ static NTSTATUS build_device_relations(DEVICE_RELATIONS **devices) LIST_FOR_EACH_ENTRY(ptr, &pnp_devset, struct pnp_device, entry) { (*devices)->Objects[i] = ptr->device; + call_fastcall_func1(ObfReferenceObject, ptr->device); i++; } LeaveCriticalSection(&device_list_cs); diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 21c9539c0a..a092216b82 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1665,6 +1665,7 @@ static inline void *MmGetSystemAddressForMdlSafe(MDL *mdl, ULONG priority) return MmMapLockedPagesSpecifyCache(mdl, KernelMode, MmCached, NULL, FALSE, priority); }
+void FASTCALL ObfReferenceObject(void*); void WINAPI ObDereferenceObject(void*); USHORT WINAPI ObGetFilterVersion(void); NTSTATUS WINAPI ObRegisterCallbacks(POB_CALLBACK_REGISTRATION*, void**);