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"
22 RosSymCreateFromMem(PVOID ImageStart
, ULONG_PTR ImageSize
, PROSSYM_INFO
*RosSymInfo
)
24 PIMAGE_DOS_HEADER DosHeader
;
25 PIMAGE_NT_HEADERS NtHeaders
;
26 PIMAGE_SECTION_HEADER SectionHeader
;
28 BOOLEAN RosSymSectionFound
= FALSE
;
29 CHAR SectionName
[IMAGE_SIZEOF_SHORT_NAME
];
31 /* Check if MZ header is valid */
32 DosHeader
= (PIMAGE_DOS_HEADER
) ImageStart
;
33 if (ImageSize
< sizeof(IMAGE_DOS_HEADER
)
34 || ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader
))
36 DPRINT1("Image doesn't have a valid DOS header\n");
40 /* Locate NT header */
41 NtHeaders
= (PIMAGE_NT_HEADERS
)((char *) ImageStart
+ DosHeader
->e_lfanew
);
42 if (ImageSize
< DosHeader
->e_lfanew
+ sizeof(IMAGE_NT_HEADERS
)
43 || ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders
))
45 DPRINT1("Image doesn't have a valid PE header\n");
49 /* Search for the section header */
50 SectionHeader
= IMAGE_FIRST_SECTION(NtHeaders
);
51 if (ImageSize
< (ULONG_PTR
)((char *) (SectionHeader
+ NtHeaders
->FileHeader
.NumberOfSections
)
52 - (char *) ImageStart
))
54 DPRINT1("Image doesn't have valid section headers\n");
57 strncpy(SectionName
, ROSSYM_SECTION_NAME
, IMAGE_SIZEOF_SHORT_NAME
);
58 for (SectionIndex
= 0; SectionIndex
< NtHeaders
->FileHeader
.NumberOfSections
; SectionIndex
++)
60 if (0 == memcmp(SectionName
, SectionHeader
->Name
, IMAGE_SIZEOF_SHORT_NAME
))
62 RosSymSectionFound
= TRUE
;
68 if (!RosSymSectionFound
)
70 DPRINT("No %s section found\n", ROSSYM_SECTION_NAME
);
74 /* Locate the section itself */
75 if (ImageSize
< SectionHeader
->PointerToRawData
+ SectionHeader
->SizeOfRawData
76 || SectionHeader
->SizeOfRawData
< sizeof(ROSSYM_HEADER
))
78 DPRINT("Invalid %s section\n", ROSSYM_SECTION_NAME
);
82 if (SectionHeader
->VirtualAddress
+ SectionHeader
->Misc
.VirtualSize
> ImageSize
)
84 DPRINT("Bad %s section virtual size!\n", ROSSYM_SECTION_NAME
);
89 return RosSymCreateFromRaw((char *) ImageStart
+ SectionHeader
->VirtualAddress
,
90 SectionHeader
->SizeOfRawData
, RosSymInfo
);