PiSwIrpStartCreateWorker

NTSTATUS __stdcall PiSwIrpStartCreateWorker(_SW_DEVICE_CREATE_IOCTL_DATA *IoctlData, _IRP *Irp){
  _IO_STACK_LOCATION *CurrentStackLocation; 
  _DEVICE_OBJECT *v4; 
  char v5; 
  int Data; 
  _PI_SWD_OBJECT **inserted; 
  __int64 v9; 
  INT64 v10; 
  _PI_SWD_OBJECT *v11; 
  __int64 v12; 
  VOID *v14; 
  _PI_SWD_OBJECT *v15; 
  _PI_SWD_OBJECT v16; 
  __int64 v17; 
  char v18; 
  __int64 v19; 
  UINT64 v20; 
  _PI_SWD_OBJECT *v21; 
  void *v22; 
  int v23; 
  _DEVICE_OBJECT *v24; 
  _PI_SWD_OBJECT *v25; 
  _ADAPTER_OBJECT *v26; 
  INT64 v27; 
  INT64 v28; 
  int v29; 
  _PI_SWD_OBJECT *v30; 
  void *v31; 
  __int64 v32; 
  VOID *v33; 
  INT64 v34; 
  _PI_SWD_OBJECT *SwDeviceObject; 
  __int64 v36; 
  __int64 pcbLength[2]; 
  UINT8 NewElement; 
  _PI_SWD_OBJECT v39; 
  _PI_SWD_OBJECT *Buffer; 

  CurrentStackLocation = 0i64;
  SwDeviceObject = 0i64;
  Buffer = 0i64;
  v4 = 0i64;
  NewElement = 0;
  v5 = 0;
  pcbLength[0] = 0i64;
  Data = PiSwValidateCreateData(IoctlData);
  if( Data < 0 )
    goto LABEL_27;
  PiSwLock();
  if( !Irp )
    goto LABEL_91;
  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  if( CurrentStackLocation->FileObject->FsContext2 )
    Data = -1073741637;
  if( Data >= 0 )
  {
LABEL_91:
    Data = PiSwDeviceCreate(&SwDeviceObject);
    if( Data >= 0 )
    {
      Data = PiSwInstanceInfoInit((WCHAR **)SwDeviceObject + 1, IoctlData);
      if( Data >= 0 )
      {
        inserted = (_PI_SWD_OBJECT **)RtlInsertElementGenericTableAvl(
                                        &PiSwDeviceInstanceTable,
                                        &SwDeviceObject,
                                        8ui64,
                                        &NewElement);
        if( !inserted )
        {
          Data = -1073741670;
LABEL_24:
          if( Data >= 0 )
            goto LABEL_25;
          goto LABEL_41;
        }
        v11 = *inserted;
        Buffer = v11;
        if( NewElement )
        {
          SwDeviceObject = 0i64;
          _InterlockedIncrement(v11);
          Data = PiSwPnPInfoInit((WCHAR **)Buffer + 3, IoctlData);
          if( Data < 0 )
            goto LABEL_41;
          Buffer[40] = IoctlData[22];
          if( *((_QWORD *)IoctlData + 12) )
          {
            *((_QWORD *)Buffer + 19) = PiSwAllocMem((unsigned int)IoctlData[22]);
            v14 = (VOID *)*((_QWORD *)Buffer + 19);
            if( !v14 )
            {
              Data = -1073741670;
              goto LABEL_41;
            }
            memmove(v14, *((const VOID **)IoctlData + 12), IoctlData[22]);
          }
          Data = PnpCopyDevPropertyArray(
                   (unsigned int)IoctlData[26],
                   *((_QWORD *)IoctlData + 14),
                   v12,
                   Buffer + 44,
                   (__int64)(Buffer + 42));
          if( Data < 0 || (Data = PiSwBusRelationAdd(*((WCHAR **)IoctlData + 1), Buffer), Data < 0) )
          {
LABEL_41:
            if( NewElement )
            {
              RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &Buffer);
              PiSwDeviceDereference(Buffer);
              if( *((_QWORD *)Buffer + 14) )
                PiSwBusRelationRemove(Buffer);
            }
            goto LABEL_25;
          }
LABEL_14:
          v4 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644u);
LABEL_15:
          v5 = 1;
LABEL_16:
          if( Irp )
          {
            if( v5 )
            {
              _InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, (__int64)PiSwIrpCancelStartCreate);
              if( Irp->Cancel )
              {
                Data = -1073741536;
                goto LABEL_41;
              }
              *((_QWORD *)Buffer + 18) = Irp;
              Irp->Tail.CurrentStackLocation->Control |= 1u;
            }
            else
            {
              Data = RtlStringCbCopyW(
                       (WCHAR *)Irp->AssociatedIrp.MasterIrp,
                       LODWORD(CurrentStackLocation->Parameters.SecurityContext),
                       *((WCHAR **)Buffer + 10));
              if( Data < 0 )
                goto LABEL_41;
              Data = RtlStringCbLengthW(
                       (WCHAR *)Irp->AssociatedIrp.MasterIrp,
                       LODWORD(CurrentStackLocation->Parameters.SecurityContext),
                       (UINT64 *)pcbLength);
              if( Data < 0 )
                goto LABEL_41;
            }
          }
          Buffer[1] |= 1u;
          if( Irp )
          {
            CurrentStackLocation->FileObject->FsContext2 = Buffer;
            Buffer = 0i64;
          }
          if( v4 )
            IoInvalidateDeviceRelations(v4, SingleBusRelations);
          goto LABEL_24;
        }
        _InterlockedIncrement(v11);
        v15 = Buffer;
        v16 = Buffer[1];
        if( (v16 & 1) != 0 )
        {
          Data = -1073741771;
          goto LABEL_25;
        }
        if( (v16 & 2) == 0 )
        {
          v17 = *((_QWORD *)Buffer + 15);
          if( v17 )
          {
            if( (*(_DWORD *)(*(_QWORD *)(v17 + 64) + 8i64) & 2) == 0 )
            {
              PiSwDoesCreateChangesRequireReEnum(Buffer, IoctlData);
              if( !v18 )
              {
                v19 = *((_QWORD *)IoctlData + 14);
                v20 = (unsigned int)IoctlData[26];
                v39 = 0;
                v36 = 0i64;
                Data = PnpCopyDevPropertyArray(v20, v19, v9, &v39, (__int64)&v36);
                if( Data < 0 )
                  goto LABEL_25;
                v21 = Buffer;
                v22 = (void *)*((_QWORD *)Buffer + 21);
                if( v22 )
                {
                  PnpFreeDevPropertyArray(Buffer[44], v22, 0x57706E50u);
                  v21 = Buffer;
                }
                v21[44] = v39;
                *((_QWORD *)Buffer + 21) = v36;
                goto LABEL_16;
              }
              v15 = Buffer;
            }
            if( *((_QWORD *)v15 + 11) )
            {
              PiSwQueuedCreateInfoFree(*((_PI_SWD_QUEUED_CREATE_INFO **)v15 + 11));
              *((_QWORD *)Buffer + 11) = 0i64;
              v15 = Buffer;
            }
            PiSwQueuedCreateInfoCreate((_PI_SWD_QUEUED_CREATE_INFO **)v15 + 11, IoctlData, v9, v10);
            Data = v23;
            if( v23 < 0 )
              goto LABEL_25;
            Buffer[1] |= 2u;
            goto LABEL_14;
          }
        }
        v24 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644u);
        v25 = Buffer;
        v4 = v24;
        if( v24 && PiSwFindPdoAssociation((__int64)Buffer, (__int64)v24, 1) )
        {
          HalPutDmaAdapter(v26);
          v4 = 0i64;
          PiSwQueuedCreateInfoCreate((_PI_SWD_QUEUED_CREATE_INFO **)Buffer + 11, IoctlData, v27, v28);
          Data = v29;
          if( v29 < 0 )
            goto LABEL_25;
          goto LABEL_15;
        }
        v25[1] &= ~4u;
        PiSwBusRelationRemove(Buffer);
        PiSwPnPInfoFree(Buffer + 6);
        v30 = Buffer;
        if( *((_QWORD *)Buffer + 19) )
        {
          PiSwFreeMem(*((VOID **)Buffer + 19));
          *((_QWORD *)Buffer + 19) = 0i64;
          Buffer[40] = 0;
          v30 = Buffer;
        }
        v31 = (void *)*((_QWORD *)v30 + 21);
        if( v31 )
        {
          PnpFreeDevPropertyArray(v30[44], v31, 0x57706E50u);
          Buffer[44] = 0;
          *((_QWORD *)Buffer + 21) = 0i64;
          v30 = Buffer;
        }
        PiSwFreeInterfaceList((_LIST_ENTRY *)(v30 + 46));
        Data = PiSwPnPInfoInit((WCHAR **)Buffer + 3, IoctlData);
        if( Data < 0 )
          goto LABEL_25;
        Buffer[40] = IoctlData[22];
        if( *((_QWORD *)IoctlData + 12) )
        {
          *((_QWORD *)Buffer + 19) = PiSwAllocMem((unsigned int)IoctlData[22]);
          v33 = (VOID *)*((_QWORD *)Buffer + 19);
          if( !v33 )
          {
            Data = -1073741670;
            goto LABEL_25;
          }
          memmove(v33, *((const VOID **)IoctlData + 12), IoctlData[22]);
        }
        Data = PnpCopyDevPropertyArray(
                 (unsigned int)IoctlData[26],
                 *((_QWORD *)IoctlData + 14),
                 v32,
                 Buffer + 44,
                 (__int64)(Buffer + 42));
        if( Data >= 0 )
        {
          Data = PiSwBusRelationAdd(*((WCHAR **)IoctlData + 1), Buffer);
          if( Data >= 0 )
          {
            Buffer[1] &= ~2u;
            goto LABEL_15;
          }
        }
      }
    }
  }
LABEL_25:
  PiSwUnlock();
  if( Data >= 0 && !v5 )
  {
    v34 = *((_QWORD *)IoctlData + 14);
    if( v34 )
    {
      Data = PiSwPropertySet(
               (WCHAR *)Irp->AssociatedIrp.MasterIrp,
               (VOID *)1,
               v34,
               (_DEVPROPERTY *)(unsigned int)IoctlData[26]);
      if( Data == -1073741772 )
        Data = 0;
    }
  }
LABEL_27:
  if( Irp )
  {
    if( Data < 0 )
    {
      Irp->IoStatus.Information = 0i64;
    }
    else
    {
      if( v5 )
      {
        Data = 259;
        goto LABEL_31;
      }
      Irp->IoStatus.Information = pcbLength[0] + 2;
    }
    Irp->IoStatus.Status = Data;
    IofCompleteRequest(Irp, 0);
  }
  else if( Data >= 0 )
  {
    Buffer[45] = 1;
    PiSwIrpCleanup(Buffer);
  }
LABEL_31:
  if( Buffer )
    PiSwDeviceDereference(Buffer);
  if( SwDeviceObject )
    PiSwDeviceDereference(SwDeviceObject);
  if( v4 )
    HalPutDmaAdapter((PADAPTER_OBJECT)v4);
  return Data;
}

Referenced by:

PiSwIrpStartCreate
PiSwStartCreate