rossym is ReactOS-specific
Modified: trunk/reactos/ReactOS.rbuild
Added: trunk/reactos/include/reactos/rossym.h
Added: trunk/reactos/lib/directory.rbuild
Added: trunk/reactos/lib/rossym/
Added: trunk/reactos/lib/rossym/delete.c
Added: trunk/reactos/lib/rossym/find.c
Added: trunk/reactos/lib/rossym/fromfile.c
Added: trunk/reactos/lib/rossym/frommem.c
Added: trunk/reactos/lib/rossym/fromraw.c
Added: trunk/reactos/lib/rossym/getraw.c
Added: trunk/reactos/lib/rossym/init.c
Added: trunk/reactos/lib/rossym/initkm.c
Added: trunk/reactos/lib/rossym/initum.c
Added: trunk/reactos/lib/rossym/rossym.rbuild
Added: trunk/reactos/lib/rossym/rossympriv.h
Added: trunk/reactos/lib/rossym/zwfile.c
_____
Modified: trunk/reactos/ReactOS.rbuild
--- trunk/reactos/ReactOS.rbuild 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/ReactOS.rbuild 2006-01-30 20:01:34 UTC (rev 53)
@@ -42,7 +42,7 @@
<include>w32api/include/crt</include>
<include>w32api/include/ddk</include>
-<!--
+<!-- TODO
<directory name="apps">
<xi:include href="apps/directory.rbuild" />
</directory>
@@ -56,7 +56,7 @@
<directory name="base">
<xi:include href="base/base.rbuild" />
</directory>
-<!--
+<!-- TODO
<directory name="dll">
<xi:include href="dll/dll.rbuild" />
</directory>
@@ -69,9 +69,11 @@
<directory name="include">
<xi:include href="include/directory.rbuild" />
</directory>
+-->
<directory name="lib">
<xi:include href="lib/directory.rbuild" />
</directory>
+<!-- TODO
<directory name="media">
<xi:include href="media/directory.rbuild" />
</directory>
_____
Added: trunk/reactos/include/reactos/rossym.h
--- trunk/reactos/include/reactos/rossym.h 2006-01-30 19:45:40 UTC
(rev 52)
+++ trunk/reactos/include/reactos/rossym.h 2006-01-30 20:01:34 UTC
(rev 53)
@@ -0,0 +1,58 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: include/reactos/rossym.h
+ * PURPOSE: Handling of rossym symbol info
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#ifndef REACTOS_ROSSYM_H_INCLUDED
+#define REACTOS_ROSSYM_H_INCLUDED
+
+#define ROSSYM_SECTION_NAME ".rossym"
+
+typedef struct _ROSSYM_HEADER {
+ unsigned long SymbolsOffset;
+ unsigned long SymbolsLength;
+ unsigned long StringsOffset;
+ unsigned long StringsLength;
+} ROSSYM_HEADER, *PROSSYM_HEADER;
+
+typedef struct _ROSSYM_ENTRY {
+ ULONG_PTR Address;
+ ULONG FunctionOffset;
+ ULONG FileOffset;
+ ULONG SourceLine;
+} ROSSYM_ENTRY, *PROSSYM_ENTRY;
+
+typedef struct _ROSSYM_CALLBACKS {
+ PVOID (*AllocMemProc)(ULONG_PTR Size);
+ VOID (*FreeMemProc)(PVOID Area);
+ BOOLEAN (*ReadFileProc)(PVOID FileContext, PVOID Buffer, ULONG Size);
+ BOOLEAN (*SeekFileProc)(PVOID FileContext, ULONG_PTR Position);
+} ROSSYM_CALLBACKS, *PROSSYM_CALLBACKS;
+
+typedef struct _ROSSYM_INFO *PROSSYM_INFO;
+
+VOID RosSymInit(PROSSYM_CALLBACKS Callbacks);
+VOID RosSymInitKernelMode(VOID);
+VOID RosSymInitUserMode(VOID);
+
+BOOLEAN RosSymCreateFromRaw(PVOID RawData, ULONG_PTR DataSize,
+ PROSSYM_INFO *RosSymInfo);
+BOOLEAN RosSymCreateFromMem(PVOID ImageStart, ULONG_PTR ImageSize,
+ PROSSYM_INFO *RosSymInfo);
+BOOLEAN RosSymCreateFromFile(PVOID FileContext, PROSSYM_INFO
*RosSymInfo);
+ULONG RosSymGetRawDataLength(PROSSYM_INFO RosSymInfo);
+VOID RosSymGetRawData(PROSSYM_INFO RosSymInfo, PVOID RawData);
+BOOLEAN RosSymGetAddressInformation(PROSSYM_INFO RosSymInfo,
+ ULONG_PTR RelativeAddress,
+ ULONG *LineNumber,
+ char *FileName,
+ char *FunctionName);
+VOID RosSymDelete(PROSSYM_INFO RosSymInfo);
+
+#endif /* REACTOS_ROSSYM_H_INCLUDED */
+
+/* EOF */
+
Property changes on: trunk/reactos/include/reactos/rossym.h
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/directory.rbuild
--- trunk/reactos/lib/directory.rbuild 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/directory.rbuild 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,5 @@
+<group>
+<directory name="rossym">
+ <xi:include href="rossym/rossym.rbuild" />
+</directory>
+</group>
Property changes on: trunk/reactos/lib/directory.rbuild
___________________________________________________________________
Name: svn:eol-style
+ native
Property changes on: trunk/reactos/lib/rossym
___________________________________________________________________
Name: ros:history
+
------------------------------------------------------------------------
r19810 | sedwards | 2005-12-01 22:37:19 +0100 (Thu, 01 Dec 2005) | 1
line
stop the abuse of having the ddk directory in the path when including a
ddk header
------------------------------------------------------------------------
r19144 | weiden | 2005-11-11 20:59:38 +0100 (Fri, 11 Nov 2005) | 1 line
fixed some more warnings when compiled with -Wwrite-strings
------------------------------------------------------------------------
r16720 | mf | 2005-07-24 23:42:00 +0200 (Sun, 24 Jul 2005) | 1 line
set eol-style for most xml files
------------------------------------------------------------------------
r16441 | weiden | 2005-07-06 00:35:29 +0200 (Wed, 06 Jul 2005) | 1 line
fixed some signed/unsigned comparison warnings with -Wsign-compare
------------------------------------------------------------------------
r16238 | ion | 2005-06-23 06:53:57 +0200 (Thu, 23 Jun 2005) | 1 line
use DDK for rossym
------------------------------------------------------------------------
r16079 | ion | 2005-06-19 09:15:07 +0200 (Sun, 19 Jun 2005) | 1 line
Fix rtl/rossym
------------------------------------------------------------------------
r15767 | mf | 2005-06-04 11:58:35 +0200 (Sat, 04 Jun 2005) | 1 line
svn:ignore generated files
------------------------------------------------------------------------
r15583 | chorns | 2005-05-28 17:18:30 +0200 (Sat, 28 May 2005) | 1 line
Merge 12735:15568 from xmlbuildsystem branch
------------------------------------------------------------------------
r13392 | gvg | 2005-02-03 00:07:33 +0100 (Thu, 03 Feb 2005) | 3 lines
Store symbolic information in a .rossym section in the
executable/library/driver/whatever
------------------------------------------------------------------------
Name: ros:doc
+ We store the symbolic information in a way completely different
from Windows.
There is no equivalent to this lib in Windows.
_____
Added: trunk/reactos/lib/rossym/delete.c
--- trunk/reactos/lib/rossym/delete.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/delete.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,23 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/delete.c
+ * PURPOSE: Free rossym info
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+VOID
+RosSymDelete(PROSSYM_INFO RosSymInfo)
+{
+ RosSymFreeMem(RosSymInfo);
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/delete.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/find.c
--- trunk/reactos/lib/rossym/find.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/find.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,150 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/find.c
+ * PURPOSE: Find symbol info for an address
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+/*
+ * Parts of this file based on work Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights
reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
the
+ * documentation and/or other materials provided with the
distribution.
+ * 4. Neither the name of the University nor the names of its
contributors
+ * may be used to endorse or promote products derived from this
software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF
+ * SUCH DAMAGE.
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+static PROSSYM_ENTRY
+FindEntry(IN PROSSYM_INFO RosSymInfo, IN ULONG_PTR RelativeAddress)
+{
+ /*
+ * Perform a binary search.
+ *
+ * The code below is a bit sneaky. After a comparison fails, we
+ * divide the work in half by moving either left or right. If lim
+ * is odd, moving left simply involves halving lim: e.g., when lim
+ * is 5 we look at item 2, so we change lim to 2 so that we will
+ * look at items 0 & 1. If lim is even, the same applies. If lim
+ * is odd, moving right again involes halving lim, this time moving
+ * the base up one item past p: e.g., when lim is 5 we change base
+ * to item 3 and make lim 2 so that we will look at items 3 and 4.
+ * If lim is even, however, we have to shrink it by one before
+ * halving: e.g., when lim is 4, we still looked at item 2, so we
+ * have to make lim 3, then halve, obtaining 1, so that we will only
+ * look at item 3.
+ */
+ PROSSYM_ENTRY Base = RosSymInfo->Symbols;
+ ULONG Lim;
+ PROSSYM_ENTRY Mid, Low;
+
+ if (RelativeAddress < Base->Address)
+ {
+ return NULL;
+ }
+
+ Low = Base;
+ for (Lim = RosSymInfo->SymbolsCount; Lim != 0; Lim >>= 1)
+ {
+ Mid = Base + (Lim >> 1);
+ if (RelativeAddress == Mid->Address)
+ {
+ return Mid;
+ }
+ if (Mid->Address < RelativeAddress) /* key > mid: move right */
+ {
+ Low = Mid;
+ Base = Mid + 1;
+ Lim--;
+ } /* else move left */
+ }
+
+ return Low;
+}
+
+
+BOOLEAN
+RosSymGetAddressInformation(PROSSYM_INFO RosSymInfo,
+ ULONG_PTR RelativeAddress,
+ ULONG *LineNumber,
+ char *FileName,
+ char *FunctionName)
+{
+ PROSSYM_ENTRY RosSymEntry;
+
+ DPRINT("RelativeAddress = 0x%08x\n", RelativeAddress);
+
+ if (RosSymInfo->Symbols == NULL || RosSymInfo->SymbolsCount == 0 ||
+ RosSymInfo->Strings == NULL || RosSymInfo->StringsLength == 0)
+ {
+__asm__("int $3\n");
+ DPRINT1("Uninitialized RosSymInfo\n");
+ return FALSE;
+ }
+
+ ASSERT(LineNumber || FileName || FunctionName);
+
+ /* find symbol entry for function */
+ RosSymEntry = FindEntry(RosSymInfo, RelativeAddress);
+
+ if (NULL == RosSymEntry)
+ {
+ DPRINT("None of the requested information was found!\n");
+ return FALSE;
+ }
+
+ if (LineNumber != NULL)
+ {
+ *LineNumber = RosSymEntry->SourceLine;
+ }
+ if (FileName != NULL)
+ {
+ PCSTR Name = "";
+ if (RosSymEntry->FileOffset != 0)
+ {
+ Name = (PCHAR) RosSymInfo->Strings + RosSymEntry->FileOffset;
+ }
+ strcpy(FileName, Name);
+ }
+ if (FunctionName != NULL)
+ {
+ PCSTR Name = "";
+ if (RosSymEntry->FunctionOffset != 0)
+ {
+ Name = (PCHAR) RosSymInfo->Strings +
RosSymEntry->FunctionOffset;
+ }
+ strcpy(FunctionName, Name);
+ }
+
+ return TRUE;
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/find.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/fromfile.c
--- trunk/reactos/lib/rossym/fromfile.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/fromfile.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,145 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/fromfile.c
+ * PURPOSE: Creating rossym info from a file
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+BOOLEAN
+RosSymCreateFromFile(PVOID FileContext, PROSSYM_INFO *RosSymInfo)
+{
+ IMAGE_DOS_HEADER DosHeader;
+ IMAGE_NT_HEADERS NtHeaders;
+ PIMAGE_SECTION_HEADER SectionHeaders, SectionHeader;
+ unsigned SectionIndex;
+ char SectionName[IMAGE_SIZEOF_SHORT_NAME];
+ ROSSYM_HEADER RosSymHeader;
+
+ /* Load DOS header */
+ if (! RosSymReadFile(FileContext, &DosHeader,
sizeof(IMAGE_DOS_HEADER)))
+ {
+ DPRINT1("Failed to read DOS header\n");
+ return FALSE;
+ }
+ if (! ROSSYM_IS_VALID_DOS_HEADER(&DosHeader))
+ {
+ DPRINT1("Image doesn't have a valid DOS header\n");
+ return FALSE;
+ }
+
+ /* Load NT headers */
+ if (! RosSymSeekFile(FileContext, DosHeader.e_lfanew))
+ {
+ DPRINT1("Failed seeking to NT headers\n");
+ return FALSE;
+ }
+ if (! RosSymReadFile(FileContext, &NtHeaders,
sizeof(IMAGE_NT_HEADERS)))
+ {
+ DPRINT1("Failed to read NT headers\n");
+ return FALSE;
+ }
+ if (! ROSSYM_IS_VALID_NT_HEADERS(&NtHeaders))
+ {
+ DPRINT1("Image doesn't have a valid PE header\n");
+ return FALSE;
+ }
+
+ /* Load section headers */
+ if (! RosSymSeekFile(FileContext, (char *)
IMAGE_FIRST_SECTION(&NtHeaders) -
+ (char *) &NtHeaders +
DosHeader.e_lfanew))
+ {
+ DPRINT1("Failed seeking to section headers\n");
+ return FALSE;
+ }
+ SectionHeaders = RosSymAllocMem(NtHeaders.FileHeader.NumberOfSections
+ * sizeof(IMAGE_SECTION_HEADER));
+ if (NULL == SectionHeaders)
+ {
+ DPRINT1("Failed to allocate memory for %u section headers\n",
+ NtHeaders.FileHeader.NumberOfSections);
+ return FALSE;
+ }
+ if (! RosSymReadFile(FileContext, SectionHeaders,
+ NtHeaders.FileHeader.NumberOfSections
+ * sizeof(IMAGE_SECTION_HEADER)))
+ {
+ RosSymFreeMem(SectionHeaders);
+ DPRINT1("Failed to read section headers\n");
+ return FALSE;
+ }
+
+ /* Search for the section header */
+ strncpy(SectionName, ROSSYM_SECTION_NAME, IMAGE_SIZEOF_SHORT_NAME);
+ SectionHeader = SectionHeaders;
+ for (SectionIndex = 0; SectionIndex <
NtHeaders.FileHeader.NumberOfSections; SectionIndex++)
+ {
+ if (0 == memcmp(SectionName, SectionHeader->Name,
IMAGE_SIZEOF_SHORT_NAME))
+ {
+ break;
+ }
+ SectionHeader++;
+ }
+ if (NtHeaders.FileHeader.NumberOfSections <= SectionIndex)
+ {
+ RosSymFreeMem(SectionHeaders);
+ DPRINT("No %s section found\n", ROSSYM_SECTION_NAME);
+ return FALSE;
+ }
+
+ /* Load rossym header */
+ if (! RosSymSeekFile(FileContext, SectionHeader->PointerToRawData))
+ {
+ RosSymFreeMem(SectionHeaders);
+ DPRINT1("Failed seeking to section data\n");
+ return FALSE;
+ }
+ RosSymFreeMem(SectionHeaders);
+ if (! RosSymReadFile(FileContext, &RosSymHeader,
sizeof(ROSSYM_HEADER)))
+ {
+ DPRINT1("Failed to read rossym header\n");
+ return FALSE;
+ }
+ if (RosSymHeader.SymbolsOffset < sizeof(ROSSYM_HEADER)
+ || RosSymHeader.StringsOffset < RosSymHeader.SymbolsOffset +
RosSymHeader.SymbolsLength
+ || 0 != (RosSymHeader.SymbolsLength % sizeof(ROSSYM_ENTRY)))
+ {
+ DPRINT1("Invalid ROSSYM_HEADER\n");
+ return FALSE;
+ }
+
+ *RosSymInfo = RosSymAllocMem(sizeof(ROSSYM_INFO) -
sizeof(ROSSYM_HEADER)
+ + RosSymHeader.StringsOffset +
RosSymHeader.StringsLength + 1);
+ if (NULL == *RosSymInfo)
+ {
+ DPRINT1("Failed to allocate memory for rossym\n");
+ return FALSE;
+ }
+ (*RosSymInfo)->Symbols = (PROSSYM_ENTRY)((char *) *RosSymInfo +
sizeof(ROSSYM_INFO)
+ - sizeof(ROSSYM_HEADER) +
RosSymHeader.SymbolsOffset);
+ (*RosSymInfo)->SymbolsCount = RosSymHeader.SymbolsLength /
sizeof(ROSSYM_ENTRY);
+ (*RosSymInfo)->Strings = (PCHAR) *RosSymInfo + sizeof(ROSSYM_INFO) -
sizeof(ROSSYM_HEADER)
+ + RosSymHeader.StringsOffset;
+ (*RosSymInfo)->StringsLength = RosSymHeader.StringsLength;
+ if (! RosSymReadFile(FileContext, *RosSymInfo + 1,
+ RosSymHeader.StringsOffset +
RosSymHeader.StringsLength
+ - sizeof(ROSSYM_HEADER)))
+ {
+ DPRINT1("Failed to read rossym headers\n");
+ return FALSE;
+ }
+ /* Make sure the last string is null terminated, we allocated an
extra byte for that */
+ (*RosSymInfo)->Strings[(*RosSymInfo)->StringsLength] = '\0';
+
+ return TRUE;
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/fromfile.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/frommem.c
--- trunk/reactos/lib/rossym/frommem.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/frommem.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,80 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/frommem.c
+ * PURPOSE: Creating rossym info from an in-memory image
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+BOOLEAN
+RosSymCreateFromMem(PVOID ImageStart, ULONG_PTR ImageSize, PROSSYM_INFO
*RosSymInfo)
+{
+ PIMAGE_DOS_HEADER DosHeader;
+ PIMAGE_NT_HEADERS NtHeaders;
+ PIMAGE_SECTION_HEADER SectionHeader;
+ unsigned SectionIndex;
+ char SectionName[IMAGE_SIZEOF_SHORT_NAME];
+
+ /* Check if MZ header is valid */
+ DosHeader = (PIMAGE_DOS_HEADER) ImageStart;
+ if (ImageSize < sizeof(IMAGE_DOS_HEADER)
+ || ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader))
+ {
+ DPRINT1("Image doesn't have a valid DOS header\n");
+ return FALSE;
+ }
+
+ /* Locate NT header */
+ NtHeaders = (PIMAGE_NT_HEADERS)((char *) ImageStart +
DosHeader->e_lfanew);
+ if (ImageSize < DosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)
+ || ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders))
+ {
+ DPRINT1("Image doesn't have a valid PE header\n");
+ return FALSE;
+ }
+
+ /* Search for the section header */
+ SectionHeader = IMAGE_FIRST_SECTION(NtHeaders);
+ if (ImageSize < (ULONG_PTR)((char *) (SectionHeader +
NtHeaders->FileHeader.NumberOfSections)
+ - (char *) ImageStart))
+ {
+ DPRINT1("Image doesn't have valid section headers\n");
+ return FALSE;
+ }
+ strncpy(SectionName, ROSSYM_SECTION_NAME, IMAGE_SIZEOF_SHORT_NAME);
+ for (SectionIndex = 0; SectionIndex <
NtHeaders->FileHeader.NumberOfSections; SectionIndex++)
+ {
+ if (0 == memcmp(SectionName, SectionHeader->Name,
IMAGE_SIZEOF_SHORT_NAME))
+ {
+ break;
+ }
+ SectionHeader++;
+ }
+ if (NtHeaders->FileHeader.NumberOfSections <= SectionIndex)
+ {
+ DPRINT("No %s section found\n", ROSSYM_SECTION_NAME);
+ return FALSE;
+ }
+
+ /* Locate the section itself */
+ if (ImageSize < SectionHeader->PointerToRawData +
SectionHeader->SizeOfRawData
+ || SectionHeader->SizeOfRawData < sizeof(ROSSYM_HEADER))
+ {
+ DPRINT1("Invalid %s section\n", ROSSYM_SECTION_NAME);
+ return FALSE;
+ }
+
+ /* Load it */
+ return RosSymCreateFromRaw((char *) ImageStart +
SectionHeader->PointerToRawData,
+ SectionHeader->SizeOfRawData, RosSymInfo);
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/frommem.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/fromraw.c
--- trunk/reactos/lib/rossym/fromraw.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/fromraw.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,54 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/frommem.c
+ * PURPOSE: Creating rossym info from an in-memory image
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+BOOLEAN
+RosSymCreateFromRaw(PVOID RawData, ULONG_PTR DataSize, PROSSYM_INFO
*RosSymInfo)
+{
+ PROSSYM_HEADER RosSymHeader;
+
+ RosSymHeader = (PROSSYM_HEADER) RawData;
+ if (RosSymHeader->SymbolsOffset < sizeof(ROSSYM_HEADER)
+ || RosSymHeader->StringsOffset < RosSymHeader->SymbolsOffset +
RosSymHeader->SymbolsLength
+ || DataSize < RosSymHeader->StringsOffset +
RosSymHeader->StringsLength
+ || 0 != (RosSymHeader->SymbolsLength % sizeof(ROSSYM_ENTRY)))
+ {
+ DPRINT1("Invalid ROSSYM_HEADER\n");
+ return FALSE;
+ }
+
+ /* Copy */
+ *RosSymInfo = RosSymAllocMem(sizeof(ROSSYM_INFO) +
RosSymHeader->SymbolsLength
+ + RosSymHeader->StringsLength + 1);
+ if (NULL == *RosSymInfo)
+ {
+ DPRINT1("Failed to allocate memory for rossym\n");
+ return FALSE;
+ }
+ (*RosSymInfo)->Symbols = (PROSSYM_ENTRY)((char *) *RosSymInfo +
sizeof(ROSSYM_INFO));
+ (*RosSymInfo)->SymbolsCount = RosSymHeader->SymbolsLength /
sizeof(ROSSYM_ENTRY);
+ (*RosSymInfo)->Strings = (PCHAR) *RosSymInfo + sizeof(ROSSYM_INFO) +
RosSymHeader->SymbolsLength;
+ (*RosSymInfo)->StringsLength = RosSymHeader->StringsLength;
+ memcpy((*RosSymInfo)->Symbols, (char *) RosSymHeader +
RosSymHeader->SymbolsOffset,
+ RosSymHeader->SymbolsLength);
+ memcpy((*RosSymInfo)->Strings, (char *) RosSymHeader +
RosSymHeader->StringsOffset,
+ RosSymHeader->StringsLength);
+ /* Make sure the last string is null terminated, we allocated an
extra byte for that */
+ (*RosSymInfo)->Strings[(*RosSymInfo)->StringsLength] = '\0';
+
+ return TRUE;
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/fromraw.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/getraw.c
--- trunk/reactos/lib/rossym/getraw.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/getraw.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,42 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/getraw.c
+ * PURPOSE: Convert rossym info to raw external format
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+ULONG
+RosSymGetRawDataLength(PROSSYM_INFO RosSymInfo)
+{
+ return sizeof(ROSSYM_HEADER)
+ + RosSymInfo->SymbolsCount * sizeof(ROSSYM_ENTRY)
+ + RosSymInfo->StringsLength;
+}
+
+VOID
+RosSymGetRawData(PROSSYM_INFO RosSymInfo, PVOID RawData)
+{
+ PROSSYM_HEADER RosSymHeader;
+
+ RosSymHeader = (PROSSYM_HEADER) RawData;
+ RosSymHeader->SymbolsOffset = sizeof(ROSSYM_HEADER);
+ RosSymHeader->SymbolsLength = RosSymInfo->SymbolsCount *
sizeof(ROSSYM_ENTRY);
+ RosSymHeader->StringsOffset = RosSymHeader->SymbolsOffset +
RosSymHeader->SymbolsLength;
+ RosSymHeader->StringsLength = RosSymInfo->StringsLength;
+
+ memcpy((char *) RawData + RosSymHeader->SymbolsOffset,
RosSymInfo->Symbols,
+ RosSymHeader->SymbolsLength);
+ memcpy((char *) RawData + RosSymHeader->StringsOffset,
RosSymInfo->Strings,
+ RosSymHeader->StringsLength);
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/getraw.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/init.c
--- trunk/reactos/lib/rossym/init.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/init.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,21 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/data.c
+ * PURPOSE: Definition of external variables
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#include <windows.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+ROSSYM_CALLBACKS RosSymCallbacks;
+
+VOID
+RosSymInit(PROSSYM_CALLBACKS Callbacks)
+{
+ RosSymCallbacks = *Callbacks;
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/init.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/initkm.c
--- trunk/reactos/lib/rossym/initkm.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/initkm.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,46 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/initkm.c
+ * PURPOSE: Initialize library for use in kernel mode
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) +
((D)<<24))
+#define TAG_ROSSYM TAG('R', 'S', 'Y', 'M')
+
+static PVOID
+RosSymAllocMemKM(ULONG_PTR Size)
+{
+ return ExAllocatePoolWithTag(NonPagedPool, Size, TAG_ROSSYM);
+}
+
+static VOID
+RosSymFreeMemKM(PVOID Area)
+{
+ return ExFreePool(Area);
+}
+
+VOID
+RosSymInitKernelMode(VOID)
+{
+ static ROSSYM_CALLBACKS KmCallbacks =
+ {
+ RosSymAllocMemKM,
+ RosSymFreeMemKM,
+ RosSymZwReadFile,
+ RosSymZwSeekFile
+ };
+
+ RosSymInit(&KmCallbacks);
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/initkm.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/initum.c
--- trunk/reactos/lib/rossym/initum.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/initum.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,42 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/initum.c
+ * PURPOSE: Initialize library for use in user mode
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#include <windows.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+static PVOID
+RosSymAllocMemUM(ULONG_PTR Size)
+{
+ return HeapAlloc(GetProcessHeap(), 0, Size);
+}
+
+static VOID
+RosSymFreeMemUM(PVOID Area)
+{
+ HeapFree(GetProcessHeap(), 0, Area);
+}
+
+VOID
+RosSymInitUserMode(VOID)
+{
+ static ROSSYM_CALLBACKS KmCallbacks =
+ {
+ RosSymAllocMemUM,
+ RosSymFreeMemUM,
+ RosSymZwReadFile,
+ RosSymZwSeekFile
+ };
+
+ RosSymInit(&KmCallbacks);
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/initum.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/rossym.rbuild
--- trunk/reactos/lib/rossym/rossym.rbuild 2006-01-30 19:45:40 UTC
(rev 52)
+++ trunk/reactos/lib/rossym/rossym.rbuild 2006-01-30 20:01:34 UTC
(rev 53)
@@ -0,0 +1,14 @@
+<module name="rossym" type="staticlibrary">
+ <define name="__USE_W32API" />
+ <include base="ReactOS">include/ddk</include>
+ <file>delete.c</file>
+ <file>find.c</file>
+ <file>fromfile.c</file>
+ <file>frommem.c</file>
+ <file>fromraw.c</file>
+ <file>getraw.c</file>
+ <file>init.c</file>
+ <file>initkm.c</file>
+ <file>initum.c</file>
+ <file>zwfile.c</file>
+</module>
Property changes on: trunk/reactos/lib/rossym/rossym.rbuild
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/rossympriv.h
--- trunk/reactos/lib/rossym/rossympriv.h 2006-01-30 19:45:40 UTC
(rev 52)
+++ trunk/reactos/lib/rossym/rossympriv.h 2006-01-30 20:01:34 UTC
(rev 53)
@@ -0,0 +1,38 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/rossympriv.h
+ * PURPOSE: Private header for rossym
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#ifndef ROSSYMPRIV_H_INCLUDED
+#define ROSSYMPRIV_H_INCLUDED
+
+typedef struct _ROSSYM_INFO {
+ PROSSYM_ENTRY Symbols;
+ ULONG SymbolsCount;
+ PCHAR Strings;
+ ULONG StringsLength;
+} ROSSYM_INFO;
+
+extern ROSSYM_CALLBACKS RosSymCallbacks;
+
+#define RosSymAllocMem(Size) (*RosSymCallbacks.AllocMemProc)(Size)
+#define RosSymFreeMem(Area) (*RosSymCallbacks.FreeMemProc)(Area)
+#define RosSymReadFile(FileContext, Buffer, Size)
(*RosSymCallbacks.ReadFileProc)((FileContext), (Buffer), (Size))
+#define RosSymSeekFile(FileContext, Position)
(*RosSymCallbacks.SeekFileProc)((FileContext), (Position))
+
+extern BOOLEAN RosSymZwReadFile(PVOID FileContext, PVOID Buffer, ULONG
Size);
+extern BOOLEAN RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position);
+
+#define ROSSYM_IS_VALID_DOS_HEADER(DosHeader) (IMAGE_DOS_SIGNATURE ==
(DosHeader)->e_magic \
+ && 0L !=
(DosHeader)->e_lfanew)
+#define ROSSYM_IS_VALID_NT_HEADERS(NtHeaders) (IMAGE_NT_SIGNATURE ==
(NtHeaders)->Signature \
+ &&
IMAGE_NT_OPTIONAL_HDR_MAGIC == (NtHeaders)->OptionalHeader.Magic)
+
+
+#endif /* ROSSYMPRIV_H_INCLUDED */
+
+/* EOF */
+
Property changes on: trunk/reactos/lib/rossym/rossympriv.h
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/lib/rossym/zwfile.c
--- trunk/reactos/lib/rossym/zwfile.c 2006-01-30 19:45:40 UTC (rev 52)
+++ trunk/reactos/lib/rossym/zwfile.c 2006-01-30 20:01:34 UTC (rev 53)
@@ -0,0 +1,51 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: lib/rossym/zwfile.c
+ * PURPOSE: File I/O using native functions
+ * COPYRIGHT: Ge van Geldorp (gvg(a)reactos.org)
+ */
+
+#define NTOSAPI
+#include <ntddk.h>
+#include <reactos/rossym.h>
+#include "rossympriv.h"
+
+#define NDEBUG
+#include <debug.h>
+
+BOOLEAN
+RosSymZwReadFile(PVOID FileContext, PVOID Buffer, ULONG Size)
+{
+ NTSTATUS Status;
+ IO_STATUS_BLOCK IoStatusBlock;
+
+ Status = ZwReadFile(*((HANDLE *) FileContext),
+ 0, 0, 0,
+ &IoStatusBlock,
+ Buffer,
+ Size,
+ 0, 0);
+
+ return NT_SUCCESS(Status) && IoStatusBlock.Information == Size;
+}
+
+BOOLEAN
+RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position)
+{
+ NTSTATUS Status;
+ IO_STATUS_BLOCK IoStatusBlock;
+ FILE_POSITION_INFORMATION NewPosition;
+
+ NewPosition.CurrentByteOffset.u.HighPart = 0;
+ NewPosition.CurrentByteOffset.u.LowPart = Position;
+ Status = ZwSetInformationFile(*((HANDLE *) FileContext),
+ &IoStatusBlock,
+ (PVOID) &NewPosition,
+ sizeof(FILE_POSITION_INFORMATION),
+ FilePositionInformation);
+
+ return NT_SUCCESS(Status);
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/rossym/zwfile.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native