Zebediah Figura : rpcrt4: Write parameters for fixed structs.

Alexandre Julliard julliard at winehq.org
Mon Apr 1 16:32:03 CDT 2019


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Sun Mar 31 23:31:18 2019 -0500

rpcrt4: Write parameters for fixed structs.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/rpcrt4/ndr_typelib.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/dlls/rpcrt4/ndr_typelib.c b/dlls/rpcrt4/ndr_typelib.c
index 8f87693..3d3d42b 100644
--- a/dlls/rpcrt4/ndr_typelib.c
+++ b/dlls/rpcrt4/ndr_typelib.c
@@ -246,6 +246,7 @@ static unsigned char get_struct_member_fc(ITypeInfo *typeinfo, TYPEDESC *tdesc)
         return (sizeof(void *) == 4) ? FC_PSTRUCT : FC_BOGUS_STRUCT;
     case VT_CY:
         return FC_STRUCT;
+    case VT_VARIANT:
     case VT_UNKNOWN:
     case VT_DISPATCH:
         return FC_BOGUS_STRUCT;
@@ -358,7 +359,12 @@ static size_t write_struct_tfs(ITypeInfo *typeinfo, unsigned char *str,
         size_t *len, TYPEATTR *attr)
 {
     unsigned char fc = get_struct_fc(typeinfo, attr);
+    unsigned int struct_offset = 0;
+    unsigned char basetype;
     size_t off = *len;
+    TYPEDESC *tdesc;
+    VARDESC *desc;
+    WORD i;
 
     if (fc != FC_STRUCT)
         FIXME("fc %02x not implemented\n", fc);
@@ -366,7 +372,30 @@ static size_t write_struct_tfs(ITypeInfo *typeinfo, unsigned char *str,
     WRITE_CHAR (str, *len, FC_STRUCT);
     WRITE_CHAR (str, *len, attr->cbAlignment - 1);
     WRITE_SHORT(str, *len, attr->cbSizeInstance);
-    WRITE_CHAR (str, *len, FC_PAD);
+
+    for (i = 0; i < attr->cVars; i++)
+    {
+        ITypeInfo_GetVarDesc(typeinfo, i, &desc);
+        tdesc = &desc->elemdescVar.tdesc;
+
+        /* This may not match the intended alignment, but we don't have enough
+         * information to determine that. This should always give the correct
+         * layout. */
+        if ((struct_offset & 7) && !(desc->oInst & 7))
+            WRITE_CHAR(str, *len, FC_ALIGNM8);
+        else if ((struct_offset & 3) && !(desc->oInst & 3))
+            WRITE_CHAR(str, *len, FC_ALIGNM4);
+        else if ((struct_offset & 1) && !(desc->oInst & 1))
+            WRITE_CHAR(str, *len, FC_ALIGNM2);
+        struct_offset = desc->oInst + type_memsize(typeinfo, tdesc);
+
+        if ((basetype = get_basetype(typeinfo, tdesc)))
+            WRITE_CHAR(str, *len, basetype);
+
+        ITypeInfo_ReleaseVarDesc(typeinfo, desc);
+    }
+    if (!(*len & 1))
+        WRITE_CHAR (str, *len, FC_PAD);
     WRITE_CHAR (str, *len, FC_END);
 
     return off;




More information about the wine-cvs mailing list