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