[PATCH v2 2/5] ntoskrnl.exe: Implement Ke(Initialize|Insert|Remove)DeviceQueue.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Tue Jun 29 11:58:28 CDT 2021
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?
More information about the wine-devel
mailing list