#--------------------------------------------------------------------------- # Script: fixprn.pl # # (c) 2000 Microsoft Corporation. All rights reserved. # # Purpose: This script populates the fixprnsv tree with the driver files. # # Version: <1.00> (10/03/2000) : (hsingh) Wrote it # <1.01> () : () #--------------------------------------------------------------------- # Set Package package fixprn; # Set the script name $ENV{script_name} = 'fixprn.pl'; # Set version $VERSION = '1.00'; # Set required perl version require 5.003; # Use section use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts"; use lib $ENV{RAZZLETOOLPATH}; use GetParams; use LocalEnvEx; use CkSKU; use Logmsg; use strict; no strict 'vars'; sub Main { # Convert to uppercase the env var names. &UCENV(); # # Get/Create Various Environment Variables. # $lang : The build language. # For US builds, this will be USA # LOGFILE : Path to log file # FIXPRNSRC : Root of fixprnsv tree. (the source) # FIXPRNDST : Root of fixprnsv tree. (the destination) # PRNTOOLS : Points to directory where we have infs etc ($FIXPRNROOT$\inf)... # TEMP : temporary directory # NTPOSTBLD : Path to the postbuild directory. This is where files are placed # after buing built (or after being built & localized as the case may be) &GetEnv(); &CreateEnv(); # # Lets ensure that the required source files are present, # lets create all the directories files etc... # &EnsurePathCorrectness(); # # Create list of printer driver files # NT4FILES : will have list of NT4 files. # W2KFILES : will have list of Win2k/Whistler files. # $NT4FILES = "$TEMP\\nt4.txt"; $W2KFILES = "$TEMP\\w2k.txt"; # # Lets create the list of NT4FILES and W2KFILES # from the badnt4.inf and badw2k.inf # &CreateW2KFileList(); &CreateNT4FileList(); # # Converting the contents of the file lists to lower case # &uc_to_lc($NT4FILES); &uc_to_lc($W2KFILES); # # Copy Win2k/Whistler files from _NTPOSTBUILD # to $FIXPRNDST\win2k\i386 # &cp_w2k_files(); # # Copy NT4 files from ............ # to $FIXPRNDST\nt4\i386 # &cp_nt4_files(); # # Create the catalogue files and do PRS signing. # AdinaS says that international build lab people # will own the signing of the non-US bld cats. # But we still have to create cat for all languages. # logmsg("The lang is $lang"); &make_cats(); } # # Copy files in $W2KFILES to $FIXPRNDST\win2k\i386 # sub cp_w2k_files { logmsg ("Deleting all files in $FIXPRNDST\\win2k\\i386"); do_cmd("del /q", "$FIXPRNDST\\win2k\\i386\\*.*"); logmsg ("Copying Whistler files"); open(W2K, "$W2KFILES") or &ExitError("Can not open $W2KFILES, created by infflist"); while() { $FILE = $_; chomp($FILE); if ($FILE ne "badw2k.inf") { if ( $FILE =~ /^srgb .+\.icm/i ) { $FILE="srgb.icm"; } logmsg ("Copying $NTPOSTBLD\\$FILE to $FIXPRNDST\\win2k\\i386"); do_cmd("copy /y", "$NTPOSTBLD\\$FILE", "$FIXPRNDST\\win2k\\i386"); } } } # # Copy files in $NT4FILES to $FIXPRNDST\nt4\i386 # NT4 files are of 3 types # 1. Those that are similar to Win2k. (mainly gpd's) # 2. Those that are specific to NT4 and do not need to be localized (gpds) # 3. Those that are specific to NT4 but have to be localized (e.g. .dlls, .hlp) # Files of type 2,3 will be checked into the source depot. During the build process # they will be (localized and) binplaced into $FIXPRNDST\nt4\i386. # Therefore we dont need to copy them using this script. We only need # to take care of files of type 1. # So we need to a list of files that are of type 1. This # list will be checked into SD and placed in \printers\fixprnsv\nt4w2kcm.lst # during the build process. # sub cp_nt4_files { # # Because of some build/postbuild script that I dont really know about, # some files are getting copied to $FIXPRNDST\\nt4\\386. # Lets delete those files. # logmsg ("Deleting any files in $FIXPRNDST\\nt4\\i386"); do_cmd("del /q", "$FIXPRNDST\\nt4\\i386\\*.*"); # # NT4 files are gathered from 2 places. # 1. Those that are NT4 specific are copied from scratch directory. # 2. Those that are common with Whistler are copied from Whistler # post build directory. # # Lets first deal with files of type 1. # Copying NT4 files that were binplaced during build time but # are now in some scratch directory. # Postbuild should not delete any files that has been binplaced # during build time. Since we dont want to ship the uncompressed files # and we cannot delete them either, therefore the build has to place # the files in a scratch tree. # logmsg ("Copying files from scratch tree - $FIXPRN_NT4_SCRATCH"); do_cmd("copy /y", "$FIXPRN_NT4_SCRATCH\\nt4\\i386\\*.*", "$FIXPRNDST\\nt4\\i386"); logmsg ("Copying NT4 files that are same as Whistler files"); $nt4w2kcommon = "$FIXPRN_NT4_SCRATCH\\nt4w2kcm.lst"; # # File of type 2. (i.e. those common with Whistler). # 1. Open nt4w2kcm.lst (which has list of common files). # 2. clean it i.e. remove blank lines, needless spaces etc.. # 3. Copy files from %NTPOSTBLD% to \printers\fixprnsv\nt4\i386 # open(NT4W2K, "$nt4w2kcommon") or &ExitError("Can not open $nt4w2kcommon : list of files common to nt4,w2k"); while() { $FILE = $_; chomp($FILE); if ($FILE ne "") { logmsg ("Copying $NTPOSTBLD\\$FILE to $FIXPRNDST\\nt4\\i386"); do_cmd("copy /y", "$NTPOSTBLD\\$FILE", "$FIXPRNDST\\nt4\\i386"); } } close NT4W2K; # # Dont need the filelist anymore. # But should not delete it since post build can run more than once. # Whenever this script runs, it needs this file. So if this file # is deleted, script will fail, and that will be a build break. # logmsg ("Deleting $nt4w2kcommon"); # do_cmd("del /q", "$nt4w2kcommon"); } sub make_cats { my $CDFPATH="$TEMP\\cdf"; $W2KPATH = "$FIXPRNDST\\win2k"; $NT4PATH = "$FIXPRNDST\\nt4"; system "if not exist $CDFPATH md $CDFPATH"; # # To create the .cat file there are two steps # Step 1 = Create .cdf file # Step 2 = Use the .cdf file to create .cat file. # # # Step 1 . Create .cdf file for Whistler drivers. # logmsg("Creating w2kfspx.cat"); @W2KFILES = `dir /b /a-d $W2KPATH\\i386`; open(CDFFILE, ">$CDFPATH\\w2kfpsx.cdf" ) or &ExitError("Can not create w2kfpsx.cdf"); print CDFFILE "\[CatalogHeader\]\nName=w2kfpsx\nPublicVersion=0x0000001\nEncodingType=0x00010001\nCATATTR1=0x10010001:OSAttr:2:5.2,2:5.1,2:5.0\n\[CatalogFiles\]\n"; print CDFFILE "$W2KPATH\\badw2k.inf=$W2KPATH\\badw2k.inf\n"; print CDFFILE "$FIXPRNDST\\printupg.inf=$FIXPRNDST\\printupg.inf\n"; foreach (@W2KFILES) { chomp $_; print CDFFILE "$W2KPATH\\i386\\$_=$W2KPATH\\i386\\$_\n"; } close CDFFILE; # # Step 2. Create the .cat file for Whistler drivers # chdir "$W2KPATH"; if ( system ("makecat $CDFPATH\\w2kfpsx.cdf") ) { &ExitError( "makecat $CDFPATH\\w2kfpsx.cdf failed" ); } if ( $lang eq "usa" ) { logmsg("Attempting to sign w2kfpsx.cat"); system ("ntsign.cmd -f w2kfpsx.cat"); } # # Compress the files in $W2KPATH\\i386 directory. # Removes the uncompressed files. # &CompressAndRemove("$W2KPATH\\i386"); # # Step 1. Create .cdf file for NT4 Drivers. # logmsg("Creating nt4fpsx.cat"); @NTXFILES = `dir /b /a-d $NT4PATH\\i386`; open(CDFFILE, ">$CDFPATH\\nt4fpsx.cdf" ) or &ExitError("Can not create nt4fpsx.cdf"); print CDFFILE "\[CatalogHeader\]\nName=nt4fpsx\nPublicVersion=0x0000001\nEncodingType=0x00010001\nCATATTR1=0x10010001:OSAttr:2:4.x\n\[CatalogFiles\]\n"; print CDFFILE "$NT4PATH\\badnt4.inf=$NT4PATH\\badnt4.inf\n"; foreach(@NTXFILES) { chomp $_; print CDFFILE "$NT4PATH\\i386\\$_=$NT4PATH\\i386\\$_\n"; } close CDFFILE; # # Step 2. Create .cat file for NT4 Drivers. # chdir "$NT4PATH"; if ( system ("makecat $CDFPATH\\nt4fpsx.cdf")) { &ExitError( "makecat $CDFPATH\\nt4fpsx.cdf failed" ); } if ( $lang eq "usa" ) { logmsg("Attempting to sign nt4fpsx.cat"); system ("ntsign.cmd -f nt4fpsx.cat"); } &CompressAndRemove("$NT4PATH\\i386"); # $CDFPATH is in temp directory. So no need to remove it (Bug # 342330) # logmsg("Deleting $CDFPATH"); # system "rd /s /q $CDFPATH"; } # # Compresses files in the directory. # Renames them by adding _ at the end of file name # (e.g. unirv.dll will be renames unidrv.dl_ ). # Removes the orginal file # sub CompressAndRemove { # # 1) First compress the files. Compressed files will have _ at end. # Now the directory will have both compressed and non-compressed # files. # 2) Make the files with _ read only. # 3) Delete all the files that are not read only. # 4) remove the read only attribute from the _ files. # (not sure if this is required, but lets just do it) # $DIRECTORY = $_[0]; logmsg("Compressing files in $DIRECTORY"); system "compress -r $DIRECTORY\\*.* > nul"; system "attrib +r $DIRECTORY\\*.*_"; system "del /q /a:-R $DIRECTORY\\*"; system "attrib -r $DIRECTORY\\*"; } # # (Read comment for CreateW2KFileList) # sub CreateNT4FileList { &GetInfflist( "$NTPOSTBLD\\printers\\fixprnsv\\nt4", "badnt4.inf", $NT4FILES ); } # # Create list of Win2K/Whistler Files. For US builds, this will be the list # of files in badw2k.inf. For FE builds, this list will, in addition, # have files that are required only for FE builds. (Assuming that # badw2k.inf will already have have language specific entries merged into it). # sub CreateW2KFileList { &GetInfflist( "$NTPOSTBLD\\printers\\fixprnsv\\win2k", "badw2k.inf", $W2KFILES ); } # # Gets the list of files in an inf. # 1st param = path of the inf file (i.e. the directory) # 2nd param = the inf file name # 3rd param = the destination of the list of driver file names # as extracted from the inf. # sub GetInfflist { my ( $infpath, $inffile, $flist) = @_; logmsg ("Extracting file list from $infpath\\$inffile"); if ( ! -e "$infpath\\$inffile" ) { &ExitError ( "Unable to find $infpath\\$inffile"); } chdir($infpath); system "infflist.exe $infpath\\$inffile > $flist"; } # # Convert contents to lower case. # sub uc_to_lc { logmsg("Converting to lowercase: $_[0]"); open(FILE, $_[0] ) or &ExitError( "Can not open $_[0]"); open(TEMP, ">$TEMP\\tmp.txt") or &ExitError( "Can not open temp file"); $CHG = ; while($CHG) { $CHG =~ tr/A-Z/a-z/; print TEMP "$CHG"; $CHG = ; } close FILE; close TEMP; system "del $_[0]"; do_cmd("copy /y", "$TEMP\\tmp.txt", "$_[0]"); } # # Ensures the various paths/files required are present. # If they are not, then it either exits or creates (as the # case may be) # sub EnsurePathCorrectness { if ( ! -e "$FIXPRNSRC" ) { &ExitError("Fixprnsv source directory not found : $FIXPRNSRC"); } if ( ! -e "$NTPOSTBLD" ) { &ExitError("Post Build directory not available : $NTPOSTBLD"); } if ( ! -e "$FIXPRNDST" ) { &ExitError("Building of fixprnsv should have created $FIXPRNDST directory. Cant continue without it"); } if ( ! -e "$FIXPRN_NT4_SCRATCH\\nt4w2kcm.lst" ) { &ExitError("Building of fixprnsv should have binplaced nt4w2kcm.lst in $FIXPRN_NT4_SCRATCH directory. Cant continue without it"); } system "if not exist $FIXPRNDST\\nt4\\i386 md $FIXPRNDST\\nt4\\i386"; system "if not exist $FIXPRNDST\\win2k\\i386 md $FIXPRNDST\\win2k\\i386"; } # # Changes environment variables to uppercase. # sub UCENV { %UCENV=(); foreach (%ENV) { $UCENV{uc($_)}=$ENV{$_}; } } sub GetEnv { $SCRIPT_NAME="fixprn.pl"; if ( exists $UCENV{'LANG'} ) { $LANG = $UCENV{'LANG'}; } else { $LANG=""; } if ( exists $UCENV{'_NTPOSTBLD'} ) { $NTPOSTBLD = $UCENV{'_NTPOSTBLD'}; } else { die "_NTPOSTBLD environment variable not defined."; } if ( exists $UCENV{'TEMP'} ) { $TEMP = $UCENV{'TEMP'}; if ( $LANG ) { $TEMP = "$TEMP\\$LANG"; } } else { die "TEMP environment variable not defined."; } system "if not exist $TEMP md $TEMP"; } # # Create various environment variables # that will be required by script. # sub CreateEnv { # # Define the LOGFILE if noy already defined. # if ( exists $UCENV{'LOGFILE'} ) { $LOGFILE =$UCENV{'LOGFILE'}; } else { $LOGFILE="$TEMP\\FIXPRVSV.LOG"; if ( -e $LOGFILE ) { unlink $LOGFILE; } } # # Check the environment # FIXPRNSRC : will point to the directory where # we have infs, any text files for special processing # etc... # FIXPRNDST : will point to the destination (where the files # need to be copied after all processing has been done) # # if ( exists $UCENV{'_NTBINDIR'} ) { $NTBINDIR = $UCENV{'_NTBINDIR'}; } else { &ExitError("Undefined _NTBINDIR"); } if ( exists $UCENV{'FIXPRNSRC'} ) { $FIXPRNSRC = $UCENV{'FIXPRNSRC'}; } else { $FIXPRNSRC = "$NTPOSTBLD\\printers\\fixprnsv"; } if ( exists $UCENV{'PRNTOOLS'} ) { $PRNTOOLS = $UCENV{'PRNTOOLS'}; } else { $PRNTOOLS = "$NTPOSTBLD\\printers\\fixprnsv\\infs"; } if ( exists $UCENV{'FIXPRNDST'} ) { $FIXPRNDST = $UCENV{'FIXPRNDST'}; } else { $FIXPRNDST = "$NTPOSTBLD\\printers\\fixprnsv"; } if ( exists $UCENV{'FIXPRN_NT4_SCRATCH'} ) { $FIXPRN_NT4_SCRATCH = $UCENV{'FIXPRN_NT4_SCRATCH'}; } else { $FIXPRN_NT4_SCRATCH = "$NTPOSTBLD\\fixprnscratch"; } } sub ExitError { my ($errmsg) = @_; errmsg ("$errmsg\n"); exit(1); } sub do_cmd { $CMD = $_[0]; $SRC = $_[1]; $DEST = $_[2]; $ERR = system "$CMD $SRC $DEST > nul"; if($ERR) { errmsg("Could not $CMD $SRC to $DEST"); } } sub CopyFile { my ($file, $dest) = @_; logmsg( "Copying $file $dest"); if ( ! -e $file ) { &ExitError( "File $file not found"); } do_cmd("copy /y", "$file", "$dest"); } sub ValidateParams { # } sub Usage { print < [] Script populates %binaries%\\printers\\fixprnsv with the Windows 2000 drivers. NT4 files updated if NT4 parameter is specified. Parameter 1 (Mandatory) - Path to the Windows 2000 driver.cab e.g. \\\\ntbuilds\\release\\usa\\2180\\x86\\fre.wks Parameter 2 (Mandatory) - Path to the compressed binaries share e.g. \binaries.comp Parameter 3 (Optional) - Give NT4 as second parameter if refresh of NT4 binaries is required. Parameter 4 (Mandatory if Paraneter 2 is NT4) Path to NT Service Pack till the place where unidrv5.4 driver files are present. e.g. \\\\ntbuilds\\release\\usa\\svcpack\\sp6\\1.058\\support\\printersEOM USAGE } sub GetParams { # Step 1: Call pm getparams with specified arguments &GetParams::getparams(@_); # Step 2: Set the language into the enviroment $ENV{lang}=$lang; # Step 3: Call the usage if specified by /? if ($HELP) { &Usage(); exit 1; } } if (eval("\$0 =~ /" . __PACKAGE__ . "\\.pl\$/i")) { # Step 1: Parse the command line # &GetParams ('-o', 'l:', '-p', 'lang', @ARGV); # Include local environment extensions &LocalEnvEx::localenvex('initialize'); # Set lang from the environment $lang=$ENV{lang}; # Validate the option given as parameter. &ValidateParams; # Exit if not a server product %ValidFlavors = &cksku::GetSkus($ENV{lang}, $ENV{_BuildArch}); if ( exists $ValidFlavors{'bla'} || $ValidFlavors{'sbs'} || exists $ValidFlavors{'srv'} || exists $ValidFlavors{'ads'} || exists $ValidFlavors{'dtc'} ) { # Step 4: Call the main function &fixprn::Main(); } else { logmsg("Fixprnsv not applicable to this pro-only language."); } # End local environment extensions. &LocalEnvEx::localenvex('end'); }