Coverage Report

Created: 2025-11-11 06:44

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