Coverage Report

Created: 2026-02-26 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-pefile-struct.c
Line
Count
Source
1
/*
2
 * This file is auto-generated, do not modify!
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include <glib.h>
10
11
#include "fu-pefile-struct.h"
12
#include "fu-byte-array.h"
13
#include "fu-bytes.h"
14
#include "fu-mem-private.h"
15
#include "fu-string.h"
16
17
#ifdef G_LOG_DOMAIN
18
  #undef G_LOG_DOMAIN
19
#endif
20
0
#define G_LOG_DOMAIN "FuStruct"
21
22
/**
23
 * fu_pe_coff_machine_to_string:
24
 * @val: value, e.g. %FU_PE_COFF_MACHINE_ALPHA
25
 *
26
 * Converts an enumerated value to a string.
27
 *
28
 * Returns: identifier string
29
 **/
30
static const gchar *
31
fu_pe_coff_machine_to_string(FuPeCoffMachine val)
32
0
{
33
0
    if (val == FU_PE_COFF_MACHINE_ALPHA)
34
0
        return "alpha";
35
0
    if (val == FU_PE_COFF_MACHINE_ALPHA64)
36
0
        return "alpha64";
37
0
    if (val == FU_PE_COFF_MACHINE_AM33)
38
0
        return "am33";
39
0
    if (val == FU_PE_COFF_MACHINE_AMD64)
40
0
        return "amd64";
41
0
    if (val == FU_PE_COFF_MACHINE_ARM)
42
0
        return "arm";
43
0
    if (val == FU_PE_COFF_MACHINE_ARM64)
44
0
        return "arm64";
45
0
    if (val == FU_PE_COFF_MACHINE_ARMNT)
46
0
        return "armnt";
47
0
    if (val == FU_PE_COFF_MACHINE_EBC)
48
0
        return "ebc";
49
0
    if (val == FU_PE_COFF_MACHINE_I386)
50
0
        return "i386";
51
0
    if (val == FU_PE_COFF_MACHINE_IA64)
52
0
        return "ia64";
53
0
    if (val == FU_PE_COFF_MACHINE_LOONGARCH32)
54
0
        return "loongarch32";
55
0
    if (val == FU_PE_COFF_MACHINE_LOONGARCH64)
56
0
        return "loongarch64";
57
0
    if (val == FU_PE_COFF_MACHINE_M32R)
58
0
        return "m32r";
59
0
    if (val == FU_PE_COFF_MACHINE_MIPS16)
60
0
        return "mips16";
61
0
    if (val == FU_PE_COFF_MACHINE_MIPSFPU)
62
0
        return "mipsfpu";
63
0
    if (val == FU_PE_COFF_MACHINE_MIPSFPU16)
64
0
        return "mipsfpu16";
65
0
    if (val == FU_PE_COFF_MACHINE_POWERPC)
66
0
        return "powerpc";
67
0
    if (val == FU_PE_COFF_MACHINE_POWERPCFP)
68
0
        return "powerpcfp";
69
0
    if (val == FU_PE_COFF_MACHINE_R4000)
70
0
        return "r4000";
71
0
    if (val == FU_PE_COFF_MACHINE_RISCV32)
72
0
        return "riscv32";
73
0
    if (val == FU_PE_COFF_MACHINE_RISCV64)
74
0
        return "riscv64";
75
0
    if (val == FU_PE_COFF_MACHINE_RISCV128)
76
0
        return "riscv128";
77
0
    if (val == FU_PE_COFF_MACHINE_SH3)
78
0
        return "sh3";
79
0
    if (val == FU_PE_COFF_MACHINE_SH3DSP)
80
0
        return "sh3dsp";
81
0
    if (val == FU_PE_COFF_MACHINE_SH4)
82
0
        return "sh4";
83
0
    if (val == FU_PE_COFF_MACHINE_SH5)
84
0
        return "sh5";
85
0
    if (val == FU_PE_COFF_MACHINE_THUMB)
86
0
        return "thumb";
87
0
    if (val == FU_PE_COFF_MACHINE_WCEMIPSV2)
88
0
        return "wcemipsv2";
89
0
    return NULL;
90
0
}
91
92
/**
93
 * fu_pe_coff_magic_to_string:
94
 * @val: value, e.g. %FU_PE_COFF_MAGIC_PE32_PLUS
95
 *
96
 * Converts an enumerated value to a string.
97
 *
98
 * Returns: identifier string
99
 **/
100
static const gchar *
101
fu_pe_coff_magic_to_string(FuPeCoffMagic val)
102
0
{
103
0
    if (val == FU_PE_COFF_MAGIC_PE32)
104
0
        return "pe32";
105
0
    if (val == FU_PE_COFF_MAGIC_PE32_PLUS)
106
0
        return "pe32-plus";
107
0
    return NULL;
108
0
}
109
110
/**
111
 * fu_coff_subsystem_to_string:
112
 * @val: value, e.g. %FU_COFF_SUBSYSTEM_NATIVE
113
 *
114
 * Converts an enumerated value to a string.
115
 *
116
 * Returns: identifier string
117
 **/
118
const gchar *
119
fu_coff_subsystem_to_string(FuCoffSubsystem val)
120
0
{
121
0
    if (val == FU_COFF_SUBSYSTEM_NATIVE)
122
0
        return "native";
123
0
    if (val == FU_COFF_SUBSYSTEM_WINDOWS_GUI)
124
0
        return "windows-gui";
125
0
    if (val == FU_COFF_SUBSYSTEM_WINDOWS_CUI)
126
0
        return "windows-cui";
127
0
    if (val == FU_COFF_SUBSYSTEM_OS2_CUI)
128
0
        return "os2-cui";
129
0
    if (val == FU_COFF_SUBSYSTEM_POSIX_CUI)
130
0
        return "posix-cui";
131
0
    if (val == FU_COFF_SUBSYSTEM_NATIVE_WINDOWS)
132
0
        return "native-windows";
133
0
    if (val == FU_COFF_SUBSYSTEM_WINDOWS_CE_GUI)
134
0
        return "windows-ce-gui";
135
0
    if (val == FU_COFF_SUBSYSTEM_EFI_APPLICATION)
136
0
        return "efi-application";
137
0
    if (val == FU_COFF_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER)
138
0
        return "efi-boot-service-driver";
139
0
    if (val == FU_COFF_SUBSYSTEM_EFI_RUNTIME_DRIVER)
140
0
        return "efi-runtime-driver";
141
0
    if (val == FU_COFF_SUBSYSTEM_EFI_ROM)
142
0
        return "efi-rom";
143
0
    if (val == FU_COFF_SUBSYSTEM_XBOX)
144
0
        return "xbox";
145
0
    if (val == FU_COFF_SUBSYSTEM_WINDOWS_BOOT_APPLICATION)
146
0
        return "windows-boot-application";
147
0
    return NULL;
148
0
}
149
/**
150
 * fu_struct_pe_dos_header_ref: (skip):
151
 **/
152
FuStructPeDosHeader *
153
fu_struct_pe_dos_header_ref(FuStructPeDosHeader *st)
154
0
{
155
0
    g_return_val_if_fail(st != NULL, NULL);
156
0
    st->refcount++;
157
0
    return st;
158
0
}
159
/**
160
 * fu_struct_pe_dos_header_unref: (skip):
161
 **/
162
void
163
fu_struct_pe_dos_header_unref(FuStructPeDosHeader *st)
164
10.0k
{
165
10.0k
    g_return_if_fail(st != NULL);
166
10.0k
    if (st->refcount == 0) {
167
0
        g_critical("FuStructPeDosHeader refcount already zero");
168
0
        return;
169
0
    }
170
10.0k
    if (--st->refcount > 0)
171
0
        return;
172
10.0k
    if (st->buf != NULL)
173
9.89k
        g_byte_array_unref(st->buf);
174
10.0k
    g_free(st);
175
10.0k
}
176
/**
177
 * fu_struct_pe_dos_header_new_internal: (skip):
178
 **/
179
static FuStructPeDosHeader *
180
fu_struct_pe_dos_header_new_internal(void)
181
10.0k
{
182
10.0k
    FuStructPeDosHeader *st = g_new0(FuStructPeDosHeader, 1);
183
10.0k
    st->refcount = 1;
184
10.0k
    return st;
185
10.0k
}
186
187
/* getters */
188
/**
189
 * fu_struct_pe_dos_header_get_magic: (skip):
190
 **/
191
static guint16
192
fu_struct_pe_dos_header_get_magic(const FuStructPeDosHeader *st)
193
9.70k
{
194
9.70k
    g_return_val_if_fail(st != NULL, 0x0);
195
9.70k
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
196
9.70k
}
197
/**
198
 * fu_struct_pe_dos_header_get_cblp: (skip):
199
 **/
200
guint16
201
fu_struct_pe_dos_header_get_cblp(const FuStructPeDosHeader *st)
202
0
{
203
0
    g_return_val_if_fail(st != NULL, 0x0);
204
0
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
205
0
}
206
/**
207
 * fu_struct_pe_dos_header_get_cp: (skip):
208
 **/
209
guint16
210
fu_struct_pe_dos_header_get_cp(const FuStructPeDosHeader *st)
211
0
{
212
0
    g_return_val_if_fail(st != NULL, 0x0);
213
0
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
214
0
}
215
/**
216
 * fu_struct_pe_dos_header_get_crlc: (skip):
217
 **/
218
guint16
219
fu_struct_pe_dos_header_get_crlc(const FuStructPeDosHeader *st)
220
0
{
221
0
    g_return_val_if_fail(st != NULL, 0x0);
222
0
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
223
0
}
224
/**
225
 * fu_struct_pe_dos_header_get_cparhdr: (skip):
226
 **/
227
guint16
228
fu_struct_pe_dos_header_get_cparhdr(const FuStructPeDosHeader *st)
229
0
{
230
0
    g_return_val_if_fail(st != NULL, 0x0);
231
0
    return fu_memread_uint16(st->buf->data + 8, G_LITTLE_ENDIAN);
232
0
}
233
/**
234
 * fu_struct_pe_dos_header_get_minalloc: (skip):
235
 **/
236
guint16
237
fu_struct_pe_dos_header_get_minalloc(const FuStructPeDosHeader *st)
238
0
{
239
0
    g_return_val_if_fail(st != NULL, 0x0);
240
0
    return fu_memread_uint16(st->buf->data + 10, G_LITTLE_ENDIAN);
241
0
}
242
/**
243
 * fu_struct_pe_dos_header_get_maxalloc: (skip):
244
 **/
245
guint16
246
fu_struct_pe_dos_header_get_maxalloc(const FuStructPeDosHeader *st)
247
0
{
248
0
    g_return_val_if_fail(st != NULL, 0x0);
249
0
    return fu_memread_uint16(st->buf->data + 12, G_LITTLE_ENDIAN);
250
0
}
251
/**
252
 * fu_struct_pe_dos_header_get_sp: (skip):
253
 **/
254
guint16
255
fu_struct_pe_dos_header_get_sp(const FuStructPeDosHeader *st)
256
0
{
257
0
    g_return_val_if_fail(st != NULL, 0x0);
258
0
    return fu_memread_uint16(st->buf->data + 16, G_LITTLE_ENDIAN);
259
0
}
260
/**
261
 * fu_struct_pe_dos_header_get_lfarlc: (skip):
262
 **/
263
guint16
264
fu_struct_pe_dos_header_get_lfarlc(const FuStructPeDosHeader *st)
265
0
{
266
0
    g_return_val_if_fail(st != NULL, 0x0);
267
0
    return fu_memread_uint16(st->buf->data + 24, G_LITTLE_ENDIAN);
268
0
}
269
/**
270
 * fu_struct_pe_dos_header_get_lfanew: (skip):
271
 **/
272
guint32
273
fu_struct_pe_dos_header_get_lfanew(const FuStructPeDosHeader *st)
274
4.82k
{
275
4.82k
    g_return_val_if_fail(st != NULL, 0x0);
276
4.82k
    return fu_memread_uint32(st->buf->data + 60, G_LITTLE_ENDIAN);
277
4.82k
}
278
279
/* setters */
280
/**
281
 * fu_struct_pe_dos_header_set_magic: (skip):
282
 **/
283
static void
284
fu_struct_pe_dos_header_set_magic(FuStructPeDosHeader *st, guint16 value)
285
356
{
286
356
    g_return_if_fail(st != NULL);
287
356
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
288
356
}
289
/**
290
 * fu_struct_pe_dos_header_set_cblp: (skip):
291
 **/
292
void
293
fu_struct_pe_dos_header_set_cblp(FuStructPeDosHeader *st, guint16 value)
294
356
{
295
356
    g_return_if_fail(st != NULL);
296
356
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
297
356
}
298
/**
299
 * fu_struct_pe_dos_header_set_cp: (skip):
300
 **/
301
void
302
fu_struct_pe_dos_header_set_cp(FuStructPeDosHeader *st, guint16 value)
303
356
{
304
356
    g_return_if_fail(st != NULL);
305
356
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
306
356
}
307
/**
308
 * fu_struct_pe_dos_header_set_crlc: (skip):
309
 **/
310
void
311
fu_struct_pe_dos_header_set_crlc(FuStructPeDosHeader *st, guint16 value)
312
0
{
313
0
    g_return_if_fail(st != NULL);
314
0
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
315
0
}
316
/**
317
 * fu_struct_pe_dos_header_set_cparhdr: (skip):
318
 **/
319
void
320
fu_struct_pe_dos_header_set_cparhdr(FuStructPeDosHeader *st, guint16 value)
321
356
{
322
356
    g_return_if_fail(st != NULL);
323
356
    fu_memwrite_uint16(st->buf->data + 8, value, G_LITTLE_ENDIAN);
324
356
}
325
/**
326
 * fu_struct_pe_dos_header_set_minalloc: (skip):
327
 **/
328
void
329
fu_struct_pe_dos_header_set_minalloc(FuStructPeDosHeader *st, guint16 value)
330
0
{
331
0
    g_return_if_fail(st != NULL);
332
0
    fu_memwrite_uint16(st->buf->data + 10, value, G_LITTLE_ENDIAN);
333
0
}
334
/**
335
 * fu_struct_pe_dos_header_set_maxalloc: (skip):
336
 **/
337
void
338
fu_struct_pe_dos_header_set_maxalloc(FuStructPeDosHeader *st, guint16 value)
339
356
{
340
356
    g_return_if_fail(st != NULL);
341
356
    fu_memwrite_uint16(st->buf->data + 12, value, G_LITTLE_ENDIAN);
342
356
}
343
/**
344
 * fu_struct_pe_dos_header_set_sp: (skip):
345
 **/
346
void
347
fu_struct_pe_dos_header_set_sp(FuStructPeDosHeader *st, guint16 value)
348
356
{
349
356
    g_return_if_fail(st != NULL);
350
356
    fu_memwrite_uint16(st->buf->data + 16, value, G_LITTLE_ENDIAN);
351
356
}
352
/**
353
 * fu_struct_pe_dos_header_set_lfarlc: (skip):
354
 **/
355
void
356
fu_struct_pe_dos_header_set_lfarlc(FuStructPeDosHeader *st, guint16 value)
357
356
{
358
356
    g_return_if_fail(st != NULL);
359
356
    fu_memwrite_uint16(st->buf->data + 24, value, G_LITTLE_ENDIAN);
360
356
}
361
/**
362
 * fu_struct_pe_dos_header_set_lfanew: (skip):
363
 **/
364
void
365
fu_struct_pe_dos_header_set_lfanew(FuStructPeDosHeader *st, guint32 value)
366
356
{
367
356
    g_return_if_fail(st != NULL);
368
356
    fu_memwrite_uint32(st->buf->data + 60, value, G_LITTLE_ENDIAN);
369
356
}
370
/**
371
 * fu_struct_pe_dos_header_new: (skip):
372
 **/
373
FuStructPeDosHeader *
374
fu_struct_pe_dos_header_new(void)
375
356
{
376
356
    FuStructPeDosHeader *st = fu_struct_pe_dos_header_new_internal();
377
356
    st->buf = g_byte_array_sized_new(128);
378
356
    fu_byte_array_set_size(st->buf, 128, 0x0);
379
356
    fu_struct_pe_dos_header_set_magic(st, 0x5A4D);
380
356
    fu_struct_pe_dos_header_set_cblp(st, 0x90);
381
356
    fu_struct_pe_dos_header_set_cp(st, 0x3);
382
356
    fu_struct_pe_dos_header_set_cparhdr(st, 0x4);
383
356
    fu_struct_pe_dos_header_set_maxalloc(st, 0xFFFF);
384
356
    fu_struct_pe_dos_header_set_sp(st, 0xB8);
385
356
    fu_struct_pe_dos_header_set_lfarlc(st, 0x40);
386
356
    fu_struct_pe_dos_header_set_lfanew(st, 0x80);
387
356
    return st;
388
356
}
389
/**
390
 * fu_struct_pe_dos_header_to_string: (skip):
391
 **/
392
static gchar *
393
fu_struct_pe_dos_header_to_string(const FuStructPeDosHeader *st)
394
0
{
395
0
    g_autoptr(GString) str = g_string_new("FuStructPeDosHeader:\n");
396
0
    g_return_val_if_fail(st != NULL, NULL);
397
0
    g_string_append_printf(str, "  magic: 0x%x\n",
398
0
                           (guint) fu_struct_pe_dos_header_get_magic(st));
399
0
    g_string_append_printf(str, "  cblp: 0x%x\n",
400
0
                           (guint) fu_struct_pe_dos_header_get_cblp(st));
401
0
    g_string_append_printf(str, "  cp: 0x%x\n",
402
0
                           (guint) fu_struct_pe_dos_header_get_cp(st));
403
0
    g_string_append_printf(str, "  crlc: 0x%x\n",
404
0
                           (guint) fu_struct_pe_dos_header_get_crlc(st));
405
0
    g_string_append_printf(str, "  cparhdr: 0x%x\n",
406
0
                           (guint) fu_struct_pe_dos_header_get_cparhdr(st));
407
0
    g_string_append_printf(str, "  minalloc: 0x%x\n",
408
0
                           (guint) fu_struct_pe_dos_header_get_minalloc(st));
409
0
    g_string_append_printf(str, "  maxalloc: 0x%x\n",
410
0
                           (guint) fu_struct_pe_dos_header_get_maxalloc(st));
411
0
    g_string_append_printf(str, "  sp: 0x%x\n",
412
0
                           (guint) fu_struct_pe_dos_header_get_sp(st));
413
0
    g_string_append_printf(str, "  lfarlc: 0x%x\n",
414
0
                           (guint) fu_struct_pe_dos_header_get_lfarlc(st));
415
0
    g_string_append_printf(str, "  lfanew: 0x%x\n",
416
0
                           (guint) fu_struct_pe_dos_header_get_lfanew(st));
417
0
    if (str->len > 0)
418
0
        g_string_set_size(str, str->len - 1);
419
0
    return g_string_free(g_steal_pointer(&str), FALSE);
420
0
}
421
static gboolean
422
fu_struct_pe_dos_header_validate_internal(FuStructPeDosHeader *st, GError **error)
423
9.68k
{
424
9.68k
    g_return_val_if_fail(st != NULL, FALSE);
425
9.68k
    if (fu_struct_pe_dos_header_get_magic(st) != 0x5A4D) {
426
26
        g_set_error(error,
427
26
                    FWUPD_ERROR,
428
26
                    FWUPD_ERROR_INVALID_DATA,
429
26
                    "constant FuStructPeDosHeader.magic was not valid, "
430
26
                    "expected 0x%x and got 0x%x",
431
26
                    (guint) 0x5A4D,
432
26
                    (guint) fu_struct_pe_dos_header_get_magic(st));
433
26
        return FALSE;
434
26
    }
435
9.65k
    return TRUE;
436
9.68k
}
437
/**
438
 * fu_struct_pe_dos_header_validate_stream: (skip):
439
 **/
440
gboolean
441
fu_struct_pe_dos_header_validate_stream(GInputStream *stream, gsize offset, GError **error)
442
4.87k
{
443
4.87k
    g_autoptr(FuStructPeDosHeader) st = fu_struct_pe_dos_header_new_internal();
444
4.87k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
445
4.87k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
446
4.87k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 128, NULL, error);
447
4.87k
    if (st->buf == NULL) {
448
0
        g_prefix_error(error, "FuStructPeDosHeader failed read of 0x%x: ", (guint) 128);
449
0
        return FALSE;
450
0
    }
451
4.87k
    if (st->buf->len != 128) {
452
25
        g_set_error(error,
453
25
                    FWUPD_ERROR,
454
25
                    FWUPD_ERROR_INVALID_DATA,
455
25
                    "FuStructPeDosHeader requested 0x%x and got 0x%x",
456
25
                    (guint) 128,
457
25
                    (guint) st->buf->len);
458
25
        return FALSE;
459
25
    }
460
4.85k
    return fu_struct_pe_dos_header_validate_internal(st, error);
461
4.87k
}
462
static gboolean
463
fu_struct_pe_dos_header_parse_internal(FuStructPeDosHeader *st, GError **error)
464
4.82k
{
465
4.82k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
466
0
        g_autofree gchar *str = fu_struct_pe_dos_header_to_string(st);
467
0
        g_debug("%s", str);
468
0
    }
469
4.82k
    if (!fu_struct_pe_dos_header_validate_internal(st, error))
470
0
        return FALSE;
471
4.82k
    return TRUE;
472
4.82k
}
473
/**
474
 * fu_struct_pe_dos_header_parse_stream: (skip):
475
 **/
476
FuStructPeDosHeader *
477
fu_struct_pe_dos_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
478
4.82k
{
479
4.82k
    g_autoptr(FuStructPeDosHeader) st = fu_struct_pe_dos_header_new_internal();
480
4.82k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 128, NULL, error);
481
4.82k
    if (st->buf == NULL) {
482
0
        g_prefix_error(error, "FuStructPeDosHeader failed read of 0x%x: ", (guint) 128);
483
0
        return NULL;
484
0
    }
485
4.82k
    if (st->buf->len != 128) {
486
0
        g_set_error(error,
487
0
                    FWUPD_ERROR,
488
0
                    FWUPD_ERROR_INVALID_DATA,
489
0
                    "FuStructPeDosHeader requested 0x%x and got 0x%x",
490
0
                    (guint) 128,
491
0
                    (guint) st->buf->len);
492
0
        return NULL;
493
0
    }
494
4.82k
    if (!fu_struct_pe_dos_header_parse_internal(st, error))
495
0
        return NULL;
496
4.82k
    return g_steal_pointer(&st);
497
4.82k
}
498
/**
499
 * fu_struct_pe_coff_file_header_ref: (skip):
500
 **/
501
FuStructPeCoffFileHeader *
502
fu_struct_pe_coff_file_header_ref(FuStructPeCoffFileHeader *st)
503
0
{
504
0
    g_return_val_if_fail(st != NULL, NULL);
505
0
    st->refcount++;
506
0
    return st;
507
0
}
508
/**
509
 * fu_struct_pe_coff_file_header_unref: (skip):
510
 **/
511
void
512
fu_struct_pe_coff_file_header_unref(FuStructPeCoffFileHeader *st)
513
5.18k
{
514
5.18k
    g_return_if_fail(st != NULL);
515
5.18k
    if (st->refcount == 0) {
516
0
        g_critical("FuStructPeCoffFileHeader refcount already zero");
517
0
        return;
518
0
    }
519
5.18k
    if (--st->refcount > 0)
520
0
        return;
521
5.18k
    if (st->buf != NULL)
522
5.15k
        g_byte_array_unref(st->buf);
523
5.18k
    g_free(st);
524
5.18k
}
525
/**
526
 * fu_struct_pe_coff_file_header_new_internal: (skip):
527
 **/
528
static FuStructPeCoffFileHeader *
529
fu_struct_pe_coff_file_header_new_internal(void)
530
5.18k
{
531
5.18k
    FuStructPeCoffFileHeader *st = g_new0(FuStructPeCoffFileHeader, 1);
532
5.18k
    st->refcount = 1;
533
5.18k
    return st;
534
5.18k
}
535
536
/* getters */
537
/**
538
 * fu_struct_pe_coff_file_header_get_signature: (skip):
539
 **/
540
static guint32
541
fu_struct_pe_coff_file_header_get_signature(const FuStructPeCoffFileHeader *st)
542
4.83k
{
543
4.83k
    g_return_val_if_fail(st != NULL, 0x0);
544
4.83k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
545
4.83k
}
546
/**
547
 * fu_struct_pe_coff_file_header_get_machine: (skip):
548
 **/
549
FuPeCoffMachine
550
fu_struct_pe_coff_file_header_get_machine(const FuStructPeCoffFileHeader *st)
551
0
{
552
0
    g_return_val_if_fail(st != NULL, 0x0);
553
0
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
554
0
}
555
/**
556
 * fu_struct_pe_coff_file_header_get_number_of_sections: (skip):
557
 **/
558
guint16
559
fu_struct_pe_coff_file_header_get_number_of_sections(const FuStructPeCoffFileHeader *st)
560
4.72k
{
561
4.72k
    g_return_val_if_fail(st != NULL, 0x0);
562
4.72k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
563
4.72k
}
564
/**
565
 * fu_struct_pe_coff_file_header_get_pointer_to_symbol_table: (skip):
566
 **/
567
guint32
568
fu_struct_pe_coff_file_header_get_pointer_to_symbol_table(const FuStructPeCoffFileHeader *st)
569
4.72k
{
570
4.72k
    g_return_val_if_fail(st != NULL, 0x0);
571
4.72k
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
572
4.72k
}
573
/**
574
 * fu_struct_pe_coff_file_header_get_number_of_symbols: (skip):
575
 **/
576
guint32
577
fu_struct_pe_coff_file_header_get_number_of_symbols(const FuStructPeCoffFileHeader *st)
578
4.72k
{
579
4.72k
    g_return_val_if_fail(st != NULL, 0x0);
580
4.72k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
581
4.72k
}
582
/**
583
 * fu_struct_pe_coff_file_header_get_size_of_optional_header: (skip):
584
 **/
585
guint16
586
fu_struct_pe_coff_file_header_get_size_of_optional_header(const FuStructPeCoffFileHeader *st)
587
5.63k
{
588
5.63k
    g_return_val_if_fail(st != NULL, 0x0);
589
5.63k
    return fu_memread_uint16(st->buf->data + 20, G_LITTLE_ENDIAN);
590
5.63k
}
591
/**
592
 * fu_struct_pe_coff_file_header_get_characteristics: (skip):
593
 **/
594
guint16
595
fu_struct_pe_coff_file_header_get_characteristics(const FuStructPeCoffFileHeader *st)
596
0
{
597
0
    g_return_val_if_fail(st != NULL, 0x0);
598
0
    return fu_memread_uint16(st->buf->data + 22, G_LITTLE_ENDIAN);
599
0
}
600
601
/* setters */
602
/**
603
 * fu_struct_pe_coff_file_header_set_signature: (skip):
604
 **/
605
static void
606
fu_struct_pe_coff_file_header_set_signature(FuStructPeCoffFileHeader *st, guint32 value)
607
356
{
608
356
    g_return_if_fail(st != NULL);
609
356
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
610
356
}
611
/**
612
 * fu_struct_pe_coff_file_header_set_machine: (skip):
613
 **/
614
void
615
fu_struct_pe_coff_file_header_set_machine(FuStructPeCoffFileHeader *st, FuPeCoffMachine value)
616
356
{
617
356
    g_return_if_fail(st != NULL);
618
356
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
619
356
}
620
/**
621
 * fu_struct_pe_coff_file_header_set_number_of_sections: (skip):
622
 **/
623
void
624
fu_struct_pe_coff_file_header_set_number_of_sections(FuStructPeCoffFileHeader *st, guint16 value)
625
170
{
626
170
    g_return_if_fail(st != NULL);
627
170
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
628
170
}
629
/**
630
 * fu_struct_pe_coff_file_header_set_pointer_to_symbol_table: (skip):
631
 **/
632
void
633
fu_struct_pe_coff_file_header_set_pointer_to_symbol_table(FuStructPeCoffFileHeader *st, guint32 value)
634
170
{
635
170
    g_return_if_fail(st != NULL);
636
170
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
637
170
}
638
/**
639
 * fu_struct_pe_coff_file_header_set_number_of_symbols: (skip):
640
 **/
641
void
642
fu_struct_pe_coff_file_header_set_number_of_symbols(FuStructPeCoffFileHeader *st, guint32 value)
643
0
{
644
0
    g_return_if_fail(st != NULL);
645
0
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
646
0
}
647
/**
648
 * fu_struct_pe_coff_file_header_set_size_of_optional_header: (skip):
649
 **/
650
void
651
fu_struct_pe_coff_file_header_set_size_of_optional_header(FuStructPeCoffFileHeader *st, guint16 value)
652
526
{
653
526
    g_return_if_fail(st != NULL);
654
526
    fu_memwrite_uint16(st->buf->data + 20, value, G_LITTLE_ENDIAN);
655
526
}
656
/**
657
 * fu_struct_pe_coff_file_header_set_characteristics: (skip):
658
 **/
659
void
660
fu_struct_pe_coff_file_header_set_characteristics(FuStructPeCoffFileHeader *st, guint16 value)
661
356
{
662
356
    g_return_if_fail(st != NULL);
663
356
    fu_memwrite_uint16(st->buf->data + 22, value, G_LITTLE_ENDIAN);
664
356
}
665
/**
666
 * fu_struct_pe_coff_file_header_new: (skip):
667
 **/
668
FuStructPeCoffFileHeader *
669
fu_struct_pe_coff_file_header_new(void)
670
356
{
671
356
    FuStructPeCoffFileHeader *st = fu_struct_pe_coff_file_header_new_internal();
672
356
    st->buf = g_byte_array_sized_new(24);
673
356
    fu_byte_array_set_size(st->buf, 24, 0x0);
674
356
    fu_struct_pe_coff_file_header_set_signature(st, 0x4550);
675
356
    fu_struct_pe_coff_file_header_set_machine(st, FU_PE_COFF_MACHINE_AMD64);
676
356
    fu_struct_pe_coff_file_header_set_size_of_optional_header(st, 0xf0);
677
356
    fu_struct_pe_coff_file_header_set_characteristics(st, 0x2022);
678
356
    return st;
679
356
}
680
/**
681
 * fu_struct_pe_coff_file_header_to_string: (skip):
682
 **/
683
static gchar *
684
fu_struct_pe_coff_file_header_to_string(const FuStructPeCoffFileHeader *st)
685
0
{
686
0
    g_autoptr(GString) str = g_string_new("FuStructPeCoffFileHeader:\n");
687
0
    g_return_val_if_fail(st != NULL, NULL);
688
0
    g_string_append_printf(str, "  signature: 0x%x\n",
689
0
                           (guint) fu_struct_pe_coff_file_header_get_signature(st));
690
0
    {
691
0
        const gchar *tmp = fu_pe_coff_machine_to_string(fu_struct_pe_coff_file_header_get_machine(st));
692
0
        if (tmp != NULL) {
693
0
            g_string_append_printf(str, "  machine: 0x%x [%s]\n", (guint) fu_struct_pe_coff_file_header_get_machine(st), tmp);
694
0
        } else {
695
0
            g_string_append_printf(str, "  machine: 0x%x\n", (guint) fu_struct_pe_coff_file_header_get_machine(st));
696
0
        }
697
0
    }
698
0
    g_string_append_printf(str, "  number_of_sections: 0x%x\n",
699
0
                           (guint) fu_struct_pe_coff_file_header_get_number_of_sections(st));
700
0
    g_string_append_printf(str, "  pointer_to_symbol_table: 0x%x\n",
701
0
                           (guint) fu_struct_pe_coff_file_header_get_pointer_to_symbol_table(st));
702
0
    g_string_append_printf(str, "  number_of_symbols: 0x%x\n",
703
0
                           (guint) fu_struct_pe_coff_file_header_get_number_of_symbols(st));
704
0
    g_string_append_printf(str, "  size_of_optional_header: 0x%x\n",
705
0
                           (guint) fu_struct_pe_coff_file_header_get_size_of_optional_header(st));
706
0
    g_string_append_printf(str, "  characteristics: 0x%x\n",
707
0
                           (guint) fu_struct_pe_coff_file_header_get_characteristics(st));
708
0
    if (str->len > 0)
709
0
        g_string_set_size(str, str->len - 1);
710
0
    return g_string_free(g_steal_pointer(&str), FALSE);
711
0
}
712
static gboolean
713
fu_struct_pe_coff_file_header_validate_internal(FuStructPeCoffFileHeader *st, GError **error)
714
4.78k
{
715
4.78k
    g_return_val_if_fail(st != NULL, FALSE);
716
4.78k
    if (fu_struct_pe_coff_file_header_get_signature(st) != 0x4550) {
717
45
        g_set_error(error,
718
45
                    FWUPD_ERROR,
719
45
                    FWUPD_ERROR_INVALID_DATA,
720
45
                    "constant FuStructPeCoffFileHeader.signature was not valid, "
721
45
                    "expected 0x%x and got 0x%x",
722
45
                    (guint) 0x4550,
723
45
                    (guint) fu_struct_pe_coff_file_header_get_signature(st));
724
45
        return FALSE;
725
45
    }
726
4.74k
    return TRUE;
727
4.78k
}
728
static gboolean
729
fu_struct_pe_coff_file_header_parse_internal(FuStructPeCoffFileHeader *st, GError **error)
730
4.78k
{
731
4.78k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
732
0
        g_autofree gchar *str = fu_struct_pe_coff_file_header_to_string(st);
733
0
        g_debug("%s", str);
734
0
    }
735
4.78k
    if (!fu_struct_pe_coff_file_header_validate_internal(st, error))
736
45
        return FALSE;
737
4.74k
    return TRUE;
738
4.78k
}
739
/**
740
 * fu_struct_pe_coff_file_header_parse_stream: (skip):
741
 **/
742
FuStructPeCoffFileHeader *
743
fu_struct_pe_coff_file_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
744
4.82k
{
745
4.82k
    g_autoptr(FuStructPeCoffFileHeader) st = fu_struct_pe_coff_file_header_new_internal();
746
4.82k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 24, NULL, error);
747
4.82k
    if (st->buf == NULL) {
748
31
        g_prefix_error(error, "FuStructPeCoffFileHeader failed read of 0x%x: ", (guint) 24);
749
31
        return NULL;
750
31
    }
751
4.79k
    if (st->buf->len != 24) {
752
8
        g_set_error(error,
753
8
                    FWUPD_ERROR,
754
8
                    FWUPD_ERROR_INVALID_DATA,
755
8
                    "FuStructPeCoffFileHeader requested 0x%x and got 0x%x",
756
8
                    (guint) 24,
757
8
                    (guint) st->buf->len);
758
8
        return NULL;
759
8
    }
760
4.78k
    if (!fu_struct_pe_coff_file_header_parse_internal(st, error))
761
45
        return NULL;
762
4.74k
    return g_steal_pointer(&st);
763
4.78k
}
764
/**
765
 * fu_struct_pe_coff_optional_header64_ref: (skip):
766
 **/
767
FuStructPeCoffOptionalHeader64 *
768
fu_struct_pe_coff_optional_header64_ref(FuStructPeCoffOptionalHeader64 *st)
769
0
{
770
0
    g_return_val_if_fail(st != NULL, NULL);
771
0
    st->refcount++;
772
0
    return st;
773
0
}
774
/**
775
 * fu_struct_pe_coff_optional_header64_unref: (skip):
776
 **/
777
void
778
fu_struct_pe_coff_optional_header64_unref(FuStructPeCoffOptionalHeader64 *st)
779
1.26k
{
780
1.26k
    g_return_if_fail(st != NULL);
781
1.26k
    if (st->refcount == 0) {
782
0
        g_critical("FuStructPeCoffOptionalHeader64 refcount already zero");
783
0
        return;
784
0
    }
785
1.26k
    if (--st->refcount > 0)
786
0
        return;
787
1.26k
    if (st->buf != NULL)
788
1.26k
        g_byte_array_unref(st->buf);
789
1.26k
    g_free(st);
790
1.26k
}
791
/**
792
 * fu_struct_pe_coff_optional_header64_new_internal: (skip):
793
 **/
794
static FuStructPeCoffOptionalHeader64 *
795
fu_struct_pe_coff_optional_header64_new_internal(void)
796
1.26k
{
797
1.26k
    FuStructPeCoffOptionalHeader64 *st = g_new0(FuStructPeCoffOptionalHeader64, 1);
798
1.26k
    st->refcount = 1;
799
1.26k
    return st;
800
1.26k
}
801
802
/* getters */
803
/**
804
 * fu_struct_pe_coff_optional_header64_get_magic: (skip):
805
 **/
806
FuPeCoffMagic
807
fu_struct_pe_coff_optional_header64_get_magic(const FuStructPeCoffOptionalHeader64 *st)
808
0
{
809
0
    g_return_val_if_fail(st != NULL, 0x0);
810
0
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
811
0
}
812
/**
813
 * fu_struct_pe_coff_optional_header64_get_major_linker_version: (skip):
814
 **/
815
guint8
816
fu_struct_pe_coff_optional_header64_get_major_linker_version(const FuStructPeCoffOptionalHeader64 *st)
817
0
{
818
0
    g_return_val_if_fail(st != NULL, 0x0);
819
0
    return st->buf->data[2];
820
0
}
821
/**
822
 * fu_struct_pe_coff_optional_header64_get_minor_linker_version: (skip):
823
 **/
824
guint8
825
fu_struct_pe_coff_optional_header64_get_minor_linker_version(const FuStructPeCoffOptionalHeader64 *st)
826
0
{
827
0
    g_return_val_if_fail(st != NULL, 0x0);
828
0
    return st->buf->data[3];
829
0
}
830
/**
831
 * fu_struct_pe_coff_optional_header64_get_size_of_code: (skip):
832
 **/
833
guint32
834
fu_struct_pe_coff_optional_header64_get_size_of_code(const FuStructPeCoffOptionalHeader64 *st)
835
0
{
836
0
    g_return_val_if_fail(st != NULL, 0x0);
837
0
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
838
0
}
839
/**
840
 * fu_struct_pe_coff_optional_header64_get_size_of_initialized_data: (skip):
841
 **/
842
guint32
843
fu_struct_pe_coff_optional_header64_get_size_of_initialized_data(const FuStructPeCoffOptionalHeader64 *st)
844
0
{
845
0
    g_return_val_if_fail(st != NULL, 0x0);
846
0
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
847
0
}
848
/**
849
 * fu_struct_pe_coff_optional_header64_get_size_of_uninitialized_data: (skip):
850
 **/
851
guint32
852
fu_struct_pe_coff_optional_header64_get_size_of_uninitialized_data(const FuStructPeCoffOptionalHeader64 *st)
853
0
{
854
0
    g_return_val_if_fail(st != NULL, 0x0);
855
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
856
0
}
857
/**
858
 * fu_struct_pe_coff_optional_header64_get_addressofentrypoint: (skip):
859
 **/
860
guint32
861
fu_struct_pe_coff_optional_header64_get_addressofentrypoint(const FuStructPeCoffOptionalHeader64 *st)
862
0
{
863
0
    g_return_val_if_fail(st != NULL, 0x0);
864
0
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
865
0
}
866
/**
867
 * fu_struct_pe_coff_optional_header64_get_base_of_code: (skip):
868
 **/
869
guint32
870
fu_struct_pe_coff_optional_header64_get_base_of_code(const FuStructPeCoffOptionalHeader64 *st)
871
0
{
872
0
    g_return_val_if_fail(st != NULL, 0x0);
873
0
    return fu_memread_uint32(st->buf->data + 20, G_LITTLE_ENDIAN);
874
0
}
875
/**
876
 * fu_struct_pe_coff_optional_header64_get_image_base: (skip):
877
 **/
878
guint64
879
fu_struct_pe_coff_optional_header64_get_image_base(const FuStructPeCoffOptionalHeader64 *st)
880
0
{
881
0
    g_return_val_if_fail(st != NULL, 0x0);
882
0
    return fu_memread_uint64(st->buf->data + 24, G_LITTLE_ENDIAN);
883
0
}
884
/**
885
 * fu_struct_pe_coff_optional_header64_get_section_alignment: (skip):
886
 **/
887
guint32
888
fu_struct_pe_coff_optional_header64_get_section_alignment(const FuStructPeCoffOptionalHeader64 *st)
889
0
{
890
0
    g_return_val_if_fail(st != NULL, 0x0);
891
0
    return fu_memread_uint32(st->buf->data + 32, G_LITTLE_ENDIAN);
892
0
}
893
/**
894
 * fu_struct_pe_coff_optional_header64_get_file_alignment: (skip):
895
 **/
896
guint32
897
fu_struct_pe_coff_optional_header64_get_file_alignment(const FuStructPeCoffOptionalHeader64 *st)
898
0
{
899
0
    g_return_val_if_fail(st != NULL, 0x0);
900
0
    return fu_memread_uint32(st->buf->data + 36, G_LITTLE_ENDIAN);
901
0
}
902
/**
903
 * fu_struct_pe_coff_optional_header64_get_size_of_image: (skip):
904
 **/
905
guint32
906
fu_struct_pe_coff_optional_header64_get_size_of_image(const FuStructPeCoffOptionalHeader64 *st)
907
0
{
908
0
    g_return_val_if_fail(st != NULL, 0x0);
909
0
    return fu_memread_uint32(st->buf->data + 56, G_LITTLE_ENDIAN);
910
0
}
911
/**
912
 * fu_struct_pe_coff_optional_header64_get_size_of_headers: (skip):
913
 **/
914
guint32
915
fu_struct_pe_coff_optional_header64_get_size_of_headers(const FuStructPeCoffOptionalHeader64 *st)
916
1.55k
{
917
1.55k
    g_return_val_if_fail(st != NULL, 0x0);
918
1.55k
    return fu_memread_uint32(st->buf->data + 60, G_LITTLE_ENDIAN);
919
1.55k
}
920
/**
921
 * fu_struct_pe_coff_optional_header64_get_checksum: (skip):
922
 **/
923
guint32
924
fu_struct_pe_coff_optional_header64_get_checksum(const FuStructPeCoffOptionalHeader64 *st)
925
0
{
926
0
    g_return_val_if_fail(st != NULL, 0x0);
927
0
    return fu_memread_uint32(st->buf->data + 64, G_LITTLE_ENDIAN);
928
0
}
929
/**
930
 * fu_struct_pe_coff_optional_header64_get_subsystem: (skip):
931
 **/
932
FuCoffSubsystem
933
fu_struct_pe_coff_optional_header64_get_subsystem(const FuStructPeCoffOptionalHeader64 *st)
934
0
{
935
0
    g_return_val_if_fail(st != NULL, 0x0);
936
0
    return fu_memread_uint16(st->buf->data + 68, G_LITTLE_ENDIAN);
937
0
}
938
/**
939
 * fu_struct_pe_coff_optional_header64_get_loader_flags: (skip):
940
 **/
941
guint32
942
fu_struct_pe_coff_optional_header64_get_loader_flags(const FuStructPeCoffOptionalHeader64 *st)
943
0
{
944
0
    g_return_val_if_fail(st != NULL, 0x0);
945
0
    return fu_memread_uint32(st->buf->data + 104, G_LITTLE_ENDIAN);
946
0
}
947
/**
948
 * fu_struct_pe_coff_optional_header64_get_number_of_rva_and_sizes: (skip):
949
 **/
950
guint32
951
fu_struct_pe_coff_optional_header64_get_number_of_rva_and_sizes(const FuStructPeCoffOptionalHeader64 *st)
952
0
{
953
0
    g_return_val_if_fail(st != NULL, 0x0);
954
0
    return fu_memread_uint32(st->buf->data + 108, G_LITTLE_ENDIAN);
955
0
}
956
/**
957
 * fu_struct_pe_coff_optional_header64_get_certificate_table: (skip):
958
 **/
959
guint32
960
fu_struct_pe_coff_optional_header64_get_certificate_table(const FuStructPeCoffOptionalHeader64 *st)
961
0
{
962
0
    g_return_val_if_fail(st != NULL, 0x0);
963
0
    return fu_memread_uint32(st->buf->data + 144, G_LITTLE_ENDIAN);
964
0
}
965
/**
966
 * fu_struct_pe_coff_optional_header64_get_size_of_certificate_table: (skip):
967
 **/
968
guint32
969
fu_struct_pe_coff_optional_header64_get_size_of_certificate_table(const FuStructPeCoffOptionalHeader64 *st)
970
897
{
971
897
    g_return_val_if_fail(st != NULL, 0x0);
972
897
    return fu_memread_uint32(st->buf->data + 148, G_LITTLE_ENDIAN);
973
897
}
974
/**
975
 * fu_struct_pe_coff_optional_header64_get_debug_table: (skip):
976
 **/
977
guint32
978
fu_struct_pe_coff_optional_header64_get_debug_table(const FuStructPeCoffOptionalHeader64 *st)
979
0
{
980
0
    g_return_val_if_fail(st != NULL, 0x0);
981
0
    return fu_memread_uint32(st->buf->data + 152, G_LITTLE_ENDIAN);
982
0
}
983
/**
984
 * fu_struct_pe_coff_optional_header64_get_size_of_debug_table: (skip):
985
 **/
986
guint32
987
fu_struct_pe_coff_optional_header64_get_size_of_debug_table(const FuStructPeCoffOptionalHeader64 *st)
988
0
{
989
0
    g_return_val_if_fail(st != NULL, 0x0);
990
0
    return fu_memread_uint32(st->buf->data + 156, G_LITTLE_ENDIAN);
991
0
}
992
993
/* setters */
994
/**
995
 * fu_struct_pe_coff_optional_header64_set_magic: (skip):
996
 **/
997
void
998
fu_struct_pe_coff_optional_header64_set_magic(FuStructPeCoffOptionalHeader64 *st, FuPeCoffMagic value)
999
356
{
1000
356
    g_return_if_fail(st != NULL);
1001
356
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
1002
356
}
1003
/**
1004
 * fu_struct_pe_coff_optional_header64_set_major_linker_version: (skip):
1005
 **/
1006
void
1007
fu_struct_pe_coff_optional_header64_set_major_linker_version(FuStructPeCoffOptionalHeader64 *st, guint8 value)
1008
356
{
1009
356
    g_return_if_fail(st != NULL);
1010
356
    st->buf->data[2] = value;
1011
356
}
1012
/**
1013
 * fu_struct_pe_coff_optional_header64_set_minor_linker_version: (skip):
1014
 **/
1015
void
1016
fu_struct_pe_coff_optional_header64_set_minor_linker_version(FuStructPeCoffOptionalHeader64 *st, guint8 value)
1017
356
{
1018
356
    g_return_if_fail(st != NULL);
1019
356
    st->buf->data[3] = value;
1020
356
}
1021
/**
1022
 * fu_struct_pe_coff_optional_header64_set_size_of_code: (skip):
1023
 **/
1024
void
1025
fu_struct_pe_coff_optional_header64_set_size_of_code(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1026
0
{
1027
0
    g_return_if_fail(st != NULL);
1028
0
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
1029
0
}
1030
/**
1031
 * fu_struct_pe_coff_optional_header64_set_size_of_initialized_data: (skip):
1032
 **/
1033
void
1034
fu_struct_pe_coff_optional_header64_set_size_of_initialized_data(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1035
0
{
1036
0
    g_return_if_fail(st != NULL);
1037
0
    fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN);
1038
0
}
1039
/**
1040
 * fu_struct_pe_coff_optional_header64_set_size_of_uninitialized_data: (skip):
1041
 **/
1042
void
1043
fu_struct_pe_coff_optional_header64_set_size_of_uninitialized_data(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1044
0
{
1045
0
    g_return_if_fail(st != NULL);
1046
0
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
1047
0
}
1048
/**
1049
 * fu_struct_pe_coff_optional_header64_set_addressofentrypoint: (skip):
1050
 **/
1051
void
1052
fu_struct_pe_coff_optional_header64_set_addressofentrypoint(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1053
0
{
1054
0
    g_return_if_fail(st != NULL);
1055
0
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
1056
0
}
1057
/**
1058
 * fu_struct_pe_coff_optional_header64_set_base_of_code: (skip):
1059
 **/
1060
void
1061
fu_struct_pe_coff_optional_header64_set_base_of_code(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1062
0
{
1063
0
    g_return_if_fail(st != NULL);
1064
0
    fu_memwrite_uint32(st->buf->data + 20, value, G_LITTLE_ENDIAN);
1065
0
}
1066
/**
1067
 * fu_struct_pe_coff_optional_header64_set_image_base: (skip):
1068
 **/
1069
void
1070
fu_struct_pe_coff_optional_header64_set_image_base(FuStructPeCoffOptionalHeader64 *st, guint64 value)
1071
0
{
1072
0
    g_return_if_fail(st != NULL);
1073
0
    fu_memwrite_uint64(st->buf->data + 24, value, G_LITTLE_ENDIAN);
1074
0
}
1075
/**
1076
 * fu_struct_pe_coff_optional_header64_set_section_alignment: (skip):
1077
 **/
1078
void
1079
fu_struct_pe_coff_optional_header64_set_section_alignment(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1080
356
{
1081
356
    g_return_if_fail(st != NULL);
1082
356
    fu_memwrite_uint32(st->buf->data + 32, value, G_LITTLE_ENDIAN);
1083
356
}
1084
/**
1085
 * fu_struct_pe_coff_optional_header64_set_file_alignment: (skip):
1086
 **/
1087
void
1088
fu_struct_pe_coff_optional_header64_set_file_alignment(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1089
356
{
1090
356
    g_return_if_fail(st != NULL);
1091
356
    fu_memwrite_uint32(st->buf->data + 36, value, G_LITTLE_ENDIAN);
1092
356
}
1093
/**
1094
 * fu_struct_pe_coff_optional_header64_set_size_of_image: (skip):
1095
 **/
1096
void
1097
fu_struct_pe_coff_optional_header64_set_size_of_image(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1098
0
{
1099
0
    g_return_if_fail(st != NULL);
1100
0
    fu_memwrite_uint32(st->buf->data + 56, value, G_LITTLE_ENDIAN);
1101
0
}
1102
/**
1103
 * fu_struct_pe_coff_optional_header64_set_size_of_headers: (skip):
1104
 **/
1105
void
1106
fu_struct_pe_coff_optional_header64_set_size_of_headers(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1107
0
{
1108
0
    g_return_if_fail(st != NULL);
1109
0
    fu_memwrite_uint32(st->buf->data + 60, value, G_LITTLE_ENDIAN);
1110
0
}
1111
/**
1112
 * fu_struct_pe_coff_optional_header64_set_checksum: (skip):
1113
 **/
1114
void
1115
fu_struct_pe_coff_optional_header64_set_checksum(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1116
0
{
1117
0
    g_return_if_fail(st != NULL);
1118
0
    fu_memwrite_uint32(st->buf->data + 64, value, G_LITTLE_ENDIAN);
1119
0
}
1120
/**
1121
 * fu_struct_pe_coff_optional_header64_set_subsystem: (skip):
1122
 **/
1123
void
1124
fu_struct_pe_coff_optional_header64_set_subsystem(FuStructPeCoffOptionalHeader64 *st, FuCoffSubsystem value)
1125
356
{
1126
356
    g_return_if_fail(st != NULL);
1127
356
    fu_memwrite_uint16(st->buf->data + 68, value, G_LITTLE_ENDIAN);
1128
356
}
1129
/**
1130
 * fu_struct_pe_coff_optional_header64_set_loader_flags: (skip):
1131
 **/
1132
void
1133
fu_struct_pe_coff_optional_header64_set_loader_flags(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1134
0
{
1135
0
    g_return_if_fail(st != NULL);
1136
0
    fu_memwrite_uint32(st->buf->data + 104, value, G_LITTLE_ENDIAN);
1137
0
}
1138
/**
1139
 * fu_struct_pe_coff_optional_header64_set_number_of_rva_and_sizes: (skip):
1140
 **/
1141
void
1142
fu_struct_pe_coff_optional_header64_set_number_of_rva_and_sizes(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1143
170
{
1144
170
    g_return_if_fail(st != NULL);
1145
170
    fu_memwrite_uint32(st->buf->data + 108, value, G_LITTLE_ENDIAN);
1146
170
}
1147
/**
1148
 * fu_struct_pe_coff_optional_header64_set_certificate_table: (skip):
1149
 **/
1150
void
1151
fu_struct_pe_coff_optional_header64_set_certificate_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1152
0
{
1153
0
    g_return_if_fail(st != NULL);
1154
0
    fu_memwrite_uint32(st->buf->data + 144, value, G_LITTLE_ENDIAN);
1155
0
}
1156
/**
1157
 * fu_struct_pe_coff_optional_header64_set_size_of_certificate_table: (skip):
1158
 **/
1159
void
1160
fu_struct_pe_coff_optional_header64_set_size_of_certificate_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1161
0
{
1162
0
    g_return_if_fail(st != NULL);
1163
0
    fu_memwrite_uint32(st->buf->data + 148, value, G_LITTLE_ENDIAN);
1164
0
}
1165
/**
1166
 * fu_struct_pe_coff_optional_header64_set_debug_table: (skip):
1167
 **/
1168
void
1169
fu_struct_pe_coff_optional_header64_set_debug_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1170
0
{
1171
0
    g_return_if_fail(st != NULL);
1172
0
    fu_memwrite_uint32(st->buf->data + 152, value, G_LITTLE_ENDIAN);
1173
0
}
1174
/**
1175
 * fu_struct_pe_coff_optional_header64_set_size_of_debug_table: (skip):
1176
 **/
1177
void
1178
fu_struct_pe_coff_optional_header64_set_size_of_debug_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1179
0
{
1180
0
    g_return_if_fail(st != NULL);
1181
0
    fu_memwrite_uint32(st->buf->data + 156, value, G_LITTLE_ENDIAN);
1182
0
}
1183
/**
1184
 * fu_struct_pe_coff_optional_header64_new: (skip):
1185
 **/
1186
FuStructPeCoffOptionalHeader64 *
1187
fu_struct_pe_coff_optional_header64_new(void)
1188
356
{
1189
356
    FuStructPeCoffOptionalHeader64 *st = fu_struct_pe_coff_optional_header64_new_internal();
1190
356
    st->buf = g_byte_array_sized_new(176);
1191
356
    fu_byte_array_set_size(st->buf, 176, 0x0);
1192
356
    fu_struct_pe_coff_optional_header64_set_magic(st, FU_PE_COFF_MAGIC_PE32_PLUS);
1193
356
    fu_struct_pe_coff_optional_header64_set_major_linker_version(st, 0x0e);
1194
356
    fu_struct_pe_coff_optional_header64_set_minor_linker_version(st, 0x0e);
1195
356
    fu_struct_pe_coff_optional_header64_set_section_alignment(st, 0x200);
1196
356
    fu_struct_pe_coff_optional_header64_set_file_alignment(st, 0x200);
1197
356
    fu_struct_pe_coff_optional_header64_set_subsystem(st, FU_COFF_SUBSYSTEM_EFI_APPLICATION);
1198
356
    return st;
1199
356
}
1200
/**
1201
 * fu_struct_pe_coff_optional_header64_to_string: (skip):
1202
 **/
1203
static gchar *
1204
fu_struct_pe_coff_optional_header64_to_string(const FuStructPeCoffOptionalHeader64 *st)
1205
0
{
1206
0
    g_autoptr(GString) str = g_string_new("FuStructPeCoffOptionalHeader64:\n");
1207
0
    g_return_val_if_fail(st != NULL, NULL);
1208
0
    {
1209
0
        const gchar *tmp = fu_pe_coff_magic_to_string(fu_struct_pe_coff_optional_header64_get_magic(st));
1210
0
        if (tmp != NULL) {
1211
0
            g_string_append_printf(str, "  magic: 0x%x [%s]\n", (guint) fu_struct_pe_coff_optional_header64_get_magic(st), tmp);
1212
0
        } else {
1213
0
            g_string_append_printf(str, "  magic: 0x%x\n", (guint) fu_struct_pe_coff_optional_header64_get_magic(st));
1214
0
        }
1215
0
    }
1216
0
    g_string_append_printf(str, "  major_linker_version: 0x%x\n",
1217
0
                           (guint) fu_struct_pe_coff_optional_header64_get_major_linker_version(st));
1218
0
    g_string_append_printf(str, "  minor_linker_version: 0x%x\n",
1219
0
                           (guint) fu_struct_pe_coff_optional_header64_get_minor_linker_version(st));
1220
0
    g_string_append_printf(str, "  size_of_code: 0x%x\n",
1221
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_code(st));
1222
0
    g_string_append_printf(str, "  size_of_initialized_data: 0x%x\n",
1223
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_initialized_data(st));
1224
0
    g_string_append_printf(str, "  size_of_uninitialized_data: 0x%x\n",
1225
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_uninitialized_data(st));
1226
0
    g_string_append_printf(str, "  addressofentrypoint: 0x%x\n",
1227
0
                           (guint) fu_struct_pe_coff_optional_header64_get_addressofentrypoint(st));
1228
0
    g_string_append_printf(str, "  base_of_code: 0x%x\n",
1229
0
                           (guint) fu_struct_pe_coff_optional_header64_get_base_of_code(st));
1230
0
    g_string_append_printf(str, "  image_base: 0x%x\n",
1231
0
                           (guint) fu_struct_pe_coff_optional_header64_get_image_base(st));
1232
0
    g_string_append_printf(str, "  section_alignment: 0x%x\n",
1233
0
                           (guint) fu_struct_pe_coff_optional_header64_get_section_alignment(st));
1234
0
    g_string_append_printf(str, "  file_alignment: 0x%x\n",
1235
0
                           (guint) fu_struct_pe_coff_optional_header64_get_file_alignment(st));
1236
0
    g_string_append_printf(str, "  size_of_image: 0x%x\n",
1237
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_image(st));
1238
0
    g_string_append_printf(str, "  size_of_headers: 0x%x\n",
1239
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_headers(st));
1240
0
    g_string_append_printf(str, "  checksum: 0x%x\n",
1241
0
                           (guint) fu_struct_pe_coff_optional_header64_get_checksum(st));
1242
0
    {
1243
0
        const gchar *tmp = fu_coff_subsystem_to_string(fu_struct_pe_coff_optional_header64_get_subsystem(st));
1244
0
        if (tmp != NULL) {
1245
0
            g_string_append_printf(str, "  subsystem: 0x%x [%s]\n", (guint) fu_struct_pe_coff_optional_header64_get_subsystem(st), tmp);
1246
0
        } else {
1247
0
            g_string_append_printf(str, "  subsystem: 0x%x\n", (guint) fu_struct_pe_coff_optional_header64_get_subsystem(st));
1248
0
        }
1249
0
    }
1250
0
    g_string_append_printf(str, "  loader_flags: 0x%x\n",
1251
0
                           (guint) fu_struct_pe_coff_optional_header64_get_loader_flags(st));
1252
0
    g_string_append_printf(str, "  number_of_rva_and_sizes: 0x%x\n",
1253
0
                           (guint) fu_struct_pe_coff_optional_header64_get_number_of_rva_and_sizes(st));
1254
0
    g_string_append_printf(str, "  certificate_table: 0x%x\n",
1255
0
                           (guint) fu_struct_pe_coff_optional_header64_get_certificate_table(st));
1256
0
    g_string_append_printf(str, "  size_of_certificate_table: 0x%x\n",
1257
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_certificate_table(st));
1258
0
    g_string_append_printf(str, "  debug_table: 0x%x\n",
1259
0
                           (guint) fu_struct_pe_coff_optional_header64_get_debug_table(st));
1260
0
    g_string_append_printf(str, "  size_of_debug_table: 0x%x\n",
1261
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_debug_table(st));
1262
0
    if (str->len > 0)
1263
0
        g_string_set_size(str, str->len - 1);
1264
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1265
0
}
1266
static gboolean
1267
fu_struct_pe_coff_optional_header64_validate_internal(FuStructPeCoffOptionalHeader64 *st, GError **error)
1268
897
{
1269
897
    g_return_val_if_fail(st != NULL, FALSE);
1270
897
    return TRUE;
1271
897
}
1272
static gboolean
1273
fu_struct_pe_coff_optional_header64_parse_internal(FuStructPeCoffOptionalHeader64 *st, GError **error)
1274
897
{
1275
897
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1276
0
        g_autofree gchar *str = fu_struct_pe_coff_optional_header64_to_string(st);
1277
0
        g_debug("%s", str);
1278
0
    }
1279
897
    if (!fu_struct_pe_coff_optional_header64_validate_internal(st, error))
1280
0
        return FALSE;
1281
897
    return TRUE;
1282
897
}
1283
/**
1284
 * fu_struct_pe_coff_optional_header64_parse_stream: (skip):
1285
 **/
1286
FuStructPeCoffOptionalHeader64 *
1287
fu_struct_pe_coff_optional_header64_parse_stream(GInputStream *stream, gsize offset, GError **error)
1288
910
{
1289
910
    g_autoptr(FuStructPeCoffOptionalHeader64) st = fu_struct_pe_coff_optional_header64_new_internal();
1290
910
    st->buf = fu_input_stream_read_byte_array(stream, offset, 176, NULL, error);
1291
910
    if (st->buf == NULL) {
1292
0
        g_prefix_error(error, "FuStructPeCoffOptionalHeader64 failed read of 0x%x: ", (guint) 176);
1293
0
        return NULL;
1294
0
    }
1295
910
    if (st->buf->len != 176) {
1296
13
        g_set_error(error,
1297
13
                    FWUPD_ERROR,
1298
13
                    FWUPD_ERROR_INVALID_DATA,
1299
13
                    "FuStructPeCoffOptionalHeader64 requested 0x%x and got 0x%x",
1300
13
                    (guint) 176,
1301
13
                    (guint) st->buf->len);
1302
13
        return NULL;
1303
13
    }
1304
897
    if (!fu_struct_pe_coff_optional_header64_parse_internal(st, error))
1305
0
        return NULL;
1306
897
    return g_steal_pointer(&st);
1307
897
}
1308
/**
1309
 * fu_struct_pe_coff_symbol_ref: (skip):
1310
 **/
1311
FuStructPeCoffSymbol *
1312
fu_struct_pe_coff_symbol_ref(FuStructPeCoffSymbol *st)
1313
0
{
1314
0
    g_return_val_if_fail(st != NULL, NULL);
1315
0
    st->refcount++;
1316
0
    return st;
1317
0
}
1318
/**
1319
 * fu_struct_pe_coff_symbol_unref: (skip):
1320
 **/
1321
void
1322
fu_struct_pe_coff_symbol_unref(FuStructPeCoffSymbol *st)
1323
0
{
1324
0
    g_return_if_fail(st != NULL);
1325
0
    if (st->refcount == 0) {
1326
0
        g_critical("FuStructPeCoffSymbol refcount already zero");
1327
0
        return;
1328
0
    }
1329
0
    if (--st->refcount > 0)
1330
0
        return;
1331
0
    if (st->buf != NULL)
1332
0
        g_byte_array_unref(st->buf);
1333
0
    g_free(st);
1334
0
}
1335
1336
/* getters */
1337
1338
/* setters */
1339
/**
1340
 * fu_struct_pe_coff_section_ref: (skip):
1341
 **/
1342
FuStructPeCoffSection *
1343
fu_struct_pe_coff_section_ref(FuStructPeCoffSection *st)
1344
0
{
1345
0
    g_return_val_if_fail(st != NULL, NULL);
1346
0
    st->refcount++;
1347
0
    return st;
1348
0
}
1349
/**
1350
 * fu_struct_pe_coff_section_unref: (skip):
1351
 **/
1352
void
1353
fu_struct_pe_coff_section_unref(FuStructPeCoffSection *st)
1354
12.6k
{
1355
12.6k
    g_return_if_fail(st != NULL);
1356
12.6k
    if (st->refcount == 0) {
1357
0
        g_critical("FuStructPeCoffSection refcount already zero");
1358
0
        return;
1359
0
    }
1360
12.6k
    if (--st->refcount > 0)
1361
0
        return;
1362
12.6k
    if (st->buf != NULL)
1363
12.5k
        g_byte_array_unref(st->buf);
1364
12.6k
    g_free(st);
1365
12.6k
}
1366
/**
1367
 * fu_struct_pe_coff_section_new_internal: (skip):
1368
 **/
1369
static FuStructPeCoffSection *
1370
fu_struct_pe_coff_section_new_internal(void)
1371
12.6k
{
1372
12.6k
    FuStructPeCoffSection *st = g_new0(FuStructPeCoffSection, 1);
1373
12.6k
    st->refcount = 1;
1374
12.6k
    return st;
1375
12.6k
}
1376
1377
/* getters */
1378
/**
1379
 * fu_struct_pe_coff_section_get_name: (skip):
1380
 **/
1381
gchar *
1382
fu_struct_pe_coff_section_get_name(const FuStructPeCoffSection *st)
1383
12.2k
{
1384
12.2k
    g_return_val_if_fail(st != NULL, NULL);
1385
12.2k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 8, NULL);
1386
12.2k
}
1387
/**
1388
 * fu_struct_pe_coff_section_get_virtual_size: (skip):
1389
 **/
1390
guint32
1391
fu_struct_pe_coff_section_get_virtual_size(const FuStructPeCoffSection *st)
1392
31.5k
{
1393
31.5k
    g_return_val_if_fail(st != NULL, 0x0);
1394
31.5k
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
1395
31.5k
}
1396
/**
1397
 * fu_struct_pe_coff_section_get_virtual_address: (skip):
1398
 **/
1399
guint32
1400
fu_struct_pe_coff_section_get_virtual_address(const FuStructPeCoffSection *st)
1401
0
{
1402
0
    g_return_val_if_fail(st != NULL, 0x0);
1403
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
1404
0
}
1405
/**
1406
 * fu_struct_pe_coff_section_get_size_of_raw_data: (skip):
1407
 **/
1408
guint32
1409
fu_struct_pe_coff_section_get_size_of_raw_data(const FuStructPeCoffSection *st)
1410
32.7k
{
1411
32.7k
    g_return_val_if_fail(st != NULL, 0x0);
1412
32.7k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
1413
32.7k
}
1414
/**
1415
 * fu_struct_pe_coff_section_get_pointer_to_raw_data: (skip):
1416
 **/
1417
guint32
1418
fu_struct_pe_coff_section_get_pointer_to_raw_data(const FuStructPeCoffSection *st)
1419
9.70k
{
1420
9.70k
    g_return_val_if_fail(st != NULL, 0x0);
1421
9.70k
    return fu_memread_uint32(st->buf->data + 20, G_LITTLE_ENDIAN);
1422
9.70k
}
1423
/**
1424
 * fu_struct_pe_coff_section_get_characteristics: (skip):
1425
 **/
1426
guint32
1427
fu_struct_pe_coff_section_get_characteristics(const FuStructPeCoffSection *st)
1428
0
{
1429
0
    g_return_val_if_fail(st != NULL, 0x0);
1430
0
    return fu_memread_uint32(st->buf->data + 36, G_LITTLE_ENDIAN);
1431
0
}
1432
1433
/* setters */
1434
/**
1435
 * fu_struct_pe_coff_section_set_name: (skip):
1436
 **/
1437
gboolean
1438
fu_struct_pe_coff_section_set_name(FuStructPeCoffSection *st, const gchar *value, GError **error)
1439
264
{
1440
264
    gsize len;
1441
264
    g_return_val_if_fail(st != NULL, FALSE);
1442
264
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
1443
264
    if (value == NULL) {
1444
0
        memset(st->buf->data + 0, 0x0, 8);
1445
0
        return TRUE;
1446
0
    }
1447
264
    len = strlen(value);
1448
264
    if (len > 8) {
1449
0
        g_set_error(error,
1450
0
                    FWUPD_ERROR,
1451
0
                    FWUPD_ERROR_INVALID_DATA,
1452
0
                    "string '%s' (0x%x bytes) does not fit in FuStructPeCoffSection.name (0x%x bytes)",
1453
0
                    value, (guint) len, (guint) 8);
1454
0
        return FALSE;
1455
0
    }
1456
264
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
1457
264
}
1458
/**
1459
 * fu_struct_pe_coff_section_set_virtual_size: (skip):
1460
 **/
1461
void
1462
fu_struct_pe_coff_section_set_virtual_size(FuStructPeCoffSection *st, guint32 value)
1463
264
{
1464
264
    g_return_if_fail(st != NULL);
1465
264
    fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN);
1466
264
}
1467
/**
1468
 * fu_struct_pe_coff_section_set_virtual_address: (skip):
1469
 **/
1470
void
1471
fu_struct_pe_coff_section_set_virtual_address(FuStructPeCoffSection *st, guint32 value)
1472
264
{
1473
264
    g_return_if_fail(st != NULL);
1474
264
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
1475
264
}
1476
/**
1477
 * fu_struct_pe_coff_section_set_size_of_raw_data: (skip):
1478
 **/
1479
void
1480
fu_struct_pe_coff_section_set_size_of_raw_data(FuStructPeCoffSection *st, guint32 value)
1481
264
{
1482
264
    g_return_if_fail(st != NULL);
1483
264
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
1484
264
}
1485
/**
1486
 * fu_struct_pe_coff_section_set_pointer_to_raw_data: (skip):
1487
 **/
1488
void
1489
fu_struct_pe_coff_section_set_pointer_to_raw_data(FuStructPeCoffSection *st, guint32 value)
1490
264
{
1491
264
    g_return_if_fail(st != NULL);
1492
264
    fu_memwrite_uint32(st->buf->data + 20, value, G_LITTLE_ENDIAN);
1493
264
}
1494
/**
1495
 * fu_struct_pe_coff_section_set_characteristics: (skip):
1496
 **/
1497
void
1498
fu_struct_pe_coff_section_set_characteristics(FuStructPeCoffSection *st, guint32 value)
1499
0
{
1500
0
    g_return_if_fail(st != NULL);
1501
0
    fu_memwrite_uint32(st->buf->data + 36, value, G_LITTLE_ENDIAN);
1502
0
}
1503
/**
1504
 * fu_struct_pe_coff_section_new: (skip):
1505
 **/
1506
FuStructPeCoffSection *
1507
fu_struct_pe_coff_section_new(void)
1508
264
{
1509
264
    FuStructPeCoffSection *st = fu_struct_pe_coff_section_new_internal();
1510
264
    st->buf = g_byte_array_sized_new(40);
1511
264
    fu_byte_array_set_size(st->buf, 40, 0x0);
1512
264
    return st;
1513
264
}
1514
/**
1515
 * fu_struct_pe_coff_section_to_string: (skip):
1516
 **/
1517
static gchar *
1518
fu_struct_pe_coff_section_to_string(const FuStructPeCoffSection *st)
1519
0
{
1520
0
    g_autoptr(GString) str = g_string_new("FuStructPeCoffSection:\n");
1521
0
    g_return_val_if_fail(st != NULL, NULL);
1522
0
    {
1523
0
        g_autofree gchar *tmp = fu_struct_pe_coff_section_get_name(st);
1524
0
        if (tmp != NULL)
1525
0
            g_string_append_printf(str, "  name: %s\n", tmp);
1526
0
    }
1527
0
    g_string_append_printf(str, "  virtual_size: 0x%x\n",
1528
0
                           (guint) fu_struct_pe_coff_section_get_virtual_size(st));
1529
0
    g_string_append_printf(str, "  virtual_address: 0x%x\n",
1530
0
                           (guint) fu_struct_pe_coff_section_get_virtual_address(st));
1531
0
    g_string_append_printf(str, "  size_of_raw_data: 0x%x\n",
1532
0
                           (guint) fu_struct_pe_coff_section_get_size_of_raw_data(st));
1533
0
    g_string_append_printf(str, "  pointer_to_raw_data: 0x%x\n",
1534
0
                           (guint) fu_struct_pe_coff_section_get_pointer_to_raw_data(st));
1535
0
    g_string_append_printf(str, "  characteristics: 0x%x\n",
1536
0
                           (guint) fu_struct_pe_coff_section_get_characteristics(st));
1537
0
    if (str->len > 0)
1538
0
        g_string_set_size(str, str->len - 1);
1539
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1540
0
}
1541
static gboolean
1542
fu_struct_pe_coff_section_validate_internal(FuStructPeCoffSection *st, GError **error)
1543
12.2k
{
1544
12.2k
    g_return_val_if_fail(st != NULL, FALSE);
1545
12.2k
    return TRUE;
1546
12.2k
}
1547
static gboolean
1548
fu_struct_pe_coff_section_parse_internal(FuStructPeCoffSection *st, GError **error)
1549
12.2k
{
1550
12.2k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1551
0
        g_autofree gchar *str = fu_struct_pe_coff_section_to_string(st);
1552
0
        g_debug("%s", str);
1553
0
    }
1554
12.2k
    if (!fu_struct_pe_coff_section_validate_internal(st, error))
1555
0
        return FALSE;
1556
12.2k
    return TRUE;
1557
12.2k
}
1558
/**
1559
 * fu_struct_pe_coff_section_parse_stream: (skip):
1560
 **/
1561
FuStructPeCoffSection *
1562
fu_struct_pe_coff_section_parse_stream(GInputStream *stream, gsize offset, GError **error)
1563
12.3k
{
1564
12.3k
    g_autoptr(FuStructPeCoffSection) st = fu_struct_pe_coff_section_new_internal();
1565
12.3k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 40, NULL, error);
1566
12.3k
    if (st->buf == NULL) {
1567
45
        g_prefix_error(error, "FuStructPeCoffSection failed read of 0x%x: ", (guint) 40);
1568
45
        return NULL;
1569
45
    }
1570
12.3k
    if (st->buf->len != 40) {
1571
98
        g_set_error(error,
1572
98
                    FWUPD_ERROR,
1573
98
                    FWUPD_ERROR_INVALID_DATA,
1574
98
                    "FuStructPeCoffSection requested 0x%x and got 0x%x",
1575
98
                    (guint) 40,
1576
98
                    (guint) st->buf->len);
1577
98
        return NULL;
1578
98
    }
1579
12.2k
    if (!fu_struct_pe_coff_section_parse_internal(st, error))
1580
0
        return NULL;
1581
12.2k
    return g_steal_pointer(&st);
1582
12.2k
}