msi: Reimplement MsiGetUserInfo.
This commit is contained in:
parent
72fedf7d88
commit
41fe12f149
110
dlls/msi/msi.c
110
dlls/msi/msi.c
|
@ -2295,57 +2295,93 @@ static USERINFOSTATE WINAPI MSI_GetUserInfo(LPCWSTR szProduct,
|
||||||
awstring *lpOrgNameBuf, LPDWORD pcchOrgNameBuf,
|
awstring *lpOrgNameBuf, LPDWORD pcchOrgNameBuf,
|
||||||
awstring *lpSerialBuf, LPDWORD pcchSerialBuf)
|
awstring *lpSerialBuf, LPDWORD pcchSerialBuf)
|
||||||
{
|
{
|
||||||
HKEY hkey;
|
WCHAR squished_pc[SQUISH_GUID_SIZE];
|
||||||
LPWSTR user, org, serial;
|
LPWSTR user, org, serial;
|
||||||
UINT r;
|
|
||||||
USERINFOSTATE state;
|
USERINFOSTATE state;
|
||||||
|
HKEY hkey, props;
|
||||||
|
LPCWSTR orgptr;
|
||||||
|
UINT r;
|
||||||
|
|
||||||
TRACE("%s %p %p %p %p %p %p\n",debugstr_w(szProduct), lpUserNameBuf,
|
static const WCHAR szEmpty[] = {0};
|
||||||
|
|
||||||
|
TRACE("%s %p %p %p %p %p %p\n", debugstr_w(szProduct), lpUserNameBuf,
|
||||||
pcchUserNameBuf, lpOrgNameBuf, pcchOrgNameBuf, lpSerialBuf,
|
pcchUserNameBuf, lpOrgNameBuf, pcchOrgNameBuf, lpSerialBuf,
|
||||||
pcchSerialBuf);
|
pcchSerialBuf);
|
||||||
|
|
||||||
if (!szProduct)
|
if (!szProduct || !squash_guid(szProduct, squished_pc))
|
||||||
return USERINFOSTATE_INVALIDARG;
|
return USERINFOSTATE_INVALIDARG;
|
||||||
|
|
||||||
r = MSIREG_OpenUninstallKey(szProduct, &hkey, FALSE);
|
if (MSIREG_OpenLocalManagedProductKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
|
||||||
if (r != ERROR_SUCCESS)
|
MSIREG_OpenUserProductsKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
|
||||||
|
MSIREG_OpenLocalClassesProductKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
return USERINFOSTATE_UNKNOWN;
|
return USERINFOSTATE_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
user = msi_reg_get_val_str( hkey, INSTALLPROPERTY_REGOWNERW );
|
if (MSIREG_OpenCurrentUserInstallProps(szProduct, &props, FALSE) != ERROR_SUCCESS &&
|
||||||
org = msi_reg_get_val_str( hkey, INSTALLPROPERTY_REGCOMPANYW );
|
MSIREG_OpenLocalSystemInstallProps(szProduct, &props, FALSE) != ERROR_SUCCESS)
|
||||||
serial = msi_reg_get_val_str( hkey, INSTALLPROPERTY_PRODUCTIDW );
|
{
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
return USERINFOSTATE_ABSENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
user = msi_reg_get_val_str(props, INSTALLPROPERTY_REGOWNERW);
|
||||||
|
org = msi_reg_get_val_str(props, INSTALLPROPERTY_REGCOMPANYW);
|
||||||
|
serial = msi_reg_get_val_str(props, INSTALLPROPERTY_PRODUCTIDW);
|
||||||
|
state = USERINFOSTATE_ABSENT;
|
||||||
|
|
||||||
RegCloseKey(hkey);
|
RegCloseKey(hkey);
|
||||||
|
RegCloseKey(props);
|
||||||
|
|
||||||
state = USERINFOSTATE_PRESENT;
|
if (user && serial)
|
||||||
|
state = USERINFOSTATE_PRESENT;
|
||||||
|
|
||||||
if (user)
|
if (pcchUserNameBuf)
|
||||||
{
|
{
|
||||||
r = msi_strcpy_to_awstring( user, lpUserNameBuf, pcchUserNameBuf );
|
if (lpUserNameBuf && !user)
|
||||||
|
{
|
||||||
|
(*pcchUserNameBuf)--;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = msi_strcpy_to_awstring(user, lpUserNameBuf, pcchUserNameBuf);
|
||||||
|
if (r == ERROR_MORE_DATA)
|
||||||
|
{
|
||||||
|
state = USERINFOSTATE_MOREDATA;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcchOrgNameBuf)
|
||||||
|
{
|
||||||
|
orgptr = org;
|
||||||
|
if (!orgptr) orgptr = szEmpty;
|
||||||
|
|
||||||
|
r = msi_strcpy_to_awstring(orgptr, lpOrgNameBuf, pcchOrgNameBuf);
|
||||||
|
if (r == ERROR_MORE_DATA)
|
||||||
|
{
|
||||||
|
state = USERINFOSTATE_MOREDATA;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcchSerialBuf)
|
||||||
|
{
|
||||||
|
if (!serial)
|
||||||
|
{
|
||||||
|
(*pcchSerialBuf)--;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = msi_strcpy_to_awstring(serial, lpSerialBuf, pcchSerialBuf);
|
||||||
if (r == ERROR_MORE_DATA)
|
if (r == ERROR_MORE_DATA)
|
||||||
state = USERINFOSTATE_MOREDATA;
|
state = USERINFOSTATE_MOREDATA;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
state = USERINFOSTATE_ABSENT;
|
|
||||||
if (org)
|
|
||||||
{
|
|
||||||
r = msi_strcpy_to_awstring( org, lpOrgNameBuf, pcchOrgNameBuf );
|
|
||||||
if (r == ERROR_MORE_DATA && state == USERINFOSTATE_PRESENT)
|
|
||||||
state = USERINFOSTATE_MOREDATA;
|
|
||||||
}
|
|
||||||
/* msdn states: The user information is considered to be present even in the absence of a company name. */
|
|
||||||
if (serial)
|
|
||||||
{
|
|
||||||
r = msi_strcpy_to_awstring( serial, lpSerialBuf, pcchSerialBuf );
|
|
||||||
if (r == ERROR_MORE_DATA && state == USERINFOSTATE_PRESENT)
|
|
||||||
state = USERINFOSTATE_MOREDATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
state = USERINFOSTATE_ABSENT;
|
|
||||||
|
|
||||||
msi_free( user );
|
done:
|
||||||
msi_free( org );
|
msi_free(user);
|
||||||
msi_free( serial );
|
msi_free(org);
|
||||||
|
msi_free(serial);
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@ -2360,6 +2396,11 @@ USERINFOSTATE WINAPI MsiGetUserInfoW(LPCWSTR szProduct,
|
||||||
{
|
{
|
||||||
awstring user, org, serial;
|
awstring user, org, serial;
|
||||||
|
|
||||||
|
if ((lpUserNameBuf && !pcchUserNameBuf) ||
|
||||||
|
(lpOrgNameBuf && !pcchOrgNameBuf) ||
|
||||||
|
(lpSerialBuf && !pcchSerialBuf))
|
||||||
|
return USERINFOSTATE_INVALIDARG;
|
||||||
|
|
||||||
user.unicode = TRUE;
|
user.unicode = TRUE;
|
||||||
user.str.w = lpUserNameBuf;
|
user.str.w = lpUserNameBuf;
|
||||||
org.unicode = TRUE;
|
org.unicode = TRUE;
|
||||||
|
@ -2381,6 +2422,11 @@ USERINFOSTATE WINAPI MsiGetUserInfoA(LPCSTR szProduct,
|
||||||
LPWSTR prod;
|
LPWSTR prod;
|
||||||
UINT r;
|
UINT r;
|
||||||
|
|
||||||
|
if ((lpUserNameBuf && !pcchUserNameBuf) ||
|
||||||
|
(lpOrgNameBuf && !pcchOrgNameBuf) ||
|
||||||
|
(lpSerialBuf && !pcchSerialBuf))
|
||||||
|
return USERINFOSTATE_INVALIDARG;
|
||||||
|
|
||||||
prod = strdupAtoW( szProduct );
|
prod = strdupAtoW( szProduct );
|
||||||
if (szProduct && !prod)
|
if (szProduct && !prod)
|
||||||
return ERROR_OUTOFMEMORY;
|
return ERROR_OUTOFMEMORY;
|
||||||
|
|
Loading…
Reference in New Issue