Implement SetupDiGetDeviceInfoListClass
Parse 'Include' and 'Needs' directives in SetupInstallFromInfSectionW
and when installing services
Modified: trunk/reactos/lib/setupapi/devinst.c
Modified: trunk/reactos/lib/setupapi/install.c
Modified: trunk/reactos/lib/setupapi/setupapi.spec
_____
Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c 2005-12-19 13:26:53 UTC
(rev 20270)
+++ trunk/reactos/lib/setupapi/devinst.c 2005-12-19 15:08:55 UTC
(rev 20271)
@@ -3184,10 +3184,70 @@
OUT PBOOL pRebootRequired OPTIONAL)
{
INFCONTEXT ContextService;
+ INFCONTEXT ContextInclude;
DWORD RequiredSize;
INT Flags;
BOOL ret = FALSE;
+ /* Parse 'Include' line */
+ if (SetupFindFirstLineW(hInf, SectionName, L"Include",
&ContextInclude))
+ {
+ DWORD Index = 1;
+ while (TRUE)
+ {
+ static WCHAR szBuffer[MAX_PATH];
+ PWSTR pBuffer = NULL;
+ DWORD required;
+
+ ret = SetupGetStringFieldW(&ContextInclude, Index,
szBuffer, MAX_PATH, &required);
+ if (!ret && GetLastError() == ERROR_INVALID_PARAMETER)
+ break;
+ else if (!ret && GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
+ {
+ pBuffer = MyMalloc(required);
+ ret = SetupGetStringFieldW(&ContextInclude, Index,
pBuffer, required, &required);
+ }
+ if (ret)
+ ret = SetupOpenAppendInfFileW(pBuffer ? pBuffer :
szBuffer, hInf, NULL);
+
+ MyFree(pBuffer);
+ if (!ret)
+ goto done;
+ Index++;
+ }
+ }
+
+ /* Parse 'Needs' line */
+ if (SetupFindFirstLineW(hInf, SectionName, L"Needs",
&ContextInclude))
+ {
+ DWORD Index = 1;
+ while (TRUE)
+ {
+ static WCHAR szBuffer[MAX_PATH];
+ PWSTR pBuffer = NULL;
+ DWORD required;
+
+ ret = SetupGetStringFieldW(&ContextInclude, Index,
szBuffer, MAX_PATH, &required);
+ if (!ret && GetLastError() == ERROR_INVALID_PARAMETER)
+ break;
+ else if (!ret && GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
+ {
+ pBuffer = MyMalloc(required);
+ ret = SetupGetStringFieldW(&ContextInclude, Index,
pBuffer, required, &required);
+ }
+ if (ret)
+ {
+ ret = InstallServicesSection(hInf, pBuffer ? pBuffer :
szBuffer,
+ DeviceInfoSet, DeviceInfoData, pAssociatedService,
pRebootRequired);
+ }
+
+ MyFree(pBuffer);
+ if (!ret)
+ goto done;
+ Index++;
+ }
+ }
+
ret = SetupFindFirstLineW(hInf, SectionName, NULL,
&ContextService);
while (ret)
{
@@ -4133,6 +4193,35 @@
}
/***********************************************************************
+ * SetupDiGetDeviceInfoListClass (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetDeviceInfoListClass(
+ IN HDEVINFO DeviceInfoSet,
+ OUT LPGUID ClassGuid)
+{
+ struct DeviceInfoSet *list;
+ BOOL ret = FALSE;
+
+ TRACE("%p %p\n", DeviceInfoSet, ClassGuid);
+
+ if (!DeviceInfoSet)
+ SetLastError(ERROR_INVALID_HANDLE);
+ else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic !=
SETUP_DEV_INFO_SET_MAGIC)
+ SetLastError(ERROR_INVALID_HANDLE);
+ else if (IsEqualIID(&list->ClassGuid, &GUID_NULL))
+ SetLastError(ERROR_NO_ASSOCIATED_CLASS);
+ else
+ {
+ memcpy(&ClassGuid, &list->ClassGuid, sizeof(GUID));
+
+ ret = TRUE;
+ }
+
+ TRACE("Returning %d\n", ret);
+ return ret;
+}
+
+/**********************************************************************
*
* SetupDiGetDeviceInfoListDetailW (SETUPAPI.@)
*/
BOOL WINAPI SetupDiGetDeviceInfoListDetailW(
_____
Modified: trunk/reactos/lib/setupapi/install.c
--- trunk/reactos/lib/setupapi/install.c 2005-12-19 13:26:53 UTC
(rev 20270)
+++ trunk/reactos/lib/setupapi/install.c 2005-12-19 15:08:55 UTC
(rev 20271)
@@ -64,6 +64,8 @@
static const WCHAR RegisterDlls[] =
{'R','e','g','i','s','t','e','r','D','l','l','s',0};
static const WCHAR UnregisterDlls[] =
{'U','n','r','e','g','i','s','t','e','r','D','l','l','s',0};
static const WCHAR ProfileItems[] =
{'P','r','o','f','i','l','e','I','t','e','m','s',0};
+static const WCHAR Include[] =
{'I','n','c','l','u','d','e',0};
+static const WCHAR Needs[] =
{'N','e','e','d','s',0};
/***********************************************************************
@@ -789,6 +791,67 @@
PSP_FILE_CALLBACK_W callback,
PVOID context,
HDEVINFO devinfo,
PSP_DEVINFO_DATA devinfo_data )
{
+ INFCONTEXT include_context;
+
+ /* Parse 'Include' line */
+ if (SetupFindFirstLineW( hinf, section, Include, &include_context
))
+ {
+ DWORD index = 1;
+ while (TRUE)
+ {
+ static WCHAR szBuffer[MAX_PATH];
+ PWSTR pBuffer = NULL;
+ DWORD required;
+ BOOL ok;
+
+ ok = SetupGetStringFieldW( &include_context, index,
szBuffer, MAX_PATH, &required );
+ if (!ok && GetLastError() == ERROR_INVALID_PARAMETER)
+ break;
+ else if (!ok && GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
+ {
+ pBuffer = MyMalloc(required);
+ ok = SetupGetStringFieldW( &include_context, index,
pBuffer, required, &required );
+ }
+ if (ok)
+ ok = SetupOpenAppendInfFileW( pBuffer ? pBuffer :
szBuffer, hinf, NULL );
+
+ MyFree(pBuffer);
+ if (!ok) return FALSE;
+ index++;
+ }
+ }
+
+ /* Parse 'Needs' line */
+ if (SetupFindFirstLineW( hinf, section, Needs, &include_context ))
+ {
+ DWORD index = 1;
+ while (TRUE)
+ {
+ static WCHAR szBuffer[MAX_PATH];
+ PWSTR pBuffer = NULL;
+ DWORD required;
+ BOOL ok;
+
+ ok = SetupGetStringFieldW( &include_context, index,
szBuffer, MAX_PATH, &required );
+ if (!ok && GetLastError() == ERROR_INVALID_PARAMETER)
+ break;
+ else if (!ok && GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
+ {
+ pBuffer = MyMalloc(required);
+ ok = SetupGetStringFieldW( &include_context, index,
pBuffer, required, &required );
+ }
+ if (ok)
+ {
+ ok = SetupInstallFromInfSectionW( owner, hinf, pBuffer
? pBuffer : szBuffer,
+ flags, key_root, src_root, copy_flags, callback,
context, devinfo, devinfo_data );
+ }
+
+ MyFree(pBuffer);
+ if (!ok) return FALSE;
+ index++;
+ }
+ }
+
if (flags & SPINST_FILES)
{
struct files_callback_info info;
_____
Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec 2005-12-19 13:26:53 UTC
(rev 20270)
+++ trunk/reactos/lib/setupapi/setupapi.spec 2005-12-19 15:08:55 UTC
(rev 20271)
@@ -320,7 +320,7 @@
@ stdcall SetupDiGetClassImageListExW(ptr wstr ptr)
@ stub SetupDiGetClassInstallParamsA
@ stub SetupDiGetClassInstallParamsW
-@ stub SetupDiGetDeviceInfoListClass
+@ stdcall SetupDiGetDeviceInfoListClass(ptr ptr)
@ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr)
@ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr)
@ stdcall SetupDiGetDeviceInstallParamsA(ptr ptr ptr)