// // ParseInf.h // // Code that parses network INF files // #pragma once #ifndef _FAUXMFC #pragma message("error --- The Millennium depgen can't deal with this") //#include #endif #include "SortStr.h" #include "NetConn.h" #include struct INF_LAYOUT_FILE { DWORD dwNameOffset; // byte offset of filename from beginning of string data BYTE iDisk; // disk number within layout BYTE iLayout; // layout file number }; #include struct SOURCE_DISK_INFO { WORD wDiskID; // loword = disk number, hiword = layout file number CString strCabFile; CString strDescription; }; struct DRIVER_FILE_INFO { BYTE nTargetDir; // LDID_* value for target directory, e.g. LDID_WIN CHAR szFileTitle[1]; // file name, followed by target subdirectory }; #define MAKE_DISK_ID(iDiskNumber, iLayoutFile) MAKEWORD(iDiskNumber, iLayoutFile) typedef CTypedPtrArray CSourceDiskArray; //typedef CTypedPtrArray CDriverFileArray; class CDriverFileArray : public CTypedPtrArray { public: ~CDriverFileArray(); }; ////////////////////////////////////////////////////////////////////////////// // Utility functions int GetFullInfPath(LPCTSTR pszPartialPath, LPTSTR pszBuf, int cchBuf); BOOL ModifyInf_NoVersionConflict(LPCTSTR pszInfFile); BOOL ModifyInf_NoCopyFiles(LPCTSTR pszInfFile); BOOL ModifyInf_RequireExclude(LPCTSTR pszInfFile, LPCTSTR pszRequire, LPCTSTR pszExclude); BOOL ModifyInf_NoCopyAndRequireExclude(LPCTSTR pszInfFile, LPCTSTR pszRequire, LPCTSTR pszExclude); BOOL RestoreInfBackup(LPCTSTR pszInfFile); BOOL GetDeviceCopyFiles(LPCTSTR pszInfFileName, LPCTSTR pszDeviceID, CDriverFileArray& rgDriverFiles); int GetStandardTargetPath(int iDirNumber, LPCTSTR pszTargetSubDir, LPTSTR pszBuf); int GetDriverTargetPath(const DRIVER_FILE_INFO* pFileInfo, LPTSTR pszBuf); BOOL CheckInfSectionInstallation(LPCTSTR pszInfFile, LPCTSTR pszInfSection); BOOL InstallInfSection(LPCTSTR pszInfFile, LPCTSTR pszInfSection, BOOL bWait); ////////////////////////////////////////////////////////////////////////////// class CInfParser { public: CInfParser(); ~CInfParser(); BOOL LoadInfFile(LPCTSTR pszInfFile, LPCTSTR pszSeparators = ",;="); BOOL Rewind(); BOOL GotoNextLine(); BOOL GetToken(CString& strTok); BOOL GetLineTokens(CStringArray& sa); BOOL GetSectionLineTokens(CStringArray& sa); BOOL GotoSection(LPCTSTR pszSection); int GetProfileInt(LPCTSTR pszSection, LPCSTR pszKey, int nDefault = 0); BOOL GetDestinationDir(LPCTSTR pszSectionName, BYTE* pbDirNumber, LPTSTR pszSubDir, UINT cchSubDir); BOOL GetFilesFromInstallSection(LPCTSTR pszSection, CDriverFileArray& rgAllFiles); void GetFilesFromCopyFilesSections(const CStringArray& rgCopyFiles, CDriverFileArray& rgAllFiles); int GetNextSourceFile(LPTSTR pszBuf, BYTE* pDiskNumber); void ReadSourceFilesSection(INF_LAYOUT_FILE* prgFiles, int cFiles); void ScanSourceFileList(int* pcFiles, int* pcchAllFileNames); void AddLayoutFiles(LPCTSTR pszInfFile, CInfParser& parser); CString m_strFileName; protected: LPTSTR m_pszFileData; DWORD m_cbFile; DWORD m_iPos; CString m_strSeparators; CString m_strExtSeparators; }; class CInfLayoutFiles { public: CInfLayoutFiles(); ~CInfLayoutFiles(); BOOL Add(LPCTSTR pszInfFile, BOOL bLayoutFile = FALSE); BOOL Add(CInfParser& parser, BOOL bLayoutFile = FALSE); void Sort(); SOURCE_DISK_INFO* FindDriverFileSourceDisk(LPCTSTR pszDriverFileTitle); #ifdef _DEBUG void Dump(); #endif protected: static int __cdecl CompareInfLayoutFiles(const void* pEl1, const void* pEl2); static LPTSTR s_pStringData; protected: INF_LAYOUT_FILE* m_prgFiles; LPTSTR m_pStringData; int m_cFiles; int m_cbStringData; CSortedStringArray m_rgLayoutFileNames; // List of source disks generated from all layout files CSourceDiskArray m_rgSourceDisks; #ifdef _DEBUG BOOL m_bSorted; #endif }; class CInfFileList { public: CInfFileList(); ~CInfFileList(); BOOL AddBaseFiles(LPCTSTR pszInfFile); BOOL AddDeviceFiles(LPCTSTR pszInfFile, LPCTSTR pszDeviceID); int BuildSourceFileList(); void SetDriverSourceDir(LPCTSTR pszSourceDir); BOOL FindWindowsCD(HWND hwndParent); BOOL CopySourceFiles(HWND hwndParent, LPCTSTR pszDestDir, PROGRESS_CALLBACK pfnProgress, LPVOID pvProgressParam); protected: BOOL CheckWindowsCD(LPCTSTR pszDirectory); BOOL PromptWindowsCD(HWND hwndParent, LPCTSTR pszInitialDir, LPTSTR pszResultDir); protected: // List of all files listed in [SourceDisksFiles] of all INFs and related layouts CInfLayoutFiles m_rgLayoutFiles; // List of all files that are required for the device to function CDriverFileArray m_rgDriverFiles; // Files that need to be present for windows installer to complete installation CSortedStringArray m_rgCabFiles; // cab files from Windows CD CSortedStringArray m_rgSourceFiles; // source files needed from driver dir // Where we'll look first for system files, before prompting user for Windows CD CString m_strDriverSourceDir; // Where we look for Windows files CString m_strWindowsCD; };