// // MINSTALL.DLL (c) Copyright 2002-2005 Martin Kiewitz // // This file is part of MINSTALL.DLL for OS/2 / eComStation // // MINSTALL.DLL is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // MINSTALL.DLL is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with MINSTALL.DLL. If not, see . // #define INCL_NOPMAPI #define INCL_BASE #define INCL_DOSMODULEMGR // #define INCL_OS2MM // #define INCL_MMIO_CODEC // #define INCL_AUDIO_CODEC_ONLY #include // #include #include #include #include // CONFIG.SYS Changing #include #include #include #include #include #include #include #include #include #include BOOL MINSTALL_LoadConfigControlFile (PMINSTFILE ScriptFilePtr) { ULONG ConfigEntryCount = 0; PCHAR CurPos = 0; PCHAR EndPos = 0; PCHAR LineStartPos = 0; PCHAR LineEndPos = 0; CHAR CurChar = 0; ULONG Temp = 0; PCHAR CommandSpacePtr = 0; PCONFIGSYSACTION ConfigEntryArrayPtr = 0; PCONFIGSYSACTION CurConfigEntry = 0; PCONFIGSYSACTSTR ConfigStringArrayPtr = 0; PCONFIGSYSACTSTR CurConfigString = 0; PMINSTDIR CurDirPtr = 0; ULONG CommandID1 = 0; ULONG CommandID2 = 0; PCHAR ValueSpacePtr = 0; PCHAR TempPtr = 0; ULONG ActionID = 0; ULONG CurLineNo = 1; // Get Full-Qualified Script Name if (!STRING_CombinePSZ (CHANGESCR.Name, MINSTMAX_PATHLENGTH, ScriptFilePtr->SourcePtr->FQName, ScriptFilePtr->Name)) return FALSE; if (!FILE_LoadFileControl(&CHANGESCR, 131767)) { MSG_SetInsertViaPSZ (1, CHANGESCR.Name); MINSTALL_TrappedError (MINSTMSG_CouldNotLoad); return FALSE; } FILE_PreProcessControlFile(&CHANGESCR); ConfigEntryCount = FILE_CountControlFileLines (&CHANGESCR); if (ConfigEntryCount==0) { FILE_UnLoadFileControl(&CHANGESCR); return TRUE; // No entries, so success } // Now allocate memory for those entries... ConfigEntryArrayPtr = malloc(ConfigEntryCount*CONFIGSYSACTION_Length); if (!ConfigEntryArrayPtr) { FILE_UnLoadFileControl(&CHANGESCR); MINSTALL_TrappedError (MINSTMSG_OutOfMemory); return FALSE; // OutOfMemory } ConfigStringArrayPtr = malloc(ConfigEntryCount*CONFIGSYSACTSTR_Length); if (!ConfigStringArrayPtr) { free (ConfigEntryArrayPtr); FILE_UnLoadFileControl(&CHANGESCR); MINSTALL_TrappedError (MINSTMSG_OutOfMemory); return FALSE; // OutOfMemory } // NUL out both arrays... memset (ConfigEntryArrayPtr, 0, ConfigEntryCount*sizeof(CONFIGSYSACTION)); memset (ConfigStringArrayPtr, 0, ConfigEntryCount*sizeof(CONFIGSYSACTSTR)); // Now extract all entries one-by-one. Known are: // "MERGE" - only used on SET lines, // may include a numeric digit, which specifies the directory // "REPLACE" - will replace a line, if it already got found. Otherwise // the line will get added // 05062004 - If a path is specified, Action is 'REPLACE' and // the command is 'SET', add ';' to the end. // It's done by original minstall and needed for // compatibility. // "DEVICE" - will add that line ConfigEntryCount = 0; CurPos = CHANGESCR.BufferPtr; EndPos = CHANGESCR.BufferEndPtr; CurConfigEntry = ConfigEntryArrayPtr; CurConfigString = ConfigStringArrayPtr; while (CurPosCommandStr, CONFIGSYSACTSTR_MAXLENGTH, CurPos, LineEndPos); CommandSpacePtr = (PCHAR)CurConfigString->CommandStr; while (*CommandSpacePtr!=0x20) { // Find 1st space in HelpBuffer if (*CommandSpacePtr==0x00) { CommandSpacePtr = 0; break; } CommandSpacePtr++; } CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo); } else { CommandSpacePtr = 0; } CurPos++; if (CurPos>=LineEndPos) { MINSTALL_ErrorMsgID = MINSTMSG_UnexpectedEndOfLine; break; } if (CurChar!='=') { MINSTALL_ErrorMsgID = MINSTMSG_ValueExpected; break; } if (ActionID==0xF9D77108) { /* We have to check this earlier, because we put command 'DEVICE' */ /* and that one is needed because we get CommandID1/2 now instead of */ /* later. */ if (CurConfigString->CommandStr[0]!=0) MINSTALL_TrappedError (MINSTMSG_NoConfigCommandExpected); strcpy (CurConfigString->CommandStr, "DEVICE"); } if (CommandSpacePtr) { // We got a space in the Command, so we take 2 CommandIDs CommandID1 = CRC32_GetFromString(CurConfigString->CommandStr,CommandSpacePtr-CurConfigString->CommandStr); CommandID2 = CRC32_GetFromPSZ(CommandSpacePtr+1); } else { CommandID1 = CRC32_GetFromPSZ(CurConfigString->CommandStr); CommandID2 = 0; } CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo); if (CurChar=='"') { // String-Delimiter, so we assume string and extract (w macros) if (!(CurPos = MINSTALL_GetMacrodString((PCHAR)CurConfigString->ValueStr, MINSTMAX_PATHLENGTH, CurPos, LineEndPos))) break; // Error during macro processing } else { if (!(CurPos = STRING_GetNumericValue(&Temp, CurPos, LineEndPos))) break; // Error during value extract CurDirPtr = MINSTALL_SearchDestinDirID (Temp); if (CurDirPtr) { strcpy (CurConfigString->ValueStr, CurDirPtr->FQName); Temp = strlen(CurConfigString->ValueStr); if (Temp>0) Temp--; if ((ActionID==0x33D8DA5F) && (CommandID1==0x70B36756)) { // If Action is 'REPLACE' and Command is 'SET' // Add a ';' here for compatibility reasons (05062004) CurConfigString->ValueStr[Temp] = ';'; } else { // cut last char (which is a '\') CurConfigString->ValueStr[Temp] = 0; } } else { MINSTALL_ErrorMsgID = MINSTMSG_UnknownDestinID; break; } } switch (ActionID) { case 0x33D8DA5F: // REPLACE, expects HelpBuffer if (CurConfigString->CommandStr[0]==0) MINSTALL_TrappedError (MINSTMSG_ConfigCommandExpected); break; case 0x1C3D55E9: // MERGE, expects HelpBuffer if (CurConfigString->CommandStr[0]==0) MINSTALL_TrappedError (MINSTMSG_ConfigCommandExpected); CurConfigEntry->Flags |= CONFIGSYSACTION_Flags_Merge; break; case 0xF9D77108: // DEVICE, expects NO HelpBuffer /* CommandStr should now be 'DEVICE' and is checked earlier for Error */ /* if (CurConfigString->CommandStr[0]!=0) MINSTALL_TrappedError (MINSTMSG_NoConfigCommandExpected); */ /* strcpy (CurConfigString->CommandStr, "DEVICE"); */ CurConfigEntry->Flags |= CONFIGSYSACTION_Flags_MatchOnFilename; break; default: // We got something unknown... MINSTALL_ErrorMsgID = MINSTMSG_BadCommand; break; } switch (CommandID1) { case 0xC6D1E64A: // RUN case 0xF9D77108: // DEVICE case 0x2110156E: // BASEDEV break; case 0x70B36756: // SET if (CommandID2==0x8262959) // LIBPATH -> strip "SET" strcpy (CurConfigString->CommandStr, CommandSpacePtr+1); break; default: MINSTALL_ErrorMsgID = MINSTMSG_BadConfigCommand; break; } if (MINSTALL_ErrorMsgID) break; // If no error found, add this entry... ValueSpacePtr = CurConfigString->ValueStr; while (*ValueSpacePtr!=0) { if (*ValueSpacePtr==0x20) // If space found break; ValueSpacePtr++; } switch (CommandID1) { case 0xC6D1E64A: // RUN case 0xF9D77108: // DEVICE case 0x2110156E: // BASEDEV if (ActionID==0xF9D77108) { // DEVICE // Match only on filename... TempPtr = ValueSpacePtr; while (TempPtr>CurConfigString->ValueStr) { if (*TempPtr==0x5C) { TempPtr++; break; } TempPtr--; // Search backwards for '\' } strncpy (CurConfigString->MatchStr, TempPtr, ValueSpacePtr-TempPtr); } else { // full qualified filename is match string... strncpy (CurConfigString->MatchStr, CurConfigString->ValueStr, ValueSpacePtr-CurConfigString->ValueStr); } } MINSTLOG_ToFile ("Command \"%s\", Match-Onto \"%s\" (Flags %X)\n", CurConfigString->CommandStr, CurConfigString->MatchStr, CurConfigEntry->Flags); MINSTLOG_ToFile (" Add/Merge in \"%s\"\n", CurConfigString->ValueStr); CurConfigString->MatchInLineStr[0] = 0; CurConfigEntry->CommandStrPtr = CurConfigString->CommandStr; CurConfigEntry->MatchStrPtr = CurConfigString->MatchStr; CurConfigEntry->MatchInLineStrPtr = CurConfigString->MatchInLineStr; CurConfigEntry->ValueStrPtr = CurConfigString->ValueStr; ConfigEntryCount++; CurConfigEntry++; CurConfigString++; CurPos = LineEndPos+1; CurLineNo++; } // Put that Array&Count into ConfigChange-Queue... ScriptFilePtr->GroupPtr->ConfigChangeArray = ConfigEntryArrayPtr; ScriptFilePtr->GroupPtr->ConfigStringArray = ConfigStringArrayPtr; ScriptFilePtr->GroupPtr->ConfigChangeCount = ConfigEntryCount; // Remove that file from memory... FILE_UnLoadFileControl(&CHANGESCR); // We didn't find anything? if (ConfigEntryCount==0) MINSTALL_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; if (MINSTALL_ErrorMsgID) { // If Error-found during parsing... MSG_SetInsertFileLocation (1, CHANGESCR.Name, CurLineNo); MINSTALL_TrappedError (MINSTALL_ErrorMsgID); return FALSE; } return TRUE; } // **************************************************************************** // ULONG MINSTALL_GetNextINIFuncID (PCHAR *CurPosPtr, PCHAR EndPos, PULONG CurLineNoPtr) { PCHAR CurPos = *CurPosPtr; PCHAR StartPos = 0; ULONG FunctionID = 0; CHAR CurChar; if (!(CurChar = STRING_GetValidChar(&CurPos, EndPos, CurLineNoPtr))) { *CurPosPtr = CurPos; return 0; // No more valid chars... } StartPos = CurPos; while (CurPosID) { if (!ICF_CurFuncEntry->ID) { MINSTALL_ErrorMsgID = MINSTMSG_ICUnknownFunction; return 0; } ICF_CurFuncEntry++; } ICF_CheckParmList = (PMINSTINI_DEFENTRY)ICF_CurFuncEntry->ParmListPtr; ICF_FilledParms = 0; // No parms currently filled out... } return FunctionID; } CurPos++; } *CurPosPtr = CurPos; // Experienced End-Of-Buffer return 0; } ULONG MINSTALL_GetNextINIParmID (PCHAR *CurPosPtr, PCHAR EndPos, PULONG CurLineNoPtr, PLONG ArrayCountPtr) { PCHAR CurPos = *CurPosPtr; PCHAR StartPos = 0; ULONG ParamID = 0; CHAR CurChar; ULONG ParamBit = 0; if (!(CurChar = STRING_GetValidChar(&CurPos, EndPos, CurLineNoPtr))) { *CurPosPtr = CurPos; // No more valid chars... MINSTALL_ErrorMsgID = MINSTMSG_ICBadStructure; return 0; } if (CurChar==')') { *CurPosPtr = CurPos+1; STRING_GetValidChar (CurPosPtr, EndPos, CurLineNoPtr); return 0; // Signals End-Of-Param-List } StartPos = CurPos; while (CurPosID) { if (!ICF_CurParmEntry->ID) { MINSTALL_ErrorMsgID = MINSTMSG_ICUnknownParameter; return 0; } ICF_CurParmEntry++; ParamBit <<= 1; } if (ParamBit & ICF_FilledParms) { MSG_SetInsertViaPSZ (2, ICF_CurParmEntry->Name); MINSTALL_ErrorMsgID = MINSTMSG_ICDuplicateParameter; return 0; } ICF_FilledParms |= ParamBit; // Got that parameter... // CHECK Array descriptor... if (*ArrayCountPtr==-1) { // <-- Array got not specified if (ICF_CurParmEntry->MaxSize!=0) { MSG_SetInsertViaPSZ (2, ICF_CurParmEntry->Name); MINSTALL_ErrorMsgID = MINSTMSG_ICParameterIsArray; return 0; } } else { // <-- Array got specified if (ICF_CurParmEntry->MaxSize==0) { MSG_SetInsertViaPSZ (2, ICF_CurParmEntry->Name); MINSTALL_ErrorMsgID = MINSTMSG_ICParameterNotArray; return 0; } if (ICF_CurParmEntry->MaxSize<*ArrayCountPtr) { MSG_SetInsertViaPSZ (2, ICF_CurParmEntry->Name); MINSTALL_ErrorMsgID = MINSTMSG_ICArrayTooBig; return 0; } } } *CurPosPtr += 1; // Now seek to next valid char... if (!STRING_GetValidChar(CurPosPtr, EndPos, CurLineNoPtr)) { MINSTALL_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; return 0; } return ParamID; } CurPos++; CurChar = *CurPos; } *CurPosPtr = CurPos; // Experienced End-Of-Buffer MINSTALL_ErrorMsgID = MINSTMSG_ICBadStructure; return 0; } // CurLineNo is transferred for Warning-logging BOOL MINSTALL_CheckForMissingINIParms (ULONG CurLineNo) { ULONG ParamBit = 1; if (ICF_CheckParmList) { // Check, if all parameters were set... ICF_CurParmEntry = ICF_CheckParmList; while (ICF_CurParmEntry->ID) { if (!(ParamBit & ICF_FilledParms)) { MSG_SetInsertViaPSZ (2, ICF_CurParmEntry->Name); if (ICF_CurParmEntry->Mandatory==TRUE) { MINSTALL_ErrorMsgID = MINSTMSG_ICMissingParameter; return TRUE; } else { MSG_SetInsertFileLocation (1, CHANGESCR.Name, CurLineNo); MINSTALL_TrappedWarning (MINSTMSG_ICMissingParameterWarning); } } ICF_CurParmEntry++; ParamBit <<= 1; } } return FALSE; } BOOL MINSTALL_LoadINIControlFile (PMINSTFILE ScriptFilePtr) { ULONG ConfigEntryCount = 0; PCHAR CurPos = 0; PCHAR StartPos = 0; PCHAR EndPos = 0; PCHAR LineStartPos = 0; PCHAR LineEndPos = 0; CHAR CurChar = 0; ULONG Temp = 0; ULONG FunctionID = 0; ULONG ParamID = 0; ULONG CurLineNo = 1; ULONG RequiredSpace = 0; LONG ArrayCount = -1; ULONG CurArray = 0; ULONG ArrayTotal = 0; PVOID INIChange1stEntryPtr = 0; ULONG INIChangeCount = 0; PMINSTINIHEADER INIChangeEntryPtr = 0; // <-- Current Entry PMINSTINIHEADER INIChangeLastEntryPtr = 0; ULONG MainFilledParms = 0; // <-- helper for array processing PMINSTINI_DEFENTRY MainCheckParmList = NULL; CHAR TempBuffer[MINSTMAX_PATHLENGTH]; // Temporary buffer ULONG TempULong; ULONG TmpNo; // Get Full-Qualified Script Name if (!STRING_CombinePSZ (CHANGESCR.Name, MINSTMAX_PATHLENGTH, ScriptFilePtr->SourcePtr->FQName, ScriptFilePtr->Name)) return FALSE; if (!FILE_LoadFileControl(&CHANGESCR, 131767)) { MSG_SetInsertViaPSZ (1, CHANGESCR.Name); MINSTALL_TrappedError (MINSTMSG_CouldNotLoad); return FALSE; } FILE_PreProcessControlFile(&CHANGESCR); // Switch on Function-Name checking... ICF_CheckFuncList = MINSTINI_FuncList; // Now we are doing the REAL read-in... // This is MUCH MUCH code, but the damn IBM Linker didnt want to compile my // structure-based stuff, so I needed to do it the hardcoded way :( CurLineNo = 1; INIChangeCount = 0; CurPos = CHANGESCR.BufferPtr; EndPos = CHANGESCR.BufferEndPtr; while (CurPosMaxSize))) { MINSTALL_TrappedError (MINSTMSG_OutOfMemory); break; } if (!INIChangeLastEntryPtr) { INIChange1stEntryPtr = INIChangeEntryPtr; } else { INIChangeLastEntryPtr->NextPtr = INIChangeEntryPtr; } INIChangeLastEntryPtr = INIChangeEntryPtr; // Reset structure and set INI Header memset (INIChangeEntryPtr, 0, ICF_CurFuncEntry->MaxSize); INIChangeEntryPtr->ID = FunctionID; INIChangeEntryPtr->Size = ICF_CurFuncEntry->MaxSize; // We have now switched the parm-list, process Parameters now... switch (FunctionID) { case EA_JOINEA_ID: // ==================== EA - JoinEA while ((CurPosJoinFileName, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0xDF5CDE5B: CurPos = MINSTALL_GetMacrodString(((PEA_JOINEA)INIChangeEntryPtr)->JoinEAFileName, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; } } break; case EA_JOINLONGNAMEEA_ID: // ============ EA - JoinLongNameEA while ((CurPosJoinLongName, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0xD5C2CE0C: CurPos = MINSTALL_GetMacrodString(((PEA_JOINLONGNAMEEA)INIChangeEntryPtr)->JoinLongFileName, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0xF01882D8: CurPos = MINSTALL_GetMacrodString(((PEA_JOINLONGNAMEEA)INIChangeEntryPtr)->JoinEALongFileName, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; } } break; case MCI_MCIINSTALLDRV_ID: // ============ MCI - MciInstallDrv while ((CurPosszInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0xF1558F48: if (!(CurPos = MINSTALL_GetNumericValue(&TempULong, CurPos, EndPos))) break; ((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->usDeviceType = TempULong; break; case 0xAC7F33FB: CurPos = MINSTALL_GetNumericValue(&((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->ulDeviceFlag, CurPos, EndPos); break; case 0xDD6E470A: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szVersionNumber, MCIMAX_VERSIONLENGTH, CurPos, EndPos); break; case 0xB377234D: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szProductInfo, MCIMAX_PRODLENGTH, CurPos, EndPos); break; case 0xB4BFB2C2: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szMCDDriver, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0xE6915F45: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szVSDDriver, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0xE8AB4FF7: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szPDDName, MCIMAX_PDDNAMELENGTH, CurPos, EndPos); break; case 0x2552FF41: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szMCDTable, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0x635D4EF2: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szVSDTable, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0xC5E91968: if (!(CurPos = MINSTALL_GetNumericValue(&TempULong, CurPos, EndPos))) break; ((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->usShareType = TempULong; break; case 0x25A89CAF: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->szResourceName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0x7DAFC42F: if (!(CurPos = MINSTALL_GetNumericValue(&TempULong, CurPos, EndPos))) break; ((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->usResourceUnits = TempULong; break; case 0x924AB2E1: // DrvClassArray is ARRAY // Safe current Main-ParmList and FilledParms... MainFilledParms = ICF_FilledParms; MainCheckParmList = ICF_CheckParmList; // Set to Array-specific ParmList... ICF_CheckParmList = ICF_CurParmEntry->ParmListPtr; ((PMCI_MCIINSTALLDRV)INIChangeEntryPtr)->usResourceClasses = ArrayCount; ArrayTotal = ArrayCount; CurArray = 0; while ((CurArrayausClassArray[CurArray] = TempULong; break; } if (MINSTALL_ErrorMsgID) break; // If any error occured... } if (MINSTALL_ErrorMsgID) break; // Check, if array element had all parameters... if (MINSTALL_CheckForMissingINIParms(CurLineNo)) break; CurArray++; } if (MINSTALL_ErrorMsgID) break; if (*CurPos!=')') { MINSTALL_ErrorMsgID = MINSTMSG_ICBadStructure; break; } CurPos++; // Now restore Main-ParmList and FilledParms... ICF_FilledParms = MainFilledParms; ICF_CheckParmList = MainCheckParmList; } } break; case MCI_MCIINSTALLCONN_ID: // =========== MCI - MciInstallConn while ((CurPosszInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0x40B7450F: // ConnArray is ARRAY // Safe current Main-ParmList and FilledParms... MainFilledParms = ICF_FilledParms; MainCheckParmList = ICF_CheckParmList; // Set to Array-specific ParmList... ICF_CheckParmList = ICF_CurParmEntry->ParmListPtr; ((PMCI_MCIINSTALLCONN)INIChangeEntryPtr)->usNumConnectors = ArrayCount; ArrayTotal = ArrayCount; CurArray = 0; while ((CurArrayConnectorList[CurArray].usConnectType = TempULong; break; case 0x77E86C5D: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLCONN)INIChangeEntryPtr)->ConnectorList[CurArray].szToInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0xDEB82C0C: if (!(CurPos = MINSTALL_GetNumericValue(&TempULong, CurPos, EndPos))) break; ((PMCI_MCIINSTALLCONN)INIChangeEntryPtr)->ConnectorList[CurArray].usToConnectIndex = TempULong; break; } if (MINSTALL_ErrorMsgID) break; // If any error occured... } if (MINSTALL_ErrorMsgID) break; // Check, if array element had all parameters... if (MINSTALL_CheckForMissingINIParms(CurLineNo)) break; CurArray++; } if (MINSTALL_ErrorMsgID) break; if (*CurPos!=')') { MINSTALL_ErrorMsgID = MINSTMSG_ICBadStructure; break; } CurPos++; // Now restore Main-ParmList and FilledParms... ICF_FilledParms = MainFilledParms; ICF_CheckParmList = MainCheckParmList; } } break; case MCI_MCIINSTALLPARM_ID: // =========== MCI - MciInstallParm while ((CurPosszInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0x7E2CCDF4: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLPARM)INIChangeEntryPtr)->szDevParams, MCIMAX_DEVPARAMSLENGTH, CurPos, EndPos); break; } } break; case MCI_MCIINSTALLALIAS_ID: // ========== MCI - MciInstallAlias while ((CurPosszInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0xA278C064: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLALIAS)INIChangeEntryPtr)->szAliasName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; } } break; case MCI_MCIINSTALLEXT_ID: // ============ MCI - MciInstallExt while ((CurPosszInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0x130025CB: // ExtArray is ARRAY // Safe current Main-ParmList and FilledParms... MainFilledParms = ICF_FilledParms; MainCheckParmList = ICF_CheckParmList; // Set to Array-specific ParmList... ICF_CheckParmList = ICF_CurParmEntry->ParmListPtr; ((PMCI_MCIINSTALLEXT)INIChangeEntryPtr)->usNumExtensions = ArrayCount; ArrayTotal = ArrayCount; CurArray = 0; while ((CurArrayszExtension[CurArray], MCIMAX_EXTENSIONNAMELENGTH, CurPos, EndPos); break; } if (MINSTALL_ErrorMsgID) break; // If any error occured... } if (MINSTALL_ErrorMsgID) break; // Check, if array element had all parameters... if (MINSTALL_CheckForMissingINIParms(CurLineNo)) break; CurArray++; } if (MINSTALL_ErrorMsgID) break; if (*CurPos!=')') { MINSTALL_ErrorMsgID = MINSTMSG_ICBadStructure; break; } CurPos++; // Now restore Main-ParmList and FilledParms... ICF_FilledParms = MainFilledParms; ICF_CheckParmList = MainCheckParmList; } } break; case MCI_MCIINSTALLTYPES_ID: // ========== MCI - MciInstallTypes while ((CurPosszInstallName, MCIMAX_DEVICENAMELENGTH, CurPos, EndPos); break; case 0x84C253AD: CurPos = MINSTALL_GetMacrodString(((PMCI_MCIINSTALLTYPES)INIChangeEntryPtr)->szTypes, MCIMAX_TYPELISTLENGTH, CurPos, EndPos); break; } } break; case MMIO_MMIOINSTALL_ID: // ============= MMIO - mmioInstall while ((CurPosfccIOProc = *((PULONG)&TempBuffer); break; case 0x83BC6E92: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->szDLLName, MMIOMAX_DLLLENGTH, CurPos, EndPos); break; case 0x383FA8EC: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->szProcName, MMIOMAX_PROCNAMELENGTH, CurPos, EndPos); break; case 0x6EA2DBC6: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->dwFlags, CurPos, EndPos); break; case 0x953B087F: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->dwExtendLen, CurPos, EndPos); break; case 0xB1824C61: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->dwMediaType, CurPos, EndPos); break; case 0xCD997BB5: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->dwIOProcType, CurPos, EndPos); break; case 0xF1124958: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOINSTALL)INIChangeEntryPtr)->szDefExt, MMIOMAX_EXTENSIONNAMELENGTH, CurPos, EndPos); break; } } break; case MMIO_MMIOCODECDELETE_ID: // ========= MMIO - mmioCodecDelete while ((CurPosulStructLen, CurPos, EndPos); break; case 0x5CCDD4CA: // mmioFourCC must be 4 chars wide if (!(CurPos = MINSTALL_GetMacrodString(TempBuffer, MINSTMAX_PATHLENGTH, CurPos, EndPos))) break; if (strlen(TempBuffer)!=4) { MINSTALL_ErrorMsgID = MINSTMSG_ICBadFourCC; break; } ((PMMIO_MMIOCODEC)INIChangeEntryPtr)->fcc = *((PULONG)&TempBuffer); break; case 0x546A3B5B: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szDLLName, MMIOMAX_DLLLENGTH, CurPos, EndPos); break; case 0x75D262DB: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szProcName, MMIOMAX_PROCNAMELENGTH, CurPos, EndPos); break; case 0xB3D96C53: // mmioCompressType (FCC) must be 4 chars wide if (!(CurPos = MINSTALL_GetMacrodString(TempBuffer, MINSTMAX_PATHLENGTH, CurPos, EndPos))) break; if (strlen(TempBuffer)!=4) { MINSTALL_ErrorMsgID = MINSTMSG_ICBadFourCC; break; } ((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCompressType = *((PULONG)&TempBuffer); break; case 0x6CCF6654: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCompressSubType, CurPos, EndPos); break; case 0xB0BB52CB: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulMediaType, CurPos, EndPos); break; case 0x524CECEC: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulFlags, CurPos, EndPos); break; case 0x09007EEC: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCapsFlags, CurPos, EndPos); break; case 0xD8CF2CF5: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szHWID, MMIOMAX_HWNAMELENGTH, CurPos, EndPos); break; case 0x2841E06C: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulMaxSrcBufLen, CurPos, EndPos); break; case 0xD9643500: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulSyncMethod, CurPos, EndPos); break; case 0xF7CAA0ED: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->fccPreferredFormat, CurPos, EndPos); break; case 0xFD9EE47D: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulXalignment, CurPos, EndPos); break; case 0x36C237D8: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulYalignment, CurPos, EndPos); break; case 0x2DCCCF4F: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szSpecInfo, MMIOMAX_SPECINFOLENGTH, CurPos, EndPos); break; } } break; case MMIO_MMIOCODEC1INSTALL_ID: // ======= MMIO - mmioCodec1Install while ((CurPosulStructLen, CurPos, EndPos); break; case 0x354F8DA4: // mmioFourCC must be 4 chars wide if (!(CurPos = MINSTALL_GetMacrodString(TempBuffer, MINSTMAX_PATHLENGTH, CurPos, EndPos))) break; if (strlen(TempBuffer)!=4) { MINSTALL_ErrorMsgID = MINSTMSG_ICBadFourCC; break; } ((PMMIO_MMIOCODEC)INIChangeEntryPtr)->fcc = *((PULONG)&TempBuffer); break; case 0xFE09F55D: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szDLLName, MMIOMAX_DLLLENGTH, CurPos, EndPos); break; case 0x08D25727: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szProcName, MMIOMAX_PROCNAMELENGTH, CurPos, EndPos); break; // Codec1Install -> Change is here: ULONG instead of FCC case 0x487146E0: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCompressType, CurPos, EndPos); break; case 0xAA46F050: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCompressSubType, CurPos, EndPos); break; case 0x9A3DB099: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulMediaType, CurPos, EndPos); break; case 0xD6D77C7F: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulFlags, CurPos, EndPos); break; case 0x23869CBE: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCapsFlags, CurPos, EndPos); break; case 0xB14D759B: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szHWID, MMIOMAX_HWNAMELENGTH, CurPos, EndPos); break; case 0x02C7023E: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulMaxSrcBufLen, CurPos, EndPos); break; case 0x5C2B833A: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulSyncMethod, CurPos, EndPos); break; case 0xDD4C42BF: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->fccPreferredFormat, CurPos, EndPos); break; case 0x941CBD13: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulXalignment, CurPos, EndPos); break; case 0x5F406EB6: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulYalignment, CurPos, EndPos); break; case 0xC40509B4: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szSpecInfo, MMIOMAX_SPECINFOLENGTH, CurPos, EndPos); break; } } break; case MMIO_MMIOCODEC2INSTALL_ID: // ======= MMIO - mmioCodec2Install while ((CurPosulStructLen, CurPos, EndPos); break; case 0x04A79739: // mmioFourCC must be 4 chars wide if (!(CurPos = MINSTALL_GetMacrodString(TempBuffer, MINSTMAX_PATHLENGTH, CurPos, EndPos))) break; if (strlen(TempBuffer)!=4) { MINSTALL_TrappedError (MINSTMSG_ICBadFourCC); break; } ((PMMIO_MMIOCODEC)INIChangeEntryPtr)->fcc = *((PULONG)&TempBuffer); break; case 0x7086F2BE: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szDLLName, MMIOMAX_DLLLENGTH, CurPos, EndPos); break; case 0x74B372FC: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szProcName, MMIOMAX_PROCNAMELENGTH, CurPos, EndPos); break; // Codec2Install -> Change is here: FCC instead of ULONG case 0x02CE28A7: // mmioCompressType (FCC) must be 4 chars wide if (!(CurPos = MINSTALL_GetMacrodString(TempBuffer, MINSTMAX_PATHLENGTH, CurPos, EndPos))) break; if (strlen(TempBuffer)!=4) { MINSTALL_TrappedError (MINSTMSG_ICBadFourCC); break; } ((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCompressType = *((PULONG)&TempBuffer); break; case 0xDDD822A0: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCompressSubType, CurPos, EndPos); break; case 0x710A0B9A: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulMediaType, CurPos, EndPos); break; case 0x50430ED1: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulFlags, CurPos, EndPos); break; case 0xC8B127BD: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulCapsFlags, CurPos, EndPos); break; case 0x80A56F06: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szHWID, MMIOMAX_HWNAMELENGTH, CurPos, EndPos); break; case 0xE9F0B93D: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulMaxSrcBufLen, CurPos, EndPos); break; case 0xC5C9E53B: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulSyncMethod, CurPos, EndPos); break; case 0x367BF9BC: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->fccPreferredFormat, CurPos, EndPos); break; case 0xA5F4A78E: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulXalignment, CurPos, EndPos); break; case 0x6EA8742B: CurPos = MINSTALL_GetNumericValue(&((PMMIO_MMIOCODEC)INIChangeEntryPtr)->ulYalignment, CurPos, EndPos); break; case 0xFD883571: CurPos = MINSTALL_GetMacrodString(((PMMIO_MMIOCODEC)INIChangeEntryPtr)->szSpecInfo, MMIOMAX_SPECINFOLENGTH, CurPos, EndPos); break; } } break; case PRF_PROFILEDATA_ID: // ============== PRF - ProfileData while ((CurPosIni, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0x027F2A21: CurPos = MINSTALL_GetMacrodString(((PPRF_PROFILEDATA)INIChangeEntryPtr)->AppName, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0xF8048436: CurPos = MINSTALL_GetMacrodString(((PPRF_PROFILEDATA)INIChangeEntryPtr)->KeyName, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0xAB74F1BC: CurPos = MINSTALL_GetMacrodString(((PPRF_PROFILEDATA)INIChangeEntryPtr)->Dll, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0x11D3633A: CurPos = MINSTALL_GetNumericValue(&((PPRF_PROFILEDATA)INIChangeEntryPtr)->Id, CurPos, EndPos); break; } } break; case PRF_PROFILESTRING_ID: // ============ PRF - ProfileString while ((CurPosInis, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0x6C0B80B7: CurPos = MINSTALL_GetMacrodString(((PPRF_PROFILESTRING)INIChangeEntryPtr)->AppNames, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0xEF227EDE: CurPos = MINSTALL_GetMacrodString(((PPRF_PROFILESTRING)INIChangeEntryPtr)->KeyNames, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0x384CCEAA: CurPos = MINSTALL_GetMacrodString(((PPRF_PROFILESTRING)INIChangeEntryPtr)->Datas, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; } } break; case SPI_SPIINSTALL_ID: // =============== SPI - SpiInstall while ((CurPosSpiDllName, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; } } break; case WPS_CREATEOBJECT_ID: // ================= WPS - WPObject while ((CurPosWPClassName, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0x6DD04D76: CurPos = MINSTALL_GetMacrodString(((PWPS_CREATEOBJECT)INIChangeEntryPtr)->WPTitle, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0x10108A85: CurPos = MINSTALL_GetMacrodString(((PWPS_CREATEOBJECT)INIChangeEntryPtr)->WPSetupString, MINSTMAX_PATHLENGTH, CurPos, EndPos); break; case 0x379F7EDF: CurPos = MINSTALL_GetMacrodString(((PWPS_CREATEOBJECT)INIChangeEntryPtr)->WPLocation, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0x4DE374A7: CurPos = MINSTALL_GetNumericValue(&((PWPS_CREATEOBJECT)INIChangeEntryPtr)->WPFlags, CurPos, EndPos); break; } } break; case WPS_DESTROYOBJECT_ID: // ================ WPS - WPDestroyObject while ((CurPosWPDestroyObjectID, MINSTMAX_STRLENGTH, CurPos, EndPos); break; } } break; case WPS_WPCLASS_ID: // ================= WPS - WPClass while ((CurPosWPClassNameNew, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0xB933A94C: CurPos = MINSTALL_GetMacrodString(((PWPS_WPCLASS)INIChangeEntryPtr)->WPDllName, MINSTMAX_STRLENGTH, CurPos, EndPos); break; case 0x7F6632F4: CurPos = MINSTALL_GetMacrodString(((PWPS_WPCLASS)INIChangeEntryPtr)->WPReplaceClass, MINSTMAX_STRLENGTH, CurPos, EndPos); break; } } break; default: MINSTLOG_ToFile ("Inconsistent MINSTINI_CheckFuncTable\n"); return FALSE; // Internal error } if (MINSTALL_ErrorMsgID) break; // If any error occured, get out... // Last but not least check if any parameter(s) are missing... if (MINSTALL_CheckForMissingINIParms(CurLineNo)) break; // // Now update current INIChangeArray-Pointers to point behind this entry // INIChangeCustomPtr = (PVOID)(((ULONG)INIChangeEntryPtr)+INIChangeHeaderPtr->Size); // INIChangeHeaderPtr = (PVOID)(((ULONG)INIChangeHeaderPtr)+INIChangeHeaderPtr->Size); INIChangeCount++; } // Put that Array&Count into INIChange-Queue... ScriptFilePtr->GroupPtr->INIChange1stEntry = INIChange1stEntryPtr; ScriptFilePtr->GroupPtr->INIChangeCount = INIChangeCount; // Remove that file from memory... FILE_UnLoadFileControl(&CHANGESCR); // For debugging the memory structure... // FileHandle = fopen ("minstall.out", "wb"); // fwrite(INIChangeArrayPtr, 1, RequiredSpace, FileHandle); // fclose (FileHandle); if (MINSTALL_ErrorMsgID) { // If Error-found during parsing... MSG_SetInsertFileLocation (1, CHANGESCR.Name, CurLineNo); MINSTALL_TrappedError (MINSTALL_ErrorMsgID); return FALSE; } return TRUE; } // **************************************************************************** BOOL MINSTALL_LoadCustomControl (VOID) { PMINSTFILE CurFilePtr = FCF_FileArrayPtr; USHORT CurNo = 0; // Remember this action for cleanup... MINSTALL_Done |= MINSTDONE_LOADCUSTOMCTRLSCR; while (CurNoFlags & MINSTFILE_Flags_CFGCF) { // Is an CONFIG-Control-File, so process it... MINSTLOG_ToFile ("LoadConfigControlFile \"%s\"...\n", CurFilePtr->Name); if (!MINSTALL_LoadConfigControlFile (CurFilePtr)) return FALSE; MINSTLOG_ToFile ("LoadConfigControlFile DONE\n"); } else if (CurFilePtr->Flags & MINSTFILE_Flags_INICF) { // Is an INI-Control-File, so process it... MINSTLOG_ToFile ("LoadINIControlFile \"%s\"...\n", CurFilePtr->Name); if (!(MINSTALL_LoadINIControlFile (CurFilePtr))) return FALSE; MINSTLOG_ToFile ("LoadINIControlFile DONE\n"); } CurFilePtr++; CurNo++; } return TRUE; } VOID MINSTALL_CleanUpCustomControl (VOID) { BOOL CurNo = 0; PMINSTGRP CurGroupPtr = MCF_GroupArrayPtr; PMINSTINIHEADER CurINIChangePtr = 0; PMINSTINIHEADER NextINIChangePtr = 0; // Release CustomControl-memory-blocks... while (CurNoConfigChangeArray) { free (CurGroupPtr->ConfigChangeArray); CurGroupPtr->ConfigChangeArray = 0; } if (CurGroupPtr->ConfigStringArray) { free (CurGroupPtr->ConfigStringArray); CurGroupPtr->ConfigChangeArray = 0; } CurGroupPtr->ConfigChangeCount = 0; // Release INI-Control-Script blocks... CurINIChangePtr = CurGroupPtr->INIChange1stEntry; while (CurINIChangePtr) { NextINIChangePtr = CurINIChangePtr->NextPtr; free (CurINIChangePtr); CurINIChangePtr = NextINIChangePtr; } CurGroupPtr->INIChangeCount = 0; CurGroupPtr++; CurNo++; } // Remove this action from cleanup... MINSTALL_Done &= !MINSTDONE_LOADCUSTOMCTRLSCR; }