225 lines
4.9 KiB
C
225 lines
4.9 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|