PiSwIrpInterfacePropertySet

INT64 __stdcall PiSwIrpInterfacePropertySet(PIRP Irp){
  __int64 v2; 
  INT64 v3; 
  NTSTATUS v4; 
  UINT64 v5; 
  _ETHREAD *CurrentThread; 
  __int64 v7; 
  __int64 *InterfaceEntry; 
  PVOID P; 
  __int64 v11; 
  INT64 v12; 
  v2 = *((_QWORD *)Irp + 23);
  v3 = *(_QWORD *)(*(_QWORD *)(v2 + 48) + 32i64);
  v12 = v3;
  v11 = 0i64;
  P = 0i64;
  if( !*((_QWORD *)Irp + 3) )
    goto LABEL_21;
  v4 = MesDecodeBufferHandleCreate(*((_QWORD *)Irp + 3), *(unsigned int *)(v2 + 16), &v11);
  if( v4 < 0 )
    goto LABEL_14;
  NdrMesTypeDecode3(v11, "TP 3\a", &off_140983A98, &off_140C01A60, 4, &P);
  if( P && *(_QWORD *)P && *((_QWORD *)P + 2) && (v5 = *((unsigned int *)P + 2), (_DWORD)v5) )
  {
    v4 = PiSwValidatePropertyArray(*((DEVPROPERTY **)P + 2), v5);
    if( v4 >= 0 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u);
      if( PiSwDeviceOperationsAllowed(v3) )
      {
        InterfaceEntry = PiSwDeviceFindInterfaceEntry(v7, *(const wchar_t **)P);
        v4 = InterfaceEntry ? PiSwUpdateArrayProperties(
                                (DEVPROPERTY *)InterfaceEntry[3],
                                *((unsigned int *)InterfaceEntry + 8),
                                *((DEVPROPERTY **)P + 2),
                                *((unsigned int *)P + 2)) : -1073741275;
      }
      else
      {
        v4 = -1073741637;
      }
      ExReleaseResourceLite((PERESOURCE)PiSwLockObj);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      if( v4 >= 0 )
        v4 = PiSwPropertySet(*(WCHAR **)P, (PVOID)3, *((_QWORD *)P + 2), (DEVPROPERTY *)*((unsigned int *)P + 2));
    }
  }
  else
  {
LABEL_21:
    v4 = -1073741811;
  }
LABEL_14:
  if( P )
    ExFreePoolWithTag(P, 0x6370726Bu);
  if( v11 )
    MesHandleFree();
  *((_DWORD *)Irp + 12) = v4;
  IofCompleteRequest(Irp, 0);
  return(unsigned int)v4;
}

Referenced by:

PiSwDispatch