1177 lines
36 KiB
Batchfile
1177 lines
36 KiB
Batchfile
@echo off
|
|
REM ------------------------------------------------------------------
|
|
REM
|
|
REM chgkeyinf.cmd
|
|
REM Change txtsetup.sif, layout.inf, dosnet.inf file for the adding mui resource files
|
|
REM
|
|
REM
|
|
REM Copyright (c) Microsoft Corporation. All rights reserved.
|
|
REM
|
|
REM ------------------------------------------------------------------
|
|
perl -x "%~f0" %*
|
|
goto :EOF
|
|
#!perl
|
|
use strict;
|
|
use File::Basename;
|
|
use IO::File;
|
|
|
|
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
|
|
use lib $ENV{RAZZLETOOLPATH};
|
|
use PbuildEnv;
|
|
use ParseArgs;
|
|
use Logmsg;
|
|
use cksku;
|
|
require Exporter;
|
|
|
|
BEGIN {
|
|
$ENV{SCRIPT_NAME} = 'chgkeyinf.cmd';
|
|
}
|
|
|
|
sub Usage { print<<USAGE; exit(1) }
|
|
chgkeyinf [-l lang]
|
|
|
|
Change txtsetup.sif, layout.inf, dosnet.inf file for the adding mui resource files
|
|
Read nttree\\build_logs\\LgNeutral\\lgnbuildlist.txt, which generated by lgndata.cmd, to
|
|
get the list of binaries to be added to the said INFs.
|
|
|
|
|
|
USAGE
|
|
|
|
# Global variables
|
|
|
|
my ($lang);
|
|
my (%CDDataSKUs, %INFPathSKUs, $Neutral_LogDir, $LGNBuildList, $LGNCMFList, $LGNDirs, $LGNDirs_Localized);
|
|
my (@ItemsList, $LGNTagStart, $LGNTagEnd, $LGNItemEntry, $LGNDirs_Tag, $LGNDirs_TagReg);
|
|
|
|
my( $LogFilename );
|
|
my( $TempDir );
|
|
my( $nttree, $razpath, $TempDir);
|
|
my($fNeedGenerateCMF);
|
|
|
|
##################
|
|
#
|
|
# parse command line
|
|
#
|
|
##################
|
|
parseargs( '?' => \&Usage,
|
|
'l:' => \$lang
|
|
);
|
|
&Main();
|
|
|
|
|
|
#
|
|
# Check if Language Neutral is enabled or not
|
|
#
|
|
sub IsLGNActivated()
|
|
{
|
|
my ($MUI_MAGIC, $Result);
|
|
|
|
$Result = 0;
|
|
|
|
$MUI_MAGIC= $ENV{ "MUI_MAGIC" };
|
|
|
|
if ( defined($MUI_MAGIC))
|
|
{
|
|
$Result=1;
|
|
}
|
|
return $Result
|
|
|
|
}
|
|
sub IsCMFActivated()
|
|
{
|
|
my ($MUI_MAGIC_CMF, $Result);
|
|
|
|
$Result = 0;
|
|
|
|
$MUI_MAGIC_CMF= $ENV{ "MUI_MAGIC_CMF" };
|
|
|
|
if ( defined($MUI_MAGIC_CMF))
|
|
{
|
|
$Result=1;
|
|
}
|
|
return $Result
|
|
}
|
|
sub Main
|
|
{
|
|
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
# Begin Main code section
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
# Return when you want to exit on error
|
|
#
|
|
my ($Mylang, $MyError, $Sku, $MyLCID);
|
|
my ($Path_Dosnet, $Path_Txtsetup, $Path_Layout, $Path_Dir);
|
|
my ($Path_Dosnet_sign, $Path_Txtsetup_sign, $Path_Layout_sign, $Path_Dir_sign);
|
|
my ($Backup_Path, $ErrCnt);
|
|
|
|
if (! &IsLGNActivated())
|
|
{
|
|
return 0;
|
|
}
|
|
#
|
|
# $lang must be set. Default is usa
|
|
#
|
|
if ( ! defined($lang))
|
|
{
|
|
$lang = $ENV{LANG};
|
|
if (! defined($lang))
|
|
{
|
|
$lang="usa";
|
|
}
|
|
}
|
|
$Mylang="\L$lang";
|
|
if ( ($Mylang ne "usa" ) && ($Mylang ne "psu" ) )
|
|
{
|
|
return 0;
|
|
}
|
|
#
|
|
# Check If CMF is enabled
|
|
#
|
|
$fNeedGenerateCMF=&IsCMFActivated();
|
|
#
|
|
# Set important path
|
|
#
|
|
$nttree = $ENV{ "_NTPostBld" };
|
|
$razpath= $ENV{ "RazzleToolPath" };
|
|
$TempDir = $ENV{ "TMP" };
|
|
|
|
|
|
|
|
$Logmsg::DEBUG = 0; # set to 1 to activate logging of dbgmsg's
|
|
$LogFilename = $ENV{ "LOGFILE" };
|
|
|
|
if ( ! defined( $LogFilename ) )
|
|
{
|
|
$TempDir = $ENV{ "TMP" };
|
|
$LogFilename = "$TempDir\\$0.log";
|
|
}
|
|
$Neutral_LogDir = $nttree."\\build_logs\\LgNeutral";
|
|
$LGNBuildList = $Neutral_LogDir."\\lgnbuildlist.txt";
|
|
$LGNCMFList = $Neutral_LogDir."\\lgnCMFlist.txt";
|
|
$LGNTagStart = "; Following are entries added for Language neutral resource files:\$\$\$ ";
|
|
$LGNTagEnd = "; End of entries for Language neutral resource files: \$\$\$";
|
|
$LGNDirs_Tag = "190 = mui\\fallback\\";
|
|
$LGNDirs_TagReg ="190 = mui\\\\fallback\\\\";
|
|
$LGNDirs = $LGNDirs_Tag."0409";
|
|
|
|
$LGNItemEntry = " = 1,,2048,,,,,190,0,0";
|
|
|
|
if (! GetLCIDofLang($lang,\$MyLCID))
|
|
{
|
|
errmsg("Fatal: can't get LCID for $lang");
|
|
return 0;
|
|
}
|
|
$LGNDirs_Localized="$LGNDirs_Tag$MyLCID";
|
|
|
|
$MyError=0;
|
|
#
|
|
# Check Language Neutral working directory
|
|
#
|
|
unless (-d $Neutral_LogDir)
|
|
{
|
|
errmsg("Fatal: Directory $Neutral_LogDir does not exist");
|
|
$MyError=1;
|
|
}
|
|
if ($fNeedGenerateCMF)
|
|
{
|
|
unless (-e $LGNCMFList)
|
|
{
|
|
errmsg("Fatal: Language Neutral CMF list not found : $LGNCMFList");
|
|
$MyError=1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
unless (-e $LGNBuildList)
|
|
{
|
|
errmsg("Fatal: Language Neutral build list not found : $LGNBuildList");
|
|
$MyError=1;
|
|
}
|
|
}
|
|
if ($MyError != 0)
|
|
{
|
|
exit(1);
|
|
}
|
|
if ($fNeedGenerateCMF)
|
|
{
|
|
#
|
|
# Read CMF binaries into @ItemsList
|
|
#
|
|
unless ( open(INFILE, $LGNCMFList))
|
|
{
|
|
errmag("Fatal: Can't open $LGNCMFList");
|
|
$MyError=1;
|
|
exit(1);
|
|
}
|
|
@ItemsList=<INFILE>;
|
|
close(INFFILE);
|
|
}
|
|
else
|
|
{
|
|
#
|
|
# Read LGN binaries into @ItemsList
|
|
#
|
|
unless ( open(INFILE, $LGNBuildList))
|
|
{
|
|
errmag("Fatal: Can't open $LGNBuildList");
|
|
$MyError=1;
|
|
exit(1);
|
|
}
|
|
@ItemsList=<INFILE>;
|
|
close(INFFILE);
|
|
}
|
|
#
|
|
# Build path of INFs for SKUs
|
|
#
|
|
BuildArray();
|
|
#
|
|
# For Each SKUs, update the KEY INFS
|
|
#
|
|
$ErrCnt=0;
|
|
foreach $Sku ( keys(%CDDataSKUs))
|
|
{
|
|
# SKU populated ?
|
|
if ($CDDataSKUs{$Sku})
|
|
{
|
|
if ( !defined($INFPathSKUs{$Sku} ))
|
|
{
|
|
errmag("Fatal: $Sku has no corr. entry in INFPathSKUs");
|
|
exit(1);
|
|
}
|
|
#
|
|
# Read the INFs path for the SKU
|
|
#
|
|
($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign)=@{$INFPathSKUs{$Sku}};
|
|
|
|
$Backup_Path="$Neutral_LogDir\\$Path_Dir";
|
|
#
|
|
#Change for DosNet
|
|
#
|
|
if (! DoDosNetChange($Path_Dosnet, \@ItemsList, $Backup_Path))
|
|
{
|
|
$ErrCnt++;
|
|
errmsg("Fatal: Update Dosnet.inf faild for $Sku");
|
|
}
|
|
#Change for Txtsetup
|
|
|
|
if (! DoTxtsetupNLayoutChange($Path_Txtsetup, \@ItemsList, $Backup_Path))
|
|
{
|
|
$ErrCnt++;
|
|
errmsg("Fatal: Update Txtsetup.sif faild for $Sku");
|
|
}
|
|
# Change for Layout
|
|
if (! DoTxtsetupNLayoutChange($Path_Layout, \@ItemsList, $Backup_Path))
|
|
{
|
|
$ErrCnt++;
|
|
errmsg("Fatal: Update layout.inf faild for $Sku");
|
|
}
|
|
#
|
|
#
|
|
#
|
|
$Backup_Path="$Neutral_LogDir\\$Path_Dir_sign";
|
|
#
|
|
#Change for DosNet
|
|
#
|
|
if (! DoDosNetChange($Path_Dosnet_sign, \@ItemsList, $Backup_Path))
|
|
{
|
|
$ErrCnt++;
|
|
errmsg("Fatal: Update Dosnet.inf faild for $Sku");
|
|
}
|
|
#Change for Txtsetup
|
|
|
|
if (! DoTxtsetupNLayoutChange($Path_Txtsetup_sign, \@ItemsList, $Backup_Path))
|
|
{
|
|
$ErrCnt++;
|
|
errmsg("Fatal: Update Txtsetup.sif faild for $Sku");
|
|
}
|
|
# Change for Layout
|
|
if (! DoTxtsetupNLayoutChange($Path_Layout_sign, \@ItemsList, $Backup_Path))
|
|
{
|
|
$ErrCnt++;
|
|
errmsg("Fatal: Update layout.inf faild for $Sku");
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
if ( !$ErrCnt)
|
|
{
|
|
timemsg( "Update KEY INFs successfully");
|
|
}
|
|
else
|
|
{
|
|
timemsg( "Update KEY INFs Failed with $ErrCnt errors, please check Log");
|
|
}
|
|
|
|
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
# End Main code section
|
|
# /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|
|
}
|
|
|
|
#
|
|
# Get LCID of a given language
|
|
#
|
|
sub GetLCIDofLang
|
|
{
|
|
my($Mylang, $LCID) = @_;
|
|
|
|
my ($CODEFILE,@data, $Result, $LCIDShort);
|
|
|
|
$CODEFILE = $ENV{RAZZLETOOLPATH} ."\\codes.txt";
|
|
$Result = 0;
|
|
|
|
$Mylang="\L$Mylang";
|
|
if ( $Mylang eq "usa")
|
|
{
|
|
$$LCID="0409";
|
|
$Result =1;
|
|
return $Result;
|
|
}
|
|
#
|
|
# Search CODEFILE for $Special_Lang, $LCID, $LANG_ISO, etc.
|
|
#
|
|
if(!open(CODEFILE, "$CODEFILE"))
|
|
{
|
|
errmsg ("Can't open lcid file $CODEFILE for reading.");
|
|
return $Result;
|
|
}
|
|
CODES_LOOP: while (<CODEFILE>)
|
|
{
|
|
if (/^$Mylang\s+/i)
|
|
{
|
|
@data = split(/\s+/,$_);
|
|
last CODES_LOOP;
|
|
}
|
|
}
|
|
close(CODEFILE);
|
|
|
|
if(!@data)
|
|
{
|
|
errmsg("fatal: can't find LCID for $Mylang");
|
|
return $Result;
|
|
}
|
|
|
|
$LCIDShort = $data[2];
|
|
$LCIDShort =~ s/^0x//;
|
|
$$LCID=$LCIDShort;
|
|
$Result =1;
|
|
|
|
return $Result;
|
|
} # GetLCIDofLang
|
|
#
|
|
# Add LGN binaries to dosnet.inf
|
|
#
|
|
sub DoDosNetChange
|
|
{
|
|
my ($FilePath, $pItemsList, $BackupPath) = @_;
|
|
|
|
my (@Items, @ItemsInSection, $Section, $Result, $nStart, $nEnd, $nStartTag1, $nStartTag2);
|
|
my ($Replace, $Line, $Entry);
|
|
my (@AddedItems, $FileName, $Path, $Idx, $Item_no);
|
|
|
|
$Result = 0;
|
|
# Open he dosnet.inf
|
|
unless ( open(INFILE, $FilePath) )
|
|
{
|
|
errmsg ("Can't open $FilePath");
|
|
return $Result;
|
|
}
|
|
# Read into @Items
|
|
@Items=<INFILE>;
|
|
close(INFILE);
|
|
|
|
$Section="Files";
|
|
$nStartTag1=0;
|
|
$nStartTag2=0;
|
|
#
|
|
# Read [Files] Section, position in nStart, nEnd
|
|
# Find LGN tag, position in nStartTag1, nStartTag2
|
|
#
|
|
# [Note] There are multiply [Files] in Dosnet.inf. We are looking the one which notepad.exe exists
|
|
#
|
|
if (!ReadSectionDosNet($Section,\@Items, \$nStart, \$nEnd, \$nStartTag1, \$nStartTag2,
|
|
$LGNTagStart,$LGNTagEnd))
|
|
{
|
|
errmsg("Fatal: Can't find $Section in $FilePath");
|
|
return $Result;
|
|
}
|
|
|
|
#
|
|
# Search the LGN Tag
|
|
#
|
|
$nStartTag1=-1;
|
|
$nStartTag2=-1;
|
|
$Replace="FALSE";
|
|
$Idx=-1;
|
|
foreach (@Items)
|
|
{
|
|
chomp($_);
|
|
$Idx++;
|
|
# Find$ LGN tag, position in nStartTag1, nStartTag2
|
|
if ( $_ eq $LGNTagStart)
|
|
{
|
|
$nStartTag1 = $Idx;
|
|
}
|
|
if ( $_ eq $LGNTagEnd)
|
|
{
|
|
$nStartTag2 = $Idx;
|
|
}
|
|
}
|
|
|
|
if ( ($nStartTag1 != -1) && ($nStartTag2 != -1))
|
|
{
|
|
$Replace = "TRUE";
|
|
}
|
|
else
|
|
{
|
|
logmsg("StartTag/EndTag not found in $FilePath, it may be a fresh one");
|
|
}
|
|
#
|
|
# LGN resource files list in @$pItemsList
|
|
# Let's add items in @$pItemsList to @AddedItems
|
|
#
|
|
foreach $Line (@$pItemsList)
|
|
{
|
|
chomp($Line);
|
|
if (! $fNeedGenerateCMF)
|
|
{
|
|
$Entry = "d1,$Line.mui";
|
|
}
|
|
else
|
|
{
|
|
$Entry = "d1,$Line";
|
|
}
|
|
push(@AddedItems,$Entry);
|
|
}
|
|
#
|
|
# backup the dosnet.inf before the modification
|
|
#
|
|
if ( ! -d $BackupPath)
|
|
{
|
|
system("md $BackupPath");
|
|
}
|
|
unless ( -d $BackupPath)
|
|
{
|
|
errmsg("Fatal: Can't open backup path $BackupPath");
|
|
}
|
|
#
|
|
# Get File name from path
|
|
#
|
|
($FileName, $Path ) = fileparse($FilePath);
|
|
|
|
if ( system("copy/y $FilePath $BackupPath\\$FileName.Bak") != 0)
|
|
{
|
|
errmsg("Fatal: Can't backup $FilePath to $BackupPath\\$FileName.Bak");
|
|
return $Result;
|
|
}
|
|
#
|
|
# Generate the dosnet.inf with added LGN resource files
|
|
#
|
|
system ("attrib -r $FilePath 2>null");
|
|
unless ( open(OUTFILE, ">$FilePath") )
|
|
{
|
|
errmsg("Fatal: Can't open output for $FilePath");
|
|
return $Result;
|
|
}
|
|
$Item_no=scalar(@Items);
|
|
|
|
if ( $Replace eq "TRUE")
|
|
{
|
|
for ($Idx=0; $Idx <= $nStartTag1; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
foreach $Line (@AddedItems)
|
|
{
|
|
print (OUTFILE "$Line\n");
|
|
}
|
|
|
|
for ($Idx=$nStartTag2; $Idx < $Item_no; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for ($Idx=0; $Idx <= $nEnd; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
#
|
|
# Add LGN resource files, enclosed them with Tag
|
|
#
|
|
print (OUTFILE "$LGNTagStart\n");
|
|
foreach $Line (@AddedItems)
|
|
{
|
|
print (OUTFILE "$Line\n");
|
|
}
|
|
print (OUTFILE "$LGNTagEnd\n\n");
|
|
|
|
for ($Idx=$nEnd+1; $Idx < $Item_no; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
}
|
|
close(OUTFILE);
|
|
$Result = 1;
|
|
logmsg("Success: Update $FilePath");
|
|
return $Result;
|
|
|
|
}
|
|
#
|
|
# Add LGN binaries to txtsetup.sif/layout.inf
|
|
#
|
|
sub DoTxtsetupNLayoutChange
|
|
{
|
|
my ($FilePath, $pItemsList, $BackupPath) = @_;
|
|
|
|
my (@Items, @ItemsInSection, $Section, $Result, $nStart, $nEnd, $nStartTag1, $nStartTag2,$nStartDirs,$nEndDirs);
|
|
my ($nStart_Dir,$nEnd_Dir);
|
|
my ($ReplaceDirs, $Replace, $Line, $Entry);
|
|
my (@AddedItems, $FileName, $Path, $Idx, $Item_no);
|
|
my (%RenameTable, $FileRenamed, $nUppbound);
|
|
my ($NoAlt, $BldArch, $AltSection,$nAltStart,$nAltEnd, $bLGNDirs);
|
|
|
|
$Result = 0;
|
|
# Open he dosnet.inf
|
|
unless ( open(INFILE, $FilePath) )
|
|
{
|
|
errmsg ("Can't open $FilePath");
|
|
return $Result;
|
|
}
|
|
# Read into @Items
|
|
@Items=<INFILE>;
|
|
close(INFILE);
|
|
|
|
#
|
|
# First, we have to read [WinntDirectories] section to see if '190 = mui\fallback\0409' is there
|
|
#
|
|
$Section="WinntDirectories";
|
|
$nStartDirs=0;
|
|
$nEndDirs=0;
|
|
#
|
|
# Read [WinntDirectories] Section, position in nStart, nEnd
|
|
#
|
|
if (!ReadSection($Section,\@Items, \@ItemsInSection, \$nStart_Dir, \$nEnd_Dir, \$nStartDirs, \$nEndDirs,
|
|
$LGNDirs,"Nothing"))
|
|
{
|
|
errmsg("Fatal: Can't find $Section in $FilePath");
|
|
return $Result;
|
|
}
|
|
|
|
$Section="SourceDisksFiles";
|
|
$nStartTag1=0;
|
|
$nStartTag2=0;
|
|
#
|
|
# Read [SourceDisksFiles] Section, position in nStart, nEnd
|
|
#
|
|
if (!ReadSection($Section,\@Items, \@ItemsInSection, \$nStart, \$nEnd, \$nStartTag1, \$nStartTag2,
|
|
$LGNTagStart,$LGNTagEnd))
|
|
{
|
|
errmsg("Fatal: Can't find $Section in $FilePath");
|
|
return $Result;
|
|
}
|
|
#
|
|
# Read [SourceDisksFiles.<BldArch>] Section. This section contains platform specific files
|
|
#
|
|
my ($NoAlt, $BldArch, $AltSection);
|
|
$NoAlt=0;
|
|
$BldArch = $ENV{ "\_BuildArch" };
|
|
if ( $BldArch =~ /x86/i )
|
|
{
|
|
$AltSection= "$Section.x86";
|
|
}
|
|
elsif ( $BldArch =~ /amd64/i)
|
|
{
|
|
$AltSection= "$Section.amd64";
|
|
}
|
|
elsif ( $BldArch =~ /ia64/i )
|
|
{
|
|
$AltSection= "$Section.ia64";
|
|
}
|
|
else
|
|
{
|
|
$AltSection= "$Section.x86";
|
|
}
|
|
if (!ReadSection($AltSection,\@Items, \@ItemsInSection, \$nAltStart, \$nAltEnd, \$nStartTag1, \$nStartTag2,
|
|
$LGNTagStart,$LGNTagEnd))
|
|
{
|
|
errmsg(" Can't find $AltSection in $FilePath");
|
|
$NoAlt=1;
|
|
}
|
|
#
|
|
# Search Tag here
|
|
#
|
|
$nStartDirs=-1;
|
|
$nEndDirs=-1;
|
|
$nStartTag1=-1;
|
|
$nStartTag2=-1;
|
|
$ReplaceDirs="FALSE";
|
|
$Replace="FALSE";
|
|
$Idx=-1;
|
|
foreach (@Items)
|
|
{
|
|
chomp($_);
|
|
$Idx++;
|
|
# Find $LGNDirs, position in nStartDirs
|
|
if ( $_ eq $LGNDirs)
|
|
{
|
|
$nStartDirs = $Idx;
|
|
}
|
|
# Find$ LGN tag, position in nStartTag1, nStartTag2
|
|
if ( $_ eq $LGNTagStart)
|
|
{
|
|
$nStartTag1 = $Idx;
|
|
}
|
|
if ( $_ eq $LGNTagEnd)
|
|
{
|
|
$nStartTag2 = $Idx;
|
|
}
|
|
}
|
|
if ($nStartDirs != -1)
|
|
{
|
|
$ReplaceDirs = "TRUE";
|
|
}
|
|
if ( ($nStartTag1 != -1) && ($nStartTag2 != -1))
|
|
{
|
|
$Replace = "TRUE";
|
|
}
|
|
|
|
#
|
|
# Build up rename table here !
|
|
# Windows sepcify the renaming in txtsetup.txt and layout.inf
|
|
#
|
|
%RenameTable={};
|
|
if ($Replace eq "TRUE")
|
|
{
|
|
$nUppbound = $nStartTag1;
|
|
}
|
|
else
|
|
{
|
|
$nUppbound = $nEnd;
|
|
}
|
|
if (! &BuildRenameTable(\@Items,$nStart, $nUppbound,\%RenameTable))
|
|
{
|
|
errmsg("Can't build File Rename Table");
|
|
return $Result;
|
|
}
|
|
if ( ! $NoAlt )
|
|
{
|
|
if (! &BuildRenameTable(\@Items,$nAltStart, $nAltEnd,\%RenameTable))
|
|
{
|
|
errmsg("Can't build File Rename Table from $AltSection");
|
|
}
|
|
}
|
|
#
|
|
# LGN resource files list in @$pItemsList
|
|
# Let's add LGN binaries to @AddedItems
|
|
#
|
|
foreach $Line (@$pItemsList)
|
|
{
|
|
chomp($Line);
|
|
if (! $fNeedGenerateCMF)
|
|
{
|
|
$Entry = "$Line.mui$LGNItemEntry";
|
|
#
|
|
# If file exists in rename table, append rename entry
|
|
#
|
|
$FileRenamed=$RenameTable{$Line};
|
|
if ( defined($FileRenamed) )
|
|
{
|
|
$Entry="$Entry,$FileRenamed.mui";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$Entry = "$Line$LGNItemEntry";
|
|
}
|
|
push(@AddedItems,$Entry);
|
|
}
|
|
#
|
|
# backup the txtsetup.sif / layout.inf before the modification
|
|
#
|
|
if ( ! -d $BackupPath)
|
|
{
|
|
system("md $BackupPath");
|
|
}
|
|
unless ( -d $BackupPath)
|
|
{
|
|
errmsg("Fatal: Can't open backup path $BackupPath");
|
|
}
|
|
#
|
|
# Get File name from path
|
|
#
|
|
($FileName, $Path ) = fileparse($FilePath);
|
|
|
|
if (system("copy/y $FilePath $BackupPath\\$FileName.Bak") != 0)
|
|
{
|
|
errmsg("Fatal: Can't backup $FilePath to $BackupPath\\$FileName.Bak");
|
|
return $Result;
|
|
}
|
|
#
|
|
# Generate the txtsetup.sif / layout.inf with added LGN resource files
|
|
#
|
|
system ("attrib -r $FilePath");
|
|
unless ( open(OUTFILE, ">$FilePath") )
|
|
{
|
|
errmsg("Fatal: Can't open output for $FilePath");
|
|
return $Result;
|
|
}
|
|
$Item_no=scalar(@Items);
|
|
|
|
$bLGNDirs=0;
|
|
for ($Idx=0; $Idx <= $nEnd_Dir; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
if ( ($Idx > $nStart_Dir) && ( $Items[$Idx] =~ /^$LGNDirs_TagReg/) )
|
|
{
|
|
$Items[$Idx] = $LGNDirs_Localized;
|
|
$bLGNDirs=1;
|
|
}
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
#if ($ReplaceDirs eq "FALSE")
|
|
if ( ! $bLGNDirs)
|
|
{
|
|
print (OUTFILE "$LGNDirs_Localized\n\n");
|
|
}
|
|
#
|
|
# Add/Replace items in [SourceDisksFiles] Section
|
|
#
|
|
|
|
if ( $Replace eq "TRUE")
|
|
{
|
|
for ($Idx=$nEnd_Dir + 1 ; $Idx <= $nStartTag1; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
foreach $Line (@AddedItems)
|
|
{
|
|
|
|
print (OUTFILE "$Line\n");
|
|
}
|
|
|
|
for ($Idx=$nStartTag2; $Idx < $Item_no; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
for ($Idx=$nEnd_Dir + 1; $Idx <= $nEnd; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
#
|
|
# Add LGN resource files, enclosed them with Tag
|
|
#
|
|
print (OUTFILE "$LGNTagStart\n");
|
|
foreach $Line (@AddedItems)
|
|
{
|
|
print (OUTFILE "$Line\n");
|
|
}
|
|
print (OUTFILE "$LGNTagEnd\n\n");
|
|
|
|
|
|
for ($Idx=$nEnd+1; $Idx < $Item_no; $Idx++)
|
|
{
|
|
chomp($Items[$Idx]);
|
|
print (OUTFILE "$Items[$Idx]\n");
|
|
}
|
|
}
|
|
close(OUTFILE);
|
|
$Result = 1;
|
|
logmsg("Success: Update $FilePath");
|
|
return $Result;
|
|
|
|
}
|
|
#
|
|
#
|
|
# Scan the entries of txtsetup.sif/layout.inf to find the files to be renamed
|
|
#
|
|
# If a file is renamed, then its associated mui file should be renamed also
|
|
#
|
|
sub BuildRenameTable
|
|
{
|
|
|
|
my ($pItems,$nStart, $nEnd,$pRenameTable)= @_;
|
|
my ($Line, $Trash, $Idx,$OldName,$NewName);
|
|
|
|
|
|
|
|
for ($Idx = $nStart; $Idx <= $nEnd; $Idx++)
|
|
{
|
|
|
|
$Line=$$pItems[$Idx];
|
|
chomp($Line);
|
|
|
|
if ( length($Line) == 0)
|
|
{
|
|
next;
|
|
}
|
|
if (substr($Line,0,1) eq ";")
|
|
{
|
|
next;
|
|
}
|
|
|
|
if ($Line =~ /=\s*[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([^,]+)/ )
|
|
{
|
|
$NewName=$1;
|
|
($OldName,$Trash) = split ( /=+/, $Line);
|
|
$OldName =~ s/\s//g;
|
|
$NewName=~ s/\s//g;
|
|
$$pRenameTable{$OldName}=$NewName;
|
|
}
|
|
}
|
|
return 1;
|
|
|
|
}
|
|
|
|
#
|
|
# Search a Section of a INFs. INFs stored in @$pItemsList
|
|
#
|
|
|
|
sub ReadSection
|
|
{
|
|
|
|
my ($Section, $pItemsList, $pItemsInSection, $pnStart, $pnEnd, $pnStartTag1, $pnStartTag2, $Tag1,$Tag2) = @_;
|
|
my ($Index, $SectionStart, $SectionEnd, $Line, $Line_Org, $ReadFlag, $Result);
|
|
|
|
$ReadFlag = "FALSE";
|
|
$Index= -1;
|
|
$SectionStart = -1;
|
|
$SectionEnd = -1;
|
|
$Result = 0;
|
|
|
|
#
|
|
# Read The section
|
|
#
|
|
LINE: foreach $Line_Org (@$pItemsList)
|
|
{
|
|
$Line = $Line_Org;
|
|
chomp($Line);
|
|
$Index++;
|
|
if ( (length($Line) == 0) || (substr($Line,0,1) eq ";") || (substr($Line,0,1) eq "#") )
|
|
{
|
|
if ( $ReadFlag eq "TRUE" )
|
|
{
|
|
push (@$pItemsInSection, $Line_Org);
|
|
}
|
|
next;
|
|
}
|
|
if ( $Line =~ /^\[/ )
|
|
{
|
|
|
|
if ( $ReadFlag eq "TRUE")
|
|
{
|
|
$ReadFlag = "FALSE";
|
|
if ( $SectionStart != -1)
|
|
{
|
|
if ($SectionEnd == -1)
|
|
{
|
|
$SectionEnd = $Index-1;
|
|
}
|
|
}
|
|
last LINE;
|
|
}
|
|
|
|
}
|
|
if ( $Line =~ /^\[$Section\]/ ) # pattern in $Section !!!
|
|
{
|
|
$ReadFlag = "TRUE";
|
|
$SectionStart=$Index;
|
|
}
|
|
if ($ReadFlag eq "TRUE")
|
|
{
|
|
# Check if it's a LGN starting Tag
|
|
if ( $$pnStartTag1 != 0)
|
|
{
|
|
if ($Line eq $Tag1)
|
|
{
|
|
$$pnStartTag1 = $Index;
|
|
}
|
|
}
|
|
# Check if it's a LGN ending Tag
|
|
if ( $$pnStartTag2 != 0)
|
|
{
|
|
if ($Line eq $Tag2)
|
|
{
|
|
$$pnStartTag2 = $Index;
|
|
}
|
|
}
|
|
|
|
push(@$pItemsInSection, $Line_Org);
|
|
}
|
|
}
|
|
if ( $SectionStart != -1)
|
|
{
|
|
if ( $SectionEnd == -1)
|
|
{
|
|
$SectionEnd = $Index;
|
|
}
|
|
$Result = 1;
|
|
$$pnStart = $SectionStart;
|
|
$$pnEnd = $SectionEnd;
|
|
}
|
|
return $Result;
|
|
}
|
|
#
|
|
# Search a Section of a INFs. INFs stored in @$pItemsList
|
|
#
|
|
|
|
sub ReadSectionDosNet
|
|
{
|
|
|
|
my ($Section, $pItemsList, $pnStart, $pnEnd, $pnStartTag1, $pnStartTag2, $Tag1,$Tag2) = @_;
|
|
my ($Index, $SectionStart, $SectionEnd, $Line, $ReadFlag, $Result, $NotepadFound, $NotepadTag);
|
|
|
|
$ReadFlag = 0;
|
|
$NotepadFound=0;
|
|
$Index= -1;
|
|
$SectionStart = -1;
|
|
$SectionEnd = -1;
|
|
$Result = 0;
|
|
$NotepadTag="d1,notepad.exe";
|
|
|
|
#
|
|
# Read The section
|
|
#
|
|
LINE: foreach $Line (@$pItemsList)
|
|
{
|
|
chomp($Line);
|
|
$Index++;
|
|
if ( (length($Line) == 0) || (substr($Line,0,1) eq ";") || (substr($Line,0,1) eq "#") )
|
|
{
|
|
next;
|
|
}
|
|
#
|
|
# A start of section
|
|
#
|
|
if ( $Line =~ /^\[/ )
|
|
{
|
|
if ( $ReadFlag)
|
|
{
|
|
$ReadFlag = 0;
|
|
#
|
|
# Is it the section we want ?
|
|
#
|
|
if ($NotepadFound)
|
|
{
|
|
if ( $SectionStart != -1)
|
|
{
|
|
if ($SectionEnd == -1)
|
|
{
|
|
$SectionEnd = $Index-1;
|
|
}
|
|
}
|
|
# Done ! and Exit the loop
|
|
last LINE;
|
|
}
|
|
else
|
|
{
|
|
$SectionStart= -1;
|
|
$SectionEnd = -1;
|
|
}
|
|
}
|
|
|
|
}
|
|
if ( $Line =~ /^\[$Section\]/ ) # pattern in $Section !!!
|
|
{
|
|
$ReadFlag = 1;
|
|
$SectionStart=$Index;
|
|
}
|
|
if ($ReadFlag)
|
|
{
|
|
if ( $Line =~ /$NotepadTag/ )
|
|
{
|
|
$NotepadFound=1;
|
|
|
|
}
|
|
}
|
|
}
|
|
if ( ($SectionStart != -1) && $NotepadFound )
|
|
{
|
|
if ( $SectionEnd == -1)
|
|
{
|
|
$SectionEnd = $Index;
|
|
}
|
|
$Result = 1;
|
|
$$pnStart = $SectionStart;
|
|
$$pnEnd = $SectionEnd;
|
|
}
|
|
return $Result;
|
|
}
|
|
|
|
#
|
|
# Build hash of array which contians path of KEY INFS
|
|
#
|
|
sub BuildArray
|
|
{
|
|
|
|
|
|
my ($BigDosnet, $PerDosnet, $BlaDosnet, $SbsDosnet, $SrvDosnet , $EntDosnet , $DtcDosnet);
|
|
my ($BigDosnet_sign, $PerDosnet_sign, $BlaDosnet_sign, $SbsDosnet_sign, $SrvDosnet_sign , $EntDosnet_sign , $DtcDosnet_sign);
|
|
|
|
my ($BigTxtsetup, $PerTxtsetup, $BlaTxtsetup, $SbsTxtsetup, $SrvTxtsetup, $EntTxtsetup, $DtcTxtsetup);
|
|
my ($BigTxtsetup_sign, $PerTxtsetup_sign, $BlaTxtsetup_sign, $SbsTxtsetup_sign, $SrvTxtsetup_sign, $EntTxtsetup_sign, $DtcTxtsetup_sign);
|
|
|
|
my ($BigLayout, $PerLayout, $BlaLayout, $SbsLayout, $SrvLayout , $EntLayout, $DtcLayout);
|
|
my ($BigLayout_sign, $PerLayout_sign, $BlaLayout_sign, $SbsLayout_sign, $SrvLayout_sign , $EntLayout_sign, $DtcLayout_sign);
|
|
|
|
my ($Path_Dosnet, $Path_Txtsetup, $Path_Layout, $Path_Dir);
|
|
my ($Path_Dosnet_sign, $Path_Txtsetup_sign, $Path_Layout_sign, $Path_Dir_sign);
|
|
|
|
|
|
|
|
#
|
|
# Get SKUs
|
|
#
|
|
%CDDataSKUs = map({uc$_ => cksku::CkSku($_, $lang, $ENV{_BuildArch})} qw(PRO PER SRV BLA SBS ADS DTC));
|
|
#
|
|
# Build Key INFs for SKUs
|
|
#
|
|
$BigDosnet = $nttree . "\\dosnet.inf";
|
|
$PerDosnet = $nttree . "\\perinf\\dosnet.inf";
|
|
$BlaDosnet = $nttree . "\\blainf\\dosnet.inf";
|
|
$SbsDosnet = $nttree . "\\sbsinf\\dosnet.inf";
|
|
$SrvDosnet = $nttree . "\\srvinf\\dosnet.inf";
|
|
$EntDosnet = $nttree . "\\entinf\\dosnet.inf";
|
|
$DtcDosnet = $nttree . "\\dtcinf\\dosnet.inf";
|
|
|
|
$BigTxtsetup = $nttree . "\\txtsetup.sif";
|
|
$PerTxtsetup = $nttree . "\\perinf\\txtsetup.sif";
|
|
$BlaTxtsetup = $nttree . "\\blainf\\txtsetup.sif";
|
|
$SbsTxtsetup = $nttree . "\\sbsinf\\txtsetup.sif";
|
|
$SrvTxtsetup = $nttree . "\\srvinf\\txtsetup.sif";
|
|
$EntTxtsetup = $nttree . "\\entinf\\txtsetup.sif";
|
|
$DtcTxtsetup = $nttree . "\\dtcinf\\txtsetup.sif";
|
|
|
|
|
|
$BigLayout = $nttree . "\\layout.inf";
|
|
$PerLayout = $nttree . "\\perinf\\layout.inf";
|
|
$BlaLayout = $nttree . "\\blainf\\layout.inf";
|
|
$SbsLayout = $nttree . "\\sbsinf\\layout.inf";
|
|
$SrvLayout = $nttree . "\\srvinf\\layout.inf";
|
|
$EntLayout = $nttree . "\\entinf\\layout.inf";
|
|
$DtcLayout = $nttree . "\\dtcinf\\layout.inf";
|
|
|
|
|
|
$BigDosnet_sign = $nttree . "\\realsign\\dosnet.inf";
|
|
$PerDosnet_sign = $nttree . "\\perinf\\realsign\\dosnet.inf";
|
|
$BlaDosnet_sign = $nttree . "\\blainf\\realsign\\dosnet.inf";
|
|
$SbsDosnet_sign = $nttree . "\\sbsinf\\realsign\\dosnet.inf";
|
|
$SrvDosnet_sign = $nttree . "\\srvinf\\realsign\\dosnet.inf";
|
|
$EntDosnet_sign = $nttree . "\\entinf\\realsign\\dosnet.inf";
|
|
$DtcDosnet_sign = $nttree . "\\dtcinf\\realsign\\dosnet.inf";
|
|
|
|
$BigTxtsetup_sign = $nttree . "\\realsign\\txtsetup.sif";
|
|
$PerTxtsetup_sign = $nttree . "\\perinf\\realsign\\txtsetup.sif";
|
|
$BlaTxtsetup_sign = $nttree . "\\blainf\\realsign\\txtsetup.sif";
|
|
$SbsTxtsetup_sign = $nttree . "\\sbsinf\\realsign\\txtsetup.sif";
|
|
$SrvTxtsetup_sign = $nttree . "\\srvinf\\realsign\\txtsetup.sif";
|
|
$EntTxtsetup_sign = $nttree . "\\entinf\\realsign\\txtsetup.sif";
|
|
$DtcTxtsetup_sign = $nttree . "\\dtcinf\\realsign\\txtsetup.sif";
|
|
|
|
|
|
$BigLayout_sign = $nttree . "\\realsign\\layout.inf";
|
|
$PerLayout_sign = $nttree . "\\perinf\\realsign\\layout.inf";
|
|
$BlaLayout_sign = $nttree . "\\blainf\\realsign\\layout.inf";
|
|
$SbsLayout_sign = $nttree . "\\sbsinf\\realsign\\layout.inf";
|
|
$SrvLayout_sign = $nttree . "\\srvinf\\realsign\\layout.inf";
|
|
$EntLayout_sign = $nttree . "\\entinf\\realsign\\layout.inf";
|
|
$DtcLayout_sign = $nttree . "\\dtcinf\\realsign\\layout.inf";
|
|
|
|
# PRO
|
|
$Path_Dosnet =$BigDosnet;
|
|
$Path_Txtsetup =$BigTxtsetup;
|
|
$Path_Layout =$BigLayout;
|
|
$Path_Dir ="ProInf";
|
|
$Path_Dosnet_sign =$BigDosnet_sign;
|
|
$Path_Txtsetup_sign =$BigTxtsetup_sign;
|
|
$Path_Layout_sign =$BigLayout_sign;
|
|
$Path_Dir_sign ="ProInf\\realsign";
|
|
$INFPathSKUs{"PRO"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
#PER
|
|
$Path_Dosnet =$PerDosnet;
|
|
$Path_Txtsetup =$PerTxtsetup;
|
|
$Path_Layout =$PerLayout;
|
|
$Path_Dir ="PerInf";
|
|
$Path_Dosnet_sign =$PerDosnet_sign;
|
|
$Path_Txtsetup_sign =$PerTxtsetup_sign;
|
|
$Path_Layout_sign =$PerLayout_sign;
|
|
$Path_Dir_sign ="PerInf\\realsign";
|
|
$INFPathSKUs{"PER"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
#SRV
|
|
$Path_Dosnet =$SrvDosnet;
|
|
$Path_Txtsetup =$SrvTxtsetup;
|
|
$Path_Layout =$SrvLayout;
|
|
$Path_Dir ="SrvInf";
|
|
$Path_Dosnet_sign =$SrvDosnet_sign;
|
|
$Path_Txtsetup_sign =$SrvTxtsetup_sign;
|
|
$Path_Layout_sign =$SrvLayout_sign;
|
|
$Path_Dir_sign ="SrvInf\\realsign";
|
|
$INFPathSKUs{"SRV"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
#BLA
|
|
$Path_Dosnet =$BlaDosnet;
|
|
$Path_Txtsetup =$BlaTxtsetup;
|
|
$Path_Layout =$BlaLayout;
|
|
$Path_Dir ="BlaInf";
|
|
$Path_Dosnet_sign =$BlaDosnet_sign;
|
|
$Path_Txtsetup_sign =$BlaTxtsetup_sign;
|
|
$Path_Layout_sign =$BlaLayout_sign;
|
|
$Path_Dir_sign ="BlaInf\\realsign";
|
|
$INFPathSKUs{"BLA"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
#SBS
|
|
$Path_Dosnet =$SbsDosnet;
|
|
$Path_Txtsetup =$SbsTxtsetup;
|
|
$Path_Layout =$SbsLayout;
|
|
$Path_Dir ="SbsInf";
|
|
$Path_Dosnet_sign =$SbsDosnet_sign ;
|
|
$Path_Txtsetup_sign =$SbsTxtsetup_sign ;
|
|
$Path_Layout_sign =$SbsLayout_sign ;
|
|
$Path_Dir_sign ="SbsInf\\realsign";
|
|
$INFPathSKUs{"SBS"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
#ADS (ENT)
|
|
$Path_Dosnet =$EntDosnet;
|
|
$Path_Txtsetup =$EntTxtsetup;
|
|
$Path_Layout =$EntLayout;
|
|
$Path_Dir ="EntInf";
|
|
$Path_Dosnet_sign =$EntDosnet_sign;
|
|
$Path_Txtsetup_sign =$EntTxtsetup_sign;
|
|
$Path_Layout_sign =$EntLayout_sign;
|
|
$Path_Dir_sign ="EntInf\\realsign";
|
|
$INFPathSKUs{"ADS"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
#DTC
|
|
$Path_Dosnet =$DtcDosnet;
|
|
$Path_Txtsetup =$DtcTxtsetup;
|
|
$Path_Layout =$DtcLayout;
|
|
$Path_Dir ="DtcInf";
|
|
$Path_Dosnet_sign =$DtcDosnet_sign;
|
|
$Path_Txtsetup_sign =$DtcTxtsetup_sign;
|
|
$Path_Layout_sign =$DtcLayout_sign;
|
|
$Path_Dir_sign ="DtcInf\\realsign";
|
|
$INFPathSKUs{"DTC"} = [ ($Path_Dosnet,$Path_Txtsetup,$Path_Layout,$Path_Dir, $Path_Dosnet_sign,$Path_Txtsetup_sign,$Path_Layout_sign,$Path_Dir_sign) ];
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|