windows-nt/Source/XPSP1/NT/base/boot/setup/i386/initx86.c

225 lines
4.9 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
initx86.c
Abstract:
Does any x86-specific initialization, then starts the common ARC setupldr
Author:
John Vert (jvert) 14-Oct-1993
Revision History:
--*/
#include "setupldr.h"
#include "bldrx86.h"
#include "msgs.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <netboot.h>
ARC_STATUS
SlInit(
IN ULONG Argc,
IN PCHAR Argv[],
IN PCHAR Envp[]
);
BOOLEAN
BlDetectHardware(
IN ULONG DriveId,
IN PCHAR LoadOptions
);
VOID
BlStartup(
IN PCHAR PartitionName
)
/*++
Routine Description:
Does x86-specific initialization, particularly running NTDETECT, then
calls to the common setupldr.
Arguments:
PartitionName - Supplies the ARC name of the partition (or floppy) that
setupldr was loaded from.
Return Value:
Does not return
--*/
{
ULONG Argc;
PCHAR Argv[10];
CHAR SetupLoadFileName[129];
CHAR LoadOptions[100];
ARC_STATUS Status;
ULONG DriveId;
ULONGLONG NetRebootParameter;
BOOLEAN UseCommandConsole = FALSE;
BOOLEAN RollbackEnabled = FALSE;
extern BOOLEAN FwDescriptorsValid;
extern BOOLEAN TryASRViaNetwork;
if (BlBootingFromNet) {
//
// Go retrieve all the information passed to us from StartROM.
// Once we have that, we'll call BlGetHeadlessRestartBlock and
// get all the port settings that StartROM sent us. These,
// in turn, will then be used in BlInitializeTerminal(), which
// we'are about to call.
//
NetGetRebootParameters(
&NetRebootParameter,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
FALSE
);
if (NetRebootParameter == NET_REBOOT_COMMAND_CONSOLE_ONLY) {
UseCommandConsole = TRUE;
}
if (NetRebootParameter == NET_REBOOT_ASR) {
TryASRViaNetwork = TRUE;
}
}
//
// Initialize any dumb terminal that may be connected.
//
BlInitializeHeadlessPort();
//
// Open the boot partition so we can load NTDETECT off it.
//
Status = ArcOpen(PartitionName, ArcOpenReadOnly, &DriveId);
if (Status != ESUCCESS) {
BlPrint(BlFindMessage(SL_DRIVE_ERROR),PartitionName);
return;
}
if (_stricmp( (PCHAR)(0x7c03), "cmdcons" ) == 0) {
UseCommandConsole = TRUE;
} else if (strcmp ((PCHAR)(0x7c03), "undo") == 0) {
//
// NTLDR wrote the exact text "undo" (including the nul
// terminator). We know the address this text was written
// to -- 0x7C03. If we find the token, then enable rollback
// mode. This triggers an argument to be passed to textmode
// setup, plus a different boot message.
//
RollbackEnabled = TRUE;
}
//
// Initialize dbcs font and display.
//
TextGrInitialize(DriveId, &BootFontImageLength);
if (UseCommandConsole) {
BlPrint(BlFindMessage(SL_NTDETECT_CMDCONS));
} else if (RollbackEnabled) {
BlPrint(BlFindMessage(SL_NTDETECT_ROLLBACK));
} else {
BlPrint(BlFindMessage(SL_NTDETECT_MSG));
}
//
// See if we need to send /noirqscan to ntdetect
//
Argv[0] = NULL;
if(WinntSifHandle != NULL) {
Argv[0] = SlGetSectionKeyIndex(WinntSifHandle,"SetupData","OsLoadOptionsVar",0);
}
//
// detect HAL here.
//
if (!BlDetectHardware(DriveId, Argv[0])) {
BlPrint(BlFindMessage(SL_NTDETECT_FAILURE));
return;
}
FwDescriptorsValid = FALSE;
BlKernelChecked=TRUE;
//
// NOTE:
// If you are testing the changes on read only Jaz drive uncomment this line
// and put the correct value for rdisk(?). You also need to make sure
// that SCSI BIOS emulation for the jaz drive is turned on for this trick
// to work.
//
//strcpy(PartitionName, "multi(0)disk(0)rdisk(1)partition(1)");
//
// Close the drive, the loader will re-open it.
//
ArcClose(DriveId);
//
// Create arguments, call off to setupldr
//
if (BlBootingFromNet) {
strcpy(SetupLoadFileName, PartitionName);
strcat(SetupLoadFileName, "\\i386\\SETUPLDR");
} else {
strcpy(SetupLoadFileName, PartitionName);
strcat(SetupLoadFileName, "\\SETUPLDR");
}
Argv[0] = SetupLoadFileName;
Argc = 1;
if (UseCommandConsole) {
Argv[Argc++] = "ImageType=cmdcons";
}
if (RollbackEnabled) {
//
// Rollback is a special case where we know there can be no
// OsLoadOptions.
//
Argv[Argc++] = "ImageType=rollback";
}
Status = SlInit( Argc, Argv, NULL );
//
// We should never return here, something
// horrible has happened.
//
while (TRUE) {
if (BlTerminalHandleLoaderFailure()) {
ArcRestart();
}
}
return;
}