Coverage Report

Created: 2025-12-14 06:56

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
314k
{
164
314k
    g_return_if_fail(st != NULL);
165
314k
    if (st->refcount == 0) {
166
0
        g_critical("FuStructPeDosHeader refcount already zero");
167
0
        return;
168
0
    }
169
314k
    if (--st->refcount > 0)
170
0
        return;
171
314k
    if (st->buf != NULL)
172
314k
        g_byte_array_unref(st->buf);
173
314k
    g_free(st);
174
314k
}
175
/**
176
 * fu_struct_pe_dos_header_new_internal: (skip):
177
 **/
178
static FuStructPeDosHeader *
179
fu_struct_pe_dos_header_new_internal(void)
180
314k
{
181
314k
    FuStructPeDosHeader *st = g_new0(FuStructPeDosHeader, 1);
182
314k
    st->refcount = 1;
183
314k
    return st;
184
314k
}
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
601k
{
193
601k
    g_return_val_if_fail(st != NULL, 0x0);
194
601k
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
195
601k
}
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
3.90k
{
274
3.90k
    g_return_val_if_fail(st != NULL, 0x0);
275
3.90k
    return fu_memread_uint32(st->buf->data + 60, G_LITTLE_ENDIAN);
276
3.90k
}
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
302
{
285
302
    g_return_if_fail(st != NULL);
286
302
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
287
302
}
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
302
{
294
302
    g_return_if_fail(st != NULL);
295
302
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
296
302
}
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
302
{
303
302
    g_return_if_fail(st != NULL);
304
302
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
305
302
}
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
302
{
321
302
    g_return_if_fail(st != NULL);
322
302
    fu_memwrite_uint16(st->buf->data + 8, value, G_LITTLE_ENDIAN);
323
302
}
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
302
{
339
302
    g_return_if_fail(st != NULL);
340
302
    fu_memwrite_uint16(st->buf->data + 12, value, G_LITTLE_ENDIAN);
341
302
}
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
302
{
348
302
    g_return_if_fail(st != NULL);
349
302
    fu_memwrite_uint16(st->buf->data + 16, value, G_LITTLE_ENDIAN);
350
302
}
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
302
{
357
302
    g_return_if_fail(st != NULL);
358
302
    fu_memwrite_uint16(st->buf->data + 24, value, G_LITTLE_ENDIAN);
359
302
}
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
302
{
366
302
    g_return_if_fail(st != NULL);
367
302
    fu_memwrite_uint32(st->buf->data + 60, value, G_LITTLE_ENDIAN);
368
302
}
369
/**
370
 * fu_struct_pe_dos_header_new: (skip):
371
 **/
372
FuStructPeDosHeader *
373
fu_struct_pe_dos_header_new(void)
374
302
{
375
302
    FuStructPeDosHeader *st = fu_struct_pe_dos_header_new_internal();
376
302
    st->buf = g_byte_array_sized_new(128);
377
302
    fu_byte_array_set_size(st->buf, 128, 0x0);
378
302
    fu_struct_pe_dos_header_set_magic(st, 0x5A4D);
379
302
    fu_struct_pe_dos_header_set_cblp(st, 0x90);
380
302
    fu_struct_pe_dos_header_set_cp(st, 0x3);
381
302
    fu_struct_pe_dos_header_set_cparhdr(st, 0x4);
382
302
    fu_struct_pe_dos_header_set_maxalloc(st, 0xFFFF);
383
302
    fu_struct_pe_dos_header_set_sp(st, 0xB8);
384
302
    fu_struct_pe_dos_header_set_lfarlc(st, 0x40);
385
302
    fu_struct_pe_dos_header_set_lfanew(st, 0x80);
386
302
    return st;
387
302
}
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, "  cblp: 0x%x\n",
397
0
                           (guint) fu_struct_pe_dos_header_get_cblp(st));
398
0
    g_string_append_printf(str, "  cp: 0x%x\n",
399
0
                           (guint) fu_struct_pe_dos_header_get_cp(st));
400
0
    g_string_append_printf(str, "  crlc: 0x%x\n",
401
0
                           (guint) fu_struct_pe_dos_header_get_crlc(st));
402
0
    g_string_append_printf(str, "  cparhdr: 0x%x\n",
403
0
                           (guint) fu_struct_pe_dos_header_get_cparhdr(st));
404
0
    g_string_append_printf(str, "  minalloc: 0x%x\n",
405
0
                           (guint) fu_struct_pe_dos_header_get_minalloc(st));
406
0
    g_string_append_printf(str, "  maxalloc: 0x%x\n",
407
0
                           (guint) fu_struct_pe_dos_header_get_maxalloc(st));
408
0
    g_string_append_printf(str, "  sp: 0x%x\n",
409
0
                           (guint) fu_struct_pe_dos_header_get_sp(st));
410
0
    g_string_append_printf(str, "  lfarlc: 0x%x\n",
411
0
                           (guint) fu_struct_pe_dos_header_get_lfarlc(st));
412
0
    g_string_append_printf(str, "  lfanew: 0x%x\n",
413
0
                           (guint) fu_struct_pe_dos_header_get_lfanew(st));
414
0
    if (str->len > 0)
415
0
        g_string_set_size(str, str->len - 1);
416
0
    return g_string_free(g_steal_pointer(&str), FALSE);
417
0
}
418
static gboolean
419
fu_struct_pe_dos_header_validate_internal(FuStructPeDosHeader *st, GError **error)
420
304k
{
421
304k
    g_return_val_if_fail(st != NULL, FALSE);
422
304k
    if (fu_struct_pe_dos_header_get_magic(st) != 0x5A4D) {
423
296k
        g_set_error(error,
424
296k
                    FWUPD_ERROR,
425
296k
                    FWUPD_ERROR_INVALID_DATA,
426
296k
                    "constant FuStructPeDosHeader.magic was not valid, "
427
296k
                    "expected 0x%x and got 0x%x",
428
296k
                    (guint) 0x5A4D,
429
296k
                    (guint) fu_struct_pe_dos_header_get_magic(st));
430
296k
        return FALSE;
431
296k
    }
432
7.80k
    return TRUE;
433
304k
}
434
/**
435
 * fu_struct_pe_dos_header_validate_stream: (skip):
436
 **/
437
gboolean
438
fu_struct_pe_dos_header_validate_stream(GInputStream *stream, gsize offset, GError **error)
439
310k
{
440
310k
    g_autoptr(FuStructPeDosHeader) st = fu_struct_pe_dos_header_new_internal();
441
310k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
442
310k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
443
310k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 128, NULL, error);
444
310k
    if (st->buf == NULL) {
445
0
        g_prefix_error(error, "FuStructPeDosHeader failed read of 0x%x: ", (guint) 128);
446
0
        return FALSE;
447
0
    }
448
310k
    if (st->buf->len != 128) {
449
9.61k
        g_set_error(error,
450
9.61k
                    FWUPD_ERROR,
451
9.61k
                    FWUPD_ERROR_INVALID_DATA,
452
9.61k
                    "FuStructPeDosHeader requested 0x%x and got 0x%x",
453
9.61k
                    (guint) 128,
454
9.61k
                    (guint) st->buf->len);
455
9.61k
        return FALSE;
456
9.61k
    }
457
300k
    return fu_struct_pe_dos_header_validate_internal(st, error);
458
310k
}
459
static gboolean
460
fu_struct_pe_dos_header_parse_internal(FuStructPeDosHeader *st, GError **error)
461
3.90k
{
462
3.90k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
463
0
        g_autofree gchar *str = fu_struct_pe_dos_header_to_string(st);
464
0
        g_debug("%s", str);
465
0
    }
466
3.90k
    if (!fu_struct_pe_dos_header_validate_internal(st, error))
467
0
        return FALSE;
468
3.90k
    return TRUE;
469
3.90k
}
470
/**
471
 * fu_struct_pe_dos_header_parse_stream: (skip):
472
 **/
473
FuStructPeDosHeader *
474
fu_struct_pe_dos_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
475
3.90k
{
476
3.90k
    g_autoptr(FuStructPeDosHeader) st = fu_struct_pe_dos_header_new_internal();
477
3.90k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 128, NULL, error);
478
3.90k
    if (st->buf == NULL) {
479
0
        g_prefix_error(error, "FuStructPeDosHeader failed read of 0x%x: ", (guint) 128);
480
0
        return NULL;
481
0
    }
482
3.90k
    if (st->buf->len != 128) {
483
0
        g_set_error(error,
484
0
                    FWUPD_ERROR,
485
0
                    FWUPD_ERROR_INVALID_DATA,
486
0
                    "FuStructPeDosHeader requested 0x%x and got 0x%x",
487
0
                    (guint) 128,
488
0
                    (guint) st->buf->len);
489
0
        return NULL;
490
0
    }
491
3.90k
    if (!fu_struct_pe_dos_header_parse_internal(st, error))
492
0
        return NULL;
493
3.90k
    return g_steal_pointer(&st);
494
3.90k
}
495
/**
496
 * fu_struct_pe_coff_file_header_ref: (skip):
497
 **/
498
FuStructPeCoffFileHeader *
499
fu_struct_pe_coff_file_header_ref(FuStructPeCoffFileHeader *st)
500
0
{
501
0
    g_return_val_if_fail(st != NULL, NULL);
502
0
    st->refcount++;
503
0
    return st;
504
0
}
505
/**
506
 * fu_struct_pe_coff_file_header_unref: (skip):
507
 **/
508
void
509
fu_struct_pe_coff_file_header_unref(FuStructPeCoffFileHeader *st)
510
4.20k
{
511
4.20k
    g_return_if_fail(st != NULL);
512
4.20k
    if (st->refcount == 0) {
513
0
        g_critical("FuStructPeCoffFileHeader refcount already zero");
514
0
        return;
515
0
    }
516
4.20k
    if (--st->refcount > 0)
517
0
        return;
518
4.20k
    if (st->buf != NULL)
519
4.13k
        g_byte_array_unref(st->buf);
520
4.20k
    g_free(st);
521
4.20k
}
522
/**
523
 * fu_struct_pe_coff_file_header_new_internal: (skip):
524
 **/
525
static FuStructPeCoffFileHeader *
526
fu_struct_pe_coff_file_header_new_internal(void)
527
4.20k
{
528
4.20k
    FuStructPeCoffFileHeader *st = g_new0(FuStructPeCoffFileHeader, 1);
529
4.20k
    st->refcount = 1;
530
4.20k
    return st;
531
4.20k
}
532
533
/* getters */
534
/**
535
 * fu_struct_pe_coff_file_header_get_signature: (skip):
536
 **/
537
static guint32
538
fu_struct_pe_coff_file_header_get_signature(const FuStructPeCoffFileHeader *st)
539
3.88k
{
540
3.88k
    g_return_val_if_fail(st != NULL, 0x0);
541
3.88k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
542
3.88k
}
543
/**
544
 * fu_struct_pe_coff_file_header_get_machine: (skip):
545
 **/
546
FuPeCoffMachine
547
fu_struct_pe_coff_file_header_get_machine(const FuStructPeCoffFileHeader *st)
548
0
{
549
0
    g_return_val_if_fail(st != NULL, 0x0);
550
0
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
551
0
}
552
/**
553
 * fu_struct_pe_coff_file_header_get_number_of_sections: (skip):
554
 **/
555
guint16
556
fu_struct_pe_coff_file_header_get_number_of_sections(const FuStructPeCoffFileHeader *st)
557
3.71k
{
558
3.71k
    g_return_val_if_fail(st != NULL, 0x0);
559
3.71k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
560
3.71k
}
561
/**
562
 * fu_struct_pe_coff_file_header_get_pointer_to_symbol_table: (skip):
563
 **/
564
guint32
565
fu_struct_pe_coff_file_header_get_pointer_to_symbol_table(const FuStructPeCoffFileHeader *st)
566
3.71k
{
567
3.71k
    g_return_val_if_fail(st != NULL, 0x0);
568
3.71k
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
569
3.71k
}
570
/**
571
 * fu_struct_pe_coff_file_header_get_number_of_symbols: (skip):
572
 **/
573
guint32
574
fu_struct_pe_coff_file_header_get_number_of_symbols(const FuStructPeCoffFileHeader *st)
575
3.71k
{
576
3.71k
    g_return_val_if_fail(st != NULL, 0x0);
577
3.71k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
578
3.71k
}
579
/**
580
 * fu_struct_pe_coff_file_header_get_size_of_optional_header: (skip):
581
 **/
582
guint16
583
fu_struct_pe_coff_file_header_get_size_of_optional_header(const FuStructPeCoffFileHeader *st)
584
7.22k
{
585
7.22k
    g_return_val_if_fail(st != NULL, 0x0);
586
7.22k
    return fu_memread_uint16(st->buf->data + 20, G_LITTLE_ENDIAN);
587
7.22k
}
588
/**
589
 * fu_struct_pe_coff_file_header_get_characteristics: (skip):
590
 **/
591
guint16
592
fu_struct_pe_coff_file_header_get_characteristics(const FuStructPeCoffFileHeader *st)
593
0
{
594
0
    g_return_val_if_fail(st != NULL, 0x0);
595
0
    return fu_memread_uint16(st->buf->data + 22, G_LITTLE_ENDIAN);
596
0
}
597
598
/* setters */
599
/**
600
 * fu_struct_pe_coff_file_header_set_signature: (skip):
601
 **/
602
static void
603
fu_struct_pe_coff_file_header_set_signature(FuStructPeCoffFileHeader *st, guint32 value)
604
302
{
605
302
    g_return_if_fail(st != NULL);
606
302
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
607
302
}
608
/**
609
 * fu_struct_pe_coff_file_header_set_machine: (skip):
610
 **/
611
void
612
fu_struct_pe_coff_file_header_set_machine(FuStructPeCoffFileHeader *st, FuPeCoffMachine value)
613
302
{
614
302
    g_return_if_fail(st != NULL);
615
302
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
616
302
}
617
/**
618
 * fu_struct_pe_coff_file_header_set_number_of_sections: (skip):
619
 **/
620
void
621
fu_struct_pe_coff_file_header_set_number_of_sections(FuStructPeCoffFileHeader *st, guint16 value)
622
33
{
623
33
    g_return_if_fail(st != NULL);
624
33
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
625
33
}
626
/**
627
 * fu_struct_pe_coff_file_header_set_pointer_to_symbol_table: (skip):
628
 **/
629
void
630
fu_struct_pe_coff_file_header_set_pointer_to_symbol_table(FuStructPeCoffFileHeader *st, guint32 value)
631
33
{
632
33
    g_return_if_fail(st != NULL);
633
33
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
634
33
}
635
/**
636
 * fu_struct_pe_coff_file_header_set_number_of_symbols: (skip):
637
 **/
638
void
639
fu_struct_pe_coff_file_header_set_number_of_symbols(FuStructPeCoffFileHeader *st, guint32 value)
640
0
{
641
0
    g_return_if_fail(st != NULL);
642
0
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
643
0
}
644
/**
645
 * fu_struct_pe_coff_file_header_set_size_of_optional_header: (skip):
646
 **/
647
void
648
fu_struct_pe_coff_file_header_set_size_of_optional_header(FuStructPeCoffFileHeader *st, guint16 value)
649
335
{
650
335
    g_return_if_fail(st != NULL);
651
335
    fu_memwrite_uint16(st->buf->data + 20, value, G_LITTLE_ENDIAN);
652
335
}
653
/**
654
 * fu_struct_pe_coff_file_header_set_characteristics: (skip):
655
 **/
656
void
657
fu_struct_pe_coff_file_header_set_characteristics(FuStructPeCoffFileHeader *st, guint16 value)
658
302
{
659
302
    g_return_if_fail(st != NULL);
660
302
    fu_memwrite_uint16(st->buf->data + 22, value, G_LITTLE_ENDIAN);
661
302
}
662
/**
663
 * fu_struct_pe_coff_file_header_new: (skip):
664
 **/
665
FuStructPeCoffFileHeader *
666
fu_struct_pe_coff_file_header_new(void)
667
302
{
668
302
    FuStructPeCoffFileHeader *st = fu_struct_pe_coff_file_header_new_internal();
669
302
    st->buf = g_byte_array_sized_new(24);
670
302
    fu_byte_array_set_size(st->buf, 24, 0x0);
671
302
    fu_struct_pe_coff_file_header_set_signature(st, 0x4550);
672
302
    fu_struct_pe_coff_file_header_set_machine(st, FU_PE_COFF_MACHINE_AMD64);
673
302
    fu_struct_pe_coff_file_header_set_size_of_optional_header(st, 0xf0);
674
302
    fu_struct_pe_coff_file_header_set_characteristics(st, 0x2022);
675
302
    return st;
676
302
}
677
/**
678
 * fu_struct_pe_coff_file_header_to_string: (skip):
679
 **/
680
static gchar *
681
fu_struct_pe_coff_file_header_to_string(const FuStructPeCoffFileHeader *st)
682
0
{
683
0
    g_autoptr(GString) str = g_string_new("FuStructPeCoffFileHeader:\n");
684
0
    g_return_val_if_fail(st != NULL, NULL);
685
0
    {
686
0
        const gchar *tmp = fu_pe_coff_machine_to_string(fu_struct_pe_coff_file_header_get_machine(st));
687
0
        if (tmp != NULL) {
688
0
            g_string_append_printf(str, "  machine: 0x%x [%s]\n", (guint) fu_struct_pe_coff_file_header_get_machine(st), tmp);
689
0
        } else {
690
0
            g_string_append_printf(str, "  machine: 0x%x\n", (guint) fu_struct_pe_coff_file_header_get_machine(st));
691
0
        }
692
0
    }
693
0
    g_string_append_printf(str, "  number_of_sections: 0x%x\n",
694
0
                           (guint) fu_struct_pe_coff_file_header_get_number_of_sections(st));
695
0
    g_string_append_printf(str, "  pointer_to_symbol_table: 0x%x\n",
696
0
                           (guint) fu_struct_pe_coff_file_header_get_pointer_to_symbol_table(st));
697
0
    g_string_append_printf(str, "  number_of_symbols: 0x%x\n",
698
0
                           (guint) fu_struct_pe_coff_file_header_get_number_of_symbols(st));
699
0
    g_string_append_printf(str, "  size_of_optional_header: 0x%x\n",
700
0
                           (guint) fu_struct_pe_coff_file_header_get_size_of_optional_header(st));
701
0
    g_string_append_printf(str, "  characteristics: 0x%x\n",
702
0
                           (guint) fu_struct_pe_coff_file_header_get_characteristics(st));
703
0
    if (str->len > 0)
704
0
        g_string_set_size(str, str->len - 1);
705
0
    return g_string_free(g_steal_pointer(&str), FALSE);
706
0
}
707
static gboolean
708
fu_struct_pe_coff_file_header_validate_internal(FuStructPeCoffFileHeader *st, GError **error)
709
3.81k
{
710
3.81k
    g_return_val_if_fail(st != NULL, FALSE);
711
3.81k
    if (fu_struct_pe_coff_file_header_get_signature(st) != 0x4550) {
712
68
        g_set_error(error,
713
68
                    FWUPD_ERROR,
714
68
                    FWUPD_ERROR_INVALID_DATA,
715
68
                    "constant FuStructPeCoffFileHeader.signature was not valid, "
716
68
                    "expected 0x%x and got 0x%x",
717
68
                    (guint) 0x4550,
718
68
                    (guint) fu_struct_pe_coff_file_header_get_signature(st));
719
68
        return FALSE;
720
68
    }
721
3.74k
    return TRUE;
722
3.81k
}
723
static gboolean
724
fu_struct_pe_coff_file_header_parse_internal(FuStructPeCoffFileHeader *st, GError **error)
725
3.81k
{
726
3.81k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
727
0
        g_autofree gchar *str = fu_struct_pe_coff_file_header_to_string(st);
728
0
        g_debug("%s", str);
729
0
    }
730
3.81k
    if (!fu_struct_pe_coff_file_header_validate_internal(st, error))
731
68
        return FALSE;
732
3.74k
    return TRUE;
733
3.81k
}
734
/**
735
 * fu_struct_pe_coff_file_header_parse_stream: (skip):
736
 **/
737
FuStructPeCoffFileHeader *
738
fu_struct_pe_coff_file_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
739
3.90k
{
740
3.90k
    g_autoptr(FuStructPeCoffFileHeader) st = fu_struct_pe_coff_file_header_new_internal();
741
3.90k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 24, NULL, error);
742
3.90k
    if (st->buf == NULL) {
743
71
        g_prefix_error(error, "FuStructPeCoffFileHeader failed read of 0x%x: ", (guint) 24);
744
71
        return NULL;
745
71
    }
746
3.82k
    if (st->buf->len != 24) {
747
16
        g_set_error(error,
748
16
                    FWUPD_ERROR,
749
16
                    FWUPD_ERROR_INVALID_DATA,
750
16
                    "FuStructPeCoffFileHeader requested 0x%x and got 0x%x",
751
16
                    (guint) 24,
752
16
                    (guint) st->buf->len);
753
16
        return NULL;
754
16
    }
755
3.81k
    if (!fu_struct_pe_coff_file_header_parse_internal(st, error))
756
68
        return NULL;
757
3.74k
    return g_steal_pointer(&st);
758
3.81k
}
759
/**
760
 * fu_struct_pe_coff_optional_header64_ref: (skip):
761
 **/
762
FuStructPeCoffOptionalHeader64 *
763
fu_struct_pe_coff_optional_header64_ref(FuStructPeCoffOptionalHeader64 *st)
764
0
{
765
0
    g_return_val_if_fail(st != NULL, NULL);
766
0
    st->refcount++;
767
0
    return st;
768
0
}
769
/**
770
 * fu_struct_pe_coff_optional_header64_unref: (skip):
771
 **/
772
void
773
fu_struct_pe_coff_optional_header64_unref(FuStructPeCoffOptionalHeader64 *st)
774
3.81k
{
775
3.81k
    g_return_if_fail(st != NULL);
776
3.81k
    if (st->refcount == 0) {
777
0
        g_critical("FuStructPeCoffOptionalHeader64 refcount already zero");
778
0
        return;
779
0
    }
780
3.81k
    if (--st->refcount > 0)
781
0
        return;
782
3.81k
    if (st->buf != NULL)
783
3.81k
        g_byte_array_unref(st->buf);
784
3.81k
    g_free(st);
785
3.81k
}
786
/**
787
 * fu_struct_pe_coff_optional_header64_new_internal: (skip):
788
 **/
789
static FuStructPeCoffOptionalHeader64 *
790
fu_struct_pe_coff_optional_header64_new_internal(void)
791
3.81k
{
792
3.81k
    FuStructPeCoffOptionalHeader64 *st = g_new0(FuStructPeCoffOptionalHeader64, 1);
793
3.81k
    st->refcount = 1;
794
3.81k
    return st;
795
3.81k
}
796
797
/* getters */
798
/**
799
 * fu_struct_pe_coff_optional_header64_get_magic: (skip):
800
 **/
801
FuPeCoffMagic
802
fu_struct_pe_coff_optional_header64_get_magic(const FuStructPeCoffOptionalHeader64 *st)
803
0
{
804
0
    g_return_val_if_fail(st != NULL, 0x0);
805
0
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
806
0
}
807
/**
808
 * fu_struct_pe_coff_optional_header64_get_major_linker_version: (skip):
809
 **/
810
guint8
811
fu_struct_pe_coff_optional_header64_get_major_linker_version(const FuStructPeCoffOptionalHeader64 *st)
812
0
{
813
0
    g_return_val_if_fail(st != NULL, 0x0);
814
0
    return st->buf->data[2];
815
0
}
816
/**
817
 * fu_struct_pe_coff_optional_header64_get_minor_linker_version: (skip):
818
 **/
819
guint8
820
fu_struct_pe_coff_optional_header64_get_minor_linker_version(const FuStructPeCoffOptionalHeader64 *st)
821
0
{
822
0
    g_return_val_if_fail(st != NULL, 0x0);
823
0
    return st->buf->data[3];
824
0
}
825
/**
826
 * fu_struct_pe_coff_optional_header64_get_size_of_code: (skip):
827
 **/
828
guint32
829
fu_struct_pe_coff_optional_header64_get_size_of_code(const FuStructPeCoffOptionalHeader64 *st)
830
0
{
831
0
    g_return_val_if_fail(st != NULL, 0x0);
832
0
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
833
0
}
834
/**
835
 * fu_struct_pe_coff_optional_header64_get_size_of_initialized_data: (skip):
836
 **/
837
guint32
838
fu_struct_pe_coff_optional_header64_get_size_of_initialized_data(const FuStructPeCoffOptionalHeader64 *st)
839
0
{
840
0
    g_return_val_if_fail(st != NULL, 0x0);
841
0
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
842
0
}
843
/**
844
 * fu_struct_pe_coff_optional_header64_get_size_of_uninitialized_data: (skip):
845
 **/
846
guint32
847
fu_struct_pe_coff_optional_header64_get_size_of_uninitialized_data(const FuStructPeCoffOptionalHeader64 *st)
848
0
{
849
0
    g_return_val_if_fail(st != NULL, 0x0);
850
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
851
0
}
852
/**
853
 * fu_struct_pe_coff_optional_header64_get_addressofentrypoint: (skip):
854
 **/
855
guint32
856
fu_struct_pe_coff_optional_header64_get_addressofentrypoint(const FuStructPeCoffOptionalHeader64 *st)
857
0
{
858
0
    g_return_val_if_fail(st != NULL, 0x0);
859
0
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
860
0
}
861
/**
862
 * fu_struct_pe_coff_optional_header64_get_base_of_code: (skip):
863
 **/
864
guint32
865
fu_struct_pe_coff_optional_header64_get_base_of_code(const FuStructPeCoffOptionalHeader64 *st)
866
0
{
867
0
    g_return_val_if_fail(st != NULL, 0x0);
868
0
    return fu_memread_uint32(st->buf->data + 20, G_LITTLE_ENDIAN);
869
0
}
870
/**
871
 * fu_struct_pe_coff_optional_header64_get_image_base: (skip):
872
 **/
873
guint64
874
fu_struct_pe_coff_optional_header64_get_image_base(const FuStructPeCoffOptionalHeader64 *st)
875
0
{
876
0
    g_return_val_if_fail(st != NULL, 0x0);
877
0
    return fu_memread_uint64(st->buf->data + 24, G_LITTLE_ENDIAN);
878
0
}
879
/**
880
 * fu_struct_pe_coff_optional_header64_get_section_alignment: (skip):
881
 **/
882
guint32
883
fu_struct_pe_coff_optional_header64_get_section_alignment(const FuStructPeCoffOptionalHeader64 *st)
884
0
{
885
0
    g_return_val_if_fail(st != NULL, 0x0);
886
0
    return fu_memread_uint32(st->buf->data + 32, G_LITTLE_ENDIAN);
887
0
}
888
/**
889
 * fu_struct_pe_coff_optional_header64_get_file_alignment: (skip):
890
 **/
891
guint32
892
fu_struct_pe_coff_optional_header64_get_file_alignment(const FuStructPeCoffOptionalHeader64 *st)
893
0
{
894
0
    g_return_val_if_fail(st != NULL, 0x0);
895
0
    return fu_memread_uint32(st->buf->data + 36, G_LITTLE_ENDIAN);
896
0
}
897
/**
898
 * fu_struct_pe_coff_optional_header64_get_size_of_image: (skip):
899
 **/
900
guint32
901
fu_struct_pe_coff_optional_header64_get_size_of_image(const FuStructPeCoffOptionalHeader64 *st)
902
0
{
903
0
    g_return_val_if_fail(st != NULL, 0x0);
904
0
    return fu_memread_uint32(st->buf->data + 56, G_LITTLE_ENDIAN);
905
0
}
906
/**
907
 * fu_struct_pe_coff_optional_header64_get_size_of_headers: (skip):
908
 **/
909
guint32
910
fu_struct_pe_coff_optional_header64_get_size_of_headers(const FuStructPeCoffOptionalHeader64 *st)
911
5.45k
{
912
5.45k
    g_return_val_if_fail(st != NULL, 0x0);
913
5.45k
    return fu_memread_uint32(st->buf->data + 60, G_LITTLE_ENDIAN);
914
5.45k
}
915
/**
916
 * fu_struct_pe_coff_optional_header64_get_checksum: (skip):
917
 **/
918
guint32
919
fu_struct_pe_coff_optional_header64_get_checksum(const FuStructPeCoffOptionalHeader64 *st)
920
0
{
921
0
    g_return_val_if_fail(st != NULL, 0x0);
922
0
    return fu_memread_uint32(st->buf->data + 64, G_LITTLE_ENDIAN);
923
0
}
924
/**
925
 * fu_struct_pe_coff_optional_header64_get_subsystem: (skip):
926
 **/
927
FuCoffSubsystem
928
fu_struct_pe_coff_optional_header64_get_subsystem(const FuStructPeCoffOptionalHeader64 *st)
929
0
{
930
0
    g_return_val_if_fail(st != NULL, 0x0);
931
0
    return fu_memread_uint16(st->buf->data + 68, G_LITTLE_ENDIAN);
932
0
}
933
/**
934
 * fu_struct_pe_coff_optional_header64_get_loader_flags: (skip):
935
 **/
936
guint32
937
fu_struct_pe_coff_optional_header64_get_loader_flags(const FuStructPeCoffOptionalHeader64 *st)
938
0
{
939
0
    g_return_val_if_fail(st != NULL, 0x0);
940
0
    return fu_memread_uint32(st->buf->data + 104, G_LITTLE_ENDIAN);
941
0
}
942
/**
943
 * fu_struct_pe_coff_optional_header64_get_number_of_rva_and_sizes: (skip):
944
 **/
945
guint32
946
fu_struct_pe_coff_optional_header64_get_number_of_rva_and_sizes(const FuStructPeCoffOptionalHeader64 *st)
947
0
{
948
0
    g_return_val_if_fail(st != NULL, 0x0);
949
0
    return fu_memread_uint32(st->buf->data + 108, G_LITTLE_ENDIAN);
950
0
}
951
/**
952
 * fu_struct_pe_coff_optional_header64_get_certificate_table: (skip):
953
 **/
954
guint32
955
fu_struct_pe_coff_optional_header64_get_certificate_table(const FuStructPeCoffOptionalHeader64 *st)
956
0
{
957
0
    g_return_val_if_fail(st != NULL, 0x0);
958
0
    return fu_memread_uint32(st->buf->data + 144, G_LITTLE_ENDIAN);
959
0
}
960
/**
961
 * fu_struct_pe_coff_optional_header64_get_size_of_certificate_table: (skip):
962
 **/
963
guint32
964
fu_struct_pe_coff_optional_header64_get_size_of_certificate_table(const FuStructPeCoffOptionalHeader64 *st)
965
3.49k
{
966
3.49k
    g_return_val_if_fail(st != NULL, 0x0);
967
3.49k
    return fu_memread_uint32(st->buf->data + 148, G_LITTLE_ENDIAN);
968
3.49k
}
969
/**
970
 * fu_struct_pe_coff_optional_header64_get_debug_table: (skip):
971
 **/
972
guint32
973
fu_struct_pe_coff_optional_header64_get_debug_table(const FuStructPeCoffOptionalHeader64 *st)
974
0
{
975
0
    g_return_val_if_fail(st != NULL, 0x0);
976
0
    return fu_memread_uint32(st->buf->data + 152, G_LITTLE_ENDIAN);
977
0
}
978
/**
979
 * fu_struct_pe_coff_optional_header64_get_size_of_debug_table: (skip):
980
 **/
981
guint32
982
fu_struct_pe_coff_optional_header64_get_size_of_debug_table(const FuStructPeCoffOptionalHeader64 *st)
983
0
{
984
0
    g_return_val_if_fail(st != NULL, 0x0);
985
0
    return fu_memread_uint32(st->buf->data + 156, G_LITTLE_ENDIAN);
986
0
}
987
988
/* setters */
989
/**
990
 * fu_struct_pe_coff_optional_header64_set_magic: (skip):
991
 **/
992
void
993
fu_struct_pe_coff_optional_header64_set_magic(FuStructPeCoffOptionalHeader64 *st, FuPeCoffMagic value)
994
302
{
995
302
    g_return_if_fail(st != NULL);
996
302
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
997
302
}
998
/**
999
 * fu_struct_pe_coff_optional_header64_set_major_linker_version: (skip):
1000
 **/
1001
void
1002
fu_struct_pe_coff_optional_header64_set_major_linker_version(FuStructPeCoffOptionalHeader64 *st, guint8 value)
1003
302
{
1004
302
    g_return_if_fail(st != NULL);
1005
302
    st->buf->data[2] = value;
1006
302
}
1007
/**
1008
 * fu_struct_pe_coff_optional_header64_set_minor_linker_version: (skip):
1009
 **/
1010
void
1011
fu_struct_pe_coff_optional_header64_set_minor_linker_version(FuStructPeCoffOptionalHeader64 *st, guint8 value)
1012
302
{
1013
302
    g_return_if_fail(st != NULL);
1014
302
    st->buf->data[3] = value;
1015
302
}
1016
/**
1017
 * fu_struct_pe_coff_optional_header64_set_size_of_code: (skip):
1018
 **/
1019
void
1020
fu_struct_pe_coff_optional_header64_set_size_of_code(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1021
0
{
1022
0
    g_return_if_fail(st != NULL);
1023
0
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
1024
0
}
1025
/**
1026
 * fu_struct_pe_coff_optional_header64_set_size_of_initialized_data: (skip):
1027
 **/
1028
void
1029
fu_struct_pe_coff_optional_header64_set_size_of_initialized_data(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1030
0
{
1031
0
    g_return_if_fail(st != NULL);
1032
0
    fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN);
1033
0
}
1034
/**
1035
 * fu_struct_pe_coff_optional_header64_set_size_of_uninitialized_data: (skip):
1036
 **/
1037
void
1038
fu_struct_pe_coff_optional_header64_set_size_of_uninitialized_data(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1039
0
{
1040
0
    g_return_if_fail(st != NULL);
1041
0
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
1042
0
}
1043
/**
1044
 * fu_struct_pe_coff_optional_header64_set_addressofentrypoint: (skip):
1045
 **/
1046
void
1047
fu_struct_pe_coff_optional_header64_set_addressofentrypoint(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1048
0
{
1049
0
    g_return_if_fail(st != NULL);
1050
0
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
1051
0
}
1052
/**
1053
 * fu_struct_pe_coff_optional_header64_set_base_of_code: (skip):
1054
 **/
1055
void
1056
fu_struct_pe_coff_optional_header64_set_base_of_code(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1057
0
{
1058
0
    g_return_if_fail(st != NULL);
1059
0
    fu_memwrite_uint32(st->buf->data + 20, value, G_LITTLE_ENDIAN);
1060
0
}
1061
/**
1062
 * fu_struct_pe_coff_optional_header64_set_image_base: (skip):
1063
 **/
1064
void
1065
fu_struct_pe_coff_optional_header64_set_image_base(FuStructPeCoffOptionalHeader64 *st, guint64 value)
1066
0
{
1067
0
    g_return_if_fail(st != NULL);
1068
0
    fu_memwrite_uint64(st->buf->data + 24, value, G_LITTLE_ENDIAN);
1069
0
}
1070
/**
1071
 * fu_struct_pe_coff_optional_header64_set_section_alignment: (skip):
1072
 **/
1073
void
1074
fu_struct_pe_coff_optional_header64_set_section_alignment(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1075
302
{
1076
302
    g_return_if_fail(st != NULL);
1077
302
    fu_memwrite_uint32(st->buf->data + 32, value, G_LITTLE_ENDIAN);
1078
302
}
1079
/**
1080
 * fu_struct_pe_coff_optional_header64_set_file_alignment: (skip):
1081
 **/
1082
void
1083
fu_struct_pe_coff_optional_header64_set_file_alignment(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1084
302
{
1085
302
    g_return_if_fail(st != NULL);
1086
302
    fu_memwrite_uint32(st->buf->data + 36, value, G_LITTLE_ENDIAN);
1087
302
}
1088
/**
1089
 * fu_struct_pe_coff_optional_header64_set_size_of_image: (skip):
1090
 **/
1091
void
1092
fu_struct_pe_coff_optional_header64_set_size_of_image(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1093
0
{
1094
0
    g_return_if_fail(st != NULL);
1095
0
    fu_memwrite_uint32(st->buf->data + 56, value, G_LITTLE_ENDIAN);
1096
0
}
1097
/**
1098
 * fu_struct_pe_coff_optional_header64_set_size_of_headers: (skip):
1099
 **/
1100
void
1101
fu_struct_pe_coff_optional_header64_set_size_of_headers(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1102
0
{
1103
0
    g_return_if_fail(st != NULL);
1104
0
    fu_memwrite_uint32(st->buf->data + 60, value, G_LITTLE_ENDIAN);
1105
0
}
1106
/**
1107
 * fu_struct_pe_coff_optional_header64_set_checksum: (skip):
1108
 **/
1109
void
1110
fu_struct_pe_coff_optional_header64_set_checksum(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1111
0
{
1112
0
    g_return_if_fail(st != NULL);
1113
0
    fu_memwrite_uint32(st->buf->data + 64, value, G_LITTLE_ENDIAN);
1114
0
}
1115
/**
1116
 * fu_struct_pe_coff_optional_header64_set_subsystem: (skip):
1117
 **/
1118
void
1119
fu_struct_pe_coff_optional_header64_set_subsystem(FuStructPeCoffOptionalHeader64 *st, FuCoffSubsystem value)
1120
302
{
1121
302
    g_return_if_fail(st != NULL);
1122
302
    fu_memwrite_uint16(st->buf->data + 68, value, G_LITTLE_ENDIAN);
1123
302
}
1124
/**
1125
 * fu_struct_pe_coff_optional_header64_set_loader_flags: (skip):
1126
 **/
1127
void
1128
fu_struct_pe_coff_optional_header64_set_loader_flags(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1129
0
{
1130
0
    g_return_if_fail(st != NULL);
1131
0
    fu_memwrite_uint32(st->buf->data + 104, value, G_LITTLE_ENDIAN);
1132
0
}
1133
/**
1134
 * fu_struct_pe_coff_optional_header64_set_number_of_rva_and_sizes: (skip):
1135
 **/
1136
void
1137
fu_struct_pe_coff_optional_header64_set_number_of_rva_and_sizes(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1138
33
{
1139
33
    g_return_if_fail(st != NULL);
1140
33
    fu_memwrite_uint32(st->buf->data + 108, value, G_LITTLE_ENDIAN);
1141
33
}
1142
/**
1143
 * fu_struct_pe_coff_optional_header64_set_certificate_table: (skip):
1144
 **/
1145
void
1146
fu_struct_pe_coff_optional_header64_set_certificate_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1147
0
{
1148
0
    g_return_if_fail(st != NULL);
1149
0
    fu_memwrite_uint32(st->buf->data + 144, value, G_LITTLE_ENDIAN);
1150
0
}
1151
/**
1152
 * fu_struct_pe_coff_optional_header64_set_size_of_certificate_table: (skip):
1153
 **/
1154
void
1155
fu_struct_pe_coff_optional_header64_set_size_of_certificate_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1156
0
{
1157
0
    g_return_if_fail(st != NULL);
1158
0
    fu_memwrite_uint32(st->buf->data + 148, value, G_LITTLE_ENDIAN);
1159
0
}
1160
/**
1161
 * fu_struct_pe_coff_optional_header64_set_debug_table: (skip):
1162
 **/
1163
void
1164
fu_struct_pe_coff_optional_header64_set_debug_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1165
0
{
1166
0
    g_return_if_fail(st != NULL);
1167
0
    fu_memwrite_uint32(st->buf->data + 152, value, G_LITTLE_ENDIAN);
1168
0
}
1169
/**
1170
 * fu_struct_pe_coff_optional_header64_set_size_of_debug_table: (skip):
1171
 **/
1172
void
1173
fu_struct_pe_coff_optional_header64_set_size_of_debug_table(FuStructPeCoffOptionalHeader64 *st, guint32 value)
1174
0
{
1175
0
    g_return_if_fail(st != NULL);
1176
0
    fu_memwrite_uint32(st->buf->data + 156, value, G_LITTLE_ENDIAN);
1177
0
}
1178
/**
1179
 * fu_struct_pe_coff_optional_header64_new: (skip):
1180
 **/
1181
FuStructPeCoffOptionalHeader64 *
1182
fu_struct_pe_coff_optional_header64_new(void)
1183
302
{
1184
302
    FuStructPeCoffOptionalHeader64 *st = fu_struct_pe_coff_optional_header64_new_internal();
1185
302
    st->buf = g_byte_array_sized_new(176);
1186
302
    fu_byte_array_set_size(st->buf, 176, 0x0);
1187
302
    fu_struct_pe_coff_optional_header64_set_magic(st, FU_PE_COFF_MAGIC_PE32_PLUS);
1188
302
    fu_struct_pe_coff_optional_header64_set_major_linker_version(st, 0x0e);
1189
302
    fu_struct_pe_coff_optional_header64_set_minor_linker_version(st, 0x0e);
1190
302
    fu_struct_pe_coff_optional_header64_set_section_alignment(st, 0x200);
1191
302
    fu_struct_pe_coff_optional_header64_set_file_alignment(st, 0x200);
1192
302
    fu_struct_pe_coff_optional_header64_set_subsystem(st, FU_COFF_SUBSYSTEM_EFI_APPLICATION);
1193
302
    return st;
1194
302
}
1195
/**
1196
 * fu_struct_pe_coff_optional_header64_to_string: (skip):
1197
 **/
1198
static gchar *
1199
fu_struct_pe_coff_optional_header64_to_string(const FuStructPeCoffOptionalHeader64 *st)
1200
0
{
1201
0
    g_autoptr(GString) str = g_string_new("FuStructPeCoffOptionalHeader64:\n");
1202
0
    g_return_val_if_fail(st != NULL, NULL);
1203
0
    {
1204
0
        const gchar *tmp = fu_pe_coff_magic_to_string(fu_struct_pe_coff_optional_header64_get_magic(st));
1205
0
        if (tmp != NULL) {
1206
0
            g_string_append_printf(str, "  magic: 0x%x [%s]\n", (guint) fu_struct_pe_coff_optional_header64_get_magic(st), tmp);
1207
0
        } else {
1208
0
            g_string_append_printf(str, "  magic: 0x%x\n", (guint) fu_struct_pe_coff_optional_header64_get_magic(st));
1209
0
        }
1210
0
    }
1211
0
    g_string_append_printf(str, "  major_linker_version: 0x%x\n",
1212
0
                           (guint) fu_struct_pe_coff_optional_header64_get_major_linker_version(st));
1213
0
    g_string_append_printf(str, "  minor_linker_version: 0x%x\n",
1214
0
                           (guint) fu_struct_pe_coff_optional_header64_get_minor_linker_version(st));
1215
0
    g_string_append_printf(str, "  size_of_code: 0x%x\n",
1216
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_code(st));
1217
0
    g_string_append_printf(str, "  size_of_initialized_data: 0x%x\n",
1218
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_initialized_data(st));
1219
0
    g_string_append_printf(str, "  size_of_uninitialized_data: 0x%x\n",
1220
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_uninitialized_data(st));
1221
0
    g_string_append_printf(str, "  addressofentrypoint: 0x%x\n",
1222
0
                           (guint) fu_struct_pe_coff_optional_header64_get_addressofentrypoint(st));
1223
0
    g_string_append_printf(str, "  base_of_code: 0x%x\n",
1224
0
                           (guint) fu_struct_pe_coff_optional_header64_get_base_of_code(st));
1225
0
    g_string_append_printf(str, "  image_base: 0x%x\n",
1226
0
                           (guint) fu_struct_pe_coff_optional_header64_get_image_base(st));
1227
0
    g_string_append_printf(str, "  section_alignment: 0x%x\n",
1228
0
                           (guint) fu_struct_pe_coff_optional_header64_get_section_alignment(st));
1229
0
    g_string_append_printf(str, "  file_alignment: 0x%x\n",
1230
0
                           (guint) fu_struct_pe_coff_optional_header64_get_file_alignment(st));
1231
0
    g_string_append_printf(str, "  size_of_image: 0x%x\n",
1232
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_image(st));
1233
0
    g_string_append_printf(str, "  size_of_headers: 0x%x\n",
1234
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_headers(st));
1235
0
    g_string_append_printf(str, "  checksum: 0x%x\n",
1236
0
                           (guint) fu_struct_pe_coff_optional_header64_get_checksum(st));
1237
0
    {
1238
0
        const gchar *tmp = fu_coff_subsystem_to_string(fu_struct_pe_coff_optional_header64_get_subsystem(st));
1239
0
        if (tmp != NULL) {
1240
0
            g_string_append_printf(str, "  subsystem: 0x%x [%s]\n", (guint) fu_struct_pe_coff_optional_header64_get_subsystem(st), tmp);
1241
0
        } else {
1242
0
            g_string_append_printf(str, "  subsystem: 0x%x\n", (guint) fu_struct_pe_coff_optional_header64_get_subsystem(st));
1243
0
        }
1244
0
    }
1245
0
    g_string_append_printf(str, "  loader_flags: 0x%x\n",
1246
0
                           (guint) fu_struct_pe_coff_optional_header64_get_loader_flags(st));
1247
0
    g_string_append_printf(str, "  number_of_rva_and_sizes: 0x%x\n",
1248
0
                           (guint) fu_struct_pe_coff_optional_header64_get_number_of_rva_and_sizes(st));
1249
0
    g_string_append_printf(str, "  certificate_table: 0x%x\n",
1250
0
                           (guint) fu_struct_pe_coff_optional_header64_get_certificate_table(st));
1251
0
    g_string_append_printf(str, "  size_of_certificate_table: 0x%x\n",
1252
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_certificate_table(st));
1253
0
    g_string_append_printf(str, "  debug_table: 0x%x\n",
1254
0
                           (guint) fu_struct_pe_coff_optional_header64_get_debug_table(st));
1255
0
    g_string_append_printf(str, "  size_of_debug_table: 0x%x\n",
1256
0
                           (guint) fu_struct_pe_coff_optional_header64_get_size_of_debug_table(st));
1257
0
    if (str->len > 0)
1258
0
        g_string_set_size(str, str->len - 1);
1259
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1260
0
}
1261
static gboolean
1262
fu_struct_pe_coff_optional_header64_validate_internal(FuStructPeCoffOptionalHeader64 *st, GError **error)
1263
3.49k
{
1264
3.49k
    g_return_val_if_fail(st != NULL, FALSE);
1265
3.49k
    return TRUE;
1266
3.49k
}
1267
static gboolean
1268
fu_struct_pe_coff_optional_header64_parse_internal(FuStructPeCoffOptionalHeader64 *st, GError **error)
1269
3.49k
{
1270
3.49k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1271
0
        g_autofree gchar *str = fu_struct_pe_coff_optional_header64_to_string(st);
1272
0
        g_debug("%s", str);
1273
0
    }
1274
3.49k
    if (!fu_struct_pe_coff_optional_header64_validate_internal(st, error))
1275
0
        return FALSE;
1276
3.49k
    return TRUE;
1277
3.49k
}
1278
/**
1279
 * fu_struct_pe_coff_optional_header64_parse_stream: (skip):
1280
 **/
1281
FuStructPeCoffOptionalHeader64 *
1282
fu_struct_pe_coff_optional_header64_parse_stream(GInputStream *stream, gsize offset, GError **error)
1283
3.51k
{
1284
3.51k
    g_autoptr(FuStructPeCoffOptionalHeader64) st = fu_struct_pe_coff_optional_header64_new_internal();
1285
3.51k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 176, NULL, error);
1286
3.51k
    if (st->buf == NULL) {
1287
0
        g_prefix_error(error, "FuStructPeCoffOptionalHeader64 failed read of 0x%x: ", (guint) 176);
1288
0
        return NULL;
1289
0
    }
1290
3.51k
    if (st->buf->len != 176) {
1291
24
        g_set_error(error,
1292
24
                    FWUPD_ERROR,
1293
24
                    FWUPD_ERROR_INVALID_DATA,
1294
24
                    "FuStructPeCoffOptionalHeader64 requested 0x%x and got 0x%x",
1295
24
                    (guint) 176,
1296
24
                    (guint) st->buf->len);
1297
24
        return NULL;
1298
24
    }
1299
3.49k
    if (!fu_struct_pe_coff_optional_header64_parse_internal(st, error))
1300
0
        return NULL;
1301
3.49k
    return g_steal_pointer(&st);
1302
3.49k
}
1303
/**
1304
 * fu_struct_pe_coff_symbol_ref: (skip):
1305
 **/
1306
FuStructPeCoffSymbol *
1307
fu_struct_pe_coff_symbol_ref(FuStructPeCoffSymbol *st)
1308
0
{
1309
0
    g_return_val_if_fail(st != NULL, NULL);
1310
0
    st->refcount++;
1311
0
    return st;
1312
0
}
1313
/**
1314
 * fu_struct_pe_coff_symbol_unref: (skip):
1315
 **/
1316
void
1317
fu_struct_pe_coff_symbol_unref(FuStructPeCoffSymbol *st)
1318
0
{
1319
0
    g_return_if_fail(st != NULL);
1320
0
    if (st->refcount == 0) {
1321
0
        g_critical("FuStructPeCoffSymbol refcount already zero");
1322
0
        return;
1323
0
    }
1324
0
    if (--st->refcount > 0)
1325
0
        return;
1326
0
    if (st->buf != NULL)
1327
0
        g_byte_array_unref(st->buf);
1328
0
    g_free(st);
1329
0
}
1330
1331
/* getters */
1332
1333
/* setters */
1334
/**
1335
 * fu_struct_pe_coff_section_ref: (skip):
1336
 **/
1337
FuStructPeCoffSection *
1338
fu_struct_pe_coff_section_ref(FuStructPeCoffSection *st)
1339
0
{
1340
0
    g_return_val_if_fail(st != NULL, NULL);
1341
0
    st->refcount++;
1342
0
    return st;
1343
0
}
1344
/**
1345
 * fu_struct_pe_coff_section_unref: (skip):
1346
 **/
1347
void
1348
fu_struct_pe_coff_section_unref(FuStructPeCoffSection *st)
1349
14.0k
{
1350
14.0k
    g_return_if_fail(st != NULL);
1351
14.0k
    if (st->refcount == 0) {
1352
0
        g_critical("FuStructPeCoffSection refcount already zero");
1353
0
        return;
1354
0
    }
1355
14.0k
    if (--st->refcount > 0)
1356
0
        return;
1357
14.0k
    if (st->buf != NULL)
1358
14.0k
        g_byte_array_unref(st->buf);
1359
14.0k
    g_free(st);
1360
14.0k
}
1361
/**
1362
 * fu_struct_pe_coff_section_new_internal: (skip):
1363
 **/
1364
static FuStructPeCoffSection *
1365
fu_struct_pe_coff_section_new_internal(void)
1366
14.0k
{
1367
14.0k
    FuStructPeCoffSection *st = g_new0(FuStructPeCoffSection, 1);
1368
14.0k
    st->refcount = 1;
1369
14.0k
    return st;
1370
14.0k
}
1371
1372
/* getters */
1373
/**
1374
 * fu_struct_pe_coff_section_get_name: (skip):
1375
 **/
1376
gchar *
1377
fu_struct_pe_coff_section_get_name(const FuStructPeCoffSection *st)
1378
13.8k
{
1379
13.8k
    g_return_val_if_fail(st != NULL, NULL);
1380
13.8k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 8, NULL);
1381
13.8k
}
1382
/**
1383
 * fu_struct_pe_coff_section_get_virtual_size: (skip):
1384
 **/
1385
guint32
1386
fu_struct_pe_coff_section_get_virtual_size(const FuStructPeCoffSection *st)
1387
31.5k
{
1388
31.5k
    g_return_val_if_fail(st != NULL, 0x0);
1389
31.5k
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
1390
31.5k
}
1391
/**
1392
 * fu_struct_pe_coff_section_get_virtual_address: (skip):
1393
 **/
1394
guint32
1395
fu_struct_pe_coff_section_get_virtual_address(const FuStructPeCoffSection *st)
1396
0
{
1397
0
    g_return_val_if_fail(st != NULL, 0x0);
1398
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
1399
0
}
1400
/**
1401
 * fu_struct_pe_coff_section_get_size_of_raw_data: (skip):
1402
 **/
1403
guint32
1404
fu_struct_pe_coff_section_get_size_of_raw_data(const FuStructPeCoffSection *st)
1405
29.4k
{
1406
29.4k
    g_return_val_if_fail(st != NULL, 0x0);
1407
29.4k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
1408
29.4k
}
1409
/**
1410
 * fu_struct_pe_coff_section_get_pointer_to_raw_data: (skip):
1411
 **/
1412
guint32
1413
fu_struct_pe_coff_section_get_pointer_to_raw_data(const FuStructPeCoffSection *st)
1414
8.89k
{
1415
8.89k
    g_return_val_if_fail(st != NULL, 0x0);
1416
8.89k
    return fu_memread_uint32(st->buf->data + 20, G_LITTLE_ENDIAN);
1417
8.89k
}
1418
/**
1419
 * fu_struct_pe_coff_section_get_characteristics: (skip):
1420
 **/
1421
guint32
1422
fu_struct_pe_coff_section_get_characteristics(const FuStructPeCoffSection *st)
1423
0
{
1424
0
    g_return_val_if_fail(st != NULL, 0x0);
1425
0
    return fu_memread_uint32(st->buf->data + 36, G_LITTLE_ENDIAN);
1426
0
}
1427
1428
/* setters */
1429
/**
1430
 * fu_struct_pe_coff_section_set_name: (skip):
1431
 **/
1432
gboolean
1433
fu_struct_pe_coff_section_set_name(FuStructPeCoffSection *st, const gchar *value, GError **error)
1434
62
{
1435
62
    gsize len;
1436
62
    g_return_val_if_fail(st != NULL, FALSE);
1437
62
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
1438
62
    if (value == NULL) {
1439
0
        memset(st->buf->data + 0, 0x0, 8);
1440
0
        return TRUE;
1441
0
    }
1442
62
    len = strlen(value);
1443
62
    if (len > 8) {
1444
0
        g_set_error(error,
1445
0
                    FWUPD_ERROR,
1446
0
                    FWUPD_ERROR_INVALID_DATA,
1447
0
                    "string '%s' (0x%x bytes) does not fit in FuStructPeCoffSection.name (0x%x bytes)",
1448
0
                    value, (guint) len, (guint) 8);
1449
0
        return FALSE;
1450
0
    }
1451
62
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
1452
62
}
1453
/**
1454
 * fu_struct_pe_coff_section_set_virtual_size: (skip):
1455
 **/
1456
void
1457
fu_struct_pe_coff_section_set_virtual_size(FuStructPeCoffSection *st, guint32 value)
1458
62
{
1459
62
    g_return_if_fail(st != NULL);
1460
62
    fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN);
1461
62
}
1462
/**
1463
 * fu_struct_pe_coff_section_set_virtual_address: (skip):
1464
 **/
1465
void
1466
fu_struct_pe_coff_section_set_virtual_address(FuStructPeCoffSection *st, guint32 value)
1467
62
{
1468
62
    g_return_if_fail(st != NULL);
1469
62
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
1470
62
}
1471
/**
1472
 * fu_struct_pe_coff_section_set_size_of_raw_data: (skip):
1473
 **/
1474
void
1475
fu_struct_pe_coff_section_set_size_of_raw_data(FuStructPeCoffSection *st, guint32 value)
1476
62
{
1477
62
    g_return_if_fail(st != NULL);
1478
62
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
1479
62
}
1480
/**
1481
 * fu_struct_pe_coff_section_set_pointer_to_raw_data: (skip):
1482
 **/
1483
void
1484
fu_struct_pe_coff_section_set_pointer_to_raw_data(FuStructPeCoffSection *st, guint32 value)
1485
62
{
1486
62
    g_return_if_fail(st != NULL);
1487
62
    fu_memwrite_uint32(st->buf->data + 20, value, G_LITTLE_ENDIAN);
1488
62
}
1489
/**
1490
 * fu_struct_pe_coff_section_set_characteristics: (skip):
1491
 **/
1492
void
1493
fu_struct_pe_coff_section_set_characteristics(FuStructPeCoffSection *st, guint32 value)
1494
0
{
1495
0
    g_return_if_fail(st != NULL);
1496
0
    fu_memwrite_uint32(st->buf->data + 36, value, G_LITTLE_ENDIAN);
1497
0
}
1498
/**
1499
 * fu_struct_pe_coff_section_new: (skip):
1500
 **/
1501
FuStructPeCoffSection *
1502
fu_struct_pe_coff_section_new(void)
1503
62
{
1504
62
    FuStructPeCoffSection *st = fu_struct_pe_coff_section_new_internal();
1505
62
    st->buf = g_byte_array_sized_new(40);
1506
62
    fu_byte_array_set_size(st->buf, 40, 0x0);
1507
62
    return st;
1508
62
}
1509
/**
1510
 * fu_struct_pe_coff_section_to_string: (skip):
1511
 **/
1512
static gchar *
1513
fu_struct_pe_coff_section_to_string(const FuStructPeCoffSection *st)
1514
0
{
1515
0
    g_autoptr(GString) str = g_string_new("FuStructPeCoffSection:\n");
1516
0
    g_return_val_if_fail(st != NULL, NULL);
1517
0
    {
1518
0
        g_autofree gchar *tmp = fu_struct_pe_coff_section_get_name(st);
1519
0
        if (tmp != NULL)
1520
0
            g_string_append_printf(str, "  name: %s\n", tmp);
1521
0
    }
1522
0
    g_string_append_printf(str, "  virtual_size: 0x%x\n",
1523
0
                           (guint) fu_struct_pe_coff_section_get_virtual_size(st));
1524
0
    g_string_append_printf(str, "  virtual_address: 0x%x\n",
1525
0
                           (guint) fu_struct_pe_coff_section_get_virtual_address(st));
1526
0
    g_string_append_printf(str, "  size_of_raw_data: 0x%x\n",
1527
0
                           (guint) fu_struct_pe_coff_section_get_size_of_raw_data(st));
1528
0
    g_string_append_printf(str, "  pointer_to_raw_data: 0x%x\n",
1529
0
                           (guint) fu_struct_pe_coff_section_get_pointer_to_raw_data(st));
1530
0
    g_string_append_printf(str, "  characteristics: 0x%x\n",
1531
0
                           (guint) fu_struct_pe_coff_section_get_characteristics(st));
1532
0
    if (str->len > 0)
1533
0
        g_string_set_size(str, str->len - 1);
1534
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1535
0
}
1536
static gboolean
1537
fu_struct_pe_coff_section_validate_internal(FuStructPeCoffSection *st, GError **error)
1538
13.8k
{
1539
13.8k
    g_return_val_if_fail(st != NULL, FALSE);
1540
13.8k
    return TRUE;
1541
13.8k
}
1542
static gboolean
1543
fu_struct_pe_coff_section_parse_internal(FuStructPeCoffSection *st, GError **error)
1544
13.8k
{
1545
13.8k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1546
0
        g_autofree gchar *str = fu_struct_pe_coff_section_to_string(st);
1547
0
        g_debug("%s", str);
1548
0
    }
1549
13.8k
    if (!fu_struct_pe_coff_section_validate_internal(st, error))
1550
0
        return FALSE;
1551
13.8k
    return TRUE;
1552
13.8k
}
1553
/**
1554
 * fu_struct_pe_coff_section_parse_stream: (skip):
1555
 **/
1556
FuStructPeCoffSection *
1557
fu_struct_pe_coff_section_parse_stream(GInputStream *stream, gsize offset, GError **error)
1558
13.9k
{
1559
13.9k
    g_autoptr(FuStructPeCoffSection) st = fu_struct_pe_coff_section_new_internal();
1560
13.9k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 40, NULL, error);
1561
13.9k
    if (st->buf == NULL) {
1562
37
        g_prefix_error(error, "FuStructPeCoffSection failed read of 0x%x: ", (guint) 40);
1563
37
        return NULL;
1564
37
    }
1565
13.9k
    if (st->buf->len != 40) {
1566
70
        g_set_error(error,
1567
70
                    FWUPD_ERROR,
1568
70
                    FWUPD_ERROR_INVALID_DATA,
1569
70
                    "FuStructPeCoffSection requested 0x%x and got 0x%x",
1570
70
                    (guint) 40,
1571
70
                    (guint) st->buf->len);
1572
70
        return NULL;
1573
70
    }
1574
13.8k
    if (!fu_struct_pe_coff_section_parse_internal(st, error))
1575
0
        return NULL;
1576
13.8k
    return g_steal_pointer(&st);
1577
13.8k
}