// // Copyright (c) 1996 Microsoft Corporation // // // INF.H -- Header for Classes: // // CInfFile // // CInfVersionSection // CInfManufacturerSection // CInfInstallSection // CInfAddRegSection // CInfCopyFilesSection // // CInfManufacturerEntry // CInfModelEntry // CInfCopyFilesEntry // CInfAddRegEntry // // CInfModelEntryAux // // // History: // 05/21/96 JosephJ Created // // class CInfVersionSection; class CInfManufacturerEntry; class CInfManufacturerSection; class CInfModelEntry; class CInfInstallSection; class CInfAddRegSection; class CInfAddRegEntry; class CInfCopyFilesEntry; class CInfCopyFilesSection; class CInfModelEntryAux; // Control flags const DWORD dwCF_EXCLUDE_FROM_SELECT = 0x1<<0; /////////////////////////////////////////////////////////////////////////// // CLASS CInfFile /////////////////////////////////////////////////////////////////////////// // Represents an inf (device information) file -- which is a special kind // of INI file. class CInfFile { public: CInfFile(void); ~CInfFile(); //-------------- Load ------------------ // Loads the specified file. (Obviously) only one file can be loaded at // a time. BOOL Load (const TCHAR rgchPathname[]); //-------------- Unload ------------------ // Unloads a previously loaded file. If there are open sessions to this // object, Unload returns a handle which will be signalled when all // sessions are closed. New sessions will not be allowed after this // function returns. The call should free the handle. // See CloseSession for more info. HANDLE Unload (void); //-------------- OpenSession ------------------ // Open a session to this object. The object will not be unloaded until // this session is closed. 0 indicates failure. // TODO: unimplemented const void * OpenSession (void) const {return (const void *) 1;} //-------------- CloseSession ------------------ // Close the specified session to this object. // If the reference count goes to zero and we're marked for unloading, // the object is unloaded as well. // TODO: unimplemented void CloseSession (const void *) const {} // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- GetFileName ------------------ // Get Version info const CInfSymbol * GetFileName(void) const { return m_pSymFileName; } // --------------- GetVersion ------------------ // Get Version info const CInfVersionSection * GetVersion(void) const { return m_pVersion; } // --------------- GetFirstManufacturerEntry ------ // Get first manufacturer entry under the manufacturer section const CInfManufacturerEntry * GetFirstManufacturerEntry(void) const { return m_pFirstManuE; } #if (TODO) // --------------- GetFirstStringEntry -------------- // Get first string entry under the strings section const CInfStringEntry * GetFirstStringEntry(void) const; DestinationDirs // --------------- LookupManufacturerSection ---------- // Lookup and return the manufacturer section with the specified name. const CInfManufacturerSection * LookupInstallSection(const CInfSymbol *pSymManSection) const; // --------------- LookupInstallSection ---------- // Lookup and return the install section with the specified name. const CInfInstallSection * LookupInstallSection(const TCHAR pchName[])const; // --------------- LookupAddRegSection -------------- // Lookup and return the addreg section with the specifed name. const CInfAddRegSection * LookupAddRegSection(const TCHAR pchName[]) const; // --------------- LookupString -------------- // Lookup and return the specified string const CInfSymbol * LookupString(const TCHAR pchName[]) const; #endif // TODO private: // ============= PRIVATE MEMBER FUNCTIONS =============== void mfn_EnterCrit(void) const {m_sync.EnterCrit();} void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();} void mfn_Cleanup(void); // ============= PRIVATE STATIC HELPER FUNCTIONS ======== static const CInfManufacturerEntry * sfn_CreateManufacturerList(CIniFile *); static void sfn_DeleteManufacturerList(const CInfManufacturerEntry *); // ======================= DATA ======================== const CInfVersionSection * m_pVersion; const CInfManufacturerEntry * m_pFirstManuE; const CInfSymbol * m_pSymFileName; CSync m_sync; CIniFile *m_pIniFile; }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfVersionSection /////////////////////////////////////////////////////////////////////////// // Sample Version section: // [Version] // LayoutFile=layout.inf // Signature="$CHICAGO$" // Class=Modem // ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318} // Provider=%MS% class CInfVersionSection { public: CInfVersionSection(void) { m_pSymLayoutFile = NULL; m_pSymSignature = NULL; m_pSymClass = NULL;; m_pSymClassGUID = NULL; m_pSymProvider = NULL; m_dwChecksum = 0; } ~CInfVersionSection() { } // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- Checksum ------------------ // Return checksum of contents DWORD Checksum(void) const { return m_dwChecksum; } // --------------- GetLayoutFile ------------------ const CInfSymbol * GetLayoutFile (void) const { return m_pSymLayoutFile; } // --------------- GetSignature ------------------ const CInfSymbol * GetSignature (void) const { return m_pSymSignature; } // --------------- GetClass ------------------ const CInfSymbol * GetClass (void) const { return m_pSymClass; } // --------------- GetClassGUID ------------------ const CInfSymbol * GetClassGUID (void) const { return m_pSymClassGUID; } // --------------- GetProvider ------------------ const CInfSymbol * GetProvider (void) const { return m_pSymProvider; } private: friend class CInfFile; BOOL Load(const CIniFile *); void Unload(void); void mfn_Cleanup(void); const CInfSymbol * m_pSymLayoutFile; const CInfSymbol * m_pSymSignature; const CInfSymbol * m_pSymClass; const CInfSymbol * m_pSymClassGUID; const CInfSymbol * m_pSymProvider; DWORD m_dwChecksum; }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfManufacturerEntry /////////////////////////////////////////////////////////////////////////// // Sample Manufacturer list section: // [Manufacturer] // %Generic% = Generic // %MagicRam% = MagicRam // .. class CInfManufacturerEntry: private CInfList { public: CInfManufacturerEntry(const CInfManufacturerEntry *pNext) : CInfList(NULL, pNext), m_pManuS(NULL), m_pSymManuName(NULL) {} ~CInfManufacturerEntry() {} // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- GetManufacturerSection ---------- // Get manufacturer section const CInfManufacturerSection * GetManufacturerSection (void) const { return m_pManuS; } // --------------- GetName ------------------ // Get manufacturer name (actual manufacturer name, not %xxxx%.) const CInfSymbol * GetName (void) const { return m_pSymManuName; } // --------------- Next ------------------ // Get next Entry. NULL if no more... const CInfManufacturerEntry * Next(void) const { return (const CInfManufacturerEntry *) CInfList::Next(); } // --------------- Load ------------------ BOOL Load( const CIniFile *pIniFile, const CIniFileSection *pISStr, const CIniFileEntry *pIE ); // --------------- Unload ------------------ void Unload(void); //-------------- ReverseList ------------------ // Reverses the implicit list of manufacturer entries static void ReverseList(CInfManufacturerEntry **ppManuE) { CInfList::ReverseList((const CInfList **) ppManuE); } private: void mfn_Cleanup(void); const CInfManufacturerSection *m_pManuS; const CInfSymbol *m_pSymManuName; }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfManufacturerSection /////////////////////////////////////////////////////////////////////////// // Sample Manufacturer section: // [Generic] // %Gen% = Gen, MDMGEN // %Gen3% = Gen3, MDMGEN3 // %Gen12% = Gen12, MDMGEN12 // %Gen24% = Gen24, MDMGEN24 // ... class CInfManufacturerSection { public: CInfManufacturerSection(void) { m_eObjSig=eOBJSIG_CInfManufacturerSection; m_pSymSectionName = NULL; m_pFirstModelE = NULL; } ~CInfManufacturerSection() //TODO { m_eObjSig = eOBJSIG_INVALID; } // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- GetFirstModelEntry -------------- // Get first model entry const CInfModelEntry * GetFirstModelEntry (void) const; // --------------- GetSectionName ------------------ // Get section name const CInfSymbol * GetSectionName (void) const { return m_pSymSectionName; } // --------------- Load ------------------ BOOL Load ( const CIniFile *pIniFile, const CIniFileSection *pISStr, const CInfSymbol *pSymManuSection ); // --------------- Unload ------------------ void Unload(void); // --------------- Validate ------------------ BOOL Validate(void) const { // TODO: can place in try-except clause... return this && m_eObjSig==eOBJSIG_CInfManufacturerSection; } #if (TODO) // --------------- GetName ------------------ // Get manufacturer name (actual manufacturer name), const CInfSymbol * GetName (void) const; #endif private: void mfn_Cleanup(void); // Static helper function const CInfModelEntry * sfn_CreateModelList( const CIniFile *pIniFile, const CIniFileSection *pISStr, const CIniFileSection *pISManuS ); const CInfSymbol *m_pSymSectionName; const CInfModelEntry * m_pFirstModelE; eOBJSIG m_eObjSig; }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfModelEntry /////////////////////////////////////////////////////////////////////////// // Sample Model entry: // %Gen% = Gen, MDMGEN class CInfModelEntry : private CInfList { public: CInfModelEntry(const CInfModelEntry *pNext) : CInfList(NULL, pNext) { /*TODO*/ m_dwControlFlags_All = dwCF_EXCLUDE_FROM_SELECT; m_dwControlFlags_NT_All = dwCF_EXCLUDE_FROM_SELECT; m_dwControlFlags_NT_Alpha = dwCF_EXCLUDE_FROM_SELECT; m_dwControlFlags_NT_PPC = dwCF_EXCLUDE_FROM_SELECT; m_dwControlFlags_NT_Mips = dwCF_EXCLUDE_FROM_SELECT; } ~CInfModelEntry() {/*TODO*/} // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- Load ------------------ BOOL Load( const CIniFile *pIniFile, const CIniFileSection *pISStr, const CIniFileEntry *pIE ); // --------------- Unload ------------------ void Unload(void); // --------------- GetNext ------------------ // Get next Entry. NULL if no more... const CInfModelEntry * Next(void) const { return (const CInfModelEntry *) CInfList::Next(); } //-------------- ReverseList ------------------ // Reverses the implicit list of model entries static void ReverseList(CInfModelEntry **ppModelE) { CInfList::ReverseList((const CInfList **) ppModelE); } // --------------- GetLHS ------------------ // Get next Entry. NULL if no more... const CInfSymbol * GetLHS(void) const { // TODO return gSymtab.Lookup(TEXT("%bongo101%"), TRUE); } // --------------- GetInstallSection -------------- // Get install section const CInfInstallSection * GetInstallSection (void) const { return m_pInstallSection; } // --------------- GetName ------------------ // Get model name (actual model name, not %xxx%) const CInfSymbol * GetName (void) const { // TODO //return m_pSymName; return gSymtab.Lookup(TEXT("Christy Brinkly"), TRUE); } // --------------- GetRank0ID ------------------ // Rank-0 ID const CInfSymbol * GetRank0ID (void) const { // TODO //return m_pSymRank0ID; // TODO return gSymtab.Lookup(TEXT("RANK-0-ID"), TRUE); } // --------------- GetRank1ID ------------------ // Rank-1 ID const CInfSymbol * GetRank1ID (void) const { // TODO // return m_pSymRank1ID; return gSymtab.Lookup(TEXT("RANK-1-ID"), TRUE); } // --------------- GetRank2ID ------------------ // Rank-2 ID const CInfSymbol * GetRank2ID (void) const { // TODO // return m_pSymRank2ID; return gSymtab.Lookup(TEXT("RANK-2-ID"), TRUE); } // --------------- GetControlFlags ----------------- // Return install flags (one or more dwCF_* flags) for the specified // platform. DWORD GetControlFlags(ePLATFORM ePlat) const { DWORD dwRet = 0; switch(ePlat) { case ePLAT_ALL: break; case ePLAT_NT_ALL: dwRet = m_dwControlFlags_NT_All; break; case ePLAT_NT_ALPHA: dwRet = m_dwControlFlags_NT_Alpha; break; case ePLAT_NT_PPC: dwRet = m_dwControlFlags_NT_PPC; break; case ePLAT_NT_MIPS: dwRet = m_dwControlFlags_NT_Mips; break; default: break; } return dwRet; } private: void mfn_Cleanup(void); const CInfInstallSection * m_pInstallSection; // Pointer to install section const CInfSymbol * m_pSymName; // Device name const CInfSymbol * m_pSymRank0ID; // Rank-0 ID (primary device ID) const CInfSymbol * m_pSymRank1ID; // Rank-1 ID (compatible device ID) const CInfSymbol * m_pSymRank2ID; // Rank-2 ID (Rank 2 ID) DWORD m_dwControlFlags_All; // Install flags (eg exclude from select, needs reboot, etc) that // apply to all platforms. DWORD m_dwControlFlags_NT_All; // Install flags (eg exclude from select, needs reboot, etc) that // apply to all NT platforms. DWORD m_dwControlFlags_NT_Alpha; // Install flags (eg exclude from select, needs reboot, etc) that // apply to NT Alpha platform. DWORD m_dwControlFlags_NT_PPC; // Install flags (eg exclude from select, needs reboot, etc) that // apply to NT PPC platform. DWORD m_dwControlFlags_NT_Mips; // Install flags (eg exclude from select, needs reboot, etc) that // apply to NT MIPS platform. }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfInstallSection /////////////////////////////////////////////////////////////////////////// // Sample Install section: // [Modem29] // AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL // CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help // UpdateInis = VView.Inis // Uninstall = VoiceView_remove // // Also contains info from the related PosDup and NoResDup sections: // // [Modem12.PosDup] // *PNP0500 // // [Modem6.NoResDup] // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15 // class CInfInstallSection { public: CInfInstallSection(void); ~CInfInstallSection(); // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- GetAddRegSectionList ---------- // Get generic list whose data items are pointers to // CInfAddRegSection objects const CInfList * GetAddRegSectionList (void) const; // --------------- GetCopyFilesSectionList ---------- // Get generic list whose data items are pointers to // CInfCopyFilesSection objects const CInfList * GetCopyFilesSectionList (void) const; // --------------- GetNoResDupIDList ---------- // Get generic list whose data items are pointers to // InfSymbol objects representing the Rank0 IDs in the corresponding // NoResDup section. const CInfList * GetNoResDupIDList (void) const; // --------------- GetPosDupIDList ---------- // Get generic list whose data items are pointers to // InfSymbol objects representing the Rank0 IDs in the corresponding // PosDup section. const CInfList * GetPosDupIDList (void) const; #if (TODO) // --------------- GetUpdateInisSectionList ------ // Get generic list whose data items are pointers to // CInfUpdateInisSection objects const CInfList * GetUpdateInisSectionList (void) const; // --------------- GetUninstallSectionList ------ // Get generic list whose data items are pointers to // CInfUninstallSection objects const CInfList * GetUninstallSectionList (void) const; // TODO: Also, treat as errors any sections which we don't understand or // don't expect in a modem inf file or we don't support in the compiler: // eg rename sections, and other fancy INF file constructs. #endif // (TODO) private: void mfn_Cleanup(void); }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfAddRegSection /////////////////////////////////////////////////////////////////////////// // Sample AddReg section: // [All] // HKR,,FriendlyDriver,,Unimodem.vxd // HKR,,DevLoader,,*vcomm // HKR,,ConfigDialog,,modemui.dll // HKR,,EnumPropPages,,"modemui.dll,EnumPropPages" // HKR,,PortSubClass,1,02 // HKR, Init, 1,, "AT" // HKR, Responses, "OK", 1, 00, 00, 00,00,00,00, ...etc. // HKR, Responses, "ERROR", 1, 03, 00, 00,00,00, ...etc. class CInfAddRegSection { public: CInfAddRegSection(void) {/*TODO*/} ~CInfAddRegSection() {/*TODO*/} // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- GetFirstAddRegEntry -------------- // Get first addreg entry const CInfAddRegEntry * GetFirstAddRegEntry (void) const; private: void mfn_Cleanup(void); }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfAddRegEntry /////////////////////////////////////////////////////////////////////////// // Sample AddReg entry: // HKR, Init, 1,, "AT" class CInfAddRegEntry { public: CInfAddRegEntry(void) { // TODO -- faked out m_pSymRegRoot = gSymtab.Lookup(TEXT("HKR"), TRUE); m_pSymSubKey = gSymtab.Lookup(TEXT("Init"), TRUE); m_pSymValueName = gSymtab.Lookup(TEXT("1"), TRUE); m_dwFlag = MAXDWORD; m_pSymValue = gSymtab.Lookup(TEXT("\"AT\""), TRUE); m_dwChecksum = 1000; } ~CInfAddRegEntry() {/*TODO*/} // --------------- Dump ------------------ // Dump state void Dump(void) const { // TODO: unimplemented printf(" HKR, Init, 1,, \"AT\"\n"); } // --------------- Checksum ------------------ // Compute and return checksum of contents DWORD Checksum(void) const { return m_dwChecksum; } // --------------- Next ------------------ // Get next Entry. NULL if no more... const CInfAddRegEntry * Next(void) const { // TODO: unimplemented return NULL; } // --------------- GetRegRoot ------------------ // Get reg-root-string key (HKR, etc) const CInfSymbol * GetRegRoot (void) const { return m_pSymRegRoot; } // --------------- GetSubKey ------------------ // Get sub key, NULL if none. const CInfSymbol * GetSubKey (void) const { return m_pSymSubKey; } // --------------- GetValueName ------------------ // Get value-name, NULL if none. const CInfSymbol * GetValueName (void) const { return m_pSymValueName; } // --------------- GetFlag ------------------ // Get flag-name, MAXDWORD if none. DWORD GetFlag (void) const { return m_dwFlag; } // --------------- GetValue ------------------ // Get value-name, NULL if none. // For binary data, this represents a normalized version of the // string specified in the inf file: it has the format: "xxyxxyxx.." // where xx is 2-digit hex representation of a byte and y is the space // character (' '). For ASCII data, the value is the ascii string without // the enclosing quotes. Extending '\' characters are processed. const CInfSymbol * GetValue (void) const { return m_pSymValue; } #if (TODO) ... more stuff #endif private: void mfn_Cleanup(void); const CInfSymbol * m_pSymRegRoot; const CInfSymbol * m_pSymSubKey; const CInfSymbol * m_pSymValueName; const CInfSymbol * m_pSymValue; DWORD m_dwFlag; DWORD m_dwChecksum; }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfCopyFilesSection /////////////////////////////////////////////////////////////////////////// // Sample DestinationDirs section: // [DestinationDirs] // Register.Copy = 17 ;LDID_INF // VV_Sys = 11 // VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir // VV_Sock_Win = 10 ;LDID_WIN \Windows dir // VV_App = 10 // VV_Help = 18 ;LDID_HELP // Sample Copyfiles section: // [VV_Sys] // fte.dll // vvexe32.exe // wsvv.vxd // Note: each CInfCopyFilesEntry object keeps a pointer to its destination // directory (all the entries for a particular section will have the same // destination dir, because in the inf, a destination directory is associated // with an entire section. class CInfCopyFilesSection { public: // --------------- Dump ------------------ // Dump state void Dump(void) const; // --------------- GetFirstCopyFilesEntry ---------- // Get first copyfiles entry const CInfCopyFilesEntry * GetFirstCopyFilesEntry (void) const; #if (TODO) // Following reflect the Copyfiles.NT* extensions. We need to keep // this information along with the section. enum {PROC_X86, PROC_MIPS, PROC_ALPHA, PROC_PPC} eProcessorType; enum {PLAT_NT, , PLAT_WIN9X} ePlatformType; #endif // (TODO) // TODO: remove following friend declaration once // CInfInstallSection::GetCopyFilesList // is properly implemented (it currently needs to access this // class's constructor. // Also, move ~CInfCopyFIlesEntry to protected when done. friend class CInfInstallSection; ~CInfCopyFilesSection() {/*TODO*/} protected: CInfCopyFilesSection(void) {/*TODO*/} private: void mfn_Cleanup(void); }; /////////////////////////////////////////////////////////////////////////// // CLASS CInfCopyFilesEntry /////////////////////////////////////////////////////////////////////////// // Sample CopyFiles entry: // fte.dll // Note: each CInfCopyFilesEntry object keeps a pointer to its destination // directory. // TODO: keep information about platform & processor as well (see TODO // notes under CInfCopyFilesSection). class CInfCopyFilesEntry { public: // --------------- Dump ------------------ // Dump state void Dump(void) const { // TODO: unimplemented printf(" fte.dll ; goes to 11\n"); } // --------------- Checksum ------------------ // Compute and return checksum of contents // Compute and return checksum of contents DWORD Checksum(void) const { return m_dwChecksum; } // --------------- GetNext ------------------ // Get next Entry. NULL if no more... const CInfCopyFilesEntry * Next(void) const { // TODO: unimplemented return NULL; } // --------------- GetFileName ------------------ // Get file name to be copied. const CInfSymbol * GetFileName (void) const; // --------------- GetDestDir ------------------ // Get file name to be copied. const CInfSymbol * GetDestDir (void) const; // TODO: remove following friend declaration once // CInfCopyFilesSection::GetFirstCopyFilesEntry // is properly implemented (it currently needs to access this // class's constructor. // Also, move ~CInfCopyFIlesEntry to protected when done. friend class CInfCopyFilesSection; ~CInfCopyFilesEntry() {/*TODO*/} protected: CInfCopyFilesEntry(void) { // TODO -- faked out m_dwChecksum = 1001; } private: void mfn_Cleanup(void); DWORD m_dwChecksum; }; #if 0 pInf->Load("mdmgen.inf"); pManuf = pInf->GetFirstManufacturerEntry(); for(;pManuf; pManuf = pManuf->Next()) { pNewDevice = new ModemDevice(pDevice); pDevice->Load(pInf, pManuf); pDevice->Dump(); pDevice = pNewDevice; } pInf->Unload(" NewSession() FreeSession() #endif