- Add a minimal implementation of SetupScanFileQueueW

- In SetupDiBuildDriverInfoList, add found drivers in the right driver list
- In SetupDiEnumDriverInfoW, enumerate the right driver list if DeviceInfoData is not NULL

svn path=/trunk/; revision=20394
This commit is contained in:
Hervé Poussineau 2005-12-28 14:21:05 +00:00
parent 83ee9cec35
commit 37faec1dc1
2 changed files with 47 additions and 10 deletions

View file

@ -5389,6 +5389,7 @@ SetupDiBuildDriverInfoList(
SetLastError(ERROR_INVALID_USER_BUFFER);
else
{
PLIST_ENTRY pDriverListHead = &list->DriverListHead;
BOOL Result;
InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
@ -5396,6 +5397,13 @@ SetupDiBuildDriverInfoList(
if (!Result)
goto done;
if (DeviceInfoData)
{
struct DeviceInfoElement *devInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
if (!(devInfo->CreationFlags & DICD_INHERIT_CLASSDRVS))
pDriverListHead = &devInfo->DriverListHead;
}
if (DriverType == SPDIT_COMPATDRIVER)
{
/* Get hardware IDs list */
@ -5633,7 +5641,7 @@ SetupDiBuildDriverInfoList(
{
/* FIXME: read [ControlFlags] / ExcludeFromSelect */
if (!AddDriverToList(
&list->DriverListHead,
pDriverListHead,
DriverType,
&ClassGuid,
ContextDevice,
@ -5689,7 +5697,7 @@ SetupDiBuildDriverInfoList(
if (wcsicmp(DeviceId, currentId) == 0)
{
AddDriverToList(
&((struct DeviceInfoElement *)DeviceInfoData->Reserved)->DriverListHead,
pDriverListHead,
DriverType,
&ClassGuid,
ContextDevice,
@ -5710,7 +5718,7 @@ SetupDiBuildDriverInfoList(
if (wcsicmp(DeviceId, currentId) == 0)
{
AddDriverToList(
&((struct DeviceInfoElement *)DeviceInfoData->Reserved)->DriverListHead,
pDriverListHead,
DriverType,
&ClassGuid,
ContextDevice,
@ -6106,8 +6114,6 @@ SetupDiEnumDriverInfoW(
SetLastError(ERROR_INVALID_HANDLE);
else if (DriverType != SPDIT_CLASSDRIVER && DriverType != SPDIT_COMPATDRIVER)
SetLastError(ERROR_INVALID_PARAMETER);
else if (DriverType == SPDIT_CLASSDRIVER && DeviceInfoData)
SetLastError(ERROR_INVALID_PARAMETER);
else if (DriverType == SPDIT_COMPATDRIVER && !DeviceInfoData)
SetLastError(ERROR_INVALID_PARAMETER);
else if (DriverInfoData->cbSize != sizeof(SP_DRVINFO_DATA_V1_W) && DriverInfoData->cbSize != sizeof(SP_DRVINFO_DATA_V2_W))
@ -6118,8 +6124,7 @@ SetupDiEnumDriverInfoW(
PLIST_ENTRY ItemList;
if (DeviceInfoData)
devInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
if (DriverType == SPDIT_CLASSDRIVER ||
(devInfo && devInfo->CreationFlags & DICD_INHERIT_CLASSDRVS))
if (!devInfo || (devInfo->CreationFlags & DICD_INHERIT_CLASSDRVS))
{
ListHead = &((struct DeviceInfoSet *)DeviceInfoSet)->DriverListHead;
}

View file

@ -1200,11 +1200,43 @@ BOOL WINAPI SetupScanFileQueueA( HSPFILEQ queue, DWORD flags, HWND window,
/***********************************************************************
* SetupScanFileQueueW (SETUPAPI.@)
*/
BOOL WINAPI SetupScanFileQueueW( HSPFILEQ queue, DWORD flags, HWND window,
BOOL WINAPI SetupScanFileQueueW( HSPFILEQ handle, DWORD flags, HWND window,
PSP_FILE_CALLBACK_W callback, PVOID context, PDWORD result )
{
FIXME("stub\n");
return FALSE;
struct file_queue *queue = handle;
struct file_op *op;
BOOL allnodesprocessed = FALSE;
FILEPATHS_W paths;
paths.Source = paths.Target = NULL;
*result = FALSE;
if ( flags & (SPQ_SCAN_FILE_PRESENCE | SPQ_SCAN_FILE_VALIDITY | SPQ_SCAN_USE_CALLBACKEX | SPQ_SCAN_INFORM_USER | SPQ_SCAN_PRUNE_COPY_QUEUE /*| SPQ_SCAN_USE_CALLBACK_SIGNERINFO | SPQ_SCAN_PRUNE_DELREN*/) )
{
FIXME( "flags ignored 0x%lx\n", flags & (SPQ_SCAN_FILE_PRESENCE | SPQ_SCAN_FILE_VALIDITY | SPQ_SCAN_USE_CALLBACKEX | SPQ_SCAN_INFORM_USER | SPQ_SCAN_PRUNE_COPY_QUEUE /*| SPQ_SCAN_USE_CALLBACK_SIGNERINFO | SPQ_SCAN_PRUNE_DELREN*/) );
}
if (queue->copy_queue.count)
{
for (op = queue->copy_queue.head; op; op = op->next)
{
build_filepathsW( op, &paths );
if (flags & SPQ_SCAN_USE_CALLBACK)
{
/* FIXME: sometimes set param 2 to SPQ_DELAYED_COPY */
if (NO_ERROR != callback( context, SPFILENOTIFY_QUEUESCAN, (UINT)paths.Target, 0 ))
goto done;
}
}
}
*result = TRUE;
allnodesprocessed = TRUE;
done:
HeapFree( GetProcessHeap(), 0, (void *)paths.Source );
HeapFree( GetProcessHeap(), 0, (void *)paths.Target );
return allnodesprocessed;
}