PiSwIrpInterfaceRegister

NTSTATUS __stdcall PiSwIrpInterfaceRegister(IRP *Irp){
  __int64 v2; 
  __int64 v3; 
  WCHAR **v4; 
  char v5; 
  __int64 v6; 
  NTSTATUS updated; 
  __int64 v8; 
  UINT64 v9; 
  __int64 v10; 
  __int64 *InterfaceEntry; 
  WCHAR ***v12; 
  INT64 v13; 
  NTSTRSAFE_PCWSTR v14; 
  __int64 v15; 
  WCHAR *v17; 
  void **v18; 
  INT64 v19; 
  NTSTRSAFE_PCWSTR pszSrc; 
  __int64 v21[11]; 
  UINT64 PdoFlags; 
  VOID *v23; 
  v2 = *((_QWORD *)Irp + 23);
  v21[1] = v2;
  v3 = *(_QWORD *)(*(_QWORD *)(v2 + 48) + 32i64);
  v21[2] = v3;
  v21[0] = 0i64;
  v23 = 0i64;
  v4 = 0i64;
  v19 = 0i64;
  pszSrc = 0i64;
  LODWORD(PdoFlags) = 0;
  v5 = 0;
  v6 = *((_QWORD *)Irp + 3);
  if( !v6 )
  {
    updated = -1073741811;
    goto LABEL_36;
  }
  updated = MesDecodeBufferHandleCreate(v6, *(unsigned int *)(v2 + 16), v21);
  if( updated >= 0 )
  {
    NdrMesTypeDecode3(v21[0], "TP 3\a", &off_140983A98, &off_140C01A60, 2, &v23);
    if( v23
      && *(_QWORD *)v23
      && ((v8 = *((_QWORD *)v23 + 3)) != 0 || !*((_DWORD *)v23 + 4))
      && ((v9 = *((unsigned int *)v23 + 4), (_DWORD)v9) || !v8) )
    {
      updated = PiSwValidatePropertyArray(*((DEVPROPERTY **)v23 + 3), v9);
      if( updated >= 0 )
      {
        PiSwLock();
        if( !PiSwDeviceOperationsAllowed(v3) || (*(_DWORD *)(v3 + 64) & 8) != 0 )
        {
          updated = -1073741637;
        }
        else
        {
          updated = IopRegisterDeviceInterface(
                      *(WCHAR **)(v3 + 80),
                      *(GUID **)v23,
                      *((WCHAR **)v23 + 1),
                      1u,
                      (WCHAR **)&pszSrc,
                      &PdoFlags);
          if( updated >= 0 )
          {
            v10 = *(_QWORD *)(v3 + 120);
            if( v10 )
              *(_DWORD *)(v10 + 48) |= PdoFlags;
            InterfaceEntry = PiSwDeviceFindInterfaceEntry(v3, pszSrc);
            v4 = (WCHAR **)InterfaceEntry;
            v19 = (INT64)InterfaceEntry;
            if( InterfaceEntry )
            {
              updated = PiSwUpdateArrayProperties(
                          (DEVPROPERTY *)InterfaceEntry[3],
                          *((unsigned int *)InterfaceEntry + 8),
                          *((DEVPROPERTY **)v23 + 3),
                          *((unsigned int *)v23 + 4));
LABEL_17:
              PiSwUnlock();
              if( updated < 0 )
                goto LABEL_36;
              v13 = *((_QWORD *)v23 + 3);
              if( v13 )
                updated = PiSwPropertySet(v4[2], (PVOID)3, v13, (DEVPROPERTY *)*((unsigned int *)v23 + 4));
              if( updated < 0 )
                goto LABEL_36;
              PiSwLock();
              updated = PiSwDeviceInterfaceSetState(v3, (INT64)v4, *((_BYTE *)v23 + 32));
              goto LABEL_22;
            }
            updated = PiSwInterfaceCreate(
                        (WCHAR *)pszSrc,
                        *((DEVPROPERTY **)v23 + 3),
                        *((unsigned int *)v23 + 4),
                        (CHAR **)&v19);
            if( updated >= 0 )
            {
              v5 = 1;
              v12 = *(WCHAR ****)(v3 + 192);
              if( *v12 != (WCHAR **)(v3 + 184) )
                goto LABEL_48;
              v4 = (WCHAR **)v19;
              *(_QWORD *)v19 = v3 + 184;
              v4[1] = (WCHAR *)v12;
              *v12 = v4;
              *(_QWORD *)(v3 + 192) = v4;
              goto LABEL_17;
            }
            v4 = (WCHAR **)v19;
          }
        }
LABEL_22:
        PiSwUnlock();
        if( updated < 0 )
          goto LABEL_36;
        v14 = pszSrc;
        updated = RtlStringCbCopyW(*((PWCHAR *)Irp + 3), *(unsigned int *)(v2 + 8), (PWCHAR)pszSrc);
        if( updated >= 0 )
        {
          v15 = -1i64;
          do
            ++v15;
          while( v14[v15] );
          *((_QWORD *)Irp + 7) = 2 * v15 + 2;
        }
      }
    }
    else
    {
      updated = -1073741811;
    }
  }
  if( updated >= 0 )
    goto LABEL_28;
LABEL_36:
  if( v4 && v5 )
  {
    PiSwLock();
    v17 = *v4;
    v18 = (void **)v4[1];
    if( *((WCHAR ***)*v4 + 1) == v4 && *v18 == v4 )
    {
      *v18 = v17;
      *((_QWORD *)v17 + 1) = v18;
      PiSwUnlock();
      PiSwInterfaceFree(v4);
      goto LABEL_28;
    }
LABEL_48:
    __fastfail(3u);
  }
LABEL_28:
  if( v23 )
    MIDL_user_free(v23);
  if( pszSrc )
    ExFreePoolWithTag((PVOID)pszSrc, 0);
  if( v21[0] )
    MesHandleFree();
  *((_DWORD *)Irp + 12) = updated;
  IofCompleteRequest(Irp, 0);
  return updated;
}

Referenced by:

PiSwDispatch