Coverage Report

Created: 2026-01-09 07:21

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