#include "cstore.h" #define SCHEMA_VERSION_NUMBER 1740 #define STRINGGUIDLEN 37 #define STRINGGUIDRDNLEN 37+3 typedef WCHAR STRINGGUID [STRINGGUIDLEN]; typedef WCHAR STRINGGUIDRDN [STRINGGUIDRDNLEN]; typedef FILETIME CSUSN; int StringFromGUID(REFGUID rguid, LPWSTR lptsz); int RDNFromGUID(REFGUID rguid, LPWSTR lptsz); void GUIDFromString(LPWSTR psz, GUID *pclsguid); BOOL IsNullGuid(REFGUID rguid); DWORD NumDigits10(DWORD Value); DWORD GetPropertyFromAttr(ADS_ATTR_INFO *pattr, DWORD cNum, WCHAR *szProperty); void FreeAttr(ADS_ATTR_INFO attr); void PackStrArrToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, WCHAR **pszAttr, DWORD num); void PackDWArrToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, DWORD *pAttr, DWORD num); void PackGUIDArrToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, GUID *pAttr, DWORD num); void PackStrToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, WCHAR *szAttr); void PackDWToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, DWORD Attr); void PackGUIDToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, GUID *pAttr); void PackBinToAttr(ADS_ATTR_INFO *attr, WCHAR *szProperty, BYTE *pAttr, DWORD sz); void PackStrArrToAttrEx(ADS_ATTR_INFO *attr, WCHAR *szProperty, WCHAR **pszAttr, DWORD num, BOOL APPEND); void PackDWArrToAttrEx(ADS_ATTR_INFO *attr, WCHAR *szProperty, DWORD *pAttr, DWORD num, BOOL APPEND); void PackGUIDArrToAttrEx(ADS_ATTR_INFO *attr, WCHAR *szProperty, GUID *pAttr, DWORD num, BOOL APPEND); // ADS_ATTR_INFO structure is returned in GetObjectAttributes. // this is the same structure as columns but has different // fields and has unfortunately 1 unused different member. // this doesn't actually copy and hence should be freed if required // by the user but allocates an array of req'd size in case // of Unpack*Arr template HRESULT UnpackStrArrFrom(AttrOrCol AorC, WCHAR ***ppszAttr, DWORD *num) { DWORD i; *num = 0; *ppszAttr = (LPOLESTR *)CoTaskMemAlloc(sizeof(LPOLESTR)*(AorC.dwNumValues)); if (!(*ppszAttr)) return E_OUTOFMEMORY; for (i = 0; (i < (AorC.dwNumValues)); i++) (*ppszAttr)[i] = AorC.pADsValues[i].DNString; *num = AorC.dwNumValues; return S_OK; } template HRESULT UnpackDWArrFrom(AttrOrCol AorC, DWORD **pAttr, DWORD *num) { DWORD i; ASSERT(AorC.dwADsType == ADSTYPE_INTEGER); *num = 0; *pAttr = (DWORD *)CoTaskMemAlloc(sizeof(DWORD)*(AorC.dwNumValues)); if (!(*pAttr)) return E_OUTOFMEMORY; for (i = 0; (i < (AorC.dwNumValues)); i++) (*pAttr)[i] = (DWORD)AorC.pADsValues[i].Integer; *num = AorC.dwNumValues; return S_OK; } template HRESULT UnpackStrFrom(AttrOrCol AorC, WCHAR **pszAttr) { ASSERT(AorC.dwNumValues <= 1); if (AorC.dwNumValues) *pszAttr = AorC.pADsValues[0].DNString; else *pszAttr = NULL; return S_OK; } template HRESULT UnpackDWFrom(AttrOrCol AorC, DWORD *pAttr) { ASSERT(AorC.dwADsType == ADSTYPE_INTEGER); ASSERT(AorC.dwNumValues <= 1); if (AorC.dwNumValues) *pAttr = (DWORD)AorC.pADsValues[0].Integer; else *pAttr = 0; return S_OK; } template HRESULT UnpackStrArrAllocFrom(AttrOrCol AorC, WCHAR ***ppszAttr, DWORD *num) { DWORD i; *num = 0; *ppszAttr = (LPOLESTR *)CoTaskMemAlloc(sizeof(LPOLESTR)*(AorC.dwNumValues)); if (!(*ppszAttr)) return E_OUTOFMEMORY; for (i = 0; (i < (AorC.dwNumValues)); i++) { (*ppszAttr)[i] = (WCHAR *)CoTaskMemAlloc(sizeof(WCHAR)* (1+wcslen(AorC.pADsValues[i].DNString))); if (!((*ppszAttr)[i])) // BUGBUG:: free all the remaining strings. return E_OUTOFMEMORY; wcscpy((*ppszAttr)[i], AorC.pADsValues[i].DNString); } *num = AorC.dwNumValues; return S_OK; } template HRESULT UnpackStrAllocFrom(AttrOrCol AorC, WCHAR **pszAttr) { ASSERT(AorC.dwNumValues <= 1); if (AorC.dwNumValues) { *pszAttr = (LPOLESTR)CoTaskMemAlloc(sizeof(WCHAR)* (wcslen(AorC.pADsValues[0].DNString)+1)); if (!(*pszAttr)) return E_OUTOFMEMORY; wcscpy(*pszAttr, AorC.pADsValues[0].DNString); } else *pszAttr = NULL; return S_OK; } // GUIDS are not returned properly when using GetObjectAttributes. // Use only search when a GUID has to be returned. template HRESULT UnpackGUIDFrom(AttrOrCol AorC, GUID *pAttr) { ASSERT(AorC.dwNumValues <= 1); if (AorC.dwNumValues) { ASSERT(AorC.pADsValues[0].OctetString.dwLength == sizeof(GUID)); memcpy(pAttr, AorC.pADsValues[0].OctetString.lpValue, AorC.pADsValues[0].OctetString.dwLength); } else memset((void *)(pAttr), 0, sizeof(GUID)); return S_OK; } template HRESULT UnpackGUIDArrFrom(AttrOrCol AorC, GUID **pAttr, DWORD *num) { DWORD i; *pAttr = (GUID *)CoTaskMemAlloc(sizeof(GUID)*AorC.dwNumValues); if (!(*pAttr)) return E_OUTOFMEMORY; for (i = 0; i < (AorC.dwNumValues); i++) { ASSERT(AorC.pADsValues[i].OctetString.dwLength == sizeof(GUID)); memcpy((*pAttr)+i, AorC.pADsValues[i].OctetString.lpValue, AorC.pADsValues[i].OctetString.dwLength); } *num = AorC.dwNumValues; return S_OK; } #define CLASSSTORE_EVENT_SOURCE L"Application Deployment" HRESULT RemapErrorCode(HRESULT ErrorCode, LPOLESTR szContainerName); void UnpackPlatform (DWORD *pdwArch, CSPLATFORM *pPlatform); void PackPlatform (DWORD dwArch, CSPLATFORM *pPlatform); ULONG FindDescription(LPOLESTR *desc, ULONG cdesc, LCID *plcid, LPOLESTR szDescription, BOOL GetPrimary); HRESULT GetCategoryLocaleDesc(LPOLESTR *pdesc, ULONG cdesc, LCID *plcid, LPOLESTR szDescription); HRESULT CreateRepository(LPOLESTR szParentPath, LPOLESTR szStoreName, LPOLESTR szPolicyName); HRESULT DeleteRepository(LPOLESTR szParentPath, LPOLESTR szStoreName); HRESULT GetRootPath(WCHAR *szRootPath); STDAPI ReleasePackageInfo(PACKAGEDISPINFO *PackageInfo); HRESULT GetPackageDetail (HANDLE hPackageADs, LPOLESTR szFullClassName, PACKAGEDETAIL *pPackageDetail); #define LDAPPREFIX L"LDAP://" #define LDAPPREFIXLENGTH 7 #define LDAPPATHSEP L"," #define CLASS_CS_CONTAINER L"classStore" #define CLASS_CS_CLASS L"classRegistration" #define CLASS_CS_PACKAGE L"packageRegistration" #define CLASS_CS_CATEGORY L"categoryRegistration" #define CLASSSTORECONTAINERNAME L"CN=Class Store" #define CLASSCONTAINERNAME L"CN=Classes" #define PACKAGECONTAINERNAME L"CN=Packages" #define CATEGORYCONTAINERNAME L"CN=Categories" #define APPCATEGORYCONTAINERNAME L"CN=AppCategories,CN=Default Domain Policy,CN=System," // // ClassStoreContainer object propertynames // #define STOREVERSION L"appSchemaVersion" #define STOREUSN L"lastUpdateSequence" #define POLICYNAME L"extensionName" #define POLICYDN L"displayName" #define GPNAME L"displayName" // // Class object propertynames // #define PROGIDLIST L"cOMProgID" #define CLASSCLSID L"cOMCLSID" #define TREATASCLSID L"cOMTreatAsClassId" #define IMPL_CATEGORIES L"implementedCategories" #define REQ_CATEGORIES L"requiredCategories" #define CLASSREFCOUNTER L"flags" // BUGBUG:: schema to be put in. // // Package object propertynames // #define PKGTLBIDLIST L"cOMTypelibId" #define PKGCLSIDLIST L"cOMClassID" #define PKGPROGIDLIST L"cOMProgID" #define PKGIIDLIST L"cOMInterfaceID" #define PKGFILEEXTNLIST L"fileExtPriority" #define LOCALEID L"localeID" #define ARCHLIST L"machineArchitecture" #define VERSIONHI L"versionNumberHi" #define VERSIONLO L"versionNumberLo" #define REVISION L"revision" #define PACKAGETYPE L"packageType" #define PACKAGEFLAGS L"packageFlags" #define PACKAGENAME L"packageName" #define SCRIPTPATH L"msiScriptPath" #define SCRIPTNAME L"msiScriptName" #define SCRIPTSIZE L"msiScriptSize" #define HELPURL L"url" #define SETUPCOMMAND L"setupCommand" #define PKGUSN L"lastUpdateSequence" #define MSIFILELIST L"msiFileList" #define PKGCATEGORYLIST L"categories" #define UPGRADESPACKAGES L"canUpgradeScript" #define UILEVEL L"installUiLevel" #define PKGSCRIPT L"msiScript" #define PRODUCTCODE L"productCode" #define MVIPC L"upgradeProductCode" // BUGBUG:: Schema name has to change #define PUBLISHER L"vendor" // // Category object Propertynames // #define DESCRIPTION L"description" #define LOCALEDESCRIPTION L"localizedDescription" #define DEFAULT_LOCALE_ID L"localeID" #define CATEGORYCATID L"categoryId" #define OBJECTCLASS L"objectclass" #define OBJECTDN L"ADsPath" #define OBJECTGUID L"objectGUID" #define DEFAULTCLASSSTOREPATH L"defaultClassStore" #define CAT_DESC_DELIMITER L"::" // Between Locale & Desc in Category #define CAT_DESC_DELIM_LEN 2 #define PKG_UPG_DELIMITER1 L"\\\\" // Between Class Store Name & PkgGuid #define PKG_UPG_DELIM1_LEN 2 #define PKG_UPG_DELIMITER2 L":" // Between PkgGuid & Flag #define PKG_UPG_DELIM2_LEN 1 extern LPOLESTR pszInstallInfoAttrNames[]; extern DWORD cInstallInfoAttr; extern LPOLESTR pszPackageInfoAttrNames[]; extern DWORD cPackageInfoAttr; extern LPOLESTR pszPackageDetailAttrNames[]; extern DWORD cPackageDetailAttr; extern LPOLESTR pszDeleteAttrNames[]; extern DWORD cDeleteAttr; extern LPOLESTR pszCategoryAttrNames[]; extern DWORD cCategoryAttr;