Coverage Report

Created: 2025-11-24 06:59

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