Bitdefender Hypervisor Memory Introspection
winpe.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Bitdefender
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #ifndef _WINPE_H_
6 #define _WINPE_H_
7 
10 
11 #include "winguest.h"
12 #include "winumcache.h"
13 
14 
15 // MZ & PE signatures.
16 #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ signature.
17 #define IMAGE_NT_SIGNATURE 0x00004550 // PE00 signature.
18 
19 // Data directories.
20 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
21 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
22 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
23 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
24 #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
25 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
26 #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
27 // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
28 #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data
29 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
30 #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
31 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
32 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
33 #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
34 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
35 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
36 
37 // DOS header.
38 typedef struct _IMAGE_DOS_HEADER
39 {
40  UINT16 e_magic; // Magic number
41  UINT16 e_cblp; // Bytes on last page of file
42  UINT16 e_cp; // Pages in file
43  UINT16 e_crlc; // Relocations
44  UINT16 e_cparhdr; // Size of header in paragraphs
45  UINT16 e_minalloc; // Minimum extra paragraphs needed
46  UINT16 e_maxalloc; // Maximum extra paragraphs needed
47  UINT16 e_ss; // Initial (relative) SS value
48  UINT16 e_sp; // Initial SP value
49  UINT16 e_csum; // Checksum
50  UINT16 e_ip; // Initial IP value
51  UINT16 e_cs; // Initial (relative) CS value
52  UINT16 e_lfarlc; // File address of relocation table
53  UINT16 e_ovno; // Overlay number
54  UINT16 e_res[4]; // Reserved words
55  UINT16 e_oemid; // OEM identifier (for e_oeminfo)
56  UINT16 e_oeminfo; // OEM information; e_oemid specific
57  UINT16 e_res2[10]; // Reserved words
58  INT32 e_lfanew; // File address of new exe header
60 
61 // File header.
62 typedef struct _IMAGE_FILE_HEADER
63 {
72 
73 // Size of the section name.
74 #define IMAGE_SIZEOF_SHORT_NAME 8u
75 
76 // Section header.
77 typedef struct _IMAGE_SECTION_HEADER
78 {
80  union
81  {
84  } Misc;
94 
95 // Data directory.
96 typedef struct _IMAGE_DATA_DIRECTORY
97 {
101 
102 // Maximum number of data directories.
103 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
104 
105 // Resource data entry.
107 {
113 
114 // Resource directory entry.
116 {
117  union
118  {
119  struct
120  {
123  };
126  };
127  union
128  {
130  struct
131  {
134  };
135  };
137 
138 // Optional header.
140 {
141  //
142  // Standard fields.
143  //
144 
154 
155  //
156  // NT additional fields.
157  //
158 
182 
184 {
216 
217 typedef struct _IMAGE_NT_HEADERS64
218 {
223 
224 typedef struct _IMAGE_NT_HEADERS
225 {
230 
231 
233 {
234  union
235  {
236  UINT32 Characteristics; // 0 for terminating null import descriptor
237  UINT32 LookupTable; // Import Lookup Table RVA (pecoff_v8.docx pg 76)
238  } u;
239  UINT32 TimeDateStamp; // 0 if not bound,
240  // -1 if bound, and real date\time stamp
241  // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
242  // O.W. date/time stamp of DLL bound to (Old BIND)
243 
244  UINT32 ForwarderChain; // -1 if no forwarders
246  UINT32 FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
249 
250 typedef struct _IMAGE_IMPORT_BY_NAME
251 {
253  UINT8 Name[1];
255 
256 
257 // 8 Byte packing needed here
258 #pragma pack(push)
259 #pragma pack(8)
260 typedef struct _IMAGE_THUNK_DATA64
261 {
262  union
263  {
265  UINT64 Function; // PULONG
267  UINT64 AddressOfData; // IMAGE_IMPORT_BY_NAME
268  } u1;
270 #pragma pack(pop)
271 
272 // Back to 4 byte packing
273 typedef struct _IMAGE_THUNK_DATA32
274 {
275  union
276  {
278  UINT32 Function; // PULONG
280  UINT32 AddressOfData; // IMAGE_IMPORT_BY_NAME
281  } u1;
283 
284 
285 //
286 // Based relocation format.
287 //
289 {
292  // UINT16 TypeOffset[1];
295 
296 
297 
298 //
299 // IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is the same either way.
300 //
301 #define IMAGE_FIRST_SECTION( ntheader ) ((IMAGE_SECTION_HEADER) \
302  ((size_t *)(ntheader) + \
303  FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
304  ((ntheader))->FileHeader.SizeOfOptionalHeader \
305  ))
306 
307 //
308 // Based relocation types.
309 //
310 #define IMAGE_REL_BASED_ABSOLUTE 0
311 #define IMAGE_REL_BASED_HIGH 1
312 #define IMAGE_REL_BASED_LOW 2
313 #define IMAGE_REL_BASED_HIGHLOW 3
314 #define IMAGE_REL_BASED_HIGHADJ 4
315 #define IMAGE_REL_BASED_MIPS_JMPADDR 5
316 // end_winnt
317 #define IMAGE_REL_BASED_SECTION 6
318 #define IMAGE_REL_BASED_REL32 7
319 // IMAGE_REL_BASED_VXD_RELATIVE 8
320 // begin_winnt
321 #define IMAGE_REL_BASED_MIPS_JMPADDR16 9
322 #define IMAGE_REL_BASED_IA64_IMM64 9
323 #define IMAGE_REL_BASED_DIR64 10
324 
325 
326 
328 {
337  UINT32 AddressOfFunctions; // RVA from base of image
338  UINT32 AddressOfNames; // RVA from base of image
339  UINT32 AddressOfNameOrdinals; // RVA from base of image
341 
343 {
350  // IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
352 
353 
354 //
355 // New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]
356 //
357 
359 {
363  // Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
365 
366 
367 
368 //
369 // Exception structures on 64 bit windows
370 //
371 #pragma pack(push)
372 #pragma pack(1)
373 typedef struct _RUNTIME_FUNCTION
374 {
379 #ifdef INT_COMPILER_MSVC
380 //warning C4214: nonstandard extension used: bit field types other than int (compiling source file agent.c)
381 #pragma warning(push)
382 #pragma warning(disable:4214)
383 #endif
384 typedef struct _UNWIND_INFO
385 {
392  struct
393  {
397  } UnwindCode[1];
399 #ifdef INT_COMPILER_MSVC
400 #pragma warning(pop)
401 #endif
402 
403 #pragma pack(pop)
404 
405 //
406 // UNWIND_INFO.Flags defines.
407 // These aren't actually flags, but values! So don't use them like Flags & .... but like Flags == ...
408 //
409 #define UNW_FLAG_NHANDLER 0x00000000
410 #define UNW_FLAG_EHANDLER 0x00000001
411 #define UNW_FLAG_UHANDLER 0x00000002
412 #define UNW_FLAG_FHANDLER 0x00000003 // unofficial
413 #define UNW_FLAG_CHAININFO 0x00000004
414 
415 //
416 // Section characteristics.
417 //
418 // IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
419 // IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
420 // IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
421 // IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
422 #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
423 // IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
424 
425 #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
426 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
427 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
428 
429 #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
430 #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
431 // IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
432 #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
433 #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
434 // 0x00002000 // Reserved.
435 // IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
436 
437 // Reset speculative exceptions handling bits in the TLB entries for this section.
438 #define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000
439 
440 // Section content can be accessed relative to GP
441 #define IMAGE_SCN_GPREL 0x00008000
442 
443 #define IMAGE_SCN_MEM_FARDATA 0x00008000
444 // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
445 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000
446 #define IMAGE_SCN_MEM_16BIT 0x00020000
447 #define IMAGE_SCN_MEM_LOCKED 0x00040000
448 #define IMAGE_SCN_MEM_PRELOAD 0x00080000
449 
450 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
451 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
452 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
453 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
454 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
455 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
456 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
457 #define IMAGE_SCN_ALIGN_128BYTES 0x00800000 //
458 #define IMAGE_SCN_ALIGN_256BYTES 0x00900000 //
459 #define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 //
460 #define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 //
461 #define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 //
462 #define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 //
463 #define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 //
464 // Unused 0x00F00000
465 #define IMAGE_SCN_ALIGN_MASK 0x00F00000
466 
467 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations.
468 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
469 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
470 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
471 #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
472 #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
473 #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
474 #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
475 
476 //
477 // Image machine types
478 //
479 #define IMAGE_FILE_MACHINE_UNKNOWN 0
480 #define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
481 #define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
482 #define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
483 #define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian
484 #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2
485 #define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP
486 #define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian
487 #define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
488 #define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian
489 #define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian
490 #define IMAGE_FILE_MACHINE_SH5 0x01a8 // SH5
491 #define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian
492 #define IMAGE_FILE_MACHINE_THUMB 0x01c2
493 #define IMAGE_FILE_MACHINE_AM33 0x01d3
494 #define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
495 #define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
496 #define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
497 #define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
498 #define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
499 #define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
500 #define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
501 #define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
502 #define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
503 #define IMAGE_FILE_MACHINE_CEF 0x0CEF
504 #define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
505 #define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
506 #define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
507 #define IMAGE_FILE_MACHINE_CEE 0xC0EE
508 
509 //
510 // Image subsystem definitions
511 //
512 #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
513 #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem.
514 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
515 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
516 #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
517 #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem.
518 #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
519 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem.
520 #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 //
521 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 //
522 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 //
523 #define IMAGE_SUBSYSTEM_EFI_ROM 13
524 #define IMAGE_SUBSYSTEM_XBOX 14
525 #define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16
526 
527 //
528 // DllCharacteristics Entries
529 //
530 
531 // IMAGE_LIBRARY_PROCESS_INIT 0x0001 // Reserved.
532 // IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved.
533 // IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved.
534 // IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved.
535 #define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // DLL can move.
536 #define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080 // Code Integrity Image
537 #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // Image is NX compatible
538 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 // Image understands isolation and doesn't want it
539 
540 // Image does not use SEH. No SE handler may reside in this image
541 #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
542 
543 #define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 // Do not bind this image.
544 // 0x1000 // Reserved.
545 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 // Driver uses WDM model
546 // 0x4000 // Reserved.
547 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
548 
549 
550 #define IMAGE_OPTIONAL_HEADER_PE32 0x010b
551 #define IMAGE_OPTIONAL_HEADER_PE64 0x020b
552 
553 
557 typedef struct _INTRO_UNWIND_INFO
558 {
565  struct
566  {
570  } UnwindCode[];
572 
573 
574 
576 
577 
579 #define MAX_PATH 260u
580 
582 #define MAX_FUNC_LENGTH 0xa00
583 
584 #define MAX_FILE_ALIGNMENT 0x10000
585 #define MIN_FILE_ALIGNMENT 0x200
586 
589 #define MAX_NUMBER_SECTIONS 96
590 
594 typedef struct _INTRO_PE_INFO
595 {
607 
608 
609 //
610 // PE stuff
611 //
612 INTSTATUS
614  _In_ QWORD ImageBase,
615  _In_opt_ BYTE *ImageBaseBuffer,
616  _In_ DWORD Rva,
617  _Out_ RUNTIME_FUNCTION *RuntimeFunction
618  );
619 
620 INTSTATUS
622  _In_ QWORD ImageBase,
623  _In_ BYTE *Buffer,
624  _In_ DWORD BufferSize,
625  _In_ DWORD Rva,
626  _Out_ RUNTIME_FUNCTION *RuntimeFunction
627  );
628 
629 INTSTATUS
631  _In_ QWORD ImageBase,
632  _In_opt_ BYTE *ImageBaseBuffer,
633  _In_ RUNTIME_FUNCTION *RuntimeFunction,
634  _In_opt_ DWORD RipOffset,
635  _Out_opt_ DWORD *ReservedStack,
636  _Out_opt_ DWORD *BeginAddress,
637  _Out_opt_ BOOLEAN *InterruptFunction,
638  _Out_opt_ BOOLEAN *ExceptionFunction,
639  _Out_opt_ BOOLEAN *HasFramePointer
640  );
641 
642 INTSTATUS
644  _In_ QWORD ImageBase,
645  _In_ BYTE *Buffer,
646  _In_ DWORD BufferSize,
647  _In_ RUNTIME_FUNCTION *RuntimeFunction,
648  _In_opt_ DWORD RipOffset,
649  _Out_opt_ DWORD *ReservedStack,
650  _Out_opt_ DWORD *BeginAddress,
651  _Out_opt_ BOOLEAN *InterruptFunction,
652  _Out_opt_ BOOLEAN *ExceptionFunction,
653  _Out_opt_ BOOLEAN *HasFramePointer
654  );
655 
656 INTSTATUS
658  _In_ QWORD ImageBase,
659  _In_ BYTE *Buffer,
660  _In_ DWORD BufferSize,
661  _In_ DWORD Rva,
662  _Out_ DWORD *BeginAddress
663  );
664 
665 INTSTATUS
667  _In_ QWORD ImageBase,
668  _In_bytecount_(BufferSize) BYTE *Buffer,
669  _In_ DWORD BufferSize,
670  _In_z_ const char *Name,
671  _Out_ DWORD *ExportRva
672  );
673 
674 INTSTATUS
676  _In_z_ const char *Name,
677  _Out_ QWORD *ExportGva
678  );
679 
680 INTSTATUS
682  _In_ QWORD ImageBase,
683  _In_opt_ BYTE *ImageBaseBuffer,
684  _In_z_ CHAR *Name,
685  _Out_ DWORD *ExportRva
686  );
687 
688 INTSTATUS
690  _In_ QWORD ImageBase,
691  _In_opt_ BYTE *ImageBaseBuffer,
692  _In_ DWORD Ordinal,
693  _Out_ DWORD *ExportRva
694  );
695 
696 INTSTATUS
698  _In_ QWORD ImageBase,
699  _In_opt_ BYTE *ImageBaseBuffer,
700  _In_ DWORD Rva,
701  _In_ DWORD ExportNameSize,
702  _Out_writes_z_(ExportNameSize) CHAR *ExportName
703  );
704 
705 INTSTATUS
707  _In_ QWORD ImageBase,
708  _In_ BYTE *Buffer,
709  _In_ DWORD BufferSize,
710  _In_ DWORD Rva,
711  _In_ DWORD ExportNameSize,
712  _Out_writes_z_(ExportNameSize) CHAR *ExportName
713  );
714 
715 INTSTATUS
717  _In_ QWORD ImageBase,
718  _In_ BYTE *Buffer,
719  _In_ DWORD BufferSize,
720  _In_ DWORD Rva
721  );
722 
723 INTSTATUS
725  _In_ QWORD ImageBase,
726  _In_opt_ BYTE *ImageBaseBuffer,
727  _In_ DWORD Rva
728  );
729 
730 INTSTATUS
732  _In_ QWORD ImageBase,
733  _In_opt_ BYTE *ImageBaseBuffer,
734  _In_ DWORD Rva,
735  _Out_ DWORD *BeginAddress
736  );
737 
738 INTSTATUS
740  _In_ QWORD ImageBase,
741  _In_opt_ BYTE *ImageBaseBuffer,
742  _In_ DWORD GuestRva,
743  _Out_ IMAGE_SECTION_HEADER *SectionHeader
744  );
745 
746 INTSTATUS
748  _In_ QWORD ImageBase,
749  _In_opt_ BYTE *ImageBaseBuffer,
750  _In_ DWORD Index,
751  _Out_ IMAGE_SECTION_HEADER *SectionHeader
752  );
753 
754 INTSTATUS
756  _In_ QWORD ImageBase,
757  _In_opt_ BYTE *ImageBaseBuffer,
758  _In_reads_or_z_(8) PCHAR Name,
759  _In_ DWORD NumberOfSectionHeadersAllocated,
760  _In_ QWORD Cr3,
761  _Out_ IMAGE_SECTION_HEADER *SectionHeaders,
762  _Out_opt_ DWORD *NumberOfSectionHeadersFilled
763  );
764 
765 #define IntPeGetSectionHeaderByName(Base, Buff, Name, Cr3, Sec) \
766  IntPeGetSectionHeadersByName((Base), (Buff), (Name), 1, (Cr3), (Sec), NULL)
767 
768 INTSTATUS
770  _In_ QWORD ImageBase,
771  _In_opt_ BYTE *ImageBaseBuffer,
772  _In_ DWORD DirectoryEntry,
773  _Out_ IMAGE_DATA_DIRECTORY *Directory
774  );
775 
776 INTSTATUS
778  _In_ QWORD ImageBase,
779  _In_opt_ BYTE *ImageBaseBuffer,
780  _In_opt_ DWORD ImageBaseBufferSize,
781  _Out_opt_ INTRO_PE_INFO *PeInfo,
782  _In_opt_ QWORD Cr3
783  );
784 
785 INTSTATUS
787  _In_ QWORD ImageBase,
788  _In_opt_ BYTE *ImageBuffer,
789  _In_opt_ DWORD ImageBufferSize,
790  _Out_ DWORD *FirstSectionOffset,
791  _Out_ DWORD *SectionCount
792  );
793 
794 INTSTATUS
796  _In_ QWORD ImageBase,
798  _In_ BOOLEAN IgnoreSectionHint,
799  _Out_ DWORD *Rva
800  );
801 
802 INTSTATUS
804  _In_bytecount_(BufferSize) BYTE *Buffer,
805  _In_ DWORD BufferSize,
807  _In_ BOOLEAN IgnoreSectionHint,
808  _Out_ DWORD *Rva
809  );
810 
811 #endif
UINT8 CountOfCodes
Definition: winpe.h:562
#define _In_opt_
Definition: intro_sal.h:16
UINT16 NumberOfSections
Definition: winpe.h:65
struct _IMAGE_NT_HEADERS64 * PIMAGE_NT_HEADERS64
INTSTATUS IntPeParseUnwindDataInBuffer(QWORD ImageBase, BYTE *Buffer, DWORD BufferSize, RUNTIME_FUNCTION *RuntimeFunction, DWORD RipOffset, DWORD *ReservedStack, DWORD *BeginAddress, BOOLEAN *InterruptFunction, BOOLEAN *ExceptionFunction, BOOLEAN *HasFramePointer)
Parse the unwind data for the indicated function and return the prologue size.
Definition: winpe.c:2726
struct _IMAGE_NT_HEADERS IMAGE_NT_HEADERS32
UINT16 NumberOfRelocations
Definition: winpe.h:90
UINT16 MinorImageVersion
Definition: winpe.h:199
UINT32 PointerToSymbolTable
Definition: winpe.h:67
INTSTATUS IntPeGetSectionHeaderByRva(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD GuestRva, IMAGE_SECTION_HEADER *SectionHeader)
Given a relative virtual address, return the section header which describes the section the RVA lies ...
Definition: winpe.c:707
#define _Out_
Definition: intro_sal.h:22
_Bool BOOLEAN
Definition: intro_types.h:58
UINT16 e_ip
Definition: winpe.h:50
UINT8 CountOfCodes
Definition: winpe.h:389
INTSTATUS IntPeFindFunctionStart(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD Rva, DWORD *BeginAddress)
Find the start address of a function, given a Rva pointing inside of it.
Definition: winpe.c:3297
uint8_t UINT8
Definition: intro_types.h:37
UINT32 Ordinal
Definition: winpe.h:279
struct _IMAGE_FILE_HEADER IMAGE_FILE_HEADER
UINT16 e_ovno
Definition: winpe.h:53
INTSTATUS IntPeGetRuntimeFunctionInBuffer(QWORD ImageBase, BYTE *Buffer, DWORD BufferSize, DWORD Rva, RUNTIME_FUNCTION *RuntimeFunction)
Parses the exception directory and gets the runtime function corresponding to the Rva...
Definition: winpe.c:2267
struct _INTRO_UNWIND_INFO * PINTRO_UNWIND_INFO
struct _IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64
UINT8 MinorLinkerVersion
Definition: winpe.h:147
uint8_t BYTE
Definition: intro_types.h:47
IMAGE_OPTIONAL_HEADER64 OptionalHeader
Definition: winpe.h:221
UINT8 Flags
Definition: winpe.h:387
UINT16 MinorImageVersion
Definition: winpe.h:165
UINT32 SizeOfUninitializedData
Definition: winpe.h:190
#define _In_
Definition: intro_sal.h:21
INTSTATUS IntPeGetDirectory(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD DirectoryEntry, IMAGE_DATA_DIRECTORY *Directory)
Validate & return the indicated image data directory.
Definition: winpe.c:552
INTSTATUS IntPeFindKernelExport(const char *Name, QWORD *ExportGva)
Find an export inside the NT kernel image.
Definition: winpe.c:1748
UINT64 Function
Definition: winpe.h:265
UINT16 e_sp
Definition: winpe.h:48
uint16_t WORD
Definition: intro_types.h:48
UINT16 e_maxalloc
Definition: winpe.h:46
UINT8 CodeOffset
Definition: winpe.h:567
struct _IMAGE_DATA_DIRECTORY IMAGE_DATA_DIRECTORY
UINT16 e_cparhdr
Definition: winpe.h:44
UINT16 e_ss
Definition: winpe.h:47
INTSTATUS IntPeFindFunctionByPattern(QWORD ImageBase, WIN_UNEXPORTED_FUNCTION_PATTERN *Pattern, BOOLEAN IgnoreSectionHint, DWORD *Rva)
Find a function using a pattern.
Definition: winpe.c:3150
UINT64 Ordinal
Definition: winpe.h:266
UINT8 UnwindOp
Definition: winpe.h:395
INTSTATUS IntPeFindExportByName(QWORD ImageBase, BYTE *ImageBaseBuffer, CHAR *Name, DWORD *ExportRva)
Find the export name a Rva lies in.
Definition: winpe.c:1783
UINT16 Characteristics
Definition: winpe.h:70
UINT32 NumberOfRvaAndSizes
Definition: winpe.h:179
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: winpe.h:228
UINT16 e_oeminfo
Definition: winpe.h:56
INTSTATUS IntPeGetSectionHeaderByIndex(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD Index, IMAGE_SECTION_HEADER *SectionHeader)
Return the section header located on position Index (0 based).
Definition: winpe.c:838
UINT32 VirtualAddress
Definition: winpe.h:98
UINT32 PointerToRelocations
Definition: winpe.h:88
struct _INTRO_PE_INFO INTRO_PE_INFO
DWORD TimeDateStamp
Time/date stamp.
Definition: winpe.h:600
UINT32 SizeOfHeapCommit
Definition: winpe.h:177
UINT16 e_lfarlc
Definition: winpe.h:52
UINT64 SizeOfStackCommit
Definition: winpe.h:209
QWORD SectionOffset
Offset of the first section header.
Definition: winpe.h:602
UINT8 OpInfo
Definition: winpe.h:396
IMAGE_FILE_HEADER FileHeader
Definition: winpe.h:220
uint32_t UINT32
Definition: intro_types.h:39
UINT32 NumberOfSymbols
Definition: winpe.h:68
int32_t INT32
Definition: intro_types.h:44
struct _IMAGE_BOUND_IMPORT_DESCRIPTOR * PIMAGE_BOUND_IMPORT_DESCRIPTOR
UINT32 Function
Definition: winpe.h:278
#define _In_bytecount_(expr)
Definition: intro_sal.h:42
struct _RUNTIME_FUNCTION RUNTIME_FUNCTION
UINT8 FrameOffset
Definition: winpe.h:391
struct _IMAGE_RESOURCE_DATA_ENTRY IMAGE_RESOURCE_DATA_ENTRY
INTSTATUS IntPeFindExportByNameInBuffer(QWORD ImageBase, BYTE *Buffer, DWORD BufferSize, const char *Name, DWORD *ExportRva)
Find the export name a Rva lies in.
Definition: winpe.c:1586
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY IMAGE_RESOURCE_DIRECTORY_ENTRY
UINT16 MajorSubsystemVersion
Definition: winpe.h:166
INTSTATUS IntPeFindFunctionByPatternInBuffer(BYTE *Buffer, DWORD BufferSize, WIN_UNEXPORTED_FUNCTION_PATTERN *Pattern, BOOLEAN IgnoreSectionHint, DWORD *Rva)
Find a function using a pattern.
Definition: winpe.c:3044
INTSTATUS IntPeFindExportByRvaInBuffer(QWORD ImageBase, BYTE *Buffer, DWORD BufferSize, DWORD Rva)
Check if the indicated Rva belongs to an exported function.
Definition: winpe.c:1223
INTSTATUS IntPeGetSectionHeadersByName(QWORD ImageBase, BYTE *ImageBaseBuffer, PCHAR Name, DWORD NumberOfSectionHeadersAllocated, QWORD Cr3, IMAGE_SECTION_HEADER *SectionHeaders, DWORD *NumberOfSectionHeadersFilled)
Return all the section headers matching the indicated Name.
Definition: winpe.c:942
WORD Subsystem
Subsystem.
Definition: winpe.h:597
UINT32 SizeOfStackReserve
Definition: winpe.h:174
int INTSTATUS
The status data type.
Definition: introstatus.h:24
UINT32 AddressOfEntryPoint
Definition: winpe.h:151
UINT32 AddressOfNameOrdinals
Definition: winpe.h:339
struct _RUNTIME_FUNCTION * PRUNTIME_FUNCTION
struct _IMAGE_IMPORT_DESCRIPTOR IMAGE_IMPORT_DESCRIPTOR
struct _INTRO_UNWIND_INFO INTRO_UNWIND_INFO
UINT16 DllCharacteristics
Definition: winpe.h:207
DWORD SectionAlignment
Sections alignment.
Definition: winpe.h:604
UINT8 CodeOffset
Definition: winpe.h:394
INTSTATUS IntPeParseUnwindData(QWORD ImageBase, BYTE *ImageBaseBuffer, RUNTIME_FUNCTION *RuntimeFunction, DWORD RipOffset, DWORD *ReservedStack, DWORD *BeginAddress, BOOLEAN *InterruptFunction, BOOLEAN *ExceptionFunction, BOOLEAN *HasFramePointer)
Parse the unwind data for the indicated function and return the prologue size.
Definition: winpe.c:2395
struct _IMAGE_IMPORT_BY_NAME * PIMAGE_IMPORT_BY_NAME
Describes a pattern for a kernel function that is not exported.
Definition: winguest.h:85
UINT16 e_magic
Definition: winpe.h:40
UINT8 FrameRegister
Definition: winpe.h:563
UINT16 e_oemid
Definition: winpe.h:55
#define IMAGE_SIZEOF_SHORT_NAME
Definition: winpe.h:74
struct _IMAGE_OPTIONAL_HEADER IMAGE_OPTIONAL_HEADER32
UINT8 MajorLinkerVersion
Definition: winpe.h:146
struct _IMAGE_DATA_DIRECTORY * PIMAGE_DATA_DIRECTORY
UINT32 AddressOfEntryPoint
Definition: winpe.h:191
UINT32 FileAlignment
Definition: winpe.h:161
UINT32 Signature
Definition: winpe.h:226
UINT32 SizeOfInitializedData
Definition: winpe.h:149
UINT16 MinorOperatingSystemVersion
Definition: winpe.h:163
UINT16 MajorImageVersion
Definition: winpe.h:198
UINT8 FrameRegister
Definition: winpe.h:390
struct _IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA64
UINT8 FrameOffset
Definition: winpe.h:564
UINT32 AddressOfData
Definition: winpe.h:280
struct _IMAGE_RESOURCE_DIRECTORY IMAGE_RESOURCE_DIRECTORY
UINT16 MajorOperatingSystemVersion
Definition: winpe.h:196
UINT32 SizeOfInitializedData
Definition: winpe.h:189
UINT16 DllCharacteristics
Definition: winpe.h:173
struct _IMAGE_RESOURCE_DIRECTORY * PIMAGE_RESOURCE_DIRECTORY
UINT32 Signature
Definition: winpe.h:219
#define _Out_opt_
Definition: intro_sal.h:30
struct _IMAGE_OPTIONAL_HEADER64 * PIMAGE_OPTIONAL_HEADER64
UINT16 e_minalloc
Definition: winpe.h:45
INTSTATUS IntPeGetExportNameByRva(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD Rva, DWORD ExportNameSize, CHAR *ExportName)
Find the export name a Rva lies in.
Definition: winpe.c:1312
UINT32 NumberOfFunctions
Definition: winpe.h:335
INTSTATUS IntPeFindExportByOrdinal(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD Ordinal, DWORD *ExportRva)
Find an exported function using its ordinal.
Definition: winpe.c:1961
unsigned long long QWORD
Definition: intro_types.h:53
WORD Machine
Machine type.
Definition: winpe.h:598
INTSTATUS IntPeListSectionsHeaders(QWORD ImageBase, BYTE *ImageBuffer, DWORD ImageBufferSize, DWORD *FirstSectionOffset, DWORD *SectionCount)
Will get the offset to the first section header and the number of sections from the given module...
Definition: winpe.c:473
struct _IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER64
struct _IMAGE_EXPORT_DIRECTORY * PIMAGE_EXPORT_DIRECTORY
UINT32 UnwindData
Definition: winpe.h:377
struct _IMAGE_FILE_HEADER * PIMAGE_FILE_HEADER
IMAGE_IMPORT_DESCRIPTOR * PIMAGE_IMPORT_DESCRIPTOR
Definition: winpe.h:248
UINT8 SizeOfProlog
Definition: winpe.h:561
UINT32 VirtualAddress
Definition: winpe.h:85
INTSTATUS IntPeGetExportNameByRvaInBuffer(QWORD ImageBase, BYTE *Buffer, DWORD BufferSize, DWORD Rva, DWORD ExportNameSize, CHAR *ExportName)
Find the export name a Rva lies in.
Definition: winpe.c:1457
QWORD NumberOfSections
Number of sections.
Definition: winpe.h:603
UINT32 Characteristics
Definition: winpe.h:329
UINT8 Version
Definition: winpe.h:386
UINT16 e_cs
Definition: winpe.h:51
UINT32 NumberOfRvaAndSizes
Definition: winpe.h:213
struct _IMAGE_OPTIONAL_HEADER * PIMAGE_OPTIONAL_HEADER32
INT32 e_lfanew
Definition: winpe.h:58
#define _In_reads_or_z_(expr)
Definition: intro_sal.h:43
UINT32 TimeDateStamp
Definition: winpe.h:66
struct _IMAGE_NT_HEADERS * PIMAGE_NT_HEADERS32
char * PCHAR
Definition: intro_types.h:56
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES
Definition: winpe.h:103
UINT64 AddressOfData
Definition: winpe.h:267
struct _IMAGE_BOUND_IMPORT_DESCRIPTOR IMAGE_BOUND_IMPORT_DESCRIPTOR
struct _IMAGE_DOS_HEADER IMAGE_DOS_HEADER
struct _UNWIND_INFO * PUNWIND_INFO
struct _IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA32
unsigned long long UINT64
Definition: intro_types.h:40
UINT32 VirtualAddress
Definition: winpe.h:290
Describes a function that is not exported.
Definition: winguest.h:101
UINT16 e_crlc
Definition: winpe.h:43
UINT16 MinorOperatingSystemVersion
Definition: winpe.h:197
uint32_t DWORD
Definition: intro_types.h:49
UINT32 VirtualSize
Definition: winpe.h:83
struct _IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS64
UINT32 Characteristics
Definition: winpe.h:92
DWORD EntryPoint
Entry point (RVA).
Definition: winpe.h:601
INTSTATUS IntPeValidateHeader(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD ImageBaseBufferSize, INTRO_PE_INFO *PeInfo, QWORD Cr3)
Validates a PE header.
Definition: winpe.c:131
struct _IMAGE_EXPORT_DIRECTORY IMAGE_EXPORT_DIRECTORY
UINT16 MinorSubsystemVersion
Definition: winpe.h:201
UINT16 e_cp
Definition: winpe.h:42
UINT16 e_csum
Definition: winpe.h:49
struct _IMAGE_RESOURCE_DATA_ENTRY * PIMAGE_RESOURCE_DATA_ENTRY
struct _IMAGE_BASE_RELOCATION IMAGE_BASE_RELOCATION
QWORD ImageBase
Image base.
Definition: winpe.h:605
UINT16 MajorOperatingSystemVersion
Definition: winpe.h:162
#define _In_z_
Definition: intro_sal.h:17
UINT32 PointerToRawData
Definition: winpe.h:87
UINT32 EndAddress
Definition: winpe.h:376
struct _IMAGE_SECTION_HEADER * PIMAGE_SECTION_HEADER
UINT16 e_cblp
Definition: winpe.h:41
IMAGE_BASE_RELOCATION * PIMAGE_BASE_RELOCATION
Definition: winpe.h:294
UINT32 PhysicalAddress
Definition: winpe.h:82
UINT16 MinorSubsystemVersion
Definition: winpe.h:167
struct _IMAGE_IMPORT_BY_NAME IMAGE_IMPORT_BY_NAME
INTSTATUS IntPeFindExportByRva(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD Rva)
Check if a RVA lies inside an exported function.
Definition: winpe.c:1103
UINT8 SizeOfProlog
Definition: winpe.h:388
IMAGE_FILE_HEADER FileHeader
Definition: winpe.h:227
uint16_t UINT16
Definition: intro_types.h:38
#define _Out_writes_z_(expr)
Definition: intro_sal.h:37
UINT16 MajorImageVersion
Definition: winpe.h:164
UINT32 PointerToLinenumbers
Definition: winpe.h:89
UINT32 SizeOfRawData
Definition: winpe.h:86
UINT64 ForwarderString
Definition: winpe.h:264
UINT32 BeginAddress
Definition: winpe.h:375
UINT32 AddressOfFunctions
Definition: winpe.h:337
INTSTATUS IntPeFindFunctionStartInBuffer(QWORD ImageBase, BYTE *Buffer, DWORD BufferSize, DWORD Rva, DWORD *BeginAddress)
Find the start address of a function, given a Rva pointing inside of it.
Definition: winpe.c:3624
UINT16 NumberOfNamedEntries
Definition: winpe.h:348
DWORD SizeOfImage
Size of the image.
Definition: winpe.h:599
BOOLEAN Image64Bit
True if the image is 64 bit.
Definition: winpe.h:596
struct _UNWIND_INFO UNWIND_INFO
struct _IMAGE_DOS_HEADER * PIMAGE_DOS_HEADER
UINT32 SizeOfHeapReserve
Definition: winpe.h:176
UINT8 UnwindOp
Definition: winpe.h:568
char CHAR
Definition: intro_types.h:56
UINT16 e_res2[10]
Definition: winpe.h:57
UINT32 SizeOfHeaders
Definition: winpe.h:170
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY * PIMAGE_RESOURCE_DIRECTORY_ENTRY
UINT32 Win32VersionValue
Definition: winpe.h:168
UINT32 SectionAlignment
Definition: winpe.h:160
struct _IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER
INTSTATUS IntPeGetRuntimeFunction(QWORD ImageBase, BYTE *ImageBaseBuffer, DWORD Rva, RUNTIME_FUNCTION *RuntimeFunction)
Parses the exception directory and gets the runtime function corresponding to the Rva...
Definition: winpe.c:2062
UINT64 SizeOfStackReserve
Definition: winpe.h:208
UINT16 NumberOfLinenumbers
Definition: winpe.h:91
struct _INTRO_PE_INFO * PINTRO_PE_INFO
UINT16 SizeOfOptionalHeader
Definition: winpe.h:69
UINT16 e_res[4]
Definition: winpe.h:54
UINT16 Machine
Definition: winpe.h:64
UINT16 MajorSubsystemVersion
Definition: winpe.h:200
UINT32 SizeOfUninitializedData
Definition: winpe.h:150
UINT64 SizeOfHeapReserve
Definition: winpe.h:210
UINT32 Win32VersionValue
Definition: winpe.h:202
UINT32 SizeOfStackCommit
Definition: winpe.h:175
struct _IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32
UINT32 ForwarderString
Definition: winpe.h:277