msi: Implement MsiSourceListEnumMediaDisks.
This commit is contained in:
parent
45d7d6a4e1
commit
1bd49bcf74
@ -264,8 +264,8 @@
|
|||||||
268 stdcall MsiSourceListSetInfoW(wstr wstr long long wstr wstr)
|
268 stdcall MsiSourceListSetInfoW(wstr wstr long long wstr wstr)
|
||||||
269 stub MsiEnumPatchesExA
|
269 stub MsiEnumPatchesExA
|
||||||
270 stub MsiEnumPatchesExW
|
270 stub MsiEnumPatchesExW
|
||||||
271 stub MsiSourceListEnumMediaDisksA
|
271 stdcall MsiSourceListEnumMediaDisksA(str str long long long ptr ptr ptr ptr ptr)
|
||||||
272 stub MsiSourceListEnumMediaDisksW
|
272 stdcall MsiSourceListEnumMediaDisksW(wstr wstr long long long ptr ptr ptr ptr ptr)
|
||||||
273 stdcall MsiSourceListAddMediaDiskA(str str long long long str str)
|
273 stdcall MsiSourceListAddMediaDiskA(str str long long long str str)
|
||||||
274 stdcall MsiSourceListAddMediaDiskW(wstr wstr long long long wstr wstr)
|
274 stdcall MsiSourceListAddMediaDiskW(wstr wstr long long long wstr wstr)
|
||||||
275 stub MsiSourceListClearMediaDiskA
|
275 stub MsiSourceListClearMediaDiskA
|
||||||
|
@ -140,6 +140,194 @@ static UINT OpenURLSubkey(HKEY rootkey, HKEY *key, BOOL create)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* MsiSourceListEnumMediaDisksA (MSI.@)
|
||||||
|
*/
|
||||||
|
UINT WINAPI MsiSourceListEnumMediaDisksA(LPCSTR szProductCodeOrPatchCode,
|
||||||
|
LPCSTR szUserSid, MSIINSTALLCONTEXT dwContext,
|
||||||
|
DWORD dwOptions, DWORD dwIndex, LPWORD pdwDiskId,
|
||||||
|
LPSTR szVolumeLabel, LPDWORD pcchVolumeLabel,
|
||||||
|
LPSTR szDiskPrompt, LPDWORD pcchDiskPrompt)
|
||||||
|
{
|
||||||
|
LPWSTR product = NULL;
|
||||||
|
LPWSTR usersid = NULL;
|
||||||
|
LPWSTR volume = NULL;
|
||||||
|
LPWSTR prompt = NULL;
|
||||||
|
DWORD volumesz, promptsz;
|
||||||
|
UINT r = ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p, %p)\n", debugstr_a(szProductCodeOrPatchCode),
|
||||||
|
debugstr_a(szUserSid), dwContext, dwOptions, dwIndex, pdwDiskId,
|
||||||
|
szVolumeLabel, pcchVolumeLabel, szDiskPrompt, pcchDiskPrompt);
|
||||||
|
|
||||||
|
if (szDiskPrompt && !pcchDiskPrompt)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (szProductCodeOrPatchCode) product = strdupAtoW(szProductCodeOrPatchCode);
|
||||||
|
if (szUserSid) usersid = strdupAtoW(szUserSid);
|
||||||
|
|
||||||
|
/* FIXME: add tests for an invalid format */
|
||||||
|
|
||||||
|
if (pcchVolumeLabel)
|
||||||
|
volume = msi_alloc(*pcchVolumeLabel * sizeof(WCHAR));
|
||||||
|
|
||||||
|
if (pcchDiskPrompt)
|
||||||
|
prompt = msi_alloc(*pcchDiskPrompt * sizeof(WCHAR));
|
||||||
|
|
||||||
|
if (volume) *volume = '\0';
|
||||||
|
if (prompt) *prompt = '\0';
|
||||||
|
r = MsiSourceListEnumMediaDisksW(product, usersid, dwContext, dwOptions,
|
||||||
|
dwIndex, pdwDiskId, volume, pcchVolumeLabel,
|
||||||
|
prompt, pcchDiskPrompt);
|
||||||
|
if (r != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (szVolumeLabel && pcchVolumeLabel)
|
||||||
|
volumesz = WideCharToMultiByte(CP_ACP, 0, volume, -1, szVolumeLabel,
|
||||||
|
*pcchVolumeLabel + 1, NULL, NULL);
|
||||||
|
|
||||||
|
if (szDiskPrompt)
|
||||||
|
promptsz = WideCharToMultiByte(CP_ACP, 0, prompt, -1, szDiskPrompt,
|
||||||
|
*pcchDiskPrompt + 1, NULL, NULL);
|
||||||
|
|
||||||
|
done:
|
||||||
|
msi_free(product);
|
||||||
|
msi_free(usersid);
|
||||||
|
msi_free(volume);
|
||||||
|
msi_free(prompt);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* MsiSourceListEnumMediaDisksW (MSI.@)
|
||||||
|
*/
|
||||||
|
UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR szProductCodeOrPatchCode,
|
||||||
|
LPCWSTR szUserSid, MSIINSTALLCONTEXT dwContext,
|
||||||
|
DWORD dwOptions, DWORD dwIndex, LPWORD pdwDiskId,
|
||||||
|
LPWSTR szVolumeLabel, LPDWORD pcchVolumeLabel,
|
||||||
|
LPWSTR szDiskPrompt, LPDWORD pcchDiskPrompt)
|
||||||
|
{
|
||||||
|
WCHAR squished_pc[GUID_SIZE];
|
||||||
|
LPWSTR value = NULL;
|
||||||
|
LPWSTR data = NULL;
|
||||||
|
LPWSTR ptr;
|
||||||
|
HKEY source, media;
|
||||||
|
DWORD valuesz, datasz = 0;
|
||||||
|
DWORD type;
|
||||||
|
DWORD numvals, size;
|
||||||
|
LONG res;
|
||||||
|
UINT r;
|
||||||
|
static int index = 0;
|
||||||
|
|
||||||
|
TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p)\n", debugstr_w(szProductCodeOrPatchCode),
|
||||||
|
debugstr_w(szUserSid), dwContext, dwOptions, dwIndex, szVolumeLabel,
|
||||||
|
pcchVolumeLabel, szDiskPrompt, pcchDiskPrompt);
|
||||||
|
|
||||||
|
if (!szProductCodeOrPatchCode ||
|
||||||
|
!squash_guid(szProductCodeOrPatchCode, squished_pc))
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (dwContext == MSIINSTALLCONTEXT_MACHINE && szUserSid)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (dwOptions != MSICODE_PRODUCT && dwOptions != MSICODE_PATCH)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (szDiskPrompt && !pcchDiskPrompt)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (dwIndex == 0)
|
||||||
|
index = 0;
|
||||||
|
|
||||||
|
if (dwIndex != index)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
r = OpenSourceKey(szProductCodeOrPatchCode, &source,
|
||||||
|
dwOptions, dwContext, FALSE);
|
||||||
|
if (r != ERROR_SUCCESS)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = OpenMediaSubkey(source, &media, FALSE);
|
||||||
|
if (r != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
RegCloseKey(source);
|
||||||
|
return ERROR_NO_MORE_ITEMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pcchVolumeLabel && !pcchDiskPrompt)
|
||||||
|
{
|
||||||
|
r = RegEnumValueW(media, dwIndex, NULL, NULL, NULL,
|
||||||
|
&type, NULL, NULL);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = RegQueryInfoKeyW(media, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, &numvals, &valuesz, &datasz, NULL, NULL);
|
||||||
|
if (res != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
r = ERROR_BAD_CONFIGURATION;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = msi_alloc(++valuesz * sizeof(WCHAR));
|
||||||
|
data = msi_alloc(++datasz * sizeof(WCHAR));
|
||||||
|
if (!value || !data)
|
||||||
|
{
|
||||||
|
r = ERROR_OUTOFMEMORY;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = RegEnumValueW(media, dwIndex, value, &valuesz,
|
||||||
|
NULL, &type, (LPBYTE)data, &datasz);
|
||||||
|
if (r != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (pdwDiskId)
|
||||||
|
*pdwDiskId = atolW(value);
|
||||||
|
|
||||||
|
ptr = strchrW(data, ';');
|
||||||
|
if (!ptr)
|
||||||
|
ptr = data;
|
||||||
|
else
|
||||||
|
*ptr = '\0';
|
||||||
|
|
||||||
|
if (pcchVolumeLabel)
|
||||||
|
{
|
||||||
|
size = lstrlenW(data);
|
||||||
|
if (size >= *pcchVolumeLabel)
|
||||||
|
r = ERROR_MORE_DATA;
|
||||||
|
else if (szVolumeLabel)
|
||||||
|
lstrcpyW(szVolumeLabel, data);
|
||||||
|
|
||||||
|
*pcchVolumeLabel = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcchDiskPrompt)
|
||||||
|
{
|
||||||
|
data = ptr;
|
||||||
|
if (!*data)
|
||||||
|
data++;
|
||||||
|
|
||||||
|
size = lstrlenW(data);
|
||||||
|
if (size >= *pcchDiskPrompt)
|
||||||
|
r = ERROR_MORE_DATA;
|
||||||
|
else if (szDiskPrompt)
|
||||||
|
lstrcpyW(szDiskPrompt, data);
|
||||||
|
|
||||||
|
*pcchDiskPrompt = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
index++;
|
||||||
|
|
||||||
|
done:
|
||||||
|
msi_free(value);
|
||||||
|
msi_free(data);
|
||||||
|
RegCloseKey(source);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* MsiSourceListEnumSourcesA (MSI.@)
|
* MsiSourceListEnumSourcesA (MSI.@)
|
||||||
*/
|
*/
|
||||||
|
@ -537,6 +537,12 @@ UINT WINAPI MsiSourceListAddSourceA(LPCSTR, LPCSTR, DWORD, LPCSTR);
|
|||||||
UINT WINAPI MsiSourceListAddSourceW(LPCWSTR, LPCWSTR, DWORD, LPCWSTR);
|
UINT WINAPI MsiSourceListAddSourceW(LPCWSTR, LPCWSTR, DWORD, LPCWSTR);
|
||||||
#define MsiSourceListAddSource WINELIB_NAME_AW(MsiSourceListAddSource)
|
#define MsiSourceListAddSource WINELIB_NAME_AW(MsiSourceListAddSource)
|
||||||
|
|
||||||
|
UINT WINAPI MsiSourceListEnumMediaDisksA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWORD,
|
||||||
|
LPSTR, LPDWORD, LPSTR, LPDWORD);
|
||||||
|
UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWORD,
|
||||||
|
LPWSTR, LPDWORD, LPWSTR, LPDWORD);
|
||||||
|
#define MsiSourceListEnumMediaDisks WINELIB_NAME_AW(MsiSourceListEnumMediaDisks)
|
||||||
|
|
||||||
UINT WINAPI MsiSourceListEnumSourcesA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
|
UINT WINAPI MsiSourceListEnumSourcesA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
|
||||||
UINT WINAPI MsiSourceListEnumSourcesW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWSTR, LPDWORD);
|
UINT WINAPI MsiSourceListEnumSourcesW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWSTR, LPDWORD);
|
||||||
#define MsiSourceListEnumSources WINELIB_NAME_AW(MsiSourceListEnumSources)
|
#define MsiSourceListEnumSources WINELIB_NAME_AW(MsiSourceListEnumSources)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user