Module: wine Branch: master Commit: 3447792a5ad683000bd333d59aa0a10afeab00ec URL: https://gitlab.winehq.org/wine/wine/-/commit/3447792a5ad683000bd333d59aa0a10...
Author: Alexandre Julliard julliard@winehq.org Date: Mon May 20 16:31:34 2024 +0200
msvcrt: Add helpers to abstract RVA accesses to RTTI data.
---
dlls/msvcp90/cxx.h | 40 ++++++++++++++++++++++++++++++++++-- dlls/msvcrt/cpp.c | 54 ++++++++++++++----------------------------------- dlls/msvcrt/cppexcept.h | 2 +- dlls/msvcrt/cxx.h | 40 ++++++++++++++++++++++++++++++++++-- 4 files changed, 92 insertions(+), 44 deletions(-)
diff --git a/dlls/msvcp90/cxx.h b/dlls/msvcp90/cxx.h index a7c7a86a899..c0b43f78256 100644 --- a/dlls/msvcp90/cxx.h +++ b/dlls/msvcp90/cxx.h @@ -16,8 +16,17 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "windef.h" +#include "winternl.h" +#include "rtlsupportapi.h" #include "wine/asm.h"
+#ifndef __x86_64__ +#undef RTTI_USE_RVA +#else +#define RTTI_USE_RVA 1 +#endif + #ifdef _WIN64
#define VTABLE_ADD_FUNC(name) "\t.quad " THISCALL_NAME(name) "\n" @@ -44,7 +53,7 @@
#endif /* _WIN64 */
-#ifndef __x86_64__ +#ifndef RTTI_USE_RVA
#define DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \ static type_info name ## _type_info = { \ @@ -330,7 +339,7 @@ typedef struct int vbase_offset; /* offset of this pointer offset in virtual base class descriptor */ } this_ptr_offsets;
-#ifndef __x86_64__ +#ifndef RTTI_USE_RVA
typedef struct _rtti_base_descriptor { @@ -445,6 +454,33 @@ typedef struct
extern const vtable_ptr type_info_vtable;
+#ifdef RTTI_USE_RVA + +static inline uintptr_t rtti_rva_base( const void *ptr ) +{ + void *base; + return (uintptr_t)RtlPcToFileHeader( (void *)ptr, &base ); +} + +static inline void *rtti_rva( unsigned int rva, uintptr_t base ) +{ + return (void *)(base + rva); +} + +#else + +static inline uintptr_t rtti_rva_base( const void *ptr ) +{ + return 0; +} + +static inline void *rtti_rva( const void *ptr, uintptr_t base ) +{ + return (void *)ptr; +} + +#endif + #define CREATE_TYPE_INFO_VTABLE \ DEFINE_THISCALL_WRAPPER(type_info_vector_dtor,8) \ void * __thiscall type_info_vector_dtor(type_info * _this, unsigned int flags) \ diff --git a/dlls/msvcrt/cpp.c b/dlls/msvcrt/cpp.c index 943f5936a19..b98dca4ee6c 100644 --- a/dlls/msvcrt/cpp.c +++ b/dlls/msvcrt/cpp.c @@ -65,62 +65,38 @@ static inline const rtti_object_locator *get_obj_locator( void *cppobj ) return (const rtti_object_locator *)vtable[-1]; }
-#ifndef __x86_64__ -static void dump_obj_locator( const rtti_object_locator *ptr ) +static uintptr_t get_obj_locator_base( const rtti_object_locator *ptr ) { - int i; - const rtti_object_hierarchy *h = ptr->type_hierarchy; - - TRACE( "%p: sig=%08x base_offset=%08x flags=%08x type=%p %s hierarchy=%p\n", - ptr, ptr->signature, ptr->base_class_offset, ptr->flags, - ptr->type_descriptor, dbgstr_type_info(ptr->type_descriptor), ptr->type_hierarchy ); - TRACE( " hierarchy: sig=%08x attr=%08x len=%d base classes=%p\n", - h->signature, h->attributes, h->array_len, h->base_classes ); - for (i = 0; i < h->array_len; i++) - { - TRACE( " base class %p: num %d off %d,%d,%d attr %08x type %p %s\n", - h->base_classes->bases[i], - h->base_classes->bases[i]->num_base_classes, - h->base_classes->bases[i]->offsets.this_offset, - h->base_classes->bases[i]->offsets.vbase_descr, - h->base_classes->bases[i]->offsets.vbase_offset, - h->base_classes->bases[i]->attributes, - h->base_classes->bases[i]->type_descriptor, - dbgstr_type_info(h->base_classes->bases[i]->type_descriptor) ); - } +#ifdef RTTI_USE_RVA + if (ptr->signature) return (uintptr_t)ptr - ptr->object_locator; +#endif + return rtti_rva_base( ptr ); }
-#else - static void dump_obj_locator( const rtti_object_locator *ptr ) { int i; - char *base = ptr->signature == 0 ? RtlPcToFileHeader((void*)ptr, (void**)&base) : (char*)ptr - ptr->object_locator; - const rtti_object_hierarchy *h = (const rtti_object_hierarchy*)(base + ptr->type_hierarchy); - const type_info *type_descriptor = (const type_info*)(base + ptr->type_descriptor); + uintptr_t base = get_obj_locator_base( ptr ); + const rtti_object_hierarchy *h = rtti_rva( ptr->type_hierarchy, base ); + const type_info *type_descriptor = rtti_rva( ptr->type_descriptor, base );
TRACE( "%p: sig=%08x base_offset=%08x flags=%08x type=%p %s hierarchy=%p\n", ptr, ptr->signature, ptr->base_class_offset, ptr->flags, type_descriptor, dbgstr_type_info(type_descriptor), h ); TRACE( " hierarchy: sig=%08x attr=%08x len=%d base classes=%p\n", - h->signature, h->attributes, h->array_len, base + h->base_classes ); + h->signature, h->attributes, h->array_len, rtti_rva(h->base_classes, base) ); for (i = 0; i < h->array_len; i++) { - const rtti_base_descriptor *bases = (rtti_base_descriptor*)(base + - ((const rtti_base_array*)(base + h->base_classes))->bases[i]); + const rtti_base_array *base_array = rtti_rva( h->base_classes, base ); + const rtti_base_descriptor *bases = rtti_rva( base_array->bases[i], base );
TRACE( " base class %p: num %d off %d,%d,%d attr %08x type %p %s\n", - bases, - bases->num_base_classes, - bases->offsets.this_offset, - bases->offsets.vbase_descr, - bases->offsets.vbase_offset, - bases->attributes, - base + bases->type_descriptor, - dbgstr_type_info((const type_info*)(base + bases->type_descriptor)) ); + bases, bases->num_base_classes, bases->offsets.this_offset, + bases->offsets.vbase_descr, bases->offsets.vbase_offset, bases->attributes, + rtti_rva( bases->type_descriptor, base ), + dbgstr_type_info((const type_info*)(base + bases->type_descriptor)) ); } } -#endif
/****************************************************************** * ??0exception@@QAE@ABQBD@Z (MSVCRT.@) diff --git a/dlls/msvcrt/cppexcept.h b/dlls/msvcrt/cppexcept.h index 48b370d1be6..adde30b6d15 100644 --- a/dlls/msvcrt/cppexcept.h +++ b/dlls/msvcrt/cppexcept.h @@ -28,7 +28,7 @@ #define CXX_FRAME_MAGIC_VC8 0x19930522 #define CXX_EXCEPTION 0xe06d7363
-#ifdef __x86_64__ +#ifdef RTTI_USE_RVA #define CXX_EXCEPTION_PARAMS 4 #else #define CXX_EXCEPTION_PARAMS 3 diff --git a/dlls/msvcrt/cxx.h b/dlls/msvcrt/cxx.h index a7c7a86a899..c0b43f78256 100644 --- a/dlls/msvcrt/cxx.h +++ b/dlls/msvcrt/cxx.h @@ -16,8 +16,17 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "windef.h" +#include "winternl.h" +#include "rtlsupportapi.h" #include "wine/asm.h"
+#ifndef __x86_64__ +#undef RTTI_USE_RVA +#else +#define RTTI_USE_RVA 1 +#endif + #ifdef _WIN64
#define VTABLE_ADD_FUNC(name) "\t.quad " THISCALL_NAME(name) "\n" @@ -44,7 +53,7 @@
#endif /* _WIN64 */
-#ifndef __x86_64__ +#ifndef RTTI_USE_RVA
#define DEFINE_RTTI_BASE(name, base_classes_no, mangled_name) \ static type_info name ## _type_info = { \ @@ -330,7 +339,7 @@ typedef struct int vbase_offset; /* offset of this pointer offset in virtual base class descriptor */ } this_ptr_offsets;
-#ifndef __x86_64__ +#ifndef RTTI_USE_RVA
typedef struct _rtti_base_descriptor { @@ -445,6 +454,33 @@ typedef struct
extern const vtable_ptr type_info_vtable;
+#ifdef RTTI_USE_RVA + +static inline uintptr_t rtti_rva_base( const void *ptr ) +{ + void *base; + return (uintptr_t)RtlPcToFileHeader( (void *)ptr, &base ); +} + +static inline void *rtti_rva( unsigned int rva, uintptr_t base ) +{ + return (void *)(base + rva); +} + +#else + +static inline uintptr_t rtti_rva_base( const void *ptr ) +{ + return 0; +} + +static inline void *rtti_rva( const void *ptr, uintptr_t base ) +{ + return (void *)ptr; +} + +#endif + #define CREATE_TYPE_INFO_VTABLE \ DEFINE_THISCALL_WRAPPER(type_info_vector_dtor,8) \ void * __thiscall type_info_vector_dtor(type_info * _this, unsigned int flags) \