Resolve imports at boot time by loading the appropriate modules. We still need

to fix the same stuff in ntoskrnl for pnp loading.
Thanks to hpoussin for fixing pnp so this works.

svn path=/trunk/; revision=27444
This commit is contained in:
Art Yerkes 2007-07-07 04:43:08 +00:00
parent 320491c5f1
commit adb11df303
3 changed files with 102 additions and 95 deletions

View file

@ -454,6 +454,8 @@ LdrPEProcessImportDirectoryEntry(PVOID DriverBase,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
extern BOOLEAN FrLdrLoadDriver(PCHAR szFileName, INT nPos);
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrPEGetOrLoadModule(IN PCHAR ModuleName, LdrPEGetOrLoadModule(IN PCHAR ModuleName,
@ -465,31 +467,15 @@ LdrPEGetOrLoadModule(IN PCHAR ModuleName,
*ImportedModule = LdrGetModuleObject(ImportedName); *ImportedModule = LdrGetModuleObject(ImportedName);
if (*ImportedModule == NULL) if (*ImportedModule == NULL)
{ {
/* if (!FrLdrLoadDriver(ImportedName, 0))
* For now, we only support import-loading the HAL. {
* Later, FrLdrLoadDriver should be made to share the same return STATUS_UNSUCCESSFUL;
* code, and we'll just call it instead. }
*/ else
if (!_stricmp(ImportedName, "hal.dll") || {
!_stricmp(ImportedName, "kdcom.dll") || return LdrPEGetOrLoadModule
!_stricmp(ImportedName, "bootvid.dll")) (ModuleName, ImportedName, ImportedModule);
{ }
/* Load the HAL */
FrLdrLoadImage(ImportedName, 10, FALSE);
/* Return the new module */
*ImportedModule = LdrGetModuleObject(ImportedName);
if (*ImportedModule == NULL)
{
DbgPrint("Error loading import: %s\n", ImportedName);
return STATUS_UNSUCCESSFUL;
}
}
else
{
DbgPrint("Don't yet support loading new modules from imports\n");
Status = STATUS_NOT_IMPLEMENTED;
}
} }
return Status; return Status;
@ -512,7 +498,7 @@ LdrPEFixupImports(IN PVOID DllBase,
TRUE, TRUE,
IMAGE_DIRECTORY_ENTRY_IMPORT, IMAGE_DIRECTORY_ENTRY_IMPORT,
&Size); &Size);
while (ImportModuleDirectory->Name) while (ImportModuleDirectory && ImportModuleDirectory->Name)
{ {
/* Check to make sure that import lib is kernel */ /* Check to make sure that import lib is kernel */
ImportedName = (PCHAR) DllBase + ImportModuleDirectory->Name; ImportedName = (PCHAR) DllBase + ImportModuleDirectory->Name;
@ -651,9 +637,6 @@ FrLdrMapImage(IN FILE *Image,
/* Increase the next Load Base */ /* Increase the next Load Base */
NextModuleBase = ROUND_UP(NextModuleBase + ImageSize, PAGE_SIZE); NextModuleBase = ROUND_UP(NextModuleBase + ImageSize, PAGE_SIZE);
/* Load HAL if this is the kernel */
if (ImageType == 1) FrLdrLoadImage("hal.dll", 10, FALSE);
/* Perform import fixups */ /* Perform import fixups */
if (!NT_SUCCESS(LdrPEFixupImports(LoadBase, Name))) if (!NT_SUCCESS(LdrPEFixupImports(LoadBase, Name)))
{ {

View file

@ -33,10 +33,93 @@ char reactos_arc_strings[32][256];
unsigned long reactos_disk_count = 0; unsigned long reactos_disk_count = 0;
CHAR szHalName[255]; CHAR szHalName[255];
CHAR szBootPath[255]; CHAR szBootPath[255];
CHAR SystemRoot[255];
static CHAR szLoadingMsg[] = "Loading ReactOS..."; static CHAR szLoadingMsg[] = "Loading ReactOS...";
BOOLEAN FrLdrBootType; BOOLEAN FrLdrBootType;
extern ULONG_PTR KernelBase, KernelEntry; extern ULONG_PTR KernelBase, KernelEntry;
BOOLEAN
FrLdrLoadDriver(PCHAR szFileName,
INT nPos)
{
PFILE FilePointer;
CHAR value[256], *FinalSlash;
LPSTR p;
if (!_stricmp(szFileName, "hal.dll"))
{
/* Use the boot.ini name instead */
szFileName = szHalName;
}
FinalSlash = strrchr(szFileName, '\\');
if(FinalSlash)
szFileName = FinalSlash + 1;
/* Open the Driver */
FilePointer = FsOpenFile(szFileName);
/* Try under the system root in the main dir and drivers */
if (FilePointer == NULL)
{
strcpy(value, SystemRoot);
if(value[strlen(value)-1] != '\\')
strcat(value, "\\");
strcat(value, szFileName);
FilePointer = FsOpenFile(value);
}
if (FilePointer == NULL)
{
strcpy(value, SystemRoot);
if(value[strlen(value)-1] != '\\')
strcat(value, "\\");
strcat(value, "SYSTEM32\\");
strcat(value, szFileName);
FilePointer = FsOpenFile(value);
}
if (FilePointer == NULL)
{
strcpy(value, SystemRoot);
if(value[strlen(value)-1] != '\\')
strcat(value, "\\");
strcat(value, "SYSTEM32\\DRIVERS\\");
strcat(value, szFileName);
FilePointer = FsOpenFile(value);
}
/* Make sure we did */
if (FilePointer == NULL) {
/* Fail if file wasn't opened */
strcpy(value, szFileName);
strcat(value, " not found.");
return(FALSE);
}
/* Update the status bar with the current file */
strcpy(value, "Reading ");
p = strrchr(szFileName, '\\');
if (p == NULL) {
strcat(value, szFileName);
} else {
strcat(value, p + 1);
}
UiDrawStatusText(value);
/* Load the driver */
FrLdrMapImage(FilePointer, szFileName, 0);
/* Update status and return */
UiDrawProgressBarCenter(nPos, 100, szLoadingMsg);
return(TRUE);
}
PVOID PVOID
NTAPI NTAPI
FrLdrLoadImage(IN PCHAR szFileName, FrLdrLoadImage(IN PCHAR szFileName,
@ -48,13 +131,6 @@ FrLdrLoadImage(IN PCHAR szFileName,
CHAR szBuffer[256], szFullPath[256]; CHAR szBuffer[256], szFullPath[256];
PVOID LoadBase; PVOID LoadBase;
/* Check if this the HAL being loaded */
if (!_stricmp(szFileName, "hal.dll"))
{
/* Use the boot.ini name instead */
szFileName = szHalName;
}
/* Extract filename without path */ /* Extract filename without path */
szShortName = strrchr(szFileName, '\\'); szShortName = strrchr(szFileName, '\\');
if (!szShortName) if (!szShortName)
@ -618,6 +694,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
strcat(szBootPath, "\\"); strcat(szBootPath, "\\");
DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath)); DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath));
strcpy(SystemRoot, szBootPath);
/* /*
* Find the kernel image name * Find the kernel image name

View file

@ -30,8 +30,10 @@ unsigned long reactos_memory_map_descriptor_size;
memory_map_t reactos_memory_map[32]; // Memory map memory_map_t reactos_memory_map[32]; // Memory map
char szBootPath[256]; char szBootPath[256];
char szHalName[256]; char szHalName[256];
CHAR SystemRoot[255];
extern ULONG_PTR KernelBase, KernelEntry; extern ULONG_PTR KernelBase, KernelEntry;
extern BOOLEAN FrLdrLoadDriver(PCHAR szFileName, INT nPos);
#define USE_UI #define USE_UI
@ -91,65 +93,7 @@ static FrLdrLoadKernel(IN PCHAR szFileName,
static BOOLEAN static BOOLEAN
LoadDriver(PCSTR szSourcePath, PCSTR szFileName) LoadDriver(PCSTR szSourcePath, PCSTR szFileName)
{ {
CHAR szFullName[256]; return FrLdrLoadDriver((PCHAR)szFileName, 0);
#ifdef USE_UI
CHAR szBuffer[80];
#endif
PFILE FilePointer;
PCSTR szShortName;
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);
}
szShortName = strrchr(szFileName, '\\');
if (szShortName == NULL)
szShortName = szFileName;
else
szShortName = szShortName + 1;
FilePointer = FsOpenFile(szFullName);
if (FilePointer == NULL)
{
printf("Could not find %s\n", szFileName);
return(FALSE);
}
/*
* Update the status bar with the current file
*/
#ifdef USE_UI
sprintf(szBuffer, "Setup is loading files (%s)", szShortName);
UiDrawStatusText(szBuffer);
#else
printf("Reading %s\n", szShortName);
#endif
/* Load the driver */
FrLdrMapImage(FilePointer, (LPSTR)szFileName, 2);
return(TRUE);
} }
@ -342,6 +286,9 @@ VOID RunLoader(VOID)
strcat(strcat(strcat(reactos_kernel_cmdline, SourcePath), " "), strcat(strcat(strcat(reactos_kernel_cmdline, SourcePath), " "),
LoadOptions); LoadOptions);
strcpy(SystemRoot, SourcePath);
strcat(SystemRoot, "\\");
/* Setup the boot path and kernel path */ /* Setup the boot path and kernel path */
strcpy(szBootPath, SourcePath); strcpy(szBootPath, SourcePath);
strcpy(szKernelName, szBootPath); strcpy(szKernelName, szBootPath);