Windows2003-3790/tools/postbuildscripts/chgkeyinf.cmd
2020-09-30 16:53:55 +02:00

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;
}