/*++ Copyright (c) 1996 Microsoft Corporation Module Name: setupdat.c Abstract: Module containing implementation for OcFillInSetupData, which the common OC Manager library will call to fill in the environment-dependent SETUP_DATA structure. Author: tedm 30-Sep-1996 Revision History: --*/ #include "precomp.h" #pragma hdrstop #include #include #include UINT pDetermineProductType( VOID ); #ifdef UNICODE VOID OcFillInSetupDataA( OUT PSETUP_DATAA SetupData ) /*++ Routine Description: Routine to fill in the ANSI SETUP_DATA structure in the Unicode build. This routine is merely a thunk to the Unicode implementation. Arguments: SetupData - receives various environment-specific values relating to the OC Manager's operation. Return Value: None. --*/ { SETUP_DATAW data; OcFillInSetupDataW(&data); SetupData->SetupMode = data.SetupMode; SetupData->ProductType = data.ProductType; SetupData->OperationFlags = data.OperationFlags; WideCharToMultiByte( CP_ACP, 0, data.SourcePath, -1, SetupData->SourcePath, sizeof(SetupData->SourcePath), NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, data.UnattendFile, -1, SetupData->UnattendFile, sizeof(SetupData->UnattendFile), NULL, NULL ); } #endif #ifdef UNICODE VOID OcFillInSetupDataW( OUT PSETUP_DATAW SetupData ) #else VOID OcFillInSetupDataA( OUT PSETUP_DATAA SetupData ) #endif /*++ Routine Description: Routine to fill in the SETUP_DATA structure in the "native" character width. Arguments: SetupData - receives various environment-specific values relating to the OC Manager's operation. Return Value: None. --*/ { TCHAR str[4]; SetupData->SetupMode = (ULONG)SETUPMODE_UNKNOWN; SetupData->ProductType = pDetermineProductType(); // // Set up source path stuff, unattend file. // lstrcpy(SetupData->SourcePath,SourcePath); lstrcpy(SetupData->UnattendFile,UnattendPath); // // Set miscellaneous bit flags and fields. // SetupData->OperationFlags = SETUPOP_STANDALONE; if(bUnattendInstall) { SetupData->OperationFlags |= SETUPOP_BATCH; } // // Which files are available? // #if defined(_AMD64_) SetupData->OperationFlags |= SETUPOP_X86_FILES_AVAIL | SETUPOP_AMD64_FILES_AVAIL; #elif defined(_X86_) SetupData->OperationFlags |= SETUPOP_X86_FILES_AVAIL; #elif defined(_IA64_) SetupData->OperationFlags |= SETUPOP_X86_FILES_AVAIL | SETUPOP_IA64_FILES_AVAIL; #else #error "No Target Architecture" #endif } UINT pDetermineProductType( VOID ) /*++ Routine Description: Determine the product type suitable for use in the SETUP_DATA structure. On Win95 this is always PRODUCT_WORKSTATION. On NT we check the registry and use other methods to distinguish among workstation and 3 flavors of server. Arguments: None. Return Value: Value suitable for use in the ProductType field of the SETUP_DATA structure. --*/ { UINT ProductType; HKEY hKey; LONG l; DWORD Type; TCHAR Buffer[512]; DWORD BufferSize; PSERVER_INFO_101 ServerInfo; HMODULE NetApiLib; NET_API_STATUS (NET_API_FUNCTION *xNetServerGetInfo)( IN LPTSTR servername, IN DWORD level, OUT LPBYTE *bufptr ); NET_API_STATUS (NET_API_FUNCTION *xNetApiBufferFree)( IN LPVOID Buffer ); // // Assume workstation. // ProductType = PRODUCT_WORKSTATION; if(IS_NT()) { // // Look in registry to determine workstation, standalone server, or DC. // l = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hKey ); if(l == NO_ERROR) { BufferSize = sizeof(Buffer); l = RegQueryValueEx(hKey,TEXT("ProductType"),NULL,&Type,(LPBYTE)Buffer,&BufferSize); if((l == NO_ERROR) && (Type == REG_SZ)) { // // Check for standalone server or DC server. // if(!lstrcmpi(Buffer,TEXT("SERVERNT"))) { ProductType = PRODUCT_SERVER_STANDALONE; } else { if(!lstrcmpi(Buffer,TEXT("LANMANNT"))) { // // PDC or BDC -- determine which. Assume PDC in case of failure. // ProductType = PRODUCT_SERVER_PRIMARY; if(NetApiLib = LoadLibrary(TEXT("NETAPI32"))) { if(((FARPROC)xNetServerGetInfo = GetProcAddress(NetApiLib,"NetServerGetInfo")) && ((FARPROC)xNetApiBufferFree = GetProcAddress(NetApiLib,"NetApiBufferFree")) && (xNetServerGetInfo(NULL,101,(LPBYTE *)&ServerInfo) == 0)) { if(ServerInfo->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) { ProductType = PRODUCT_SERVER_SECONDARY; } xNetApiBufferFree(ServerInfo); } FreeLibrary(NetApiLib); } } } } RegCloseKey(hKey); } } return(ProductType); } INT OcLogError( IN OcErrorLevel Level, IN LPCTSTR FormatString, ... ) { TCHAR str[4096]; TCHAR tmp[64]; TCHAR Title[256]; va_list arglist; UINT Icon; va_start(arglist,FormatString); wvsprintf(str,FormatString,arglist); va_end(arglist); // In Batch mode don't display UI if ( Level & OcErrBatch ) { pDbgPrintEx( DPFLTR_SETUP_ID, DPFLTR_INFO_LEVEL, "sysocmgr: %S\n", str ); return IDOK; } // // Mask off lower byte to allow us to pass // Addtionall "icon" information // switch( Level & OcErrMask ) { case OcErrLevInfo: Icon = MB_ICONINFORMATION; break; case OcErrLevWarning: case OcErrLevError: Icon = MB_ICONWARNING; break; case OcErrTrace: pDbgPrintEx( DPFLTR_SETUP_ID, DPFLTR_INFO_LEVEL, "sysocmgr: %S\n", str ); return(IDOK); break; default: Icon = MB_ICONERROR; break; } pDbgPrintEx( DPFLTR_SETUP_ID, DPFLTR_ERROR_LEVEL, "sysocmgr: level 0x%08x error: %S\n", Level, str ); // // If no additional Icon information is specified that's ok since // MB_OK is default // Icon |= (Level & ~OcErrMask); if ((Level & OcErrMask) < OcErrLevError) return IDOK; LoadString(hInst,AppTitleStringId,Title,sizeof(Title)/sizeof(TCHAR)); return MessageBox(NULL,str,Title,Icon | MB_TASKMODAL | MB_SETFOREGROUND); }