user32: Fix icon extraction from non-native PE executables.

Alexandre Julliard julliard at winehq.org
Thu Jun 6 07:23:16 CDT 2013


Hans Leidekker <hans at codeweavers.com> writes:

> ---
>  dlls/user32/exticon.c |  202 ++++++++++++++++++++++++++++++++-----------------
>  1 file changed, 133 insertions(+), 69 deletions(-)
>
> diff --git a/dlls/user32/exticon.c b/dlls/user32/exticon.c
> index 5b9d681..e6e97d5 100644
> --- a/dlls/user32/exticon.c
> +++ b/dlls/user32/exticon.c
> @@ -251,6 +251,127 @@ static BYTE * ICO_GetIconDirectory( LPBYTE peimage, LPicoICONDIR* lplpiID, ULONG
>  	return 0;
>  }
>  
> +/* caller must make sure we have a PE image */
> +static BOOL get_nt_header( const BYTE *image, const IMAGE_NT_HEADERS32 **nt32, const IMAGE_NT_HEADERS64 **nt64 )
> +{
> +    const IMAGE_DOS_HEADER *dos = (const IMAGE_DOS_HEADER *)image;
> +    const IMAGE_NT_HEADERS *nt = (const IMAGE_NT_HEADERS *)(image + dos->e_lfanew);
> +
> +    if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
> +    {
> +        *nt32 = (const IMAGE_NT_HEADERS32 *)nt;
> +        *nt64 = NULL;
> +        return TRUE;
> +    }
> +    else if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
> +    {
> +        *nt64 = (const IMAGE_NT_HEADERS64 *)nt;
> +        *nt32 = NULL;
> +        return TRUE;
> +    }
> +    return FALSE;
> +}
> +
> +static const IMAGE_SECTION_HEADER *get_next_section_header( const BYTE *image, WORD *index )
> +{
> +    const IMAGE_NT_HEADERS32 *hdr32;
> +    const IMAGE_NT_HEADERS64 *hdr64;
> +    const IMAGE_SECTION_HEADER *section = NULL;
> +
> +    if (!get_nt_header( image, &hdr32, &hdr64 )) return NULL;
> +    if (hdr32)
> +    {
> +        if (*index >= hdr32->FileHeader.NumberOfSections) return NULL;
> +        section = (const IMAGE_SECTION_HEADER *)((char *)hdr32 + sizeof(DWORD) +
> +                  sizeof(IMAGE_FILE_HEADER) + hdr32->FileHeader.SizeOfOptionalHeader +
> +                  *index * sizeof(IMAGE_SECTION_HEADER));
> +    }
> +    else
> +    {
> +        if (*index >= hdr64->FileHeader.NumberOfSections) return NULL;
> +        section = (const IMAGE_SECTION_HEADER *)((char *)hdr64 + sizeof(DWORD) +
> +                  sizeof(IMAGE_FILE_HEADER) + hdr64->FileHeader.SizeOfOptionalHeader +
> +                  *index * sizeof(IMAGE_SECTION_HEADER));
> +    }
> +    if (section) (*index)++;
> +    return section;
> +}

You probably want to use RtlImageDirectoryEntryToData and friends instead.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list