PiSwIrpInterfacePropertySet

NTSTATUS __stdcall PiSwIrpInterfacePropertySet(_IRP *Irp){
  UINT64 v1; 
  INT64 v2; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  INT64 FsContext2; 
  int v6; 
  _ETHREAD *CurrentThread; 
  _PI_SWD_OBJECT *v8; 
  _PI_SWD_INTERFACE *InterfaceEntry; 
  PVOID P; 
  __int64 v12; 
  INT64 v13; 

  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  FsContext2 = (INT64)CurrentStackLocation->FileObject->FsContext2;
  v13 = FsContext2;
  v12 = 0i64;
  P = 0i64;
  if( !Irp->AssociatedIrp.MasterIrp )
    goto LABEL_21;
  v6 = MesDecodeBufferHandleCreate(Irp->AssociatedIrp.MasterIrp, CurrentStackLocation->Parameters.Options, &v12);
  if( v6 < 0 )
    goto LABEL_14;
  NdrMesTypeDecode3(v12, "TP 3\a", &off_140983A98, (char *)&stru_140C00F40 + 2848, 4, &P);
  if( P && *(_QWORD *)P && *((_QWORD *)P + 2) && (v1 = *((unsigned int *)P + 2), (_DWORD)v1) )
  {
    v6 = PiSwValidatePropertyArray(*((_DEVPROPERTY **)P + 2), v1);
    if( v6 >= 0 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquireResourceExclusiveLite((UINT64)&PiSwLockObj, 1, v2);
      if( PiSwDeviceOperationsAllowed(FsContext2) )
      {
        InterfaceEntry = PiSwDeviceFindInterfaceEntry(v8, *(WCHAR **)P);
        v6 = InterfaceEntry ? PiSwUpdateArrayProperties(
                                *((_DEVPROPERTY **)InterfaceEntry + 3),
                                (unsigned int)InterfaceEntry[8],
                                *((_DEVPROPERTY **)P + 2),
                                *((unsigned int *)P + 2)) : -1073741275;
      }
      else
      {
        v6 = -1073741637;
      }
      ExReleaseResourceLite(&PiSwLockObj);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      if( v6 >= 0 )
        v6 = PiSwPropertySet(*(WCHAR **)P, (VOID *)3, *((_QWORD *)P + 2), (_DEVPROPERTY *)*((unsigned int *)P + 2));
    }
  }
  else
  {
LABEL_21:
    v6 = -1073741811;
  }
LABEL_14:
  if( P )
    ExFreePoolWithTag(P, 0x6370726Bu);
  if( v12 )
    MesHandleFree(v12, v1, v2);
  Irp->IoStatus.Status = v6;
  IofCompleteRequest(Irp, 0);
  return v6;
}

Referenced by:

PiSwDispatch