summaryrefslogtreecommitdiffstats
path: root/private/ntos/boot/bldr/i386/initx86.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/boot/bldr/i386/initx86.c
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/ntos/boot/bldr/i386/initx86.c')
-rw-r--r--private/ntos/boot/bldr/i386/initx86.c311
1 files changed, 311 insertions, 0 deletions
diff --git a/private/ntos/boot/bldr/i386/initx86.c b/private/ntos/boot/bldr/i386/initx86.c
new file mode 100644
index 000000000..699f53945
--- /dev/null
+++ b/private/ntos/boot/bldr/i386/initx86.c
@@ -0,0 +1,311 @@
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ initx86.c
+
+Abstract:
+
+ Does any x86-specific initialization, then starts the common ARC osloader
+
+Author:
+
+ John Vert (jvert) 4-Nov-1993
+
+Revision History:
+
+--*/
+#include "bldrx86.h"
+#include "msg.h"
+
+UCHAR BootPartitionName[80];
+UCHAR KernelBootDevice[80];
+UCHAR OsLoadFilename[100];
+UCHAR OsLoaderFilename[100];
+UCHAR SystemPartition[100];
+UCHAR OsLoadPartition[100];
+UCHAR OsLoadOptions[100];
+UCHAR ConsoleInputName[50];
+UCHAR MyBuffer[SECTOR_SIZE+32];
+UCHAR ConsoleOutputName[50];
+UCHAR X86SystemPartition[sizeof("x86systempartition=") + sizeof(BootPartitionName)];
+
+
+VOID
+BlStartup(
+ IN PCHAR PartitionName
+ )
+
+/*++
+
+Routine Description:
+
+ Does x86-specific initialization, particularly presenting the boot.ini
+ menu and running NTDETECT, then calls to the common osloader.
+
+Arguments:
+
+ PartitionName - Supplies the ARC name of the partition (or floppy) that
+ setupldr was loaded from.
+
+Return Value:
+
+ Does not return
+
+--*/
+
+{
+ PUCHAR Argv[10];
+ ARC_STATUS Status;
+ ULONG BootFileId;
+ PCHAR BootFile;
+ ULONG Read;
+ PCHAR p;
+ ULONG i;
+ ULONG DriveId;
+ ULONG FileSize;
+ ULONG Count;
+ LARGE_INTEGER SeekPosition;
+ PCHAR LoadOptions = NULL;
+ BOOLEAN UseTimeOut=TRUE;
+ BOOLEAN AlreadyInitialized = FALSE;
+ extern BOOLEAN FwDescriptorsValid;
+
+ //
+ // Open the boot partition so we can load boot drivers off it.
+ //
+ Status = ArcOpen(PartitionName, ArcOpenReadOnly, &DriveId);
+ if (Status != ESUCCESS) {
+ BlPrint("Couldn't open drive %s\n",PartitionName);
+ BlPrint(BlFindMessage(BL_DRIVE_ERROR),PartitionName);
+ goto BootFailed;
+ }
+
+ //
+ // Initialize dbcs font and display support.
+ //
+ TextGrInitialize(DriveId);
+
+ do {
+
+ Status = BlOpen( DriveId,
+ "\\boot.ini",
+ ArcOpenReadOnly,
+ &BootFileId );
+
+ BootFile = MyBuffer;
+
+ RtlZeroMemory(MyBuffer, SECTOR_SIZE+32);
+
+ if (Status != ESUCCESS) {
+ BootFile[0]='\0';
+ } else {
+ //
+ // Determine the length of the boot.ini file by reading to the end of
+ // file.
+ //
+
+ FileSize = 0;
+ do {
+ Status = BlRead(BootFileId, BootFile, SECTOR_SIZE, &Count);
+ if (Status != ESUCCESS) {
+ BlClose(BootFileId);
+ BlPrint(BlFindMessage(BL_READ_ERROR),Status);
+ BootFile[0] = '\0';
+ FileSize = 0;
+ Count = 0;
+ goto BootFailed;
+ }
+
+ FileSize += Count;
+ } while (Count != 0);
+
+ if (FileSize >= SECTOR_SIZE) {
+
+ //
+ // We need to allocate a bigger buffer, since the boot.ini file
+ // is bigger than one sector.
+ //
+
+ BootFile=FwAllocateHeap(FileSize);
+ }
+
+ if (BootFile == NULL) {
+ BlPrint(BlFindMessage(BL_READ_ERROR),ENOMEM);
+ BootFile = MyBuffer;
+ BootFile[0] = '\0';
+ goto BootFailed;
+ } else {
+
+ SeekPosition.QuadPart = 0;
+ Status = BlSeek(BootFileId,
+ &SeekPosition,
+ SeekAbsolute);
+ if (Status != ESUCCESS) {
+ BlPrint(BlFindMessage(BL_READ_ERROR),Status);
+ BootFile = MyBuffer;
+ BootFile[0] = '\0';
+ goto BootFailed;
+ } else {
+ Status = BlRead( BootFileId,
+ BootFile,
+ FileSize,
+ &Read );
+
+ SeekPosition.QuadPart = 0;
+ Status = BlSeek(BootFileId,
+ &SeekPosition,
+ SeekAbsolute);
+ if (Status != ESUCCESS) {
+ BlPrint(BlFindMessage(BL_READ_ERROR),Status);
+ BootFile = MyBuffer;
+ BootFile[0] = '\0';
+ goto BootFailed;
+ } else {
+ BootFile[Read]='\0';
+ }
+ }
+ }
+
+ //
+ // Find Ctrl-Z, if it exists
+ //
+
+ p=BootFile;
+ while ((*p!='\0') && (*p!=26)) {
+ ++p;
+ }
+ if (*p != '\0') {
+ *p='\0';
+ }
+ BlClose(BootFileId);
+ }
+
+ if (!AlreadyInitialized) {
+ AbiosInitDataStructures();
+ }
+
+ MdShutoffFloppy();
+
+ TextClearDisplay();
+
+ p=BlSelectKernel(DriveId,BootFile, &LoadOptions, UseTimeOut);
+
+ if (!AlreadyInitialized) {
+
+ BlPrint(BlFindMessage(BL_NTDETECT_MSG));
+ if (!BlDetectHardware(DriveId, LoadOptions)) {
+ BlPrint(BlFindMessage(BL_NTDETECT_FAILURE));
+ return;
+ }
+
+ TextClearDisplay();
+
+ //
+ // Initialize SCSI boot driver, if necessary.
+ //
+ if(!_strnicmp(p,"scsi(",5)) {
+ AEInitializeIo(DriveId);
+ }
+ ArcClose(DriveId);
+ //
+ // Indicate that fw memory descriptors cannot be changed from
+ // now on.
+ //
+ FwDescriptorsValid = FALSE;
+ } else {
+ TextClearDisplay();
+ }
+
+ //
+ // Set AlreadyInitialized Flag to TRUE to indicate that ntdetect
+ // and abios init routines have been run.
+ //
+
+ AlreadyInitialized = TRUE;
+
+ //
+ // Only time out the boot menu the first time through the boot.
+ // For all subsequent reboots, the menu will stay up.
+ //
+ UseTimeOut=FALSE;
+
+ i=0;
+ while (*p !='\\') {
+ KernelBootDevice[i] = *p;
+ i++;
+ p++;
+ }
+ KernelBootDevice[i] = '\0';
+
+ strcpy(OsLoadFilename,"osloadfilename=");
+ strcat(OsLoadFilename,p);
+
+ //
+ // We are fooling the OS Loader here. It only uses the osloader= variable
+ // to determine where to load HAL.DLL from. Since x86 systems have no
+ // "system partition" we want to load HAL.DLL from \nt\system\HAL.DLL.
+ // So we pass that it as the osloader path.
+ //
+
+ strcpy(OsLoaderFilename,"osloader=");
+ strcat(OsLoaderFilename,p);
+ strcat(OsLoaderFilename,"\\System32\\NTLDR");
+
+ strcpy(SystemPartition,"systempartition=");
+ strcat(SystemPartition,KernelBootDevice);
+
+ strcpy(OsLoadPartition,"osloadpartition=");
+ strcat(OsLoadPartition,KernelBootDevice);
+
+ strcpy(OsLoadOptions,"osloadoptions=");
+ if (LoadOptions) {
+ strcat(OsLoadOptions,LoadOptions);
+ }
+
+
+ strcpy(ConsoleInputName,"consolein=multi(0)key(0)keyboard(0)");
+
+ strcpy(ConsoleOutputName,"consoleout=multi(0)video(0)monitor(0)");
+
+ strcpy(X86SystemPartition,"x86systempartition=");
+ strcat(X86SystemPartition,PartitionName);
+
+ Argv[0]="load";
+
+ Argv[1]=OsLoaderFilename;
+ Argv[2]=SystemPartition;
+ Argv[3]=OsLoadFilename;
+ Argv[4]=OsLoadPartition;
+ Argv[5]=OsLoadOptions;
+ Argv[6]=ConsoleInputName;
+ Argv[7]=ConsoleOutputName;
+ Argv[8]=X86SystemPartition;
+
+ Status = BlOsLoader(9,Argv,NULL);
+
+ BootFailed:
+
+ if (Status != ESUCCESS) {
+ //
+ // Boot failed, wait for reboot
+ //
+ while (TRUE) {
+ GET_KEY();
+ }
+ } else {
+ //
+ // Need to reopen the drive
+ //
+ Status = ArcOpen(BootPartitionName, ArcOpenReadOnly, &DriveId);
+ if (Status != ESUCCESS) {
+ BlPrint(BlFindMessage(BL_DRIVE_ERROR),BootPartitionName);
+ goto BootFailed;
+ }
+
+ }
+ } while (TRUE);
+
+}