@echo off REM ------------------------------------------------------------------ REM REM copywow64.cmd 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<] 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); # *** NEXT FEW LINES ARE TEMPLATE *** $ENV{"_CPCMAGIC"}++;exit(system($0)>>8); __END__ :CPCBegin set _CPCMAGIC= setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS REM *** BEGIN YOUR 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 REM set wowchar=w 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. copy /b layout.inx+layout.txt dosnet.tmp1 prodfilt dosnet.tmp1 dosnet.tmp2 +@ prodfilt dosnet.tmp2 dosnet.tmp1 +i wowlist -i dosnet.tmp1 -c wowlist.inf -o dosnet.tmp2 -ac 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.tmp2 dosnet.tmp1 %outputfile%" copy %outputfile% %_NTPostBld%\congeal_scripts\copywowlist.txt REM ren files back to original name so that incremental compdir works. REM First, create the list of files at UnCompDestDir without the "w" (WowUncompDest.txt) if exist %tmp%\WowUncompDest.txt del %tmp%\WowUncompDest.txt for /f %%a in (%outputfile%) do ( echo %UnCompDestDir%\%%a >> %tmp%\WowUncompDest.txt ) REM Now rename files back if not exist !UnCompDestDir! md !UnCompDestDir! if /i "%Comp%" == "Yes" ( if not exist !DestDir! md !DestDir! ) for /f %%a in (%tmp%\WowUncompDest.txt) do ( if exist %%~dpaw%%~nxa ( if exist %%a del /f %%a ren %%~dpaw%%~nxa %%~nxa ) ) for /f %%i in (%outputfile%) do ( if exist %SourceDir%\%%i call ExecuteCmd.cmd "compdir /enrstd %SourceDir%\%%i %UnCompDestDir%\%%i" ) if exist dosnet.tmp1 del dosnet.tmp1 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 the files prepending a 'w' set wowchar=w REM do this once for files that don't have another file REM with the same name except for a 'w' in front for /f %%a in (%tmp%\WowUncompDest.txt) do ( if not exist %%~dpaw%%~nxa ( if exist %%a ren %%a w%%~nxa ) else ( if exist %%a echo %%a>> %tmp%\WowRen.txt ) ) REM now do it for the remaining files if exist %tmp%\wowren.txt ( for /f %%a in (%tmp%\WowRen.txt) do ( if exist %%a ren %%a w%%~nxa ) ) if exist %tmp%\wowren.txt del /f %tmp%\wowren.txt 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 Compress it if /i "%Comp%" == "Yes" ( pushd %DestDir% call ExecuteCmd.cmd "compress -r -d -zx21 -s %UnCompDestDir%\*.* ." popd if not exist %DestDir%\lang md %DestDir%\lang pushd %DestDir%\lang for /f %%a in ('dir /b /a-d !UnCompDestDir!\lang') do call ExecuteCmd.cmd "compress -r -d -zx21 -s %UnCompDestDir%\lang\%%a ." popd ) else ( call ExecuteCmd.cmd "if exist !DestDir! rd /s/q !DestDir!" call ExecuteCmd.cmd "move !UnCompDestDir! !DestDir!" ) call ExecuteCmd.cmd "xcopy /cyied %SourceDir%\asms %DestDir%\asms" call ExecuteCmd.cmd "xcopy /cyied %SourceDir%\wow6432\asms %DestDir%\wasms" REM REM Delete asms that have corresponding wasms. REM for /f %%i in ('dir /s/b/a-d %DestDir%\wasms\*.man') do call :DelAsmOfWasm %%i REM REM Delete any resulting empty directories. REM for /f %%i in ('dir /s/b/ad %DestDir%\asms') do rmdir %%i goto :EndDelAsmOfWasm :DelAsmOfWasm setlocal set i=%~dp1 set i=%i:\wasms\=\asms\% call ExecuteCmd.cmd "rmdir /q/s %i%" endlocal goto :eof :EndDelAsmOfWasm REM Check that we have all the wow files if exist !WowMiss! del /f !WowMiss! REM Create the list of files at DestDir (their uncompressed name) REM and without the "w" (WowDest.txt) if exist %tmp%\WowDest.txt del %tmp%\WowDest.txt for /f %%a in (%outputfile%) do ( echo %DestDir%\%%a >> %tmp%\WowDest.txt ) for /f %%a in (%tmp%\WowDest.txt) do ( if NOT exist %%~dpaw%%~nxa ( call :CompName w%%~nxa if NOT exist %%~dpa!CompFileName! ( echo %%~nxa >> !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! type !WowMiss! 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 %%a in (!WowMiss!) do ( if exist !SourceDir!\%%a ( echo copying %%a from !SourceDir! ... call ExecuteCmd.cmd "copy !SourceDir!\%%a !UnCompDestDir!\w%%a" echo compressing w%%a ... call ExecuteCmd.cmd "compress -zx21 -r -d -s !UnCompDestDir!\w%%a ." ) ) for /f %%a in (!WowMiss!) do ( if exist !SourceDir!\wow6432\%%a ( echo copying %%a from !SourceDir!\wow6432 ... call ExecuteCmd.cmd "copy !SourceDir!\wow6432\%%a !UnCompDestDir!\w%%a" echo compressing w%%a ... call ExecuteCmd.cmd "compress -zx21 -r -d -s !UnCompDestDir!\w%%a ." ) ) popd ) else ( pushd !DestDir! for /f %%a in (!WowMiss!) do ( if exist !SourceDir!\%%a ( echo copying %%a from !SourceDir! ... call ExecuteCmd.cmd "copy !SourceDir!\%%a !DestDir!\w%%a" ) ) for /f %%a in (!WowMiss!) do ( if exist !SourceDir!\wow6432\%%a ( echo copying %%a from !SourceDir!\wow6432 ... call ExecuteCmd.cmd "copy !SourceDir!\wow6432\%%a !DestDir!\w%%a" ) ) popd ) REM Now make sure there are no missing files if exist !WowMiss! del /f !WowMiss! for /f %%a in (%outputfile%) do ( if NOT exist %DestDir%\w%%a ( call :CompName w%%a if NOT exist %DestDir%\!CompFileName! ( echo %%a >> !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! type !WowMiss! ) :SkipTryAgain 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 :end seterror.exe "%errors%"& goto :EOF