Implement SetupDiInstallClassExA

Implement parts of SetupDiInstallClassExW

svn path=/trunk/; revision=20267
This commit is contained in:
Hervé Poussineau 2005-12-19 10:15:06 +00:00
parent 55869af70a
commit 8cf0eb4663
2 changed files with 166 additions and 103 deletions

View file

@ -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)
{
BOOL ret = FALSE;
TRACE("%p %s 0x%lx %p %s %p %p\n", hwndParent, debugstr_w(InfFileName), Flags,
FileQueue, debugstr_guid(InterfaceClassGuid), Reserved1, Reserved2);
if (!InfFileName && !InterfaceClassGuid)
SetLastError(ERROR_INVALID_PARAMETER);
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]; WCHAR SectionName[MAX_PATH];
DWORD SectionNameLength = 0; HINF hInf = INVALID_HANDLE_VALUE;
HINF hInf; HKEY hClassKey = INVALID_HANDLE_VALUE;
BOOL bFileQueueCreated = FALSE; PVOID callback_context = NULL;
HKEY hClassKey;
TRACE("%p %s 0x%lx %p\n", hwndParent, debugstr_w(InfFileName), if (InterfaceClassGuid)
Flags, FileQueue);
FIXME("not fully implemented\n");
if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE))
{ {
SetLastError(ERROR_INVALID_PARAMETER); /* Retrieve the actual section name */
return FALSE; 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)
{ {

View file

@ -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)