// Test.cpp : Defines the entry point for the console application. // #include #include #include #include #define IsDigit(c) ((c) >= '0' && (c) <= '9') //-------------------------------------------------------------------------- // ConvertDotVersionStrToDwords //-------------------------------------------------------------------------- bool fConvertDotVersionStrToDwords(LPSTR pszVer, LPDWORD pdwVer, LPDWORD pdwBuild) { DWORD grVerFields[4] = {0,0,0,0}; char *pch = pszVer; grVerFields[0] = atol(pch); for ( int index = 1; index < 4; index++ ) { while ( IsDigit(*pch) && (*pch != '\0') ) pch++; if ( *pch == '\0' ) break; pch++; grVerFields[index] = atol(pch); } *pdwVer = (grVerFields[0] << 16) + grVerFields[1]; *pdwBuild = (grVerFields[2] << 16) + grVerFields[3]; return true; } //-------------------------------------------------------------------------- // GetStringField2 //-------------------------------------------------------------------------- #define WHITESPACE " \t" DWORD GetStringField2(LPSTR szStr, UINT uField, LPSTR szBuf, UINT cBufSize) { LPSTR pszBegin = szStr; LPSTR pszEnd; UINT i = 0; DWORD dwToCopy; if ( (cBufSize == 0) || (szStr == NULL) || (szBuf == NULL) ) { return 0; } szBuf[0] = '\0'; // look for fields based on commas but handle quotes. for ( ;i < uField; i++ ) { // skip spaces pszBegin += strspn(pszBegin, WHITESPACE); // handle quotes if ( *pszBegin == '"' ) { pszBegin = strchr(++pszBegin, '"'); if ( pszBegin == NULL ) { return 0; // invalid string } pszBegin++; // skip trailing quote // find start of next string pszBegin += strspn(pszBegin, WHITESPACE); if ( *pszBegin != ',' ) { return 0; } } else { pszBegin = strchr(++pszBegin, ','); if ( pszBegin == NULL ) { return 0; // field isn't here } } pszBegin++; } // pszBegin points to the start of the desired string. // skip spaces pszBegin += strspn(pszBegin, WHITESPACE); // handle quotes if ( *pszBegin == '"' ) { pszEnd = strchr(++pszBegin, '"'); if ( pszEnd == NULL ) { return 0; // invalid string } } else { pszEnd = pszBegin + 1 + strcspn(pszBegin + 1, ","); while ( (pszEnd > pszBegin) && ((*(pszEnd - 1) == ' ') || (*(pszEnd - 1) == '\t')) ) { pszEnd--; } } dwToCopy = pszEnd - pszBegin + 1; if ( dwToCopy > cBufSize ) { dwToCopy = cBufSize; } lstrcpynA(szBuf, pszBegin, dwToCopy); return dwToCopy - 1; } void Usage(char *pszExeName); class FakeICifComponent : public ICifComponent { public: FakeICifComponent(LPSTR pszCIFFile, LPSTR pszID) : m_pszCIFFile(pszCIFFile), m_pszID(pszID) {} STDMETHOD(GetID)(THIS_ LPSTR pszID, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetGUID)(THIS_ LPSTR pszGUID, DWORD dwSize) { return (GetPrivateProfileString(m_pszID, "GUID", "", pszGUID, dwSize, m_pszCIFFile) != 0 ) ? S_OK : E_FAIL; } STDMETHOD(GetDescription)(THIS_ LPSTR pszDesc, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetDetails)(THIS_ LPSTR pszDetails, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetUrl)(THIS_ UINT uUrlNum, LPSTR pszUrl, DWORD dwSize, LPDWORD pdwUrlFlags) { return E_NOTIMPL; } STDMETHOD(GetFileExtractList)(THIS_ UINT uUrlNum, LPSTR pszExtract, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetUrlCheckRange)(THIS_ UINT uUrlNum, LPDWORD pdwMin, LPDWORD pdwMax) { return E_NOTIMPL; } STDMETHOD(GetCommand)(THIS_ UINT uCmdNum, LPSTR pszCmd, DWORD dwCmdSize, LPSTR pszSwitches, DWORD dwSwitchSize, LPDWORD pdwType) { return E_NOTIMPL; } STDMETHOD(GetVersion)(THIS_ LPDWORD pdwVersion, LPDWORD pdwBuild) { char szBuf[100]; if ( GetPrivateProfileString(m_pszID, "VERSION", "", szBuf, sizeof(szBuf), m_pszCIFFile) == 0 ) return E_FAIL; fConvertDotVersionStrToDwords(szBuf, pdwVersion, pdwBuild); return S_OK; } STDMETHOD(GetLocale)(THIS_ LPSTR pszLocale, DWORD dwSize) { return (GetPrivateProfileString(m_pszID, "LOCALE", "", pszLocale, dwSize, m_pszCIFFile) != 0 ) ? S_OK : E_FAIL; } STDMETHOD(GetUninstallKey)(THIS_ LPSTR pszKey, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetInstalledSize)(THIS_ LPDWORD pdwWin, LPDWORD pdwApp) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetDownloadSize)(THIS) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetExtractSize)(THIS) { return E_NOTIMPL; } STDMETHOD(GetSuccessKey)(THIS_ LPSTR pszKey, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetProgressKeys)(THIS_ LPSTR pszProgress, DWORD dwProgSize, LPSTR pszCancel, DWORD dwCancelSize) { return E_NOTIMPL; } STDMETHOD(IsActiveSetupAware)(THIS) { return E_NOTIMPL; } STDMETHOD(IsRebootRequired)(THIS) { return E_NOTIMPL; } STDMETHOD(RequiresAdminRights)(THIS) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetPriority)(THIS) { return E_NOTIMPL; } STDMETHOD(GetDependency)(THIS_ UINT uDepNum, LPSTR pszID, DWORD dwBuf, char *pchType, LPDWORD pdwVer, LPDWORD pdwBuild) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetPlatform)(THIS) { return E_NOTIMPL; } STDMETHOD(GetMode)(THIS_ UINT uModeNum, LPSTR pszMode, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetGroup)(THIS_ LPSTR pszID, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(IsUIVisible)(THIS) { return E_NOTIMPL; } STDMETHOD(GetPatchID)(THIS_ LPSTR pszID, DWORD dwSize) { return E_NOTIMPL; } STDMETHOD(GetDetVersion)(THIS_ LPSTR pszDLL, DWORD dwdllSize, LPSTR pszEntry, DWORD dwentSize) { HRESULT hr = S_OK; char szBuf[100]; if ( (GetPrivateProfileString(m_pszID, "DetectVersion", "", szBuf, sizeof(szBuf), m_pszCIFFile) == 0 ) || (GetStringField2(szBuf, 0, pszDLL, dwdllSize) == 0) || (GetStringField2(szBuf, 1, pszEntry, dwentSize) == 0) ) { hr = E_FAIL; } return hr; } STDMETHOD(GetTreatAsOneComponents)(THIS_ UINT uNum, LPSTR pszID, DWORD dwBuf) { return E_NOTIMPL; } STDMETHOD(GetCustomData)(LPSTR pszKey, LPSTR pszData, DWORD dwSize) { char szBuf[100]; lstrcpy(szBuf, "_"); lstrcat(szBuf, pszKey); return (GetPrivateProfileString(m_pszID, szBuf, "", pszData, dwSize, m_pszCIFFile) != 0 ) ? S_OK : E_FAIL; } // access to state STDMETHOD_(DWORD, IsComponentInstalled)(THIS) { return E_NOTIMPL; } STDMETHOD(IsComponentDownloaded)(THIS) { return E_NOTIMPL; } STDMETHOD_(DWORD, IsThisVersionInstalled)(THIS_ DWORD dwAskVer, DWORD dwAskBld, LPDWORD pdwVersion, LPDWORD pdwBuild) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetInstallQueueState)(THIS) { return E_NOTIMPL; } STDMETHOD(SetInstallQueueState)(THIS_ DWORD dwState) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetActualDownloadSize)(THIS) { return E_NOTIMPL; } STDMETHOD_(DWORD, GetCurrentPriority)(THIS) { return E_NOTIMPL; } STDMETHOD(SetCurrentPriority)(THIS_ DWORD dwPriority) { return E_NOTIMPL; } private: LPSTR m_pszCIFFile; LPSTR m_pszID; }; //-------------------------------------------------------------------------- // main //-------------------------------------------------------------------------- int __cdecl main(int argc, char* argv[]) { HRESULT hr = E_FAIL; HINSTANCE hLib; DETECTVERSION fpDetVer; DETECTION_STRUCT Det; DWORD dwInstalledVer = 1; DWORD dwInstalledBuild = 1; char szDll[MAX_PATH]; char szEntryPoint[MAX_PATH]; char szCIFFile[MAX_PATH]; LPSTR pszCIFFile; LPSTR pszID; char szGUID[100]; char szLocale[100]; // check args if ( argc != 3 ) { Usage(argv[0]); return 1; } pszCIFFile = _fullpath(szCIFFile, argv[1], sizeof(szCIFFile)); if ( pszCIFFile == NULL ) { printf("Cannot find file %s.\n", argv[1]); return 1; } pszID = argv[2]; memset(&Det, 0, sizeof(Det)); Det.dwSize = sizeof(DETECTION_STRUCT); Det.pdwInstalledVer = &dwInstalledVer; Det.pdwInstalledBuild = &dwInstalledBuild; // load this information from the CIF file FakeICifComponent FakeCifComp(pszCIFFile, pszID); /* if ( FAILED(FakeCifComp.GetGUID(szGUID, sizeof(szGUID))) ) { printf("Cannot find GUID in CIF file.\n"); return 1; } Det.pszGUID = szGUID; if ( FAILED(FakeCifComp.GetLocale(szLocale, sizeof(szLocale))) ) { printf("Cannot find Locale in CIF file.\n"); return 1; } Det.pszLocale = szLocale; if ( FAILED(FakeCifComp.GetVersion(&Det.dwAskVer, &Det.dwAskBuild)) ) { printf("Cannot find Version in CIF file.\n"); return 1; } */ if ( FAILED(FakeCifComp.GetDetVersion(szDll, sizeof(szDll), szEntryPoint, sizeof(szEntryPoint))) ) { printf("Cannot find DetectVersion in CIF file.\n"); return 1; } Det.pCifComp = &FakeCifComp; hLib = LoadLibrary(szDll); if ( hLib == NULL ) { printf("Could not load detection library.\n"); } else { fpDetVer = (DETECTVERSION)GetProcAddress(hLib, szEntryPoint); if ( fpDetVer != NULL ) { DWORD dwStatus = fpDetVer(&Det); switch ( dwStatus ) { case DET_NOTINSTALLED: printf("Detection Status : ICI_NOTINSTALLED\n"); break; case DET_INSTALLED: printf("Detection Status : ICI_INSTALLED\n"); break; case DET_NEWVERSIONINSTALLED: printf("Detection Status : ICI_OLDVERSIONAVAILABLE\n"); break; case DET_OLDVERSIONINSTALLED: printf("Detection Status : ICI_NEWVERSIONAVAILABLE\n"); break; default: printf("Detection Status : unknown status %d\n", dwStatus); break; } } FreeLibrary(hLib); } return hr; } //-------------------------------------------------------------------------- // Usage //-------------------------------------------------------------------------- void Usage(char *pszExeName) { printf("Usage:\n\n"); printf("%s \n", pszExeName); printf("\n"); printf("e.g. %s wu.cif chrome\n", pszExeName); }