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.
 
 
 
 
 
 

363 lines
16 KiB

#include "precomp.h"
extern TCHAR g_szCustIns[];
extern TCHAR g_szBuildTemp[];
extern TCHAR g_szTempSign[];
extern TCHAR g_szWizRoot[];
extern TCHAR g_szDestCif[];
extern TCHAR g_szDefInf[];
extern TCHAR g_szCustInf[];
extern TCHAR g_szAllModes[];
extern TCHAR g_szLanguage[];
extern BOOL g_fIntranet;
extern BOOL g_fServerICW, g_fServerKiosk, g_fServerless;
extern PROPSHEETPAGE g_psp[];
extern int g_iCurPage;
extern void SetCompSize(LPTSTR szCab, LPTSTR szSect, DWORD dwInstallSize);
extern void WriteModesToCif(CCifRWComponent_t * pCifRWComponent_t, LPCTSTR pcszModes);
// global variables
TCHAR g_szJobVersion[32];
TCHAR g_szDeskTemp[MAX_PATH] = TEXT("");
TCHAR g_szUnsignedFiles[MAX_BUF] = TEXT("");
// static variables
static DWORD s_dwDDF = 0;
static TCHAR s_szInfAdd1[] = TEXT("\r\n[ProgramFilesDir]\r\nHKLM,Software\\Microsoft\\Windows\\CurrentVersion,ProgramFilesDir,,%24%\r\n");
static TCHAR s_szInfAdd2[] = TEXT("\r\n[IeFilesDir]\r\nHKLM,\"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEXPLORE.EXE\"")
TEXT(",\"Path\",,\"%24%\\Program Files\\%IEDIR%\"\r\n");
static TCHAR s_szDDFTpl[] = TEXT(".Set SourceDir=%s\r\nsetup.inf /INF=NO\r\ninstall.inf /INF=NO");
void CreatePostCmdSection(LPCTSTR szDestDir, LPCTSTR szInf)
{
TCHAR szLDID[MAX_PATH],
szDir[MAX_PATH],
szBuildDir[MAX_PATH];
LPTSTR pPtr,
pPostCmdSect;
int nSizeSectBuffer = 0;
if (szDestDir == NULL || *szDestDir == TEXT('\0') || szInf == NULL || *szInf == TEXT('\0'))
return;
*szLDID = TEXT('\0');
*szDir = TEXT('\0');
pPtr = StrChr(szDestDir, TEXT(','));
if (pPtr != NULL)
{
StrCpyN(szLDID, szDestDir, (int) ((pPtr - szDestDir) + 1));
StrCpy(szDir, pPtr + 1);
}
if (*szLDID == TEXT('\0') || *szDir == TEXT('\0'))
return;
wnsprintf(szBuildDir, countof(szBuildDir), TEXT("%%%s%%\\%s"), szLDID, szDir);
nSizeSectBuffer = MAX_PATH * 5;
pPostCmdSect = (LPTSTR)LocalAlloc(LPTR, nSizeSectBuffer * sizeof(TCHAR));
if (pPostCmdSect)
{
TCHAR szFile[MAX_PATH],
szSectLine[MAX_PATH];
int nCopyIndex = 0;
WIN32_FIND_DATA findFileData;
// add .adm inf line (if any) to the section string
PathCombine(szFile, g_szTempSign, TEXT("*.inf"));
HANDLE hFind = FindFirstFile(szFile, &findFileData);
if(hFind != INVALID_HANDLE_VALUE)
{
TCHAR szADMFile[MAX_PATH],
szADMPath[MAX_PATH];
LPTSTR pTemp;
PathCombine(szADMPath, g_szWizRoot, TEXT("Policies"));
PathAppend(szADMPath, g_szLanguage);
do
{
StrCpy(szFile, findFileData.cFileName);
PathRenameExtension(szFile, TEXT(".adm"));
PathCombine(szADMFile, szADMPath, szFile);
if (PathFileExists(szADMFile))
{
wnsprintf(szSectLine, countof(szSectLine), TEXT("rundll32.exe advpack.dll,LaunchINFSection %s\\%s,DefaultInstall.HKLM, 1"), szBuildDir, findFileData.cFileName);
if (nCopyIndex + StrLen(szSectLine) + 1 > (nSizeSectBuffer - 1))
{
nSizeSectBuffer += MAX_PATH;
pTemp = (LPTSTR)LocalReAlloc(pPostCmdSect, nSizeSectBuffer, LMEM_ZEROINIT);
if (pTemp != NULL)
pPostCmdSect = pTemp;
else
break;
}
StrCpy(pPostCmdSect + nCopyIndex, szSectLine);
nCopyIndex += StrLen(szSectLine);
nCopyIndex++; // section lines must be spaced with a NULL character
}
}while(FindNextFile(hFind, &findFileData));
FindClose(hFind);
}
}
if (pPostCmdSect != NULL)
{
if (*pPostCmdSect != TEXT('\0'))
{
WritePrivateProfileSection(TEXT("PostCmdSect"), pPostCmdSect, szInf);
WritePrivateProfileString(NULL, NULL, NULL, szInf);
}
LocalFree(pPostCmdSect);
}
}
HRESULT CabUpFolder(HWND hWnd, LPTSTR szFolderPath, LPTSTR szDestDir, LPTSTR szCabname,
LPTSTR szDisplayName, LPTSTR szGuid, LPTSTR szAddReg)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
TCHAR szFrom[MAX_PATH];
TCHAR szCabPath[MAX_PATH];
TCHAR szDDF[MAX_PATH];
TCHAR szDiamondParams[MAX_PATH];
TCHAR szInf[MAX_PATH];
TCHAR szSetInf[MAX_PATH];
TCHAR szTempDir[MAX_PATH];
TCHAR szIEDir[MAX_PATH];
TCHAR szMakeCabLoc[MAX_PATH];
TCHAR szDefaultInstallSect[64];
DWORD dwsHi, nWritten;
HANDLE hDDF, hInf, hRegInf, hMakeCab;
SHELLEXECUTEINFO shInfo;
TCHAR szDDFAdd[3 * MAX_PATH];
DWORD dwInstallSize;
TCHAR szSourceDisk[80];
PathCombine(szFrom, szFolderPath, TEXT("*.*"));
PathCombine(szCabPath, g_szBuildTemp, szCabname);
PathCombine(szDDF, g_szBuildTemp, TEXT("Folder.ddf"));
wnsprintf(szDiamondParams, countof(szDiamondParams), TEXT("/D CabinetName1=..\\%s /D SourceDir=\"%s\" /F %s"),
szCabname, szFolderPath, szDDF);
StrCpy(szInf, szCabPath);
PathRemoveFileSpec(szInf);
PathAppend(szInf, TEXT("install.inf"));
if (ISNULL(szGuid))
{
GUID guid;
if (CoCreateGuid(&guid) == NOERROR)
CoStringFromGUID(guid, szGuid, 64);
}
DeleteFile(szInf);
WritePrivateProfileString(VERSION, TEXT("Signature"), TEXT("$Chicago$"), szInf);
WritePrivateProfileString(VERSION, TEXT("AdvancedInf"), TEXT("2.5"), szInf);
WritePrivateProfileString(VERSION, TEXT("LayoutFile"), TEXT("Setup.inf"), szInf);
WritePrivateProfileString( TEXT("CustInstDestSection"), TEXT("49000,49001,49002,49003"),
TEXT("ProgramFilesDir,5"), szInf );
WritePrivateProfileString( TEXT("CustInstDestSection"), TEXT("49100,49101,49102,49103"),
TEXT("IEFilesDir,5"), szInf );
LoadString( g_rvInfo.hInst, IDS_IE, szIEDir, MAX_PATH );
WritePrivateProfileString( IS_STRINGS, TEXT("IEDIR"), szIEDir, szInf);
StrCpy(szDefaultInstallSect, DEFAULT_INSTALL);
WritePrivateProfileString(szDefaultInstallSect, TEXT("CopyFiles"), TEXT("CopyFileSect"), szInf);
WritePrivateProfileString(szDefaultInstallSect, TEXT("CustomDestination"),
TEXT("CustInstDestSection"), szInf);
WritePrivateProfileString(szDefaultInstallSect, REQUIRED_ENGINE, SETUPAPI_FATAL, szInf);
WritePrivateProfileString(TEXT("DestinationDirs"), TEXT("CopyFileSect"), szDestDir, szInf);
WritePrivateProfileString(NULL, NULL, NULL, szInf);
hInf = CreateFile(szInf, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hInf, 0, NULL, FILE_END);
WriteStringToFile( hInf, s_szInfAdd1, StrLen(s_szInfAdd1));
WriteStringToFile( hInf, s_szInfAdd2, StrLen(s_szInfAdd2) );
WriteStringToFile( hInf, TEXT("\r\n[CopyFileSect]\r\n"), 18);
hDDF = CreateFile(szDDF, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hDDF == INVALID_HANDLE_VALUE)
{
CloseHandle(hInf);
return E_FAIL;
}
if (s_dwDDF == 0) s_dwDDF = GetFileSize( hDDF, &dwsHi );
SetFilePointer(hDDF, s_dwDDF, NULL, FILE_BEGIN);
SetEndOfFile( hDDF );
if ((hFind = FindFirstFile( szFrom, &fd)) != INVALID_HANDLE_VALUE)
while (1)
{
LPTSTR pFn = fd.cFileName;
if ((ISNONNULL(pFn)) && StrCmp(pFn, TEXT(".")) && StrCmp(pFn, TEXT(".."))
&& ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0))
{
WriteStringToFile( hDDF, TEXT("\""), 1);
WriteStringToFile( hDDF, pFn, StrLen(pFn) );
WriteStringToFile( hDDF, TEXT("\"\r\n"), 3 );
WriteStringToFile( hInf, TEXT("\""), 1 );
WriteStringToFile( hInf, pFn, StrLen(pFn) );
WriteStringToFile( hInf, TEXT("\"\r\n"), 3 );
}
if (!FindNextFile( hFind, &fd ))
if (GetLastError() == ERROR_NO_MORE_FILES)
{
FindClose( hFind );
break;
}
}
if (szAddReg)
{
if (ISNONNULL(szAddReg))
{
TCHAR szRegInf[MAX_PATH];
CHAR szRegInfBuf[2048];
TCHAR szQuotedVer[80];
TCHAR szClearStubCmd[MAX_PATH];
DWORD nRead;
PathCombine(szRegInf, g_szBuildTemp, TEXT("ADDREG.INF"));
ZeroMemory(szRegInfBuf, sizeof(szRegInfBuf));
hRegInf = CreateFile(szRegInf, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
ReadFile( hRegInf, szRegInfBuf, sizeof(szRegInfBuf), &nRead, NULL );
WriteFile( hInf, szRegInfBuf, nRead, &nWritten, NULL );
CloseHandle(hInf);
CloseHandle(hRegInf);
if ((szGuid[0] == TEXT('>')) || (szGuid[0] == TEXT('<')))
{
WritePrivateProfileString(szDefaultInstallSect, TEXT("DelReg"),
TEXT("DelRegSect"), szInf);
WritePrivateProfileString( IS_STRINGS, TEXT("OLDGUID"), &szGuid[1], szInf);
}
else
WritePrivateProfileString(TEXT("DelRegSect"), NULL, NULL, szInf);
wnsprintf(szQuotedVer, countof(szQuotedVer), TEXT("\"%s\""), g_szJobVersion);
wnsprintf(szClearStubCmd, countof(szClearStubCmd), TEXT("\"RUNDLL32 IEDKCS32.DLL,BrandCleanInstallStubs %s\""), szGuid);
WritePrivateProfileString( IS_STRINGS, TEXT("Description"), szDisplayName, szInf);
WritePrivateProfileString( IS_STRINGS, TEXT("StubPath"), szAddReg, szInf);
WritePrivateProfileString( IS_STRINGS, TEXT("Revision"), szQuotedVer, szInf);
WritePrivateProfileString( IS_STRINGS, TEXT("GUID"), szGuid, szInf);
WritePrivateProfileString( IS_STRINGS, TEXT("ClearStubsCmd"), szClearStubCmd, szInf);
WritePrivateProfileString( szDefaultInstallSect, TEXT("AddReg"), TEXT("AddRegSect"), szInf);
// create a postcmdsect to dump the HKLM data of the rating.inf and the
// .adm inf's.
WritePrivateProfileString(szDefaultInstallSect, TEXT("RunPostSetupCommands"), TEXT("PostCmdSect"), szInf);
CreatePostCmdSection(szDestDir, szInf);
}
else CloseHandle(hInf);
}
else CloseHandle(hInf);
wnsprintf(szDDFAdd, countof(szDDFAdd), s_szDDFTpl, g_szBuildTemp);
WriteStringToFile( hDDF, szDDFAdd, StrLen(szDDFAdd));
CloseHandle(hDDF);
WritePrivateProfileString(NULL, NULL, NULL, szInf);
wnsprintf(szSourceDisk, countof(szSourceDisk), TEXT("\"Custom Folder\",%s,0"), szCabname);
PathCombine(szSetInf, g_szBuildTemp, TEXT("SETUP.INF") );
DeleteFile(szSetInf);
WritePrivateProfileString( TEXT("SourceDisksNames"), TEXT("1"), szSourceDisk, szSetInf );
WritePrivateProfileString(NULL, NULL, NULL, szSetInf);
dwInstallSize = FolderSize(szFolderPath) >> 10;
memset(&shInfo, 0, sizeof(shInfo));
shInfo.cbSize = sizeof(shInfo);
shInfo.hwnd = hWnd;
shInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shInfo.lpVerb = TEXT("open");
// If MAKECAB.EXE is in the current directory, use the full path.
// otherwise when we build in the scratch dir we won't find it.
PathCombine(szMakeCabLoc, g_szBuildTemp, TEXT("MAKECAB.EXE"));
hMakeCab = CreateFile(szMakeCabLoc, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if(hMakeCab == INVALID_HANDLE_VALUE)
shInfo.lpFile = TEXT("MAKECAB.EXE");
else
{
CloseHandle(hMakeCab);
shInfo.lpFile = szMakeCabLoc;
}
shInfo.lpParameters = szDiamondParams;
PathCombine(szTempDir, g_szBuildTemp, TEXT("SCRATCH") ); // SETUP.INF is destroyed by ShellExecAndWait!! Use scratch dir
CreateDirectory(szTempDir, NULL);
shInfo.lpDirectory = szTempDir;
shInfo.nShow = SW_MINIMIZE;
SetCurrentDirectory(szTempDir);
ShellExecAndWait(shInfo);
SetCurrentDirectory(g_szBuildTemp);
{
ICifRWComponent * pCifRWComponent;
CCifRWComponent_t * pCifRWComponent_t;
ICifComponent * pCifBaseComp;
g_lpCifRWFileDest->DeleteComponent(szCabname);
g_lpCifRWFileDest->CreateComponent(szCabname, &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->SetGUID(szGuid);
pCifRWComponent_t->SetDescription(szDisplayName);
pCifRWComponent_t->SetUrl(0, szCabname, 3);
pCifRWComponent_t->SetVersion(g_szJobVersion);
pCifRWComponent_t->SetCommand(0, TEXT("INSTALL.INF"), TEXT(""), 0);
pCifRWComponent_t->SetReboot(TRUE);
WriteModesToCif(pCifRWComponent_t, g_szAllModes);
pCifRWComponent_t->SetGroup(TEXT("BASEIE4"));
pCifRWComponent_t->SetPriority(835);
pCifRWComponent_t->SetUIVisible(FALSE);
if (SUCCEEDED(g_lpCifRWFileDest->FindComponent(TEXT("BASEIE40_Win"), &pCifBaseComp)))
{
// passing in the slash because we can't change inseng interface signature
// this translates to writing a line of BASEIE40:N:5.0.0.0"
pCifRWComponent_t->AddDependency(TEXT("BASEIE40_Win"), TEXT('\\'));
delete pCifRWComponent_t;
g_lpCifRWFileDest->CreateComponent(TEXT("BASEIE40_Win"), &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->AddToTreatAsOne(szCabname);
delete pCifRWComponent_t;
g_lpCifRWFileDest->CreateComponent(TEXT("BASEIE40_NTx86"), &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->AddToTreatAsOne(szCabname);
delete pCifRWComponent_t;
}
else
{
// passing in the slash because we can't change inseng interface signature
// this translates to writing a line of BASEIE40:N:5.0.0.0"
pCifRWComponent_t->AddDependency(TEXT("BASEIE40_NTAlpha"), TEXT('\\'));
delete pCifRWComponent_t;
g_lpCifRWFileDest->CreateComponent(TEXT("BASEIE40_NTAlpha"), &pCifRWComponent);
pCifRWComponent_t = new CCifRWComponent_t(pCifRWComponent);
pCifRWComponent_t->AddToTreatAsOne(szCabname);
delete pCifRWComponent_t;
}
}
SetCompSize(szCabPath, szCabname, dwInstallSize);
return(S_OK);
}
void BuildIE4Folders(HWND hWnd)
{
// build desktop.cab if g_szDeskTemp exists and is non-empty
if (PathIsDirectory(g_szDeskTemp) && !RemoveDirectory(g_szDeskTemp))
{
TCHAR szGuid[128];
TCHAR szCustDesk[128];
GetPrivateProfileString(IS_STRINGS, TEXT("DesktopName"), TEXT(""), szCustDesk, countof(szCustDesk), g_szDefInf);
if (ISNULL(szCustDesk))
LoadString(g_rvInfo.hInst, IDS_CUSTDESK, szCustDesk, countof(szCustDesk));
GetPrivateProfileString(IS_BRANDING, TEXT("DesktopGuid"), TEXT(""), szGuid, countof(szGuid), g_szCustIns);
CabUpFolder(hWnd, g_szDeskTemp, TEXT("25,WEB"), TEXT("DESKTOP.CAB"), szCustDesk, szGuid, NULL);
SignFile(TEXT("DESKTOP.CAB"), g_szBuildTemp, g_szCustIns, g_szUnsignedFiles, g_szCustInf);
PathRemovePath(g_szDeskTemp);
}
}