IopStartNextPacketByKeyEx
VOID __stdcall IopStartNextPacketByKeyEx(_DEVICE_OBJECT *DeviceObject, UINT64 Key, UINT8 *Flags){
unsigned int StartIoKey;
_DEVOBJ_EXTENSION *DeviceObjectExtension;
signed __int32 v6;
_DEVOBJ_EXTENSION *v7;
unsigned int StartIoFlags;
UINT64 v9;
StartIoKey = Key;
DeviceObjectExtension = DeviceObject->DeviceObjectExtension;
do
{
v6 = _InterlockedExchangeAdd(&DeviceObjectExtension->StartIoCount, 1u);
v7 = DeviceObject->DeviceObjectExtension;
StartIoFlags = v7->StartIoFlags;
if( v6 + 1 <= 1 )
{
v7->StartIoFlags = StartIoFlags & 0xFFFFFF1F;
v9 = (unsigned __int8)Flags & 0x80;
DeviceObject->DeviceObjectExtension->StartIoKey = 0;
if( ((unsigned __int8)Flags & 0x40) != 0 )
{
IopStartNextPacketByKey(DeviceObject, v9, (UINT8 *)StartIoKey);
}
else if( ((unsigned __int8)Flags & 0x20) != 0 )
{
IopStartNextPacket(DeviceObject, v9, Flags);
}
}
else
{
v7->StartIoFlags = (unsigned int)Flags | StartIoFlags;
DeviceObject->DeviceObjectExtension->StartIoKey = StartIoKey;
}
if( _InterlockedExchangeAdd(&DeviceObject->DeviceObjectExtension->StartIoCount, 0xFFFFFFFF) != 1 )
break;
DeviceObjectExtension = DeviceObject->DeviceObjectExtension;
StartIoKey = DeviceObjectExtension->StartIoKey;
Flags = (UINT8 *)(DeviceObjectExtension->StartIoFlags & 0xE0);
}
while( (DeviceObjectExtension->StartIoFlags & 0x60) != 0 );
}Referenced by:
IoStartNextPacket
IoStartNextPacketByKey