PiSwIrpInterfaceRegister

NTSTATUS __stdcall PiSwIrpInterfaceRegister(_IRP *Irp){
  UINT64 v1; 
  INT64 v2; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  INT64 FsContext2; 
  _PI_SWD_INTERFACE *v6; 
  char v7; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v8; 
  int updated; 
  __int64 v10; 
  _PI_SWD_INTERFACE *InterfaceEntry; 
  _PI_SWD_INTERFACE **v12; 
  WCHAR *v13; 
  __int64 v14; 
  __int64 v16; 
  _PI_SWD_INTERFACE **v17; 
  _PI_SWD_INTERFACE *Interface; 
  WCHAR *InterfaceId; 
  __int64 v20[11]; 
  UINT64 PdoFlags; 
  VOID *pMemory; 

  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  v20[1] = (__int64)CurrentStackLocation;
  FsContext2 = (INT64)CurrentStackLocation->FileObject->FsContext2;
  v20[2] = FsContext2;
  v20[0] = 0i64;
  pMemory = 0i64;
  v6 = 0i64;
  Interface = 0i64;
  InterfaceId = 0i64;
  LODWORD(PdoFlags) = 0;
  v7 = 0;
  v8.MasterIrp = (_IRP *)Irp->AssociatedIrp;
  if( !v8.MasterIrp )
  {
    updated = -1073741811;
    goto LABEL_36;
  }
  updated = MesDecodeBufferHandleCreate(v8.MasterIrp, CurrentStackLocation->Parameters.Options, v20);
  if( updated >= 0 )
  {
    NdrMesTypeDecode3(v20[0], "TP 3\a", &off_140983A98, (char *)&stru_140C00F40 + 2848, 2, &pMemory);
    if( pMemory
      && *(_QWORD *)pMemory
      && ((v2 = *((_QWORD *)pMemory + 3)) != 0 || !*((_DWORD *)pMemory + 4))
      && ((v1 = *((unsigned int *)pMemory + 4), (_DWORD)v1) || !v2) )
    {
      updated = PiSwValidatePropertyArray(*((_DEVPROPERTY **)pMemory + 3), v1);
      if( updated >= 0 )
      {
        PiSwLock();
        if( !PiSwDeviceOperationsAllowed(FsContext2) || (*(_DWORD *)(FsContext2 + 64) & 8) != 0 )
        {
          updated = -1073741637;
        }
        else
        {
          updated = IopRegisterDeviceInterface(
                      *(WCHAR **)(FsContext2 + 80),
                      *(_GUID **)pMemory,
                      *((WCHAR **)pMemory + 1),
                      1u,
                      &InterfaceId,
                      &PdoFlags);
          if( updated >= 0 )
          {
            v10 = *(_QWORD *)(FsContext2 + 120);
            if( v10 )
              *(_DWORD *)(v10 + 48) |= PdoFlags;
            InterfaceEntry = PiSwDeviceFindInterfaceEntry((_PI_SWD_OBJECT *)FsContext2, InterfaceId);
            v6 = InterfaceEntry;
            Interface = InterfaceEntry;
            if( InterfaceEntry )
            {
              updated = PiSwUpdateArrayProperties(
                          *((_DEVPROPERTY **)InterfaceEntry + 3),
                          (unsigned int)InterfaceEntry[8],
                          *((_DEVPROPERTY **)pMemory + 3),
                          *((unsigned int *)pMemory + 4));
LABEL_17:
              PiSwUnlock();
              if( updated < 0 )
                goto LABEL_36;
              v2 = *((_QWORD *)pMemory + 3);
              if( v2 )
                updated = PiSwPropertySet(
                            *((WCHAR **)v6 + 2),
                            (VOID *)3,
                            v2,
                            (_DEVPROPERTY *)*((unsigned int *)pMemory + 4));
              if( updated < 0 )
                goto LABEL_36;
              PiSwLock();
              updated = PiSwDeviceInterfaceSetState((PI_SWD_OBJECT *)FsContext2, v6, *((_BYTE *)pMemory + 32));
              goto LABEL_22;
            }
            updated = PiSwInterfaceCreate(
                        InterfaceId,
                        *((_DEVPROPERTY **)pMemory + 3),
                        *((unsigned int *)pMemory + 4),
                        (VOID **)&Interface);
            if( updated >= 0 )
            {
              v7 = 1;
              v12 = *(_PI_SWD_INTERFACE ***)(FsContext2 + 192);
              if( *v12 != (_PI_SWD_INTERFACE *)(FsContext2 + 184) )
                goto LABEL_48;
              v6 = Interface;
              *(_QWORD *)Interface = FsContext2 + 184;
              *((_QWORD *)v6 + 1) = v12;
              *v12 = v6;
              *(_QWORD *)(FsContext2 + 192) = v6;
              goto LABEL_17;
            }
            v6 = Interface;
          }
        }
LABEL_22:
        PiSwUnlock();
        if( updated < 0 )
          goto LABEL_36;
        v13 = InterfaceId;
        updated = RtlStringCbCopyW(
                    (WCHAR *)Irp->AssociatedIrp.MasterIrp,
                    LODWORD(CurrentStackLocation->Parameters.SecurityContext),
                    InterfaceId);
        if( updated >= 0 )
        {
          v14 = -1i64;
          do
            ++v14;
          while( v13[v14] );
          Irp->IoStatus.Information = 2 * v14 + 2;
        }
      }
    }
    else
    {
      updated = -1073741811;
    }
  }
  if( updated >= 0 )
    goto LABEL_28;
LABEL_36:
  if( v6 && v7 )
  {
    PiSwLock();
    v16 = *(_QWORD *)v6;
    v17 = (_PI_SWD_INTERFACE **)*((_QWORD *)v6 + 1);
    if( *(_PI_SWD_INTERFACE **)(*(_QWORD *)v6 + 8i64) == v6 && *v17 == v6 )
    {
      *v17 = (_PI_SWD_INTERFACE *)v16;
      *(_QWORD *)(v16 + 8) = v17;
      PiSwUnlock();
      PiSwInterfaceFree(v6);
      goto LABEL_28;
    }
LABEL_48:
    __fastfail(3u);
  }
LABEL_28:
  if( pMemory )
    MIDL_user_free(pMemory);
  if( InterfaceId )
    ExFreePoolWithTag(InterfaceId, 0);
  if( v20[0] )
    MesHandleFree(v20[0], v1, v2);
  Irp->IoStatus.Status = updated;
  IofCompleteRequest(Irp, 0);
  return updated;
}

Referenced by:

PiSwDispatch