1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** GUIX Component                                                        */
16 /**                                                                       */
17 /**   Binres Loader Management (Binres Loader)                            */
18 /**                                                                       */
19 /**************************************************************************/
20 
21 #define GX_SOURCE_CODE
22 
23 
24 /* Include necessary system files.  */
25 
26 #include "gx_api.h"
27 #include "gx_binres_loader.h"
28 #include "gx_utility.h"
29 
30 /**************************************************************************/
31 /*                                                                        */
32 /*  FUNCTION                                               RELEASE        */
33 /*                                                                        */
34 /*    _gx_binres_standalone_resource_seek                 PORTABLE C      */
35 /*                                                           6.3.0        */
36 /*  AUTHOR                                                                */
37 /*                                                                        */
38 /*    Ting Zhu, Microsoft Corporation                                     */
39 /*                                                                        */
40 /*  DESCRIPTION                                                           */
41 /*                                                                        */
42 /*    This function locates the resource data in the binary data memory.  */
43 /*                                                                        */
44 /*  INPUT                                                                 */
45 /*                                                                        */
46 /*    info                                  Binary resource control block */
47 /*    res_index                             The index of the resource to  */
48 /*                                            be located                  */
49 /*                                                                        */
50 /*  OUTPUT                                                                */
51 /*                                                                        */
52 /*    Status                                Completion status             */
53 /*                                                                        */
54 /*  CALLS                                                                 */
55 /*                                                                        */
56 /*    None                                                                */
57 /*                                                                        */
58 /*  CALLED BY                                                             */
59 /*                                                                        */
60 /*    GUIX Internal Code                                                  */
61 /*                                                                        */
62 /*  RELEASE HISTORY                                                       */
63 /*                                                                        */
64 /*    DATE              NAME                      DESCRIPTION             */
65 /*                                                                        */
66 /*  10-31-2023     Ting Zhu                 Initial Version 6.3.0         */
67 /*                                                                        */
68 /**************************************************************************/
_gx_binres_standalone_resource_seek(GX_BINRES_DATA_INFO * info,UINT res_index)69 UINT _gx_binres_standalone_resource_seek(GX_BINRES_DATA_INFO *info, UINT res_index)
70 {
71 USHORT type;
72 ULONG  count;
73 
74     GX_BINRES_READ_USHORT(type, info -> gx_binres_root_address + info -> gx_binres_read_offset);
75     info -> gx_binres_read_offset += sizeof(USHORT);
76 
77     if (type != GX_RESOURCE_TYPE_BINRES_STANDALONE)
78     {
79         return GX_INVALID_FORMAT;
80     }
81 
82     /* Skip 2 bytes version.  */
83     info -> gx_binres_read_offset += sizeof(USHORT);
84 
85     GX_BINRES_READ_ULONG(count, info -> gx_binres_root_address + info -> gx_binres_read_offset);
86     info -> gx_binres_read_offset += sizeof(ULONG);
87 
88     if ((USHORT)res_index >= count)
89     {
90         return GX_NOT_FOUND;
91     }
92 
93     if (count > 1)
94     {
95         GX_BINRES_READ_ULONG(info -> gx_binres_read_offset, info -> gx_binres_root_address + info -> gx_binres_read_offset + sizeof(ULONG) * res_index);
96     }
97 
98     return GX_SUCCESS;
99 }
100 
101 /**************************************************************************/
102 /*                                                                        */
103 /*  FUNCTION                                               RELEASE        */
104 /*                                                                        */
105 /*    _gx_binres_pixelmap_load                            PORTABLE C      */
106 /*                                                           6.3.0        */
107 /*  AUTHOR                                                                */
108 /*                                                                        */
109 /*    Ting Zhu, Microsoft Corporation                                     */
110 /*                                                                        */
111 /*  DESCRIPTION                                                           */
112 /*                                                                        */
113 /*    This service loads a pixelmap from a resource data memory.          */
114 /*                                                                        */
115 /*  INPUT                                                                 */
116 /*                                                                        */
117 /*    root_address                          Pointer to the binary data    */
118 /*                                            memory                      */
119 /*    map_index                             Resource index of the pixelmap*/
120 /*                                            to be loaded                */
121 /*    pixelmap                              Pointer to the returned       */
122 /*                                            pixelmap                    */
123 /*                                                                        */
124 /*  OUTPUT                                                                */
125 /*                                                                        */
126 /*    Status                                Completion status             */
127 /*                                                                        */
128 /*  CALLS                                                                 */
129 /*                                                                        */
130 /*    _gx_binres_standalone_resource_seek  Locate the resource data       */
131 /*    _gx_binres_one_pixelmap_load         Load one pixelmap              */
132 /*                                                                        */
133 /*  CALLED BY                                                             */
134 /*                                                                        */
135 /*    Application Code                                                    */
136 /*                                                                        */
137 /*  RELEASE HISTORY                                                       */
138 /*                                                                        */
139 /*    DATE              NAME                      DESCRIPTION             */
140 /*                                                                        */
141 /*  10-31-2023     Ting Zhu                 Initial Version 6.3.0         */
142 /*                                                                        */
143 /**************************************************************************/
_gx_binres_pixelmap_load(GX_UBYTE * root_address,UINT map_index,GX_PIXELMAP * pixelmap)144 UINT _gx_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap)
145 {
146 UINT                status = GX_SUCCESS;
147 GX_BINRES_DATA_INFO info;
148 
149     /* file format
150      +--------+
151      |        | <-- represents one bytes
152      +--------+
153 
154      |+========+
155      |        | <-- represents a variable number of bytes
156      |+========+
157 
158      |+--------+--------+--------+--------+
159      |    magic number  | resource count  |
160      |+--------+--------+--------+--------+
161      |+--------+--------+--------+--------+
162      |         resource offset            |
163      |+--------+--------+--------+--------+
164      |+--------+--------+--------+--------+
165      |              ...                   |
166      |+--------+--------+--------+--------+
167      |+===================================+
168      |         resource data              |
169      |+===================================+
170      */
171 
172     memset(&info, 0, sizeof(GX_BINRES_DATA_INFO));
173 
174     info.gx_binres_root_address = (GX_UBYTE *)root_address;
175     info.gx_binres_buffer = (GX_UBYTE *)pixelmap;
176     info.gx_binres_buffer_size = sizeof(GX_PIXELMAP);
177 
178     status = _gx_binres_standalone_resource_seek(&info, map_index);
179 
180     if (status == GX_SUCCESS)
181     {
182         status = _gx_binres_one_pixelmap_load(&info, GX_NULL, GX_NULL);
183     }
184 
185     return status;
186 }
187 
188