/*++ Copyright (c) 2000 Microsoft Corporation Module Name: sgminit.c Abstract: Implements the initialization/termination code for the data gather portion of scanstate v1 compatiblity. Author: Jim Schmidt (jimschm) 12-Mar-2000 Revision History: --*/ // // Includes // #include "pch.h" #include "v1p.h" #define DBG_V1 "v1" // // Strings // // None // // Constants // // None // // Macros // // None // // Types // // None // // Globals // PMAPSTRUCT g_EnvMap; PMAPSTRUCT g_UndefMap; PMAPSTRUCT g_RevEnvMap; HASHTABLE g_RenameSrcTable; HASHTABLE g_RenameDestTable; HASHTABLE g_DePersistTable; PMHANDLE g_V1Pool; MIG_OBJECTTYPEID g_FileType; MIG_OBJECTTYPEID g_RegType; MIG_ATTRIBUTEID g_OsFileAttribute; MIG_ATTRIBUTEID g_CopyIfRelevantAttr; MIG_ATTRIBUTEID g_LockPartitionAttr; // // Macro expansion list // // // Private function prototypes // VCMINITIALIZE ScriptVcmInitialize; SGMINITIALIZE ScriptSgmInitialize; BOOL pParseAllInfs ( VOID ); // // Macro expansion definition // // None // // Code // VOID pPrepareIsmEnvironment ( VOID ) { if (IsmGetRealPlatform() == PLATFORM_SOURCE) { SetIsmEnvironmentFromPhysicalMachine (g_EnvMap, FALSE, g_UndefMap); } else { SetIsmEnvironmentFromVirtualMachine (g_EnvMap, g_RevEnvMap, g_UndefMap); } } BOOL pInitGlobals ( IN PMIG_LOGCALLBACK LogCallback ) { BOOL result; LogReInit (NULL, NULL, NULL, (PLOGCALLBACK) LogCallback); g_V1Pool = PmCreateNamedPool ("v1 sgm"); g_EnvMap = CreateStringMapping(); g_UndefMap = CreateStringMapping(); g_RevEnvMap = CreateStringMapping(); g_FileType = MIG_FILE_TYPE; g_RegType = MIG_REGISTRY_TYPE; result = g_V1Pool && g_EnvMap && g_UndefMap && g_RevEnvMap; if (!result) { DEBUGMSG ((DBG_ERROR, "Unable to initialize gather module globals"));\ } return result; } BOOL pCommonInit ( IN PVOID Reserved, IN BOOL VcmMode ) { g_OsFileAttribute = IsmRegisterAttribute (S_ATTRIBUTE_OSFILE, FALSE); g_CopyIfRelevantAttr = IsmRegisterAttribute (S_ATTRIBUTE_COPYIFRELEVANT, FALSE); g_LockPartitionAttr = IsmRegisterAttribute (S_ATTRIBUTE_PARTITIONLOCK, FALSE); g_DePersistTable = HtAlloc (); InitRules(); // // Call special conversion entry point // InitSpecialConversion (PLATFORM_SOURCE); InitSpecialRename (PLATFORM_SOURCE); // // Save shell folder environment // pPrepareIsmEnvironment(); return TRUE; } BOOL pGetDomainUserName ( OUT PCTSTR *Domain, OUT PCTSTR *User ) { TCHAR userName[256]; TCHAR domainName[256]; DWORD size; HANDLE token = NULL; BOOL b; PTOKEN_USER tokenInfo = NULL; BOOL result = FALSE; DWORD domainSize; SID_NAME_USE dontCare; MIG_OBJECTSTRINGHANDLE regObject; MIG_CONTENT regContent; *Domain = NULL; *User = NULL; // // Assert that this is the source platform. We access the system directly. // MYASSERT (IsmGetRealPlatform() == PLATFORM_SOURCE); __try { if (ISWIN9X()) { size = ARRAYSIZE(userName); if (!GetUserName (userName, &size)) { LOG ((LOG_WARNING, (PCSTR) MSG_CANT_GET_USERNAME)); __leave; } *User = DuplicateText (userName); regObject = IsmCreateObjectHandle ( TEXT("HKLM\\System\\CurrentControlSet\\Services\\MSNP32\\NetworkProvider"), TEXT("AuthenticatingAgent") ); if (IsmAcquireObject (g_RegType, regObject, ®Content)) { if (!regContent.ContentInFile && regContent.MemoryContent.ContentBytes && regContent.Details.DetailsSize == sizeof (DWORD) && *((PDWORD) regContent.Details.DetailsData) == REG_SZ ) { *Domain = DuplicateText ((PCTSTR) regContent.MemoryContent.ContentBytes); } IsmReleaseObject (®Content); } IsmDestroyObjectHandle (regObject); } else { if (!OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &token)) { LOG ((LOG_WARNING, (PCSTR) MSG_PROCESS_TOKEN_ERROR)); __leave; } size = 0; GetTokenInformation ( token, TokenUser, // sdk enum value NULL, 0, &size ); if (size) { tokenInfo = (PTOKEN_USER) MemAllocUninit (size); b = GetTokenInformation ( token, TokenUser, tokenInfo, size, &size ); } else { b = FALSE; } if (!b) { LOG ((LOG_WARNING, (PCSTR) MSG_PROCESS_TOKEN_INFO_ERROR)); __leave; } size = ARRAYSIZE (userName); domainSize = ARRAYSIZE (domainName); b = LookupAccountSid ( NULL, tokenInfo->User.Sid, userName, &size, domainName, &domainSize, &dontCare ); if (!b) { LOG ((LOG_WARNING, (PCSTR) MSG_SECURITY_ID_LOOKUP_ERROR)); __leave; } *User = DuplicateText (userName); if (*domainName) { *Domain = DuplicateText (domainName); } } result = TRUE; } __finally { if (tokenInfo) { FreeAlloc (tokenInfo); } if (token) { CloseHandle (token); } } return result; } BOOL WINAPI ScriptSgmInitialize ( IN PMIG_LOGCALLBACK LogCallback, IN PVOID Reserved ) { TCHAR userName[256]; TCHAR domainName[256]; PCTSTR srcUserName; PCTSTR srcDomainName; if (!pInitGlobals (LogCallback)) { return FALSE; } g_RenameSrcTable = HtAllocWithData (sizeof (MIG_DATAHANDLE)); g_RenameDestTable = HtAllocWithData (sizeof (MIG_DATAHANDLE)); if (IsmGetRealPlatform() == PLATFORM_DESTINATION) { IsmGetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_USER_INFKEY, userName, sizeof (userName)); if (!IsmGetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_DOMAIN_INFKEY, domainName, sizeof (domainName))) { if (IsmIsEnvironmentFlagSet (PLATFORM_DESTINATION, NULL, S_REQUIRE_DOMAIN_USER)) { // // NOTE: We could create the user account for the non-domain case. // IsmSetCancel(); SetLastError (ERROR_INVALID_DOMAINNAME); LOG ((LOG_ERROR, (PCSTR) MSG_DOMAIN_REQUIRED)); return FALSE; } } else { IsmSetEnvironmentString ( PLATFORM_SOURCE, S_SYSENVVAR_GROUP, TEXT("USERDOMAIN"), domainName ); AddStringMappingPair (g_EnvMap, TEXT("%DOMAINNAME%"), domainName); } IsmSetEnvironmentString ( PLATFORM_SOURCE, S_SYSENVVAR_GROUP, TEXT("USERNAME"), userName ); AddStringMappingPair (g_EnvMap, TEXT("%USERNAME%"), userName); } else { if (!pGetDomainUserName (&srcDomainName, &srcUserName)) { if (IsmIsEnvironmentFlagSet (PLATFORM_DESTINATION, NULL, S_REQUIRE_DOMAIN_USER)) { return FALSE; } } else { IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_USER_INFKEY, srcUserName); IsmSetEnvironmentString ( PLATFORM_SOURCE, S_SYSENVVAR_GROUP, TEXT("USERNAME"), srcUserName ); AddStringMappingPair (g_EnvMap, TEXT("%USERNAME%"), srcUserName); if (srcDomainName) { IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_DOMAIN_INFKEY, srcDomainName); IsmSetEnvironmentString ( PLATFORM_SOURCE, S_SYSENVVAR_GROUP, TEXT("USERDOMAIN"), srcDomainName ); AddStringMappingPair (g_EnvMap, TEXT("%DOMAINNAME%"), srcDomainName); } FreeText (srcUserName); FreeText (srcDomainName); } } // // Parse the script and do the rest of the business // return pCommonInit (Reserved, FALSE); } VOID pSaveRegDword ( IN PCTSTR InfKeyName, IN PCTSTR Key, IN PCTSTR Value ) { TCHAR buffer[32]; MIG_OBJECTSTRINGHANDLE regObject; MIG_CONTENT regContent; regObject = IsmCreateObjectHandle (Key, Value); if (IsmAcquireObject (g_RegType, regObject, ®Content)) { if (!regContent.ContentInFile && regContent.MemoryContent.ContentBytes && regContent.Details.DetailsSize == sizeof (DWORD) && *((PDWORD) regContent.Details.DetailsData) == REG_DWORD ) { wsprintf (buffer, TEXT("0x%08X"), *((PDWORD) regContent.MemoryContent.ContentBytes)); IsmSetTransportVariable (PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, InfKeyName, buffer); } IsmReleaseObject (®Content); } IsmDestroyObjectHandle (regObject); } VOID pSaveRegSz ( IN PCTSTR InfKeyName, IN PCTSTR Key, IN PCTSTR Value ) { MIG_OBJECTSTRINGHANDLE regObject; MIG_CONTENT regContent; regObject = IsmCreateObjectHandle (Key, Value); if (IsmAcquireObject (g_RegType, regObject, ®Content)) { if (!regContent.ContentInFile && regContent.MemoryContent.ContentBytes && regContent.Details.DetailsSize == sizeof (DWORD) && *((PDWORD) regContent.Details.DetailsData) == REG_SZ ) { IsmSetTransportVariable ( PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, InfKeyName, (PCTSTR) regContent.MemoryContent.ContentBytes ); } IsmReleaseObject (®Content); } IsmDestroyObjectHandle (regObject); } BOOL WINAPI ScriptVcmInitialize ( IN PMIG_LOGCALLBACK LogCallback, IN PVOID Reserved ) { TCHAR buffer[256]; DWORD d; PCTSTR domainName; PCTSTR userName; if (!pInitGlobals (LogCallback)) { return FALSE; } // // Save all the basic settings via the transport string interface // // version d = GetVersion(); wsprintf (buffer, TEXT("0x%08x"), d); IsmSetTransportVariable (PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, S_VERSION_INFKEY, buffer); // code page d = (DWORD) GetACP(); wsprintf (buffer, TEXT("0x%08x"), d); IsmSetTransportVariable (PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, S_ACP_INFKEY, buffer); // // MACRO EXPANSION LIST -- generate the code necessary to save the settings // described in the macro expansion list in v1p.h // #define DEFMAC(infname,key,value) pSaveRegDword(TEXT(infname),TEXT(key),TEXT(value)); STANDARD_DWORD_SETTINGS #undef DEFMAC #define DEFMAC(infname,key,value) pSaveRegSz(TEXT(infname),TEXT(key),TEXT(value)); STANDARD_STRING_SETTINGS if (ISWIN9X()) { STANDARD_STRING_SETTINGS_9X } else { STANDARD_STRING_SETTINGS_NT } #undef DEFMAC // // Save the current user // if (!pGetDomainUserName (&domainName, &userName)) { return FALSE; } IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_USER_INFKEY, userName); IsmSetEnvironmentString ( PLATFORM_SOURCE, S_SYSENVVAR_GROUP, TEXT("USERNAME"), userName ); AddStringMappingPair (g_EnvMap, TEXT("%USERNAME%"), userName); if (domainName) { IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_DOMAIN_INFKEY, domainName); IsmSetEnvironmentString ( PLATFORM_SOURCE, S_SYSENVVAR_GROUP, TEXT("USERDOMAIN"), domainName ); AddStringMappingPair (g_EnvMap, TEXT("%DOMAINNAME%"), domainName); } FreeText (userName); FreeText (domainName); // // Parse the script and do the rest of the business // return pCommonInit (Reserved, TRUE); } VOID WINAPI ScriptTerminate ( VOID ) { HtFree (g_RenameSrcTable); g_RenameSrcTable = NULL; HtFree (g_RenameDestTable); g_RenameDestTable = NULL; HtFree (g_DePersistTable); g_DePersistTable = NULL; TerminateRestoreCallback (); TerminateSpecialRename(); TerminateSpecialConversion(); TerminateRules(); }