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