mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 20:53:02 +00:00
Implement SetupDiInstallClassExA
Implement parts of SetupDiInstallClassExW svn path=/trunk/; revision=20267
This commit is contained in:
parent
55869af70a
commit
8cf0eb4663
2 changed files with 166 additions and 103 deletions
|
@ -2913,31 +2913,67 @@ BOOL WINAPI SetupDiSetDeviceRegistryPropertyW(
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiInstallClassA (SETUPAPI.@)
|
* SetupDiInstallClassA (SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI SetupDiInstallClassA(
|
BOOL WINAPI SetupDiInstallClassA(
|
||||||
HWND hwndParent,
|
IN HWND hwndParent OPTIONAL,
|
||||||
PCSTR InfFileName,
|
IN PCSTR InfFileName,
|
||||||
DWORD Flags,
|
IN DWORD Flags,
|
||||||
HSPFILEQ FileQueue)
|
IN HSPFILEQ FileQueue OPTIONAL)
|
||||||
{
|
{
|
||||||
UNICODE_STRING FileNameW;
|
return SetupDiInstallClassExA(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiInstallClassW (SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI SetupDiInstallClassW(
|
||||||
|
IN HWND hwndParent OPTIONAL,
|
||||||
|
IN PCWSTR InfFileName,
|
||||||
|
IN DWORD Flags,
|
||||||
|
IN HSPFILEQ FileQueue OPTIONAL)
|
||||||
|
{
|
||||||
|
return SetupDiInstallClassExW(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiInstallClassExA (SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI SetupDiInstallClassExA(
|
||||||
|
IN HWND hwndParent OPTIONAL,
|
||||||
|
IN PCSTR InfFileName OPTIONAL,
|
||||||
|
IN DWORD Flags,
|
||||||
|
IN HSPFILEQ FileQueue OPTIONAL,
|
||||||
|
IN const GUID* InterfaceClassGuid OPTIONAL,
|
||||||
|
IN PVOID Reserved1,
|
||||||
|
IN PVOID Reserved2)
|
||||||
|
{
|
||||||
|
PWSTR InfFileNameW = NULL;
|
||||||
BOOL Result;
|
BOOL Result;
|
||||||
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW, InfFileName))
|
if (InfFileName)
|
||||||
|
{
|
||||||
|
InfFileNameW = MultiByteToUnicode(InfFileName, CP_ACP);
|
||||||
|
if (InfFileNameW == NULL)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Result = SetupDiInstallClassW(hwndParent, FileNameW.Buffer, Flags, FileQueue);
|
Result = SetupDiInstallClassExW(hwndParent, InfFileNameW, Flags,
|
||||||
|
FileQueue, InterfaceClassGuid, Reserved1, Reserved2);
|
||||||
|
|
||||||
RtlFreeUnicodeString(&FileNameW);
|
MyFree(InfFileNameW);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static HKEY CreateClassKey(HINF hInf)
|
static HKEY CreateClassKey(HINF hInf)
|
||||||
{
|
{
|
||||||
WCHAR FullBuffer[MAX_PATH];
|
WCHAR FullBuffer[MAX_PATH];
|
||||||
|
@ -3002,103 +3038,131 @@ static HKEY CreateClassKey(HINF hInf)
|
||||||
return hClassKey;
|
return hClassKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiInstallClassW (SETUPAPI.@)
|
* SetupDiInstallClassExW (SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI SetupDiInstallClassW(
|
BOOL WINAPI SetupDiInstallClassExW(
|
||||||
HWND hwndParent,
|
IN HWND hwndParent OPTIONAL,
|
||||||
PCWSTR InfFileName,
|
IN PCWSTR InfFileName OPTIONAL,
|
||||||
DWORD Flags,
|
IN DWORD Flags,
|
||||||
HSPFILEQ FileQueue)
|
IN HSPFILEQ FileQueue OPTIONAL,
|
||||||
|
IN const GUID* InterfaceClassGuid OPTIONAL,
|
||||||
|
IN PVOID Reserved1,
|
||||||
|
IN PVOID Reserved2)
|
||||||
{
|
{
|
||||||
WCHAR SectionName[MAX_PATH];
|
BOOL ret = FALSE;
|
||||||
DWORD SectionNameLength = 0;
|
|
||||||
HINF hInf;
|
|
||||||
BOOL bFileQueueCreated = FALSE;
|
|
||||||
HKEY hClassKey;
|
|
||||||
|
|
||||||
TRACE("%p %s 0x%lx %p\n", hwndParent, debugstr_w(InfFileName),
|
TRACE("%p %s 0x%lx %p %s %p %p\n", hwndParent, debugstr_w(InfFileName), Flags,
|
||||||
Flags, FileQueue);
|
FileQueue, debugstr_guid(InterfaceClassGuid), Reserved1, Reserved2);
|
||||||
|
|
||||||
FIXME("not fully implemented\n");
|
if (!InfFileName && !InterfaceClassGuid)
|
||||||
|
|
||||||
if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE))
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return FALSE;
|
else if (InfFileName && InterfaceClassGuid)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL))
|
||||||
|
{
|
||||||
|
TRACE("Unknown flags: 0x%08lx\n", Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL));
|
||||||
|
SetLastError(ERROR_INVALID_FLAGS);
|
||||||
}
|
}
|
||||||
|
else if ((Flags & DI_NOVCP) && FileQueue == NULL)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (Reserved1 != NULL)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (Reserved2 != NULL)
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WCHAR SectionName[MAX_PATH];
|
||||||
|
HINF hInf = INVALID_HANDLE_VALUE;
|
||||||
|
HKEY hClassKey = INVALID_HANDLE_VALUE;
|
||||||
|
PVOID callback_context = NULL;
|
||||||
|
|
||||||
|
if (InterfaceClassGuid)
|
||||||
|
{
|
||||||
|
/* Retrieve the actual section name */
|
||||||
|
ret = SetupDiGetActualSectionToInstallW(hInf,
|
||||||
|
InterfaceInstall32,
|
||||||
|
SectionName,
|
||||||
|
MAX_PATH,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (!ret)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
FIXME("Installing an interface is not implemented\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Flags & DI_NOVCP)
|
||||||
|
FIXME("FileQueue argument ignored\n");
|
||||||
|
if (Flags & (DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL))
|
||||||
|
FIXME("Flags 0x%lx ignored\n", Flags & (DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL));
|
||||||
|
|
||||||
/* Open the .inf file */
|
/* Open the .inf file */
|
||||||
hInf = SetupOpenInfFileW(InfFileName,
|
hInf = SetupOpenInfFileW(
|
||||||
|
InfFileName,
|
||||||
NULL,
|
NULL,
|
||||||
INF_STYLE_WIN4,
|
INF_STYLE_WIN4,
|
||||||
NULL);
|
NULL);
|
||||||
if (hInf == INVALID_HANDLE_VALUE)
|
if (hInf == INVALID_HANDLE_VALUE)
|
||||||
{
|
goto cleanup;
|
||||||
|
|
||||||
return FALSE;
|
/* Create or open the class registry key 'HKLM\CurrentControlSet\Class\{GUID}' */
|
||||||
}
|
|
||||||
|
|
||||||
/* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */
|
|
||||||
hClassKey = CreateClassKey(hInf);
|
hClassKey = CreateClassKey(hInf);
|
||||||
if (hClassKey == INVALID_HANDLE_VALUE)
|
if (hClassKey == INVALID_HANDLE_VALUE)
|
||||||
{
|
goto cleanup;
|
||||||
SetupCloseInfFile(hInf);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Try to append a layout file */
|
/* Try to append a layout file */
|
||||||
#if 0
|
ret = SetupOpenAppendInfFileW(NULL, hInf, NULL);
|
||||||
SetupOpenAppendInfFileW(NULL, hInf, NULL);
|
if (!ret)
|
||||||
#endif
|
goto cleanup;
|
||||||
|
|
||||||
/* Retrieve the actual section name */
|
/* Retrieve the actual section name */
|
||||||
SetupDiGetActualSectionToInstallW(hInf,
|
ret = SetupDiGetActualSectionToInstallW(
|
||||||
|
hInf,
|
||||||
ClassInstall32,
|
ClassInstall32,
|
||||||
SectionName,
|
SectionName,
|
||||||
MAX_PATH,
|
MAX_PATH,
|
||||||
&SectionNameLength,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
if (!ret)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
#if 0
|
callback_context = SetupInitDefaultQueueCallback(hwndParent);
|
||||||
if (!(Flags & DI_NOVCP))
|
if (!callback_context)
|
||||||
{
|
goto cleanup;
|
||||||
FileQueue = SetupOpenFileQueue();
|
|
||||||
if (FileQueue == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
SetupCloseInfFile(hInf);
|
|
||||||
RegCloseKey(hClassKey);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
bFileQueueCreated = TRUE;
|
ret = SetupInstallFromInfSectionW(
|
||||||
|
hwndParent,
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SetupInstallFromInfSectionW(NULL,
|
|
||||||
hInf,
|
hInf,
|
||||||
SectionName,
|
SectionName,
|
||||||
SPINST_REGISTRY,
|
SPINST_REGISTRY | SPINST_FILES | SPINST_BITREG | SPINST_INIFILES | SPINST_INI2REG,
|
||||||
hClassKey,
|
hClassKey,
|
||||||
|
NULL, /* SourceRootPath */
|
||||||
|
0, /* CopyFlags */
|
||||||
|
SetupDefaultQueueCallbackW,
|
||||||
|
callback_context,
|
||||||
NULL,
|
NULL,
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
INVALID_HANDLE_VALUE,
|
|
||||||
NULL);
|
NULL);
|
||||||
|
if (!ret)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
/* FIXME: Process InterfaceInstall32 section */
|
/* FIXME: Install .Services section */
|
||||||
|
|
||||||
if (bFileQueueCreated)
|
ret = TRUE;
|
||||||
SetupCloseFileQueue(FileQueue);
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (hInf != INVALID_HANDLE_VALUE)
|
||||||
SetupCloseInfFile(hInf);
|
SetupCloseInfFile(hInf);
|
||||||
|
if (hClassKey != INVALID_HANDLE_VALUE)
|
||||||
RegCloseKey(hClassKey);
|
RegCloseKey(hClassKey);
|
||||||
return TRUE;
|
SetupTermDefaultQueueCallback(callback_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Returning %d\n", ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4639,7 +4703,6 @@ HKEY WINAPI SetupDiOpenDevRegKey(
|
||||||
if (KeyType == DIREG_DEV)
|
if (KeyType == DIREG_DEV)
|
||||||
{
|
{
|
||||||
/* We're done. Just return the hKey handle */
|
/* We're done. Just return the hKey handle */
|
||||||
CHECKPOINT1;
|
|
||||||
ret = hKey;
|
ret = hKey;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -7213,7 +7276,7 @@ nextservice:
|
||||||
rc = RegSetValueEx(hKey, REGSTR_VAL_DEVDESC, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR));
|
rc = RegSetValueEx(hKey, REGSTR_VAL_DEVDESC, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR));
|
||||||
if (rc == ERROR_SUCCESS)
|
if (rc == ERROR_SUCCESS)
|
||||||
rc = RegSetValueEx(hKey, REGSTR_VAL_MFG, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.MfgName, (wcslen(SelectedDriver->Info.MfgName) + 1) * sizeof(WCHAR));
|
rc = RegSetValueEx(hKey, REGSTR_VAL_MFG, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.MfgName, (wcslen(SelectedDriver->Info.MfgName) + 1) * sizeof(WCHAR));
|
||||||
if (rc == ERROR_SUCCESS && *AssociatedService)
|
if (rc == ERROR_SUCCESS && AssociatedService && *AssociatedService)
|
||||||
rc = RegSetValueEx(hKey, REGSTR_VAL_SERVICE, 0, REG_SZ, (const BYTE *)AssociatedService, (wcslen(AssociatedService) + 1) * sizeof(WCHAR));
|
rc = RegSetValueEx(hKey, REGSTR_VAL_SERVICE, 0, REG_SZ, (const BYTE *)AssociatedService, (wcslen(AssociatedService) + 1) * sizeof(WCHAR));
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
|
|
|
@ -348,8 +348,8 @@
|
||||||
@ stdcall SetupDiGetSelectedDriverW(ptr ptr ptr)
|
@ stdcall SetupDiGetSelectedDriverW(ptr ptr ptr)
|
||||||
@ stub SetupDiGetWizardPage
|
@ stub SetupDiGetWizardPage
|
||||||
@ stdcall SetupDiInstallClassA(long str long ptr)
|
@ stdcall SetupDiInstallClassA(long str long ptr)
|
||||||
@ stub SetupDiInstallClassExA
|
@ stdcall SetupDiInstallClassExA(long str long ptr ptr ptr ptr)
|
||||||
@ stub SetupDiInstallClassExW
|
@ stdcall SetupDiInstallClassExW(long wstr long ptr ptr ptr ptr)
|
||||||
@ stdcall SetupDiInstallClassW(long wstr long ptr)
|
@ stdcall SetupDiInstallClassW(long wstr long ptr)
|
||||||
@ stdcall SetupDiInstallDevice(ptr ptr)
|
@ stdcall SetupDiInstallDevice(ptr ptr)
|
||||||
@ stdcall SetupDiInstallDeviceInterfaces(ptr ptr)
|
@ stdcall SetupDiInstallDeviceInterfaces(ptr ptr)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue