KeInsertByKeyDeviceQueue
UINT8 __stdcall KeInsertByKeyDeviceQueue(
_KDEVICE_QUEUE *DeviceQueue,
_KDEVICE_QUEUE_ENTRY *DeviceQueueEntry,
UINT64 SortKey){
unsigned int v5;
unsigned __int8 v6;
unsigned __int8 Busy;
_LIST_ENTRY *p_DeviceListHead;
_LIST_ENTRY *Blink;
struct _KLOCK_QUEUE_HANDLE LockHandle;
DeviceQueueEntry->SortKey = SortKey;
memset(&LockHandle, 0, sizeof(LockHandle));
v5 = SortKey;
v6 = 0;
KeAcquireInStackQueuedSpinLockForDpc(&DeviceQueue->Lock, &LockHandle);
Busy = DeviceQueue->Busy;
DeviceQueue->Busy = 1;
if( Busy == 1 )
{
p_DeviceListHead = &DeviceQueue->DeviceListHead;
if( p_DeviceListHead->Flink != p_DeviceListHead && v5 < LODWORD(DeviceQueue->DeviceListHead.Blink[1].Flink) )
{
do
p_DeviceListHead = p_DeviceListHead->Flink;
while( v5 >= LODWORD(p_DeviceListHead[1].Flink) );
}
Blink = p_DeviceListHead->Blink;
if( Blink->Flink != p_DeviceListHead )
__fastfail(3u);
DeviceQueueEntry->DeviceListEntry.Flink = p_DeviceListHead;
v6 = 1;
DeviceQueueEntry->DeviceListEntry.Blink = Blink;
Blink->Flink = &DeviceQueueEntry->DeviceListEntry;
p_DeviceListHead->Blink = &DeviceQueueEntry->DeviceListEntry;
}
DeviceQueueEntry->Inserted = v6;
KeReleaseInStackQueuedSpinLockForDpc(&LockHandle);
return v6;
}Referenced by:
IoStartPacket