|
|
#!perl -w # # A tool to create boot floppy images. # # Author: Milong Sabandith (milongs) # ##############################################################################
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts"; use lib $ENV{RAZZLETOOLPATH}; use PbuildEnv; use ParseArgs; use cksku; use ReadSetupFiles; use Logmsg;
sub Usage { print<<USAGE; exit(1) } Create Boot Floppy Images. Usage: $0 share Example: $0 d:\i386
USAGE
$MakeZdr = 1; $ErrorCode = 0; # List of files that need to be on last floppy
@lastlist = ("ntdll.dll", "usetup.exe", "spcmdcon.sys", "kbdus.dll"); # List of replacement destinations. Use "" for the same name as in @lastlist @lastrepl = ("system32\\ntdll.dll", "system32\\smss.exe", "","");
# List of files that need to be on a particular floppy # txtsetup.sif is special because it needs to be compressed. @speciallist = ("setupldr.bin", "txtsetup.sif", "biosinfo.inf", "ntdetect.com", "ntkrnlmp.exe"); @specialnum = ("1", "1", "1", "1", "2");
# List of files that should come from somewhere else @differentlist = ("setupreg.hiv"); @differentsource = ("..\\idw\\setup\\no_tbomb.hiv");
sub onlastdisk { local($filename) = @_; while (<@lastlist>) { if ($filename =~ /^$_$/ ) { return 1; } } return 0; }
sub GetFromInf { local( $filename, $section, $name, $num) = @_; $retvalue = "";
open( INFFILE, "<".$filename) or die "can't open $filename: $!"; LINEG: while( <INFFILE>) { chomp $_; $line = lc $_;
if ($line =~ /^\[/) { $InSection = 0; } if ($line =~ /^\[$section/) { $InSection = 1; next LINEG; } if (! $InSection) { next LINEG; }
@linefields = split('=', $line);
# empty line if ( $#linefields == -1) { next LINEG; }
$nameg = $linefields[0];
#print "nameg = " . $#linefields . $nameg . "\n"; if( length( $nameg) < 1) { next LINEG; } $nameg =~ s/ *$//g;
if ( not ($nameg =~ /$name/)) { next LINEG; }
@linefields2 = split(',', $linefields[1]);
$retvalue = $linefields2[$num]; # Remove spaces $retvalue =~ s/ *$//g; $retvalue =~ s/^ *//g; if( length( $retvalue) > 0) { last LINEG; } } # while (there is still data in this inputfile) close( INFFILE); return $retvalue; }
sub myprocess { local($shareloc) = @_; $output = "bootfiles"; $layout = $shareloc . "\\layout.inf"; $dosnet = $shareloc . "\\dosnet.inf"; $txtsetup = $shareloc . "\\txtsetup.sif"; $allfiles = $output.".all"; $modified = $output.".mod"; $enum = $output.".enum"; $total = $output.".total"; $final = $output.".final"; $languageid = "00000409";
if ($MakeZdr == 1) { $txtsetup = "..\\realsign\\txtsetup.sif"; } print "Share location: " . $shareloc . "\n\n"; print "Finding layout.inf at: " . $layout . "\n"; open(OLD, "<" . $layout) or die "can't open $layout: $!"; open(NEW, ">" . $allfiles) or die "can't open $allfiles: $!";
# Read txtsetup.sif for required language id.
$languageid = GetFromInf( $txtsetup, "nls", "defaultlayout", 0); if ( length($languageid) < 1) { print "Could not determine DefaultLayout from txtsetup.sif.\n"; return 0; } print "Lanuage Id = " . $languageid ."\n";
$keyboardfile = GetFromInf( $txtsetup, "files.keyboardlayout", $languageid, 0); if ( length($languageid) < 1) { print "Could not determine keyboard file from txtsetup.sif.\n"; return 0; } print "Keyboard file = " . $keyboardfile ."\n";
# Make sure it's not us keyboad since this is already in our last list. if (not ($keyboardfile =~ /^kbdus.dll$/ )) { push( @lastlist, $keyboardfile); push( @lastrepl, $keyboardfile); }
# Compress txtsetup.sif locally
(print "\nCopying $txtsetup for compression.\n"); `dcomp $txtsetup .`;
# Read dosnet.inf for .fon and .nls boot files print "Finding dosnet.inf at: " . $dosnet . "\n"; open(DOSNET, "<" . $dosnet) or die "can't open $dosnet: $!";
$InFloppySection = 0; $disknum = "-";
print "\nAdding the following font and nls files to disk3.\n"; LINE1: while( <DOSNET> ) { chomp $_; $line = lc $_;
if ($line =~ /^\[/) { $InFloppySection = 0; } if ($line =~ /^\[floppyfiles\./) { $InFloppySection = 1; $line2 = $line; chop $line2; @linefields= split('\.', $line2); $disknum = $linefields[1]; next LINE1; } if (! $InFloppySection) { next LINE1; }
if ( $line =~ /^d1\,disk1\,disk/) { next LINE1; }
if ($line =~ /^d1\,/) { @linefields = split(',', $line); $filename = $linefields[1];
#Remove spaces from filesname $filename =~ s/ *$//g;
#Skip .fon and .nls files since they are included in dosnet.txt if ($filename !~ /\.fon$/ and $filename !~ /\.nls$/) { next LINE1; }
$filenamep = $shareloc. "\\".$filename; $filename2 = $filename; if (!(-e $filenamep) ) { chop $filenamep; $filenamep = $filenamep . "_"; chop $filename2; $filename2 = $filename2 . "_"; } if (-e $filenamep ) { ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($filenamep); (printf "%20s %10s", " " . $filename, $size . "\n"); (printf NEW "%2s %20s %10s %20s\n", 3, " " . $filename, $size, $filename2); } } } # while (there is still data in this inputfile)
close(DOSNET);
$InFileSection = 0; $maxdisknum = 1; # Now add files from layout.inf LINE2: while( <OLD> ) { chomp $_; $line = lc $_;
if ($line =~ /^\[/) { $InFileSection = 0; } if ($line eq "[sourcedisksfiles]" or $line eq "[sourcedisksfiles.x86]") { $InFileSection = 1; next LINE2; } if (! $InFileSection) { next LINE2; }
if ($line =~ /=/) { ($filename = $line) =~ s/(.*:)?(\S*.?\S*)\s*=.*/$2/;
#Remove spaces from filesname $filename =~ s/ *$//g;
#Skip .fon and .nls files since they are included in dosnet.txt if ($filename =~ /\.fon$/ or $filename =~ /\.nls$/) { next LINE2; }
($fields = $line) =~ s/.*=\s*(.*)/$1/; @linefields = split(',', $fields); $disknum = $linefields[6];
if ($disknum =~ /^_/) { $compressed = 0; } else { $compressed = 1; } $disknum =~ s/_//; if( length($disknum) > 0 && $disknum !~ /x/) {
if( int($disknum) > $maxdisknum) { $maxdisknum = int($disknum); } $filename2 = $filename; if( $compressed) { chop $filename2; $filename2 = $filename2 . "_"; } $filenamep = "$shareloc\\$filename2"; if (-e $filenamep ) { ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($filenamep); } else { $size = "0"; }
(printf NEW "%2s %20s %10s %20s\n", $disknum, " " . $filename, $size , $filename2); print "."; } }
} # while (there is still data in this inputfile)
close(OLD) or die "can't close $layout: $!"; close(NEW) or die "can't close $allfiles: $!";
#Remove from the list any files on the first or last flopy. open(OLD, "<" . $allfiles) or die "can't open $allfiles: $!"; open(NEW, ">" . $modified) or die "can't open $modified: $!";
$disknum = 0; $disksize = 0;
NLINE:while (<OLD>) { $save = $_; @lnfields = split(' ', $_); $filename = $lnfields[1]; while (<@speciallist>) { if ($filename =~ /^$_$/ ) { next NLINE; } } while (<@lastlist>) { if ($filename =~ /^$_$/ ) { next NLINE; } } (print NEW $save); print "."; }
#Put the following files on the first floppy
#On FE build, if bootfont.bin exist then add it to the first floppy $fname = "bootfont.bin"; $fname2 = "$shareloc\\$fname";
if (-e $fname2 ) { ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($fname2); (printf NEW "%2s %20s %10s %20s\n", 1, " " . $fname, $size, $fname); }
$count = 0; while (<@speciallist>) { $fname = $_; if ($fname =~ /^txtsetup.sif$/ ) { chop $fname; $fname = $fname . "_"; if (-e $fname ) { ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($fname); } else { $size = "0"; } } else { $fname2 = "$shareloc\\$fname"; if (-e $fname2 ) { ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($fname2); } else { chop $fname2; $fname2 = $fname2 . "_"; if (-e $fname2 ) { chop $fname; $fname = $fname . "_"; ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($fname2); } else { $size = "0"; } } } (printf NEW "%2s %20s %10s %20s\n", $specialnum[$count], " " . $_,$size ,$fname); $count = ($count +1); print "."; }
#Put the following files on the last floppy
$count = 0; while (<@lastlist>) { $fname = $_; $fname2 = "$shareloc\\$fname"; if (-e $fname2 ) { ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($fname2); } else { chop $fname2; $fname2 = $fname2 . "_"; if (-e $fname2) { chop $fname; $fname = $fname . "_"; ($0,$0,$0,$0,$0,$0,$0,$size,$0,$0,$0,$0,$0) = stat($fname2); } else { $size = "0"; } } (printf NEW "%2s %20s %10s %20s\n", ($maxdisknum+1), " " . $_, $size, $fname); $count = ($count +1); print "."; }
close(OLD) or die "can't close $old: $!"; close(NEW) or die "can't close $new: $!";
`sort $modified /o $modified`;
# Reenumerate disk numbers in case all the files on the last in layout.inf # appears in our private list. open(OLD, "<" . $modified) or die "can't open $modified: $!"; open(NEW, ">" . $enum) or die "can't open $enum: $!";
$donefixup = 0; $disksize = 0; $maxdisknum = 1;
while (<OLD>) { $save = $_; @lnfields = split(' ', $_); $cdisk = int($lnfields[0]); $fname = $lnfields[1]; $fsize = $lnfields[2]; $fact = $lnfields[3]; if( !$donefixup and $cdisk > $maxdisknum) { $maxdisknum = $maxdisknum +1; if( $maxdisknum != $cdisk) { $donefixup = 1; } } (printf NEW "%2d %20s %10s %20s\n",$maxdisknum,$fname,$fsize,$fact); } close(OLD) or die "can't close $old: $!"; close(NEW) or die "can't close $new: $!";
# Create total file containing total disk sizes. open(OLD, "<" . $enum) or die "can't open $enum: $!"; open(NEW, ">" . $total) or die "can't open $total: $!";
$disknum = 0; $disksize = 0; $runningtotal = 0;
while (<OLD>) { $save = $_; @lnfields = split(' ', $_); $cdisk = int($lnfields[0]); $sdisk = int($lnfields[2]); if( $cdisk == $disknum) { $disksize = $disksize + $sdisk; } else { if( $disknum != 0) { (printf NEW "%10s %24s", "Disk " . $disknum . ":", $disksize . "\n\n"); } $disknum = $cdisk; $runningtotal = $runningtotal + $disksize; $disksize = $sdisk; } (print NEW $save); print "."; } if( $disknum != 0) { $runningtotal = $runningtotal + $disksize; (printf NEW "%10s %24s", "Disk " . $disknum . ":", $disksize . "\n"); (printf NEW "Total :%24s", $runningtotal . "\n"); } close(OLD) or die "can't close $old: $!"; close(NEW) or die "can't close $new: $!";
# Create boot floppies.
# Create disk1 to be renamed accordingly for each floppy
open(NEW, ">disk1") or die "Could not create disk1 file in current directory!"; print NEW "\n"; close NEW;
# Now create list of files for each floppy
open(OLD, "<" . $enum) or die "can't open $enum: $!";
$disknum = 0;
while (<OLD>) { @lnfields = split(' ', $_); $cdisk = int($lnfields[0]); $fname = $lnfields[1]; $fact = $lnfields[3]; if( $cdisk != $disknum) { if( $disknum > 0) { close( NEW); } open(NEW, ">" . $output . "\." . $cdisk) or die "can't open $: $!";
# first floppy require the following information
if( $cdisk == 1) { (printf NEW "\-bnt35setup\n"); }
(printf NEW "disk1=disk10%d\n", $cdisk); $disknum = $cdisk; }
$source = $shareloc."\\".$fact; $dest = $fact;
#check if this file should have a different source location if ($MakeZdr == 1) { $icount = 0; $done = 0; while (<@differentlist>) { if ($done == 0) { $save = $_; if ($fname =~ /^$_$/) { $source = $differentsource[$icount]; $done = 1; } $icount = ($icount + 1); } } } $icount = 0;
#if the last disk, then final name of file maybe different if( $disknum == ($maxdisknum)) { $done = 0; while (<@lastlist>) { if ($done == 0) { $save = $_; if ($fname =~ /^$_$/ and length($lastrepl[$icount]) > 0) { $dest = $lastrepl[$icount]; $done = 1; } $icount = ($icount + 1); } } } else { if ($fname =~ /^txtsetup.sif$/ ) { $dest = "txtsetup\.si_"; $source = "txtsetup\.si_"; } } #For el use english version of usetup since el version is too big. if( ($disknum == ($maxdisknum)) && (lc $ENV{lang} eq "el") && ($fact =~ /^usetup.exe$/)) { $source = $ENV{_NTFILTER}."\\".$fact; }
(printf NEW "%s=%s\n", $source, $dest); print "."; } close(OLD) or die "can't close $old: $!"; close(NEW) or die "can't close $new: $!";
# Creating each floppy $disknum = 1; while ( $disknum <= $maxdisknum) { $fname2 = "cdboot".$disknum."\.img"; $fcmdline = "\nfcopy \-f \-3 \@$output" . "\." . $disknum . " cdboot" . $disknum . "\.img"; print $fcmdline; print "\nCreating cdimage" . $disknum . "\.img"; $message = `$fcmdline`; print $message; if (not -e $fname2 ) { errmsg("Could not create boot floppy $disknum!"); $ErrorCode = 1; } $disknum = $disknum +1; }
# Create equivalent dosnet floppyfiles sections
open(OLD, "<" . $enum) or die "can't open $enum: $!"; open(NEW, ">" . $final) or die "can't open $final: $!";
$disknum = 0;
while (<OLD>) { @lnfields = split(' ', $_); $cdisk = int($lnfields[0]); $fname = $lnfields[1]; if( $cdisk != $disknum) { (printf NEW "\n[FloppyFiles.%d]\n", $disknum); (printf NEW "d1,disk1,disk10%d\n", ($disknum+1)); $disknum = $cdisk; }
$icount = 0; if( $disknum == ($maxdisknum)) { $done = 0; while (<@lastlist>) { if ($done == 0) { $save = $_; if ($fname =~ /^$_$/ and length($lastrepl[$icount]) > 0 ) { $fname = $fname."\,".$lastrepl[$icount]; $done = 1; } $icount = ($icount + 1); } } }
(printf NEW "d1,%s\n", $fname); print "."; } close(OLD) or die "can't close $old: $!"; close(NEW) or die "can't close $new: $!"; print "\nTotal floppies is " . $maxdisknum . "\n";
}
foreach $share (@ARGV) { #print "arg is $file\n"; #@filelist = <$file>; #@filelist = `dir /b /a-d $file`; foreach (@ARGV) { chomp $share; myprocess( $share); } exit($ErrorCode); }
|