ae484252424f19e010ad45f3b410b096a1461df1
[reactos.git] / reactos / lib / rossym / fromraw.c
1 /*
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
6 *
7 * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com)
8 */
9
10 #define NTOSAPI
11 #include <ntddk.h>
12 #include <reactos/rossym.h>
13 #include "rossympriv.h"
14
15 #define NDEBUG
16 #include <debug.h>
17
18 BOOLEAN
19 RosSymCreateFromRaw(PVOID RawData, ULONG_PTR DataSize, PROSSYM_INFO *RosSymInfo)
20 {
21 PROSSYM_HEADER RosSymHeader;
22
23 RosSymHeader = (PROSSYM_HEADER) RawData;
24 if (RosSymHeader->SymbolsOffset < sizeof(ROSSYM_HEADER)
25 || RosSymHeader->StringsOffset < RosSymHeader->SymbolsOffset + RosSymHeader->SymbolsLength
26 || DataSize < RosSymHeader->StringsOffset + RosSymHeader->StringsLength
27 || 0 != (RosSymHeader->SymbolsLength % sizeof(ROSSYM_ENTRY)))
28 {
29 DPRINT1("Invalid ROSSYM_HEADER\n");
30 return FALSE;
31 }
32
33 /* Copy */
34 *RosSymInfo = RosSymAllocMem(sizeof(ROSSYM_INFO) + RosSymHeader->SymbolsLength
35 + RosSymHeader->StringsLength + 1);
36 if (NULL == *RosSymInfo)
37 {
38 DPRINT1("Failed to allocate memory for rossym\n");
39 return FALSE;
40 }
41 (*RosSymInfo)->Symbols = (PROSSYM_ENTRY)((char *) *RosSymInfo + sizeof(ROSSYM_INFO));
42 (*RosSymInfo)->SymbolsCount = RosSymHeader->SymbolsLength / sizeof(ROSSYM_ENTRY);
43 (*RosSymInfo)->Strings = (PCHAR) *RosSymInfo + sizeof(ROSSYM_INFO) + RosSymHeader->SymbolsLength;
44 (*RosSymInfo)->StringsLength = RosSymHeader->StringsLength;
45 memcpy((*RosSymInfo)->Symbols, (char *) RosSymHeader + RosSymHeader->SymbolsOffset,
46 RosSymHeader->SymbolsLength);
47 memcpy((*RosSymInfo)->Strings, (char *) RosSymHeader + RosSymHeader->StringsOffset,
48 RosSymHeader->StringsLength);
49 /* Make sure the last string is null terminated, we allocated an extra byte for that */
50 (*RosSymInfo)->Strings[(*RosSymInfo)->StringsLength] = '\0';
51
52 return TRUE;
53 }
54
55 /* EOF */