[PATCH v2 2/5] ntoskrnl.exe: Implement Ke(Initialize|Insert|Remove)DeviceQueue.

Rémi Bernon rbernon at codeweavers.com
Tue Jun 29 12:03:18 CDT 2021


On 6/29/21 6:58 PM, Zebediah Figura (she/her) wrote:
> Sorry I didn't notice this before, but...
> 
> On 6/29/21 2:21 AM, Rémi Bernon wrote:
>> +BOOLEAN WINAPI KeInsertDeviceQueue( KDEVICE_QUEUE *queue, 
>> KDEVICE_QUEUE_ENTRY *entry )
>> +{
>> +    KIRQL irql;
>> +
>> +    TRACE( "queue %p, entry %p.\n", queue, entry );
>> +
>> +    KeAcquireSpinLock( &queue->Lock, &irql );
>> +    if ((entry->Inserted = queue->Busy))
>> +        InsertTailList( &queue->DeviceListHead, 
>> &entry->DeviceListEntry );
>> +    queue->Busy = TRUE;
>> +    KeReleaseSpinLock( &queue->Lock, irql );
>> +
>> +    return entry->Inserted;
>> +}
> 
> I don't think it's thread-safe to access entry->Inserted outside of the 
> lock.
> 
>> +
>> +KDEVICE_QUEUE_ENTRY *WINAPI KeRemoveDeviceQueue( KDEVICE_QUEUE *queue )
>> +{
>> +    LIST_ENTRY *entry = NULL;
>> +    KIRQL irql;
>> +
>> +    TRACE( "queue %p.\n", queue );
>> +
>> +    KeAcquireSpinLock( &queue->Lock, &irql );
>> +    if (IsListEmpty( &queue->DeviceListHead )) queue->Busy = FALSE;
>> +    else entry = RemoveHeadList( &queue->DeviceListHead );
>> +    KeReleaseSpinLock( &queue->Lock, irql );
>> +
>> +    if (!entry) return NULL;
>> +    return CONTAINING_RECORD( entry, KDEVICE_QUEUE_ENTRY, 
>> DeviceListEntry );
>> +}
> 
> And while we're at it, should this unset entry->Inserted?
> 

Yeah maybe, I'll add a few tests to make sure.

FWIW the next patches don't even need this anymore.
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list