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
;
27 unsigned SectionIndex
;
28 char SectionName
[IMAGE_SIZEOF_SHORT_NAME
];
30 /* Check if MZ header is valid */
31 DosHeader
= (PIMAGE_DOS_HEADER
) ImageStart
;
32 if (ImageSize
< sizeof(IMAGE_DOS_HEADER
)
33 || ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader
))
35 DPRINT1("Image doesn't have a valid DOS header\n");
39 /* Locate NT header */
40 NtHeaders
= (PIMAGE_NT_HEADERS
)((char *) ImageStart
+ DosHeader
->e_lfanew
);
41 if (ImageSize
< DosHeader
->e_lfanew
+ sizeof(IMAGE_NT_HEADERS
)
42 || ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders
))
44 DPRINT1("Image doesn't have a valid PE header\n");
48 /* Search for the section header */
49 SectionHeader
= IMAGE_FIRST_SECTION(NtHeaders
);
50 if (ImageSize
< (ULONG_PTR
)((char *) (SectionHeader
+ NtHeaders
->FileHeader
.NumberOfSections
)
51 - (char *) ImageStart
))
53 DPRINT1("Image doesn't have valid section headers\n");
56 strncpy(SectionName
, ROSSYM_SECTION_NAME
, IMAGE_SIZEOF_SHORT_NAME
);
57 for (SectionIndex
= 0; SectionIndex
< NtHeaders
->FileHeader
.NumberOfSections
; SectionIndex
++)
59 if (0 == memcmp(SectionName
, SectionHeader
->Name
, IMAGE_SIZEOF_SHORT_NAME
))
65 if (NtHeaders
->FileHeader
.NumberOfSections
<= SectionIndex
)
67 DPRINT("No %s section found\n", ROSSYM_SECTION_NAME
);
71 /* Locate the section itself */
72 if (ImageSize
< SectionHeader
->PointerToRawData
+ SectionHeader
->SizeOfRawData
73 || SectionHeader
->SizeOfRawData
< sizeof(ROSSYM_HEADER
))
75 DPRINT1("Invalid %s section\n", ROSSYM_SECTION_NAME
);
80 return RosSymCreateFromRaw((char *) ImageStart
+ SectionHeader
->VirtualAddress
,
81 SectionHeader
->SizeOfRawData
, RosSymInfo
);