[PATCH v4] combase: Reorder hstring_private elements.

Huw Davies huw at codeweavers.com
Wed Jan 12 01:53:39 CST 2022


On Mon, Dec 27, 2021 at 03:29:30PM +0100, Bernhard Kölbl wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51017
> 
> Debugging sessions and the official WinRT SDK show, that hstrings
> are aligned differently in memory, than they are currently used in Wine.
> E.g. The string buffer is stored at the end of hstring_private.
> Also if a string reference is created with WindowsCreateStringReference,
> a seperate pointer is used to point at the string-source.
> 
> Signed-off-by: Bernhard Kölbl <besentv at gmail.com>
> ---
> v4: Remove leftover debugging TRACE and minor style changes.
> v3: Add nested hstring_header struct to hstring_private and add a test for both.
> v2: I was mistaken about no reference counting being used.
> ---
>  dlls/combase/string.c       | 126 ++++++++++++++++++++++--------------
>  dlls/combase/tests/string.c |  73 ++++++++++++++++++++-
>  2 files changed, 150 insertions(+), 49 deletions(-)
> 
> diff --git a/dlls/combase/string.c b/dlls/combase/string.c
> index 2092e4360a3..1677915c244 100644
> --- a/dlls/combase/string.c
> +++ b/dlls/combase/string.c
> @@ -26,44 +26,58 @@
>  
>  WINE_DEFAULT_DEBUG_CHANNEL(winstring);
>  
> -struct hstring_private
> +#define HSTRING_REFERENCE_FLAG 1
> +
> +struct hstring_header
>  {
> -    LPWSTR buffer;
> +    UINT32 flags;
>      UINT32 length;
> -    BOOL   reference;
> -    LONG   refcount;
> +    UINT32 padding1;
> +    UINT32 padding2;
> +    const WCHAR *ptr;
>  };
>  
> +struct hstring_private
> +{
> +    struct hstring_header header;
> +    LONG refcount;
> +    WCHAR buffer[1];
> +};


There's quite a lot going on with this patch and it seems possible to
split it up.

I'd suggest initially adding a hstring_header that contains just the
flags (as well as necessary padding) and then move the elements
over on at a time.

>  static BOOL alloc_string(UINT32 len, HSTRING *out)
>  {
>      struct hstring_private *priv;
> -    priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv) + (len + 1) * sizeof(*priv->buffer));
> +    priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv) + len * sizeof(*priv->buffer));

                                             offsetof(struct hstring_private, buffer[len])

Huw.



More information about the wine-devel mailing list