Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

294 lines
4.9 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Copyright (c) 1993 Digital Equipment Corporation
Module Name:
jnfsinit.c
Abstract:
This module implements the main part of the FailSafe Booter. It was
based on jxboot.c.
Author:
John DeRosa 21-October-1992
Environment:
Kernel mode only.
Revision History:
--*/
#include "fwp.h"
#ifdef JENSEN
#include "jnsnrtc.h"
#else
#include "mrgnrtc.h" // morgan
#endif
#include "string.h"
#include "led.h"
#include "fwstring.h"
#include "xxstring.h"
extern PCHAR FirmwareVersion;
//
// Define local procedure prototypes.
//
typedef
VOID
(*PTRANSFER_ROUTINE) (
IN ULONG Argc,
IN PCHAR Argv[],
IN PCHAR Envp[]
);
VOID
PutLedDisplay(
IN UCHAR Value
);
//
// Saved sp
//
ULONG FwSavedSp;
VOID
JnFsUpgradeSystem (
VOID
)
/*++
Routine Description:
This routine attempts to load the upgrade image into memory.
Arguments:
None.
Return Value:
None.
--*/
{
ARC_STATUS Status;
//
// Initialize value for the ALIGN_BUFFER macro.
//
BlDcacheFillSize = KeGetDcacheFillSize();
//
// Initialize the firmware servies.
//
FwInitialize(0);
FwSetScreenColor( ArcColorWhite, ArcColorBlue);
FwSetScreenAttributes( TRUE, FALSE, FALSE);
FwClearScreen();
FwSetPosition(1,0);
PutLedDisplay(LED_FW_INITIALIZED);
FwPrint(FSB_MSG, FirmwareVersion);
FwPrint(FW_COPYRIGHT_MSG);
FwPrint(FSB_WHY_RUNNING_MSG);
FwSetScreenAttributes( FALSE, FALSE, FALSE);
FwSetScreenColor(ArcColorRed, ArcColorWhite);
FwPrint(FSB_FIELD_SERVICE_MSG);
FwSetScreenAttributes( TRUE, FALSE, FALSE);
FwSetScreenColor( ArcColorWhite, ArcColorBlue);
FwPrint(FSB_LOOKING_FOR_MSG);
FwSavedSp = 0;
Status = FwExecute("eisa()disk()fdisk()jnupdate.exe", 0, NULL, NULL);
if (Status != ESUCCESS) {
FwSetScreenAttributes( FALSE, FALSE, FALSE);
FwSetScreenColor(ArcColorRed, ArcColorWhite);
FwPrint(FW_ERROR2_MSG);
if (Status <= EROFS) {
FwPrint(FW_ERROR_MSG[Status - 1]);
} else {
FwPrint(FW_ERROR_CODE_MSG, Status);
}
FwPrint(FSB_UPGRADE_ABORTED_MSG);
}
//
// No matter how we returned, hang if we come back.
//
VenPrint(FSB_POWER_CYCLE_TO_REBOOT_MSG);
while (TRUE) {
}
}
VOID
FwInitialize (
IN ULONG MemSize
)
/*++
Routine Description:
This routine initializes the system parameter block which is located
in low memory. This structure contains the firmware entry vector and
the restart parameter block. This routine also initializes the io devices,
the configuration, and opens standard in/out.
Arguments:
MemSize - Not Used. For compatibility with definitions in bldr\firmware.h
Return Value:
None.
--*/
{
ULONG Fid;
ULONG TTBase;
PCHAR ConsoleName;
ULONG Index;
CHAR DiskPath[40];
//
// Initialize Vendor Must be done before Calling FwAllocatePool. Also
// initialize the system ID and time.
//
FwVendorInitialize();
//FwSystemIdInitialize();
FwTimeInitialize();
//
// Initialize the Fw loadable services.
//
FwLoadInitialize();
//
// Initialize the termination function entry points in the transfer vector
//
//FwTerminationInitialize();
//
// Initialize configuration
//
FwConfigurationInitialize();
//
// Initialize IO structures and display driver.
//
FwIoInitialize1();
//
// Initialize the I/O services and environment.
//
FwIoInitialize2();
//FwEnvironmentInitialize();
//
// Open the std in and out device.
//
FwOpenConsole();
FwConsoleInitialized = TRUE;
//
// Spinning up the disks and initting the Eisa routines are not necessary.
//
return;
}
VOID
FwOpenConsole(
IN VOID
)
/*++
Routine Description:
This opens the console input and output devices. This does not
reference the environment variables, as we do not have full
environment variable support to minimize code space.
Arguments:
None.
Return Value:
None.
--*/
{
ULONG Fid;
PCHAR ConsoleName;
//
// Open the std in and out device.
//
if (SerialOutput) {
ConsoleName=FW_SERIAL_0_DEVICE;
} else {
ConsoleName=FW_KEYBOARD_IN_DEVICE;
}
if (FwOpen(ConsoleName,ArcOpenReadOnly,&Fid) != ESUCCESS) {
FwPrint(FW_CONSOLE_IN_ERROR_MSG);
FwPrint(FW_CONTACT_FIELD_SERVICE_MSG);
}
if (Fid != ARC_CONSOLE_INPUT) {
FwPrint(FW_CONSOLE_IN_ERROR2_MSG);
}
if (SerialOutput) {
ConsoleName=FW_SERIAL_0_DEVICE;
} else {
ConsoleName=FW_CONSOLE_OUT_DEVICE;
}
if (FwOpen(ConsoleName,ArcOpenWriteOnly,&Fid) != ESUCCESS) {
FwPrint(FW_CONSOLE_OUT_ERROR_MSG);
FwPrint(FW_CONTACT_FIELD_SERVICE_MSG);
}
if (Fid != ARC_CONSOLE_OUTPUT) {
FwPrint(FW_CONSOLE_OUT_ERROR2_MSG);
}
}