1110xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
1120xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
1130xff,0x00,0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff,
1140x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0xff,0xff,0xff,0x16,0xff,0x17,
1150x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
1160x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0x34,0x35,0x36,
1170x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,
1180x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xff,0x53,0x54,0xff,
122"!$%&'()*+,-.0123456789=?@ABCDEFGHIJKLMNO"
123"PQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwx"
140 for(
i=0;
i<20;
i++ )
167 unsigned int x, *
p,
i;
169 p = (
unsigned int*)
guid;
305 WCHAR keypath[0x200];
313 lstrcpyW(keypath,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
349 lstrcpyW(keypath,
L"Software\\Classes\\Installer\\Products\\");
355 lstrcpyW( keypath,
L"Software\\Microsoft\\Installer\\Products\\" );
364 ERR(
"Failed to retrieve user SID\n");
370 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\%s\\Installer\\Products\\%s",
371 szUserSid, squashed_pc );
385 lstrcpyW( keypath,
L"Software\\Microsoft\\Installer\\Products\\" );
397 lstrcpyW( keypath,
L"Software\\Microsoft\\Installer\\Patches\\" );
416 lstrcpyW(keypath,
L"Software\\Classes\\Installer\\Features\\");
422 lstrcpyW(keypath,
L"Software\\Microsoft\\Installer\\Features\\");
431 ERR(
"Failed to retrieve user SID\n");
437 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\%s\\Installer\\Features\\%s",
438 szUserSid, squashed_pc );
452 lstrcpyW( keypath,
L"Software\\Microsoft\\Installer\\Features\\" );
465 lstrcpyW(keypath,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Features\\");
475 static const WCHAR fmtW[] =
476 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products\\%s\\Features";
493 ERR(
"Failed to retrieve user SID\n");
514 lstrcpyW(keypath,
L"Software\\Microsoft\\Installer\\Components\\");
521 lstrcpyW(keypath,
L"Software\\Classes\\Installer\\Components\\");
528 static const WCHAR fmtW[] =
529 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Components\\%s";
540 ERR(
"Failed to retrieve user SID\n");
554 static const WCHAR fmtW[] =
555 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Components";
568 ERR(
"Failed to retrieve user SID\n");
584 static const WCHAR fmtW[] =
585 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products\\%s";
600 ERR(
"Failed to retrieve user SID\n");
612 static const WCHAR fmtW[] =
613 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Patches\\%s";
626 ERR(
"Failed to retrieve user SID\n");
638 static const WCHAR fmtW[] =
639 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Patches";
654 ERR(
"Failed to retrieve user SID\n");
668 static const WCHAR fmtW[] =
669 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products\\%s\\Patches";
682 ERR(
"Failed to retrieve user SID\n");
694 static const WCHAR fmtW[] =
695 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products\\%s\\InstallProperties";
710 ERR(
"Failed to retrieve user SID\n");
722 static const WCHAR fmtW[] =
723 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\%s\\Products";
738 ERR(
"Failed to retrieve user SID\n");
776 lstrcpyW( keypath,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Patches\\" );
791 lstrcpyW( keypath,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\" );
805 lstrcpyW(keypath,
L"Software\\Microsoft\\Installer\\UpgradeCodes\\");
836 lstrcpyW(keypath,
L"Software\\Microsoft\\Installer\\UpgradeCodes\\");
883 lstrcpyW(keypath,
L"Software\\Classes\\Installer\\UpgradeCodes\\");
932 GUID product, component;
935 szFeature, szComponent, pUsed);
942 if (!(
p =
wcschr( &szDescriptor[20],
'>' )))
943 p =
wcschr( &szDescriptor[20],
'<' );
947 len = (
p - &szDescriptor[20]);
975 len =
p - szDescriptor + 1;
976 if (*
p ==
'>')
len += 20;
979 if (pUsed) *pUsed =
len;
994 szFeature, szComponent, pUsed);
997 if( szDescriptor && !
str )
1080 HKEY hkeyProduct = 0;
1130 TRACE(
"%s, %#lx, %lu, %p, %p, %p, %p\n",
debugstr_a(user_sid),
ctx,
index,
guid, installed_ctx,
1156 DWORD i = 0, len_component;
1158 HKEY key_components;
1161 L"Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Components",
1162 0,
access, &key_components ))
1202 DWORD i = 0,
j = 0, len_component, len_user;
1204 HKEY key_users, key_components;
1248 if (*sid_len < len_user + 1)
1250 *sid_len = len_user + 1;
1255 *sid_len = len_user;
1260 if (installed_ctx) *installed_ctx =
ctx;
1280 installed_ctx,
sid, sid_len );
1286 installed_ctx,
sid, sid_len );
1306 static DWORD last_index;
1308 TRACE(
"%s, %#lx, %lu, %p, %p, %p, %p\n",
debugstr_w(user_sid),
ctx,
index,
guid, installed_ctx,
1317 if (!
index) last_index = 0;
1363 if (!szComponent || !*szComponent || !szProduct)
1398 FIXME(
"%s, %s, %#lx, %lu, %p, %p, %p, %p\n",
debugstr_a(component),
debugstr_a(usersid),
ctx,
index,
1399 installed_product, installed_ctx,
sid, sid_len );
1407 FIXME(
"%s, %s, %#lx, %lu, %p, %p, %p, %p\n",
debugstr_w(component),
debugstr_w(usersid),
ctx,
index,
1408 installed_product, installed_ctx,
sid, sid_len );
1415 DWORD name_sz, val_sz, name_max, val_max,
type, ofs;
1420 TRACE(
"%s, %lu, %p, %p, %p, %p\n",
debugstr_w(szComponent), iIndex, lpQualBuf, pcchQual, lpAppBuf, pcchAppBuf );
1455 ERR(
"component data has wrong type (%lu)\n",
type );
1460 if (name_sz + 1 >= name_max)
1469 if (val_sz > val_max)
1471 val_max = val_sz +
sizeof (
WCHAR);
1478 ERR(
"should be enough data, but isn't %lu %lu\n", name_sz, val_sz );
1506 DWORD *pcchQualifierBuf,
char *lpApplicationDataBuf,
1507 DWORD *pcchApplicationDataBuf )
1513 TRACE(
"%s, %lu, %p, %p, %p, %p\n",
debugstr_a(szComponent), iIndex, lpQualifierBuf, pcchQualifierBuf,
1514 lpApplicationDataBuf, pcchApplicationDataBuf );
1517 if (szComponent && !comp)
1521 qual.
str.
a = lpQualifierBuf;
1524 appdata.str.a = lpApplicationDataBuf;
1527 &qual, pcchQualifierBuf, &
appdata, pcchApplicationDataBuf );
1536 DWORD *pcchQualifierBuf,
WCHAR *lpApplicationDataBuf,
1537 DWORD *pcchApplicationDataBuf )
1541 TRACE(
"%s, %lu, %p, %p, %p, %p\n",
debugstr_w(szComponent), iIndex, lpQualifierBuf, pcchQualifierBuf,
1542 lpApplicationDataBuf, pcchApplicationDataBuf );
1545 qual.
str.
w = lpQualifierBuf;
1548 appdata.str.w = lpApplicationDataBuf;
1558 WCHAR *lpProductBuf )
1567 if (
NULL == szUpgradeCode)
1569 if (
NULL == lpProductBuf)
1589 char *lpProductBuf )
1599 szwUpgradeCode =
strdupAtoW( szUpgradeCode );
1600 if( !szwUpgradeCode )
1605 iProductIndex, productW );
1611 free( szwUpgradeCode );
1619 DWORD dwIndex,
char *szPatchCode,
char *szTargetProductCode,
1621 DWORD *pcchTargetUserSid )
1628 TRACE(
"%s, %s, %#lx, %lu, %lu, %p, %p, %p, %p, %p\n",
debugstr_a(szProductCode),
debugstr_a(szUserSid),
1629 dwContext, dwFilter, dwIndex, szPatchCode, szTargetProductCode, pdwTargetProductContext, szTargetUserSid,
1630 pcchTargetUserSid );
1632 if (szTargetUserSid && !pcchTargetUserSid)
1635 if (szProductCode) prodcode =
strdupAtoW(szProductCode);
1636 if (szUserSid) usersid =
strdupAtoW(szUserSid);
1639 patch, targprod, pdwTargetProductContext,
1649 if (!szTargetUserSid)
1651 if (pcchTargetUserSid)
1652 *pcchTargetUserSid =
len;
1665 patch, targprod, pdwTargetProductContext,
1674 if (*pcchTargetUserSid <
len + 1)
1677 *pcchTargetUserSid =
len *
sizeof(
WCHAR);
1680 *pcchTargetUserSid =
len;
1694 HKEY prod, hkey = 0;
1702 usersid, &prod,
FALSE);
1740 HKEY prod, patchkey = 0;
1741 HKEY localprod = 0, localpatch = 0;
1880 lstrcpynW(targetsid, usersid, *sidsize);
1889 *sidsize *=
sizeof(
WCHAR);
1903 WCHAR **szTransforms)
1917 szPatchCode, szTargetProductCode, pdwTargetProductContext, szTargetUserSid,
1918 pcchTargetUserSid, szTransforms);
1926 szPatchCode, szTargetProductCode, pdwTargetProductContext, szTargetUserSid,
1927 pcchTargetUserSid, szTransforms);
1935 szPatchCode, szTargetProductCode, pdwTargetProductContext, szTargetUserSid,
1936 pcchTargetUserSid, szTransforms);
1952 DWORD *pcchTargetUserSid )
1958 static DWORD last_index;
1960 TRACE(
"%s, %s, %#lx, %lu, %lu, %p, %p, %p, %p, %p)\n",
debugstr_w(szProductCode),
debugstr_w(szUserSid),
1961 dwContext, dwFilter, dwIndex, szPatchCode, szTargetProductCode, pdwTargetProductContext, szTargetUserSid,
1962 pcchTargetUserSid );
1964 if (!szProductCode || !
squash_guid( szProductCode, squashed_pc ))
1967 if (szUserSid && !
wcscmp( szUserSid,
L"S-1-5-18" ))
1980 if (dwIndex && dwIndex - last_index != 1)
1986 r =
enum_patches(szProductCode, szUserSid, dwContext, dwFilter, dwIndex, &
idx, szPatchCode, szTargetProductCode,
1987 pdwTargetProductContext, szTargetUserSid, pcchTargetUserSid,
NULL);
1990 last_index = dwIndex;
2001 DWORD *pcchTransformsBuf )
2007 TRACE(
"%s, %lu, %p, %p, %p\n",
debugstr_a(szProduct), iPatchIndex, lpPatchBuf, lpTransformsBuf,
2008 pcchTransformsBuf );
2010 if (!szProduct || !lpPatchBuf || !lpTransformsBuf || !pcchTransformsBuf)
2017 len = *pcchTransformsBuf;
2038 lpTransformsBuf[*pcchTransformsBuf - 1] =
'\0';
2039 *pcchTransformsBuf =
len * 2;
2042 *pcchTransformsBuf =
strlen( lpTransformsBuf );
2055 DWORD *pcchTransformsBuf )
2062 TRACE(
"%s, %lu, %p, %p, %p)\n",
debugstr_w(szProduct), iPatchIndex, lpPatchBuf, lpTransformsBuf,
2063 pcchTransformsBuf );
2065 if (!szProduct || !
squash_guid( szProduct, squashed_pc ))
2068 if (!lpPatchBuf || !lpTransformsBuf || !pcchTransformsBuf)
2086 lstrcpynW(lpTransformsBuf, transforms, *pcchTransformsBuf);
2087 if (*pcchTransformsBuf <=
lstrlenW(transforms))
2090 *pcchTransformsBuf =
lstrlenW(transforms);
2093 *pcchTransformsBuf =
lstrlenW(transforms);
2107 TRACE(
"%s, %s, %#lx, %lu, %p, %p, %p, %p\n",
debugstr_a(product),
debugstr_a(usersid),
ctx,
index,
2108 installed_product, installed_ctx,
sid, sid_len );
2112 if (usersid && !(usersidW =
strdupAtoW( usersid )))
2124 installed_ctx, sidW, sid_len );
2168 if (sid_len && *sid_len < 1)
2175 if (installed_product)
unsquash_guid( product, installed_product );
2193 const WCHAR *subkey;
2195 DWORD i = 0,
j = 0, len_product, len_user;
2197 HKEY key_users, key_products;
2201 subkey =
L"\\Installer\\Products";
2207 subkey =
L"\\Software\\Microsoft\\Installer\\Products";
2252 if (sid_len && *sid_len <= len_user)
2254 *sid_len = len_user;
2259 if (installed_product)
unsquash_guid( product, installed_product );
2260 if (installed_ctx) *installed_ctx =
ctx;
2264 *sid_len = len_user;
2294 idx, installed_product, installed_ctx,
sid, sid_len );
2300 idx, installed_product, installed_ctx,
sid, sid_len );
2315 static DWORD last_index;
2317 TRACE(
"%s, %s, %#lx, %lu, %p, %p, %p, %p\n",
debugstr_w(product),
debugstr_w(usersid),
ctx,
index,
2318 installed_product, installed_ctx,
sid, sid_len );
2326 if (!
index) last_index = 0;
ACPI_SIZE strlen(const char *String)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void user(int argc, const char *argv[])
#define RegCloseKey(hKey)
LSTATUS WINAPI RegDeleteTreeW(_In_ HKEY, _In_opt_ LPCWSTR)
#define ERROR_INSUFFICIENT_BUFFER
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
BOOL WINAPI ConvertSidToStringSidW(PSID Sid, LPWSTR *StringSid)
static WCHAR * strdupAtoW(const char *str)
#define ERROR_INVALID_PARAMETER
#define GetCurrentProcess()
#define ERROR_NO_MORE_ITEMS
#define WideCharToMultiByte
#define ERROR_ACCESS_DENIED
static const WCHAR version[]
UINT msi_strcpy_to_awstring(const WCHAR *str, int len, awstring *awbuf, DWORD *sz)
BOOL unsquash_guid(LPCWSTR in, LPWSTR out)
UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode)
UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT context, HKEY *key, BOOL create)
BOOL decode_base85_guid(LPCWSTR str, GUID *guid)
UINT WINAPI MsiEnumComponentsA(DWORD index, char *lpguid)
static UINT fetch_machine_product(const WCHAR *match, DWORD index, DWORD *idx, WCHAR installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, WCHAR *sid, DWORD *sid_len)
LONG msi_reg_set_val_dword(HKEY hkey, LPCWSTR name, DWORD val)
UINT WINAPI MsiEnumProductsExW(const WCHAR *product, const WCHAR *usersid, DWORD ctx, DWORD index, WCHAR installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, WCHAR *sid, DWORD *sid_len)
static UINT MSI_EnumComponentQualifiers(const WCHAR *szComponent, DWORD iIndex, awstring *lpQualBuf, DWORD *pcchQual, awstring *lpAppBuf, DWORD *pcchAppBuf)
BOOL squash_guid(LPCWSTR in, LPWSTR out)
UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode)
UINT WINAPI MsiEnumClientsExW(const WCHAR *component, const WCHAR *usersid, DWORD ctx, DWORD index, WCHAR installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, WCHAR *sid, DWORD *sid_len)
static const char table_enc85[]
UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid, HKEY *key, BOOL create)
UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY *key, BOOL create)
LONG msi_reg_set_subkey_val(HKEY hkey, LPCWSTR path, LPCWSTR name, LPCWSTR val)
UINT WINAPI MsiEnumProductsW(DWORD index, WCHAR *lpguid)
UINT WINAPI MsiEnumFeaturesW(const WCHAR *szProduct, DWORD index, WCHAR *szFeature, WCHAR *szParent)
UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY *key, BOOL create)
UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context, HKEY *key, BOOL create)
UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY *key, BOOL create)
UINT WINAPI MsiEnumPatchesW(const WCHAR *szProduct, DWORD iPatchIndex, WCHAR *lpPatchBuf, WCHAR *lpTransformsBuf, DWORD *pcchTransformsBuf)
UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY *key, BOOL create)
LONG msi_reg_set_val_multi_str(HKEY hkey, LPCWSTR name, LPCWSTR value)
UINT WINAPI MsiDecomposeDescriptorA(LPCSTR szDescriptor, LPSTR szProduct, LPSTR szFeature, LPSTR szComponent, LPDWORD pUsed)
BOOL encode_base85_guid(GUID *guid, LPWSTR str)
UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, LPCWSTR szUserSid, HKEY *key, BOOL create)
UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid)
UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY *key, BOOL create)
UINT WINAPI MsiEnumPatchesExW(const WCHAR *szProductCode, const WCHAR *szUserSid, DWORD dwContext, DWORD dwFilter, DWORD dwIndex, WCHAR *szPatchCode, WCHAR *szTargetProductCode, MSIINSTALLCONTEXT *pdwTargetProductContext, WCHAR *szTargetUserSid, DWORD *pcchTargetUserSid)
UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode)
UINT WINAPI MsiEnumProductsA(DWORD index, char *lpguid)
UINT WINAPI MsiDecomposeDescriptorW(LPCWSTR szDescriptor, LPWSTR szProduct, LPWSTR szFeature, LPWSTR szComponent, LPDWORD pUsed)
UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY *key, BOOL create)
static const unsigned char table_dec85[0x80]
static UINT fetch_machine_component(DWORD ctx, DWORD index, DWORD *idx, WCHAR guid[39], MSIINSTALLCONTEXT *installed_ctx, LPWSTR sid, LPDWORD sid_len)
UINT WINAPI MsiEnumClientsA(const char *szComponent, DWORD index, char *szProduct)
UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct)
LPWSTR msi_reg_get_val_str(HKEY hkey, LPCWSTR name)
LONG msi_reg_set_val_str(HKEY hkey, LPCWSTR name, LPCWSTR value)
UINT WINAPI MsiEnumRelatedProductsW(const WCHAR *szUpgradeCode, DWORD dwReserved, DWORD iProductIndex, WCHAR *lpProductBuf)
UINT WINAPI MsiEnumClientsW(const WCHAR *szComponent, DWORD index, WCHAR *szProduct)
UINT WINAPI MsiEnumClientsExA(const char *component, const char *usersid, DWORD ctx, DWORD index, char installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, char *sid, DWORD *sid_len)
UINT WINAPI MsiEnumProductsExA(const char *product, const char *usersid, DWORD ctx, DWORD index, char installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, char *sid, DWORD *sid_len)
UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT context, HKEY *key, BOOL create)
UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context)
static WCHAR * get_user_sid(void)
BOOL msi_reg_get_val_dword(HKEY hkey, LPCWSTR name, DWORD *val)
static UINT enum_components(const WCHAR *usersid, DWORD ctx, DWORD index, DWORD *idx, WCHAR guid[39], MSIINSTALLCONTEXT *installed_ctx, LPWSTR sid, LPDWORD sid_len)
static UINT enum_products(const WCHAR *product, const WCHAR *usersid, DWORD ctx, DWORD index, DWORD *idx, WCHAR installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, WCHAR *sid, DWORD *sid_len)
UINT WINAPI MsiEnumRelatedProductsA(const char *szUpgradeCode, DWORD dwReserved, DWORD iProductIndex, char *lpProductBuf)
UINT WINAPI MsiEnumPatchesExA(const char *szProductCode, const char *szUserSid, DWORD dwContext, DWORD dwFilter, DWORD dwIndex, char *szPatchCode, char *szTargetProductCode, MSIINSTALLCONTEXT *pdwTargetProductContext, char *szTargetUserSid, DWORD *pcchTargetUserSid)
UINT MSIREG_DeleteUpgradeCodesKey(const WCHAR *code)
UINT WINAPI MsiEnumFeaturesA(const char *szProduct, DWORD index, char *szFeature, char *szParent)
UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode)
static UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create)
UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct)
UINT MSIREG_OpenUninstallKey(const WCHAR *product, enum platform platform, HKEY *key, BOOL create)
UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext, HKEY *key, BOOL create)
static UINT fetch_user_component(const WCHAR *usersid, DWORD ctx, DWORD index, DWORD *idx, WCHAR guid[39], MSIINSTALLCONTEXT *installed_ctx, LPWSTR sid, LPDWORD sid_len)
UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, LPCWSTR szUserSid, HKEY *key, BOOL create)
static UINT get_patch_state(const WCHAR *prodcode, const WCHAR *usersid, MSIINSTALLCONTEXT context, WCHAR *patch, MSIPATCHSTATE *state)
UINT WINAPI MsiEnumComponentQualifiersA(const char *szComponent, DWORD iIndex, char *lpQualifierBuf, DWORD *pcchQualifierBuf, char *lpApplicationDataBuf, DWORD *pcchApplicationDataBuf)
UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT context, HKEY *key, BOOL create)
UINT MSIREG_DeleteProductKey(LPCWSTR szProduct)
UINT WINAPI MsiEnumComponentsExW(const WCHAR *user_sid, DWORD ctx, DWORD index, WCHAR guid[39], MSIINSTALLCONTEXT *installed_ctx, WCHAR *sid, DWORD *sid_len)
UINT MSIREG_DeleteUninstallKey(const WCHAR *product, enum platform platform)
UINT WINAPI MsiEnumComponentsExA(const char *user_sid, DWORD ctx, DWORD index, CHAR guid[39], MSIINSTALLCONTEXT *installed_ctx, char *sid, DWORD *sid_len)
static UINT fetch_user_product(const WCHAR *match, const WCHAR *usersid, DWORD ctx, DWORD index, DWORD *idx, WCHAR installed_product[GUID_SIZE], MSIINSTALLCONTEXT *installed_ctx, WCHAR *sid, DWORD *sid_len)
UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context)
UINT WINAPI MsiEnumPatchesA(const char *szProduct, DWORD iPatchIndex, char *lpPatchBuf, char *lpTransformsBuf, DWORD *pcchTransformsBuf)
UINT WINAPI MsiEnumComponentsW(DWORD index, WCHAR *lpguid)
DWORD msi_version_str_to_dword(LPCWSTR p)
static UINT enum_patches(const WCHAR *szProductCode, const WCHAR *szUserSid, DWORD dwContext, DWORD dwFilter, DWORD dwIndex, DWORD *idx, WCHAR *szPatchCode, WCHAR *szTargetProductCode, MSIINSTALLCONTEXT *pdwTargetProductContext, WCHAR *szTargetUserSid, DWORD *pcchTargetUserSid, WCHAR **szTransforms)
static UINT check_product_patches(const WCHAR *prodcode, const WCHAR *usersid, MSIINSTALLCONTEXT context, DWORD filter, DWORD index, DWORD *idx, WCHAR *patch, WCHAR *targetprod, MSIINSTALLCONTEXT *targetctx, WCHAR *targetsid, DWORD *sidsize, WCHAR **transforms)
UINT WINAPI MsiEnumComponentQualifiersW(const WCHAR *szComponent, DWORD iIndex, WCHAR *lpQualifierBuf, DWORD *pcchQualifierBuf, WCHAR *lpApplicationDataBuf, DWORD *pcchApplicationDataBuf)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum type
GLdouble GLdouble GLdouble r
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint GLint GLboolean GLint GLenum access
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
HLOCAL NTAPI LocalFree(HLOCAL hMem)
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
#define memcpy(s1, s2, n)
#define ERROR_FILE_NOT_FOUND
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static const struct access_res create[16]
INTERNETFEATURELIST feature
@ MSIPATCHSTATE_REGISTERED
enum tagMSIPATCHSTATE MSIPATCHSTATE
enum tagMSIINSTALLCONTEXT MSIINSTALLCONTEXT
@ MSIINSTALLCONTEXT_MACHINE
@ MSIINSTALLCONTEXT_USERUNMANAGED
@ MSIINSTALLCONTEXT_USERMANAGED
#define MAX_FEATURE_CHARS
#define SQUASHED_GUID_SIZE
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
#define KEY_ENUMERATE_SUB_KEYS
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
DWORD WINAPI GetLastError(void)
#define ERROR_UNKNOWN_PRODUCT
#define ERROR_UNKNOWN_COMPONENT
#define ERROR_FUNCTION_FAILED
#define ERROR_BAD_CONFIGURATION
static const char appdata[]
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER