2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: lib/rossym/frommem.c
5 * PURPOSE: Creating rossym info from an in-memory image
7 * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com)
12 #include <reactos/rossym.h>
13 #include "rossympriv.h"
20 RosSymCreateFromMem(PVOID ImageStart
, ULONG_PTR ImageSize
, PROSSYM_INFO
*RosSymInfo
)
22 PIMAGE_DOS_HEADER DosHeader
;
23 PIMAGE_NT_HEADERS NtHeaders
;
24 PIMAGE_SECTION_HEADER SectionHeader
;
26 BOOLEAN RosSymSectionFound
= FALSE
;
27 CHAR SectionName
[IMAGE_SIZEOF_SHORT_NAME
];
29 /* Check if MZ header is valid */
30 DosHeader
= (PIMAGE_DOS_HEADER
) ImageStart
;
31 if (ImageSize
< sizeof(IMAGE_DOS_HEADER
)
32 || ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader
))
34 DPRINT1("Image doesn't have a valid DOS header\n");
38 /* Locate NT header */
39 NtHeaders
= (PIMAGE_NT_HEADERS
)((char *) ImageStart
+ DosHeader
->e_lfanew
);
40 if (ImageSize
< DosHeader
->e_lfanew
+ sizeof(IMAGE_NT_HEADERS
)
41 || ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders
))
43 DPRINT1("Image doesn't have a valid PE header\n");
47 /* Search for the section header */
48 SectionHeader
= IMAGE_FIRST_SECTION(NtHeaders
);
49 if (ImageSize
< (ULONG_PTR
)((char *) (SectionHeader
+ NtHeaders
->FileHeader
.NumberOfSections
)
50 - (char *) ImageStart
))
52 DPRINT1("Image doesn't have valid section headers\n");
55 strncpy(SectionName
, ROSSYM_SECTION_NAME
, IMAGE_SIZEOF_SHORT_NAME
);
56 for (SectionIndex
= 0; SectionIndex
< NtHeaders
->FileHeader
.NumberOfSections
; SectionIndex
++)
58 if (0 == memcmp(SectionName
, SectionHeader
->Name
, IMAGE_SIZEOF_SHORT_NAME
))
60 RosSymSectionFound
= TRUE
;
66 if (!RosSymSectionFound
)
68 DPRINT("No %s section found\n", ROSSYM_SECTION_NAME
);
72 /* Locate the section itself */
73 if (ImageSize
< SectionHeader
->PointerToRawData
+ SectionHeader
->SizeOfRawData
74 || SectionHeader
->SizeOfRawData
< sizeof(ROSSYM_HEADER
))
76 DPRINT("Invalid %s section\n", ROSSYM_SECTION_NAME
);
80 if (SectionHeader
->VirtualAddress
+ SectionHeader
->Misc
.VirtualSize
> ImageSize
)
82 DPRINT("Bad %s section virtual size!\n", ROSSYM_SECTION_NAME
);
87 return RosSymCreateFromRaw((char *) ImageStart
+ SectionHeader
->VirtualAddress
,
88 SectionHeader
->SizeOfRawData
, RosSymInfo
);