|
|
/****************************************************************************\
SLPFILES.C / Factory Mode (FACTORY.EXE)
Microsoft Confidential Copyright (c) Microsoft Corporation 2001 All rights reserved
Source file for Factory that contains the update SLP files state functions.
07/2001 - Jason Cohen (JCOHEN)
Added this new source file for factory for updating the SLP files and reinstalling the catalog file.
\****************************************************************************/
//
// Include File(s):
//
#include "factoryp.h"
//
// Internal Define(s):
//
#define REG_KEY_WINLOGON _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon")
#define REG_VAL_DLLCACHE _T("SFCDllCacheDir")
#define DIR_SYSTEM _T("system32")
#define DIR_DLLCACHE _T("dllcache")
//
// Internal Global(s):
//
static LPTSTR s_lpszSlpFiles[] = { _T("OEMBIOS.CAT"), // Catalog file needs to be the first in the list.
_T("OEMBIOS.BIN"), _T("OEMBIOS.DAT"), _T("OEMBIOS.SIG"), };
//
// Internal Function Prototype(s):
//
static void GetDestFolder(LPTSTR lpszDest, DWORD cbDest, BOOL bDllCache); static BOOL CopySlpFile(LPTSTR lpszSrc, LPTSTR lpszDst);
//
// External Function(s):
//
BOOL SlpFiles(LPSTATEDATA lpStateData) { BOOL bRet = TRUE; #if 0
DWORD dwErr; TCHAR szSrcFile[MAX_PATH]; LPTSTR lpszSourcePath;
if ( lpszSourcePath = IniGetExpand(lpStateData->lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_SLPSOURCE, NULL) ) { // Should support getting the files from the network.
//
FactoryNetworkConnect(lpszSourcePath, lpStateData->lpszWinBOMPath, NULL, TRUE);
// The source should point to a directory that contains all the SLP files.
//
if ( DirectoryExists(lpszSourcePath) ) { LPTSTR lpszEndSrc; DWORD x;
// Copy the root source folder into our buffer.
//
lstrcpyn(szSrcFile, lpszSourcePath, AS(szSrcFile)); lpszEndSrc = szSrcFile + lstrlen(szSrcFile);
// Make sure all the files are in the folder as well.
//
for ( x = 0; x < AS(s_lpszSlpFiles); x++ ) { // Setup the full path to this slp file.
//
AddPathN(szSrcFile, s_lpszSlpFiles[x], AS(szSrcFile));
// Make sure this slp file exists.
//
if ( !FileExists(szSrcFile) ) { // NEEDLOG: Log that this file doesn't exist.
//
bRet = FALSE; }
// Don't leave the file name on there for the next guy.
//
*lpszEndSrc = NULLCHR; }
// If there were no errors, lets try to update the files.
//
if ( bRet ) { // Call the syssetup function to update the catalog before
// we copy any of the files (the catalog is always the first file).
//
AddPathN(szSrcFile, s_lpszSlpFiles[0], AS(szSrcFile)); if ( NO_ERROR == (dwErr = SetupInstallCatalog(szSrcFile)) ) { TCHAR szDstCache[MAX_PATH], szDstSystem[MAX_PATH]; LPTSTR lpszEndCache, lpszEndSystem;
// Setup the destination folders.
//
GetDestFolder(szDstCache, AS(szDstCache), TRUE); GetDestFolder(szDstSystem, AS(szDstSystem), FALSE); lpszEndCache = szDstCache + lstrlen(szDstCache); lpszEndSystem = szDstSystem + lstrlen(szDstSystem);
// Now copy all the files.
//
for ( x = 0; x < AS(s_lpszSlpFiles); x++ ) { // First create the path to the source first (it stil has
// the previous file on it, so chop it off first).
//
*lpszEndSrc = NULLCHR; AddPathN(szSrcFile, s_lpszSlpFiles[x], AS(szSrcFile));
// Now copy it to the dll cache folder.
//
AddPathN(szDstCache, s_lpszSlpFiles[x], AS(szDstCache)); if ( !CopySlpFile(szSrcFile, szDstCache) ) { // No need to log, the copy function will do that for us.
//
bRet = FALSE; } *lpszEndCache = NULLCHR;
// The cat file (which is the first one) does not get copied
// to the system32 folder.
//
if ( x ) { // Now copy it to the system folder.
//
AddPathN(szDstSystem, s_lpszSlpFiles[x], AS(szDstSystem)); if ( !CopySlpFile(szSrcFile, szDstSystem) ) { // No need to log, the copy function will do that for us.
//
bRet = FALSE; } *lpszEndSystem = NULLCHR; } } } else { // NEEDLOG: Log that the catalog could not be installed (error code is in dwErr).
//
bRet = FALSE; } } } else { // NEEDLOG: Log that the directory doesn't exist.
//
bRet = FALSE; }
// Remove the network connection if we made one.
//
FactoryNetworkConnect(lpszSourcePath, lpStateData->lpszWinBOMPath, NULL, FALSE);
// Free up the key read from the ini file.
//
FREE(lpszSourcePath); } else { // If the key isn't present, we still want to reinstall the cat file
// in case they replaced the SLP files offline.
//
GetDestFolder(szSrcFile, AS(szSrcFile), TRUE); AddPathN(szSrcFile, s_lpszSlpFiles[0], AS(szSrcFile)); if ( ( FileExists(szSrcFile) ) && ( NO_ERROR != (dwErr = SetupInstallCatalog(szSrcFile)) ) ) { // NEEDLOG: Log that the catalog could not be installed (error code is in dwErr).
//
bRet = FALSE; } } #endif
return bRet; }
BOOL DisplaySlpFiles(LPSTATEDATA lpStateData) { return IniSettingExists(lpStateData->lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_SLPSOURCE, NULL); }
//
// Internal Function(s):
//
static void GetDestFolder(LPTSTR lpszDest, DWORD cbDest, BOOL bDllCache) { LPTSTR lpszData;
// See if we want the dll cache folder, and check the registry key if we do.
//
if ( ( bDllCache ) && ( lpszData = RegGetExpand(HKLM, REG_KEY_WINLOGON, REG_VAL_DLLCACHE) ) ) { // Return the registry key.
//
lstrcpyn(lpszDest, lpszData, cbDest); FREE(lpszData); } else { // Get the main system directory and tack on the dll cache folder.
//
GetSystemWindowsDirectory(lpszDest, cbDest); AddPathN(lpszDest, DIR_SYSTEM, cbDest); if ( bDllCache ) { AddPathN(lpszDest, DIR_DLLCACHE, cbDest); } } }
static BOOL CopySlpFile(LPTSTR lpszSrc, LPTSTR lpszDst) { BOOL bRet = TRUE;
// We make sure the source and destination are not the
// same because the OEM might do something crazy like put
// them in the dllcache folder.
//
if ( ( 0 != lstrcmpi(lpszSrc, lpszDst) ) && ( !CopyFile(lpszSrc, lpszDst, FALSE) ) ) { // NEEDLOG: Log the file that fails.
//
bRet = FALSE; }
return bRet; }
|