443 lines
11 KiB
C
443 lines
11 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1993 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
sploaddrv.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Routines to load sets of device drivers for use during text setup.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Ted Miller (tedm) 13-November-1993
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "spprecmp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
//
|
||
|
// Define type of routine used by the device driver set loader.
|
||
|
// Before each driver is loaded, this routine is called with
|
||
|
// a flag indicating whether the machine is an MCA machine and
|
||
|
// the shortname of the driver about to be loaded. If this routine
|
||
|
// returns FALSE, the driver is not loaded. If it returns TRUE,
|
||
|
// the driver is loaded.
|
||
|
//
|
||
|
typedef
|
||
|
BOOLEAN
|
||
|
(*PDRIVER_VERIFY_LOAD_ROUTINE) (
|
||
|
IN PVOID SifHandle,
|
||
|
IN BOOLEAN IsMcaMachine,
|
||
|
IN PWSTR DriverShortname
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
BOOLEAN
|
||
|
pSpVerifyLoadDiskDrivers(
|
||
|
IN PVOID SifHandle,
|
||
|
IN BOOLEAN IsMcaMachine,
|
||
|
IN PWSTR DriverShortname
|
||
|
)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(SifHandle);
|
||
|
|
||
|
//
|
||
|
// Don't load fat if setupldr loaded floppy drivers.
|
||
|
//
|
||
|
if(!_wcsicmp(DriverShortname,L"Fat") && SetupParameters.LoadedFloppyDrivers) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// On an MCA machine, don't load atdisk.
|
||
|
// On a non-MCA machine, don't load abiosdsk.
|
||
|
//
|
||
|
if(( IsMcaMachine && !_wcsicmp(DriverShortname,L"atdisk"))
|
||
|
|| (!IsMcaMachine && !_wcsicmp(DriverShortname,L"abiosdsk")))
|
||
|
{
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we get this far, the driver should be loaded.
|
||
|
//
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
SpLoadDriverSet(
|
||
|
IN PVOID SifHandle,
|
||
|
IN PWSTR SifSectionName,
|
||
|
IN PWSTR SourceDevicePath,
|
||
|
IN PWSTR DirectoryOnSourceDevice,
|
||
|
IN PDRIVER_VERIFY_LOAD_ROUTINE VerifyLoad OPTIONAL
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Load a set of device drivers listed in a section in the setup
|
||
|
information file. The section is expected to be in the following form:
|
||
|
|
||
|
[SectionName.Load]
|
||
|
DriverShortname = DriverFilename
|
||
|
DriverShortname = DriverFilename
|
||
|
DriverShortname = DriverFilename
|
||
|
etc.
|
||
|
|
||
|
[SectionName]
|
||
|
DriverShortname = Description
|
||
|
DriverShortname = Description
|
||
|
DriverShortname = Description
|
||
|
etc.
|
||
|
|
||
|
The drivers will be loaded from the setup boot media, and errors
|
||
|
loading the drivers will be ignored.
|
||
|
|
||
|
Before loading each driver, a callback routine is called to verify
|
||
|
that the driver should actually be loaded. This allows the caller
|
||
|
to gain a fine degree of control over which drivers are loaded.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
SifHandle - supplies handle to loaded setup information file.
|
||
|
|
||
|
SifSectionName - supplies name of section in setup information file
|
||
|
listing drivers to be laoded.
|
||
|
|
||
|
SourceDevicePath - supplies the device path in the nt namespace of
|
||
|
the device from which the drivers are to be loaded.
|
||
|
|
||
|
DirectoryOnSourceDevice - supplies the directory on the source device
|
||
|
from which the drivers are to be loaded.
|
||
|
|
||
|
VerifyLoad - if specified, supplies the address of a routine to be
|
||
|
called before each driver is loaded. The routine takes a flag
|
||
|
indicating whether the machine is an MCA machine, and the driver
|
||
|
shortname. If the routine returns false, the driver is not loaded.
|
||
|
If this parameter is not specified, all drivers in the section
|
||
|
will be loaded.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
BOOLEAN IsMcaMachine;
|
||
|
ULONG d,DriverLoadCount;
|
||
|
PWSTR DiskDesignator,PreviousDiskDesignator;
|
||
|
PWSTR DriverShortname,DriverFilename,DriverDescription;
|
||
|
PWSTR LoadSectionName;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
CLEAR_CLIENT_SCREEN();
|
||
|
SpDisplayStatusText(SP_STAT_PLEASE_WAIT,DEFAULT_STATUS_ATTRIBUTE);
|
||
|
|
||
|
//
|
||
|
// Form the .load section name.
|
||
|
//
|
||
|
LoadSectionName = SpMemAlloc((wcslen(SifSectionName)*sizeof(WCHAR))+sizeof(L".Load"));
|
||
|
wcscpy(LoadSectionName,SifSectionName);
|
||
|
wcscat(LoadSectionName,L".Load");
|
||
|
|
||
|
IsMcaMachine = FALSE;
|
||
|
|
||
|
//
|
||
|
// Set up some initial state.
|
||
|
//
|
||
|
PreviousDiskDesignator = L"";
|
||
|
|
||
|
//
|
||
|
// Determine the number of drivers to be loaded.
|
||
|
//
|
||
|
DriverLoadCount = SpCountLinesInSection(SifHandle,LoadSectionName);
|
||
|
for(d=0; d<DriverLoadCount; d++) {
|
||
|
|
||
|
PWSTR p;
|
||
|
|
||
|
//
|
||
|
// Get the driver shortname.
|
||
|
//
|
||
|
DriverShortname = SpGetKeyName(SifHandle,LoadSectionName,d);
|
||
|
if(!DriverShortname) {
|
||
|
SpFatalSifError(SifHandle,LoadSectionName,NULL,d,(ULONG)(-1));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Determine whether we are really supposed to load this driver.
|
||
|
//
|
||
|
if((p = SpGetSectionLineIndex(SifHandle,LoadSectionName,d,2)) && !_wcsicmp(p,L"noload")) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if(VerifyLoad && !VerifyLoad(SifHandle,IsMcaMachine,DriverShortname)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get a human-readable description for this driver.
|
||
|
//
|
||
|
DriverDescription = SpGetSectionLineIndex(SifHandle,SifSectionName,d,0);
|
||
|
if(!DriverDescription) {
|
||
|
SpFatalSifError(SifHandle,SifSectionName,NULL,d,0);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the driver filename.
|
||
|
//
|
||
|
DriverFilename = SpGetSectionLineIndex(SifHandle,LoadSectionName,d,0);
|
||
|
if(!DriverFilename) {
|
||
|
SpFatalSifError(SifHandle,LoadSectionName,NULL,d,0);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Determine the disk on which this driver resides.
|
||
|
//
|
||
|
DiskDesignator = SpLookUpValueForFile(
|
||
|
SifHandle,
|
||
|
DriverFilename,
|
||
|
INDEX_WHICHBOOTMEDIA,
|
||
|
TRUE
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Prompt for the disk containing the driver.
|
||
|
//
|
||
|
retryload:
|
||
|
if(_wcsicmp(DiskDesignator,PreviousDiskDesignator)) {
|
||
|
|
||
|
SpPromptForSetupMedia(
|
||
|
SifHandle,
|
||
|
DiskDesignator,
|
||
|
SourceDevicePath
|
||
|
);
|
||
|
|
||
|
PreviousDiskDesignator = DiskDesignator;
|
||
|
|
||
|
CLEAR_CLIENT_SCREEN();
|
||
|
SpDisplayStatusText(SP_STAT_PLEASE_WAIT,DEFAULT_STATUS_ATTRIBUTE);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Attempt to load the driver.
|
||
|
//
|
||
|
Status = SpLoadDeviceDriver(
|
||
|
DriverDescription,
|
||
|
SourceDevicePath,
|
||
|
DirectoryOnSourceDevice,
|
||
|
DriverFilename
|
||
|
);
|
||
|
|
||
|
if(Status == STATUS_NO_MEDIA_IN_DEVICE) {
|
||
|
PreviousDiskDesignator = L"";
|
||
|
goto retryload;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SpMemFree(LoadSectionName);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
SpLoadScsiClassDrivers(
|
||
|
IN PVOID SifHandle,
|
||
|
IN PWSTR SourceDevicePath,
|
||
|
IN PWSTR DirectoryOnSourceDevice
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Load scsi class drivers if setupldr has not already loaded them
|
||
|
and there are any miniport drivers loaded.
|
||
|
|
||
|
The drivers to be loaded are listed in [ScsiClass].
|
||
|
The section is expected to be in the following form:
|
||
|
|
||
|
[ScsiClass]
|
||
|
cdrom = "SCSI CD-ROM" ,scsicdrm.sys
|
||
|
floppy = "SCSI Floppy Disk",scsiflop.sys
|
||
|
disk = "SCSI Disk" ,scsidisk.sys
|
||
|
|
||
|
The drivers will be loaded from the setup boot media, and errors
|
||
|
loading the drivers will be ignored.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
SifHandle - supplies handle to loaded setup information file.
|
||
|
|
||
|
SourceDevicePath - supplies the device path in the nt namespace of
|
||
|
the device from which the drivers are to be loaded.
|
||
|
|
||
|
DirectoryOnSourceDevice - supplies the directory on the source device
|
||
|
where the drivers are to be found.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
//
|
||
|
// If setupldr loaded scsi drivers, nothing to do.
|
||
|
// If there are no miniport drivers loaded, nothing to do.
|
||
|
//
|
||
|
if(!SetupParameters.LoadedScsi && LoadedScsiMiniportCount) {
|
||
|
|
||
|
SpLoadDriverSet(
|
||
|
SifHandle,
|
||
|
SIF_SCSICLASSDRIVERS,
|
||
|
SourceDevicePath,
|
||
|
DirectoryOnSourceDevice,
|
||
|
NULL
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
SpLoadDiskDrivers(
|
||
|
IN PVOID SifHandle,
|
||
|
IN PWSTR SourceDevicePath,
|
||
|
IN PWSTR DirectoryOnSourceDevice
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Load (non-scsi) disk class drivers and disk filesystems
|
||
|
if setupldr has not already loaded them.
|
||
|
|
||
|
The drivers to be loaded are listed in [DiskDrivers] and [FileSystems].
|
||
|
The section is expected to be in the following form:
|
||
|
|
||
|
[DiskDrivers]
|
||
|
atdisk = "ESDI/IDE Hard DIsk",atdisk.sys
|
||
|
abiosdsk = "Micro Channel Hard Disk",abiosdsk.sys
|
||
|
|
||
|
[FileSystems]
|
||
|
fat = "FAT File System",fastfat.sys
|
||
|
ntfs = "Windows NT File System (NTFS)",ntfs.sys
|
||
|
|
||
|
|
||
|
The drivers will be loaded from the setup boot media, and errors
|
||
|
loading the drivers will be ignored.
|
||
|
|
||
|
On MCA machines, atdisk will not be loaded.
|
||
|
On non-MCA machines, abiosdsk will not be loaded.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
SifHandle - supplies handle to loaded setup information file.
|
||
|
|
||
|
SourceDevicePath - supplies the device path in the nt namespace of
|
||
|
the device from which the drivers are to be loaded.
|
||
|
|
||
|
DirectoryOnSourceDevice - supplies the directory on the source device
|
||
|
where the drivers are to be found.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
//
|
||
|
// If setupldr loaded disk drivers, nothing to do.
|
||
|
//
|
||
|
if(!SetupParameters.LoadedDiskDrivers) {
|
||
|
|
||
|
SpLoadDriverSet(
|
||
|
SifHandle,
|
||
|
SIF_DISKDRIVERS,
|
||
|
SourceDevicePath,
|
||
|
DirectoryOnSourceDevice,
|
||
|
pSpVerifyLoadDiskDrivers
|
||
|
);
|
||
|
}
|
||
|
//
|
||
|
// If setupldr loaded file systems, nothing to do.
|
||
|
//
|
||
|
if(!SetupParameters.LoadedFileSystems) {
|
||
|
|
||
|
SpLoadDriverSet(
|
||
|
SifHandle,
|
||
|
SIF_FILESYSTEMS,
|
||
|
SourceDevicePath,
|
||
|
DirectoryOnSourceDevice,
|
||
|
pSpVerifyLoadDiskDrivers
|
||
|
);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SpLoadCdRomDrivers(
|
||
|
IN PVOID SifHandle,
|
||
|
IN PWSTR SourceDevicePath,
|
||
|
IN PWSTR DirectoryOnSourceDevice
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Load the cd-rom filesystem if setupldr has not already loaded it.
|
||
|
|
||
|
The drivers to be loaded are listed in [CdRomDrivers].
|
||
|
The section is expected to be in the following form:
|
||
|
|
||
|
[CdRomDrivers]
|
||
|
cdfs = "CD-ROM File System",cdfs.sys
|
||
|
|
||
|
|
||
|
The drivers will be loaded from the setup boot media, and errors
|
||
|
loading the drivers will be ignored.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
SifHandle - supplies handle to loaded setup information file.
|
||
|
|
||
|
SourceDevicePath - supplies the device path in the nt namespace of
|
||
|
the device from which the drivers are to be loaded.
|
||
|
|
||
|
DirectoryOnSourceDevice - supplies the directory on the source device
|
||
|
where the drivers are to be found.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
//
|
||
|
// If setupldr loaded cd-rom drivers, nothing to do.
|
||
|
//
|
||
|
if(!SetupParameters.LoadedCdRomDrivers) {
|
||
|
|
||
|
SpLoadDriverSet(
|
||
|
SifHandle,
|
||
|
SIF_CDROMDRIVERS,
|
||
|
SourceDevicePath,
|
||
|
DirectoryOnSourceDevice,
|
||
|
NULL
|
||
|
);
|
||
|
}
|
||
|
}
|