Piotr Caban : winebus: Reference PDOs added to DEVICE_RELATIONS structure.

Alexandre Julliard julliard at winehq.org
Tue Nov 12 16:56:07 CST 2019


Module: wine
Branch: master
Commit: cc395391ed51e55a8f13150a4eb62f50417d1436
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cc395391ed51e55a8f13150a4eb62f50417d1436

Author: Piotr Caban <piotr at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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**);




More information about the wine-cvs mailing list