Load the symbols from ntoskrn.exe from the boot cd, if it is possible.
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
_____
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
--- trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
2005-08-17 18:56:57 UTC (rev 17424)
+++ trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
2005-08-17 20:41:15 UTC (rev 17425)
@@ -19,6 +19,7 @@
*/
#include <freeldr.h>
+#include <reactos/rossym.h>
#include <debug.h>
#include <arch.h>
#include <disk.h>
@@ -42,7 +43,22 @@
#define USE_UI
+static BOOLEAN
+FreeldrReadFile(PVOID FileContext, PVOID Buffer, ULONG Size)
+{
+ ULONG BytesRead;
+ return FsReadFile((PFILE) FileContext, (ULONG) Size, &BytesRead,
Buffer)
+ && Size == BytesRead;
+}
+
+static BOOLEAN
+FreeldrSeekFile(PVOID FileContext, ULONG_PTR Position)
+{
+ FsSetFilePointer((PFILE) FileContext, (ULONG) Position);
+ return TRUE;
+}
+
static BOOL
LoadKernel(PCHAR szSourcePath, PCHAR szFileName)
{
@@ -108,7 +124,61 @@
return(TRUE);
}
+static BOOL
+LoadKernelSymbols(PCHAR szSourcePath, PCHAR szFileName)
+{
+ static ROSSYM_CALLBACKS FreeldrCallbacks =
+ {
+ MmAllocateMemory,
+ MmFreeMemory,
+ FreeldrReadFile,
+ FreeldrSeekFile
+ };
+ CHAR szFullName[256];
+ PFILE FilePointer;
+ PROSSYM_INFO RosSymInfo;
+ ULONG Size;
+ ULONG_PTR Base;
+ if (szSourcePath[0] != '\\')
+ {
+ strcpy(szFullName, "\\");
+ strcat(szFullName, szSourcePath);
+ }
+ else
+ {
+ strcpy(szFullName, szSourcePath);
+ }
+
+ if (szFullName[strlen(szFullName)] != '\\')
+ {
+ strcat(szFullName, "\\");
+ }
+
+ if (szFileName[0] != '\\')
+ {
+ strcat(szFullName, szFileName);
+ }
+ else
+ {
+ strcat(szFullName, szFileName + 1);
+ }
+
+ RosSymInit(&FreeldrCallbacks);
+
+ FilePointer = FsOpenFile(szFullName);
+ if (FilePointer && RosSymCreateFromFile(FilePointer, &RosSymInfo))
+ {
+ Base = FrLdrCreateModule("NTOSKRNL.SYM");
+ Size = RosSymGetRawDataLength(RosSymInfo);
+ RosSymGetRawData(RosSymInfo, (PVOID)Base);
+ FrLdrCloseModule(Base, Size);
+ RosSymDelete(RosSymInfo);
+ return TRUE;
+ }
+ return FALSE;
+}
+
static BOOL
LoadDriver(PCHAR szSourcePath, PCHAR szFileName)
{
@@ -388,6 +458,8 @@
if (!LoadDriver(SourcePath, "hal.dll"))
return;
+ /* Create ntoskrnl.sym */
+ LoadKernelSymbols(SourcePath, "ntoskrnl.exe");
/* Export the hardware hive */
Base = FrLdrCreateModule ("HARDWARE");