Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

589 lines
20 KiB

@REM -----------------------------------------------------------------
@REM
@REM copywow64.cmd - WadeLa
@REM Copy appropriate 32bit files from a release into a 64bit build
@REM
@REM Copyright (c) Microsoft Corporation. All rights reserved.
@REM
@REM ------------------------------------------------------------------
@if defined _CPCMAGIC goto CPCBegin
@perl -x "%~f0" %*
@goto :EOF
#!perl
use strict;
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH};
use PbuildEnv;
use ParseArgs;
sub Usage { print<<USAGE; exit(1) }
copywow64 [-l <language>]
Copy appropriate 32bit files from a release into a 64bit build.
If _NTWOWBINSTREE is set that is the location 32bit files will be
copied from.
USAGE
parseargs('?' => \&Usage);
# *** TEMPLATE CODE ***
$ENV{"_CPCMAGIC"}++;exit(system($0)>>8);
__END__
@:CPCBegin
@set _CPCMAGIC=
@setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
@if not defined DEBUG echo off
@REM *** CMD SCRIPT BELOW ***
REM This script generates a list of wow32 binaries to be copied from
REM a 32 bit machine. The list itself is generated on the 64 bit machine
REM Bail if your not on a 64 bit machine
if /i "%_BuildArch%" neq "ia64" (
if /i "%_BuildArch%" neq "amd64" (
call logmsg.cmd "Not Win64, exiting."
goto :End
)
)
REM define comp if it's not already defined
if NOT defined Comp (
set Comp=No
if %NUMBER_OF_PROCESSORS% GEQ 4 set Comp=Yes
if defined OFFICIAL_BUILD_MACHINE set Comp=Yes
)
REM First find the latest build from which to copy the binaries
if defined _NTWoWBinsTREE (
set SourceDir=%_NTWoWBinsTREE%
goto :EndGetBuild
)
REM read the copy location from build_logs\CPLocation.txt
set CPFile=%_NTPOSTBLD%\build_logs\CPLocation.txt
if not exist %CPFile% (
call logmsg.cmd "Copy Location file not found, will attempt to create ..."
call %RazzleToolPath%\PostBuildScripts\CPLocation.cmd -l:%lang%
if not exist %CPFile% (
call errmsg.cmd "CPLocation.cmd failed, exiting ..."
goto :End
)
)
for /f "delims=" %%a in ('type %CPFile%') do set CPLocation=%%a
if not exist %CPLocation% (
call logmsg.cmd "Copy Location from %CPFile% does not exist, retry ..."
call %RazzleToolPath%\PostBuildScripts\CPLocation.cmd -l:%lang%
if not exist %CPFile% (
call errmsg.cmd "CPLocation.cmd failed, exiting ..."
goto :End
)
for /f "delims=" %%a in ('type %CPFile%') do set CPLocation=%%a
if not exist !CPLocation! (
call errmsg.cmd "Copy Location !CPLocation! does not exist ..."
goto :End
)
)
call logmsg.cmd "Copy Location is set to %CPLocation% ..."
set SourceDir=%CPLocation%
:EndGetBuild
if not exist %SourceDir% (
call errmsg.cmd "The source dir %SourceDir% does not exist ..."
goto :End
)
REM Now compare the services.tab files from the 32-bit build and
REM the 64-bit build and make sure they're identical
call logmsg.cmd "Verifying services.tab..."
if not exist %SourceDir%\ntsv6432\kesvc32.tab (
call logmsg.cmd "%SourceDir%\ntsv6432\kesvc32.tab not found"
goto :CompFailed
)
if not exist %_NTPOSTBLD%\ntsv6432\kesvc.tab (
call logmsg.cmd "%_NTPOSTBLD%\ntsv6432\kesvc.tab not found"
goto :CompFailed
)
fc /w %SourceDir%\ntsv6432\kesvc32.tab %_NTPOSTBLD%\ntsv6432\kesvc.tab >Nul
if %ERRORLEVEL% NEQ 0 (
call logmsg.cmd "services.tab [kernel] comparison failed"
goto :CompFailed
)
if not exist %SourceDir%\ntsv6432\guisvc32.tab (
call logmsg.cmd "%SourceDir%\ntsv6432\guisvc32.tab not found"
goto :CompFailed
)
if not exist %_NTPOSTBLD%\ntsv6432\guisvc.tab (
call logmsg.cmd "%_NTPOSTBLD%\ntsv6432\guisvc.tab not found"
goto :CompFailed
)
fc /w %SourceDir%\ntsv6432\guisvc32.tab %_NTPOSTBLD%\ntsv6432\guisvc.tab >Nul
if %ERRORLEVEL% == 0 (
call logmsg.cmd "services.tab comparison successful"
goto :CompSucceeded
)
:CompFailed
if defined OFFICIAL_BUILD_MACHINE (
call errmsg.cmd "services.tab [gui] comparison failed"
goto :END
) else (
echo.
call logmsg.cmd "--------------- WARNING: ---------------------------
call logmsg.cmd "This Win64 build has a services.tab that's "
call logmsg.cmd "incompatible with the 32-bit build used by Wow64."
call logmsg.cmd "If the new services.tab entry you added isn't"
call logmsg.cmd "located at the end of the file, then don't expect"
call logmsg.cmd "32-bit component registration during 64-bit GUI "
call logmsg.cmd "setup to work. Basically, 32-bit apps won't work on "
call logmsg.cmd "this build."
echo.
)
: CompSucceeded
REM Set the Destination directory
set DestDir=!_NTPostBld!\wowbins
set UnCompDestDir=!_NTPostBld!\wowbins_uncomp
REM Set the rest
set outputfile=%tmp%\copywowlist.txt
set WowMiss=%tmp%\MissingWowFiles.txt
call logmsg.cmd "Copying files from %SourceDir%"
REM Delete the output file if it already exists
if exist %tmp%\copywowlist.txt del /f %tmp%\copywowlist.txt
if exist %tmp%\copywowlist1 del /f %tmp%\copywowlist1
pushd %_NTPostBld%\congeal_scripts
REM File compare the x86 and 64-bit layout.inf
REM If they are different log a warning
fc %SourceDir%\congeal_scripts\layout.inx layout.inx 2>Nul 1>Nul
if /i NOT "%ErrorLevel%" == "0" (
call logmsg.cmd /t "WARNING: the x86 build machine's layout.inx is different than this machine's - continuing"
)
if /i "%Comp%" == "No" (
if exist !DestDir! (
if exist !UnCompDestDir! rd /s /q !UnCompDestDir!
if exist !DestDir! move !DestDir! !UnCompDestDir!
)
)
REM Make the dosnet.tmp1 list: file with filenames and Media IDs.
for %%a in (p w s e d b l @) do (
copy /b layout.inx+layout.txt dosnet.tmp1
prodfilt dosnet.tmp1 dosnet.tmp2 +%%a
prodfilt dosnet.tmp2 dosnet.tmp1 +i
wowlist -i dosnet.tmp1 -c wowlist.inf -f w -o dosnet.tmp2 -ac -p 2>NUL
copy /b dosnet.tmp2+wowexcp.txt dosnet.tmp1
copy /b layout.inx+layout.txt layout64.tmp1
prodfilt layout64.tmp1 layout64.tmp2 +w
prodfilt layout64.tmp2 layout64.tmp1 +m
REM Process dosnet.tmp1 using layout64.tmp1 to get appropriate
REM folder relative to \i386 and prepend to the entry before writing out to the outputfile
call ExecuteCmd "perl %RazzleToolPath%\postbuildscripts\Copywowlist.pl layout64.tmp1 dosnet.tmp1 %outputfile%"
if not %%a == @ (
copy %outputfile% %_NTPostBld%\congeal_scripts\copywowlist_%%a.txt
perl -ne "@a=split/:/;chomp @a;$a[1]=~s/^(.*)(.)$/\1/;print $a[1].\"*\n\"" copywowlist_%%a.txt > copywowlist_%%a.lst
) else (
copy %outputfile% %_NTPostBld%\congeal_scripts\copywowlist.txt
)
)
if not exist !UnCompDestDir! md !UnCompDestDir!
if /i "%Comp%" == "Yes" (
if not exist !DestDir! md !DestDir!
)
REM Convert "<relative_src>:<destination>" format into "<relative_src>,<relative_dest>,<full_dest>" format
perl -ne "if ( /(.*\\)?([^\\]+):(.*)/ ) {print qq($1$2,$1$3,$ENV{DestDir}\\$1$3\n)} else {print STDERR qq(WARNING: UNRECOGNIZED LINE ($_)\n)}" %outputfile% >%tmp%\WowStuff.txt
REM ren files back to original name so that incremental compdir works.
for /f "tokens=1,2 delims=," %%a in (%tmp%\WowStuff.txt) do (
if exist %UnCompDestDir%\%%b ren %UnCompDestDir%\%%b %%~nxa
)
rem Reduce the number of calls to compdir.
call :WRAP_COMPDIR %SourceDir% %UnCompDestDir% %outputfile%
REM if exist dosnet.tmp1 del dosnet.tmp1
REM if exist dosnet.tmp2 del dosnet.tmp2
popd
REM copy special wow6432 files over top of the stock versions
REM Can't use /d because the wow6432 files MUST be copied over the same named
REM files from root.
call ExecuteCmd.cmd "xcopy /cyi %SourceDir%\wow6432 %UnCompDestDir%"
REM Rename files to their new wow names
for /f "tokens=1,2 delims=," %%a in (%tmp%\WowStuff.txt) do (
if exist %UnCompDestDir%\%%a ren %UnCompDestDir%\%%a %%~nxb
)
REM Sign it
call ExecuteCmd "deltacat.cmd %UnCompDestDir%"
if exist %UnCompDestDir%\..\wow64.cat (
del %UnCompDestDir%\..\wow64.cat
)
move %UnCompDestDir%\delta.cat %UnCompDestDir%\..\wow64.cat
REM And now sign lang
call ExecuteCmd "deltacat.cmd %UnCompDestDir%\lang"
if exist %UnCompDestDir%\..\wowlang.cat (
del %UnCompDestDir%\..\wowlang.cat
)
move %UnCompDestDir%\lang\delta.cat %UnCompDestDir%\..\wowlang.cat
REM Populate wowbins
if /i "%Comp%" == "Yes" (
call :WRAP_COMPRESS !UnCompDestDir! !DestDir! %_NTPostBld%\congeal_scripts\wowfilesuncomp.lst
REM Copy uncompressed files over as well
for %%a in (%_NTPostBld%\congeal_scripts\wowfilesuncomp.lst) do (
if "0" NEQ "%%~za" CALL ExecuteCmd "compdir /eznu /m:%_NTPostBld%\congeal_scripts\wowfilesuncomp.lst !UnCompDestDir! !DestDir!"
)
) else (
call ExecuteCmd.cmd "if exist !DestDir! rd /s/q !DestDir!"
call ExecuteCmd.cmd "move !UnCompDestDir! !DestDir!"
)
REM
REM We used to put stuff here, delete for incremental over old builds.
REM
rd /q/s %DestDir%\asms
rd /q/s %DestDir%\wasms
REM
REM Give sxsofflineinstall one merged asms directory to install from.
REM The directory names do clash, so offset by inserting an extra directory level.
REM
REM Note that just like "regular" stuff, the wow6432 files overwrite the
REM "regular" x86 files, so we cannot use /d for incremental, and the order
REM of the two copies must be what it is.
REM
call ExecuteCmd.cmd "xcopy /cyie %SourceDir%\asms %_NTPostBld%\asms\x86"
call ExecuteCmd.cmd "xcopy /cyie %SourceDir%\wow6432\asms %_NTPostBld%\asms\x86"
REM Check that we have all the wow files
if exist !WowMiss! del /f !WowMiss!
for /f "tokens=1-3 delims=," %%a in (%tmp%\WowStuff.txt) do (
if NOT exist %%c (
call :CompName %%c
if NOT exist %%~dpc!CompFileName! (
echo %%a,%%b,%%c >> !WowMiss!
)
)
)
REM If we are missing files we have to wait for the x86 machine
if NOT exist !WowMiss! goto SkipTryAgain
echo Missing WowFiles :
if exist !WowMiss! for /f "tokens=2 delims=," %%a in (!WowMiss!) do @echo %%a
if defined OFFICIAL_BUILD_MACHINE (
echo.
call logmsg.cmd "This 64-bit build machine must now wait for the"
call logmsg.cmd "for corresponding x86 build machine to complete"
call logmsg.cmd "build and postbuild in order to copy wow64 files"
call logmsg.cmd "that are required by setup."
echo.
) else (
echo.
call logmsg.cmd "You are missing the files listed above."
call logmsg.cmd "This means there will be missing files during setup."
echo.
call logmsg.cmd "This probably occurred because someone in your VBL"
call logmsg.cmd "added new wow64 files to layout.inx, but the VBL x86"
call logmsg.cmd "build machine has not finished it's build with"
call logmsg.cmd "these changes."
echo.
call logmsg.cmd "You MUST UNDERSTAND these missing files"
call logmsg.cmd "before checking in your changes."
echo.
call errmsg.cmd "Continuing with missing wow files."
goto :SkipTryAgain
)
REM
REM if there were failed file copies, then let's generate our copy location
REM again and retry
REM
call %RazzleToolPath%\PostBuildScripts\CPLocation.cmd -l:%lang%
set CPFile=%_NTPOSTBLD%\build_logs\CPLocation.txt
if not exist %CPFile% (
call errmsg.cmd "Failed to find %CPFile%, exiting ..."
goto :End
)
for /f "delims=" %%a in ('type %CPFile%') do set CPLocation=%%a
if not exist %CPLocation% (
call errmsg.cmd "Copy location %CPLocation% not found, exiting ..."
goto :End
)
call logmsg.cmd "Retrying, copying from %CPLocation% ..."
set SourceDir=%CPLocation%
REM Copy and compress the files one by one - there shouldn't be many
REM Note that the file may have been removed so check for existence
REM before attempting to copy
if /i "%Comp%" == "Yes" (
pushd !DestDir!
for /f "tokens=1,2 delims=," %%a in (!WowMiss!) do (
if exist !SourceDir!\%%a (
echo copying %%a from !SourceDir! ...
call ExecuteCmd.cmd "copy !SourceDir!\%%a !UnCompDestDir!\%%b"
findstr /i %%a %_NTPostBld%\congeal_scripts\wowfilesuncomp.lst>NUL
if errorlevel 1 (
echo compressing %%b ...
call ExecuteCmd.cmd "compress -zx21 -r -d -s !UnCompDestDir!\%%b ."
) else (
echo placing %%b ...
call ExecuteCmd.cmd "copy /Y !UnCompDestDir!\%%b"
)
)
)
for /f "tokens=1,2 delims=," %%a in (!WowMiss!) do (
if exist !SourceDir!\wow6432\%%a (
echo copying %%a from !SourceDir!\wow6432 ...
call ExecuteCmd.cmd "copy !SourceDir!\wow6432\%%a !UnCompDestDir!\%%b"
findstr /i %%a %_NTPostBld%\congeal_scripts\wowfilesuncomp.lst>NUL
if errorlevel 1 (
echo compressing %%b ...
call ExecuteCmd.cmd "compress -zx21 -r -d -s !UnCompDestDir!\%%b ."
) else (
echo placing %%b ...
call ExecuteCmd.cmd "copy /Y !UnCompDestDir!\%%b"
)
)
)
popd
) else (
pushd !DestDir!
for /f "tokens=1,2 delims=," %%a in (!WowMiss!) do (
if exist !SourceDir!\%%a (
echo copying %%a from !SourceDir! ...
call ExecuteCmd.cmd "copy !SourceDir!\%%a !DestDir!\%%b"
)
)
for /f "tokens=1,2 delims=," %%a in (!WowMiss!) do (
if exist !SourceDir!\wow6432\%%a (
echo copying %%a from !SourceDir!\wow6432 ...
call ExecuteCmd.cmd "copy !SourceDir!\wow6432\%%a !DestDir!\%%b"
)
)
popd
)
REM Now make sure there are no missing files
if exist !WowMiss! del /f !WowMiss!
for /f "tokens=1-3 delims=," %%a in (%tmp%\WowStuff.txt) do (
if NOT exist %%c (
call :CompName %%c
if NOT exist %%~dpc!CompFileName! (
echo %%a,%%b,%%c >> !WowMiss!
)
)
)
REM Now remake the catalog - It doesn't take very long
REM Also note that catalog signing doesn't care if I compress
REM first or sign first, so we can sign the uncompressed binaries now.
if /i "%Comp%" == "Yes" (
call deltacat.cmd %UnCompDestDir%
if exist %UnCompDestDir%\..\wow64.cat (
del %UnCompDestDir%\..\wow64.cat
)
move %UnCompDestDir%\delta.cat %UnCompDestDir%\..\wow64.cat
copy %tmp%\cdf\delta.cdf %_ntpostbld%\build_logs\copywow64.cdf
copy %tmp%\log\delta.log %_ntpostbld%\build_logs\copywow64.log
) else (
call deltacat.cmd -d %DestDir%
if exist %DestDir%\..\wow64.cat (
del %DestDir%\..\wow64.cat
)
move %DestDir%\delta.cat %DestDir%\..\wow64.cat
)
REM If the files are missing now we're screwed - log an error
if exist !WowMiss! (
call errmsg.cmd "Missing Wow64 files after x86 build finished - you cannot boot this build."
if exist !WowMiss! for /f "tokens=2 delims=," %%a in (!WowMiss!) do @echo %%a
)
:SkipTryAgain
REM ************************************************
REM ********** BEGIN AMD64 BOOT FILE HACK **********
REM ************************************************
REM
REM the following is necessary because a few 32-bit x86 boot files are copied
REM over to the AMD64 build, but the "nocompress" (_x) directive is not currently
REM honored in wowfile.inx.
REM
if /i "%_BuildArch%" == "amd64" (
call :ExpandWow64 ntldr._ ntldr
call :ExpandWow64 bootfix.bi_ bootfix.bin
call :ExpandWow64 setupldr.bi_ setupldr.bin
call :ExpandWow64 ntdetect.co_ ntdetect.com
)
goto :end
REM
REM Function :ExpandWow64
REM Arguments:
REM %1 - Compressed file name
REM %2 - Expanded file name
REM
:ExpandWow64
if exist %DestDir%\%1 call ExecuteCmd.cmd "expand %DestDir%\%1 %DestDir%\%2"
goto :EOF
REM ************************************************
REM *********** END AMD64 BOOT FILE HACK ***********
REM ************************************************
goto end
REM
REM Function :CompName
REM Arguments : File Name Returns : Compressed File Name
REM
:CompName
for %%a in (%1) do (
set FileName=%%~na
set FileExt=%%~xa
)
if NOT defined FileExt (
set CompFileExt=._
) else (
set FourthExtChar=!FileExt:~3,1!
if defined FourthExtChar (
set CompFileExt=!FileExt:~0,-1!_
) else (
set CompFileExt=!FileExt!_
)
)
set CompFileName=!FileName!!CompFileExt!
goto :EOF
:WRAP_COMPDIR
rem =======================================================
rem = %iRawList% parser
rem = groups files by path and feeds compdir
rem = with suitable matchlists
rem =======================================================
SET iSrcPath=%~1
SET iDstPath=%~2
SET iRawList=%3
SET iSrcPath=%iSrcPath: =%
SET iDstPath=%iDstPath: =%
set iSelf=%~n0
set iTmp1=%TEMP%\!iSelf!.parse.1.temp
set iTmp2=%TEMP%\!iSelf!.parse.2.temp
set iTmp3=%TEMP%\!iSelf!.parse.3.temp
rem
rem Step 1. compdir the bare files in %iRawList%
set count=1
set iPlainList=%TEMP%\!iSelf!.compdir.!count!.temp
set iDummyName=!iSelf!.matchlist.!count!.txt
perl -ne "print qq($1\n) if (/^([^\\]+):/)" %iRawList%>!iPlainList!
call :MATCHLIST !iDummyName! %iSrcPath% %iDstPath% !iPlainList!
rem Step 2. Check for the paths in %iRawList%
perl -ne "print qq($1\n) if (/^(.*\\.*):/)" %iRawList%>%iTmp1%
:HAVEDIR
rem Step 3. Loop over the dirs in %iRawList%
for /F %%p in (%iTmp1%) do (
set prefix=%%~dpp&set prefix=!prefix:%CD%=!
set dir=!prefix:~0,-1!&set dir=!dir:~1!
set pattern=!dir!&set pattern=!pattern:\=\\!
rem Step 4. restrict to files in !dir!
set /A count=!count!+1
set iPlainList=%TEMP%\%iSelf%.compdir.!count!.temp
set iDummyName=%TEMP%\%iSelf%.matchlist.!count!.txt
findstr /irc:"!pattern!\\\\" %iTmp1%>%iTmp2%
rem Step 5. Get bare filenames
del !iPlainList!>NUL
for /F %%f in (%iTmp2%) do (set iFile=%%~nxf&echo !iFile!>>!iPlainList!)
rem Step 6. Feed compdir with modified arguments...
rem appending !dir! to !iSrcPath!
call :MATCHLIST !iDummyName! %iSrcPath%\!dir! %iDstPath%\!dir! !iPlainList!
copy %iTmp1% %iTmp3%>NUL
rem Step 7. Remove the !dir!\.. from the %iRawList%: we done with it
findstr /irVc:"!pattern!\\\\" %iTmp3%>%iTmp1%
goto :HAVEDIR
)
del !iTmp1!&del !iTmp2!&del !iTmp3!
goto :EOF
:MATCHLIST
pushd %TEMP%
set iFound=
set iMatchList=%~1
set iSrcPath=%~2
set iDstPath=%~3
set iLisiTmp=%~4
if exist %iMatchList% del %iMatchList%
for /f %%i in (%iLisiTmp%) do (
set iFileTest=%%i
if exist %iSrcPath%\!iFileTest! SET iFound=Y && echo !iFileTest!>>%iMatchList%
rem Step 1. Raise the flag and collect the filename
)
if defined iFound (
call ExecuteCmd.cmd "compdir.exe /enrstdm:%iMatchList% %iSrcPath% %iDstPath%"
)
popd
goto :EOF
:WRAP_COMPRESS
rem =======================================================
rem = compress the contents
rem = of %iSrcPath% in one run
rem =======================================================
pushd %TEMP%
set iSelf=%~n0
set iLstFile=%TEMP%\%iSelf%.compress.list.txt
set iSrcPath=%1
set iDstPath=%2
set iExcludeList=%3
rem Step 1. Generate the tree structure
for /F %%d in ('dir /b/s/ad %iSrcPath%') do (
set iDstDir=%%d&set iDstDir=!iDstDir:%iSrcPath%=%iDstPath%!
if not exist !iDstDir! call ExecuteCmd.cmd "md !iDstDir!")
pushd !iDstDir!
if errorlevel 1 (
call errmsg.cmd "invalid dir !iDstDir!, exiting ..."
goto :End
)
popd
rem Step 2. Generate the list file to compress
if exist %iLstFile% del %iLstFile%
rem only want to compress those files that are supposed to be compressed
for /F %%f in ('perl -e "open F, $ARGV[0];$u{lc$_}=1 foreach <F>;print foreach grep {/([^\\]+)$/ and not exists $u{lc$1}} qx(dir /b/s/a-d $ARGV[1])" %iExcludeList% %iSrcPath%') do (
SET iSrcDir=%%~dpf
set iSrcFile=%%~nxf
set iDstDir=!iSrcDir:%iSrcPath%=%iDstPath%!
call :CompName !iSrcFile!
set iDstFile=!iDstDir!!CompFileName!
set iSrcFile=!iSrcDir!!iSrcFile!
echo !iSrcFile!>>%iLstFile%&echo !iDstFile!>>%iLstFile%
)
call ExecuteCmd.cmd "compress.exe -zx21 -s -d @%iLstFile%"
popd
goto :EOF
:end
seterror.exe "%errors%"& goto :EOF