PiUEventHandleRegistration

NTSTATUS __stdcall PiUEventHandleRegistration(
        _FILE_OBJECT *FileObject,
        VOID *Buffer,
        UINT64 InputBufferLength,
        UINT64 OutputBufferLength,
        _IO_STATUS_BLOCK *IoStatus){
  _WNF_STATE_NAME *inited; 
  CHAR v6; 
  int v9; 
  int v10; 
  int v11; 
  VOID **v12; 
  UINT64 v13; 
  int v14; 
  int v15; 
  unsigned int v16; 
  char *v17; 
  _WNF_STATE_NAME **v18; 
  int v20; 
  int v21; 
  unsigned int v22; 
  char *v23; 
  _WNF_STATE_NAME **v24; 
  int v25; 
  int v26; 
  unsigned int v27; 
  char *v28; 
  _WNF_STATE_NAME **v29; 
  NTSTATUS Object; 
  unsigned int v31; 
  char *v32; 
  _WNF_STATE_NAME **v33; 
  _UNICODE_STRING *DeviceId; 
  _DEVICE_OBJECT *RevocationDeviceObject; 
  UINT64 pcchLength; 

  DeviceId = 0i64;
  inited = 0i64;
  RevocationDeviceObject = 0i64;
  v6 = 0;
  if( !Buffer || (_DWORD)InputBufferLength != 936 || (_DWORD)OutputBufferLength != 8 )
  {
    v9 = -1073741811;
    goto LABEL_25;
  }
  inited = PiUEventInitClientRegistrationContext();
  if( !inited )
  {
    v9 = -1073741670;
LABEL_55:
    FileObject->FsContext2 = 0i64;
    return v9;
  }
  inited[6] = (_WNF_STATE_NAME)PsGetCurrentThreadProcessId();
  SeCaptureSubjectContext((INT64)&inited[7]);
  v9 = RtlStringCchLengthW((WCHAR *)Buffer, 0x104ui64, &pcchLength);
  if( v9 < 0 )
    goto LABEL_52;
  if( *((_DWORD *)Buffer + 130) != 416 )
    goto LABEL_52;
  v10 = *((_DWORD *)Buffer + 132);
  if( v10 >= 4 )
    goto LABEL_52;
  v11 = *((_DWORD *)Buffer + 131);
  if( (v11 & 0xFFFFFFFC) != 0 || (v11 & 1) != 0 && v10 )
    goto LABEL_52;
  if( (v11 & 2) != 0 && (unsigned int)(v10 - 2) > 1 )
    goto LABEL_52;
  v12 = (VOID **)((char *)Buffer + 536);
  if( v10 == 1 && (((unsigned __int64)*v12 + 1) & 0xFFFFFFFFFFFFFFFEui64) == 0 )
    goto LABEL_52;
  v13 = 200i64;
  if( v10 == 2 )
  {
    v9 = RtlStringCchLengthW((WCHAR *)Buffer + 268, 0xC8ui64, &pcchLength);
    if( v9 < 0 )
      goto LABEL_52;
  }
  if( *((_DWORD *)Buffer + 132) == 3 )
  {
    v9 = RtlStringCchLengthW((WCHAR *)Buffer + 268, v13, &pcchLength);
    if( v9 < 0 )
      goto LABEL_52;
  }
  inited[16].Data[1] = *((_DWORD *)Buffer + 132);
  v14 = *((_DWORD *)Buffer + 132);
  if( v14 )
  {
    v20 = v14 - 1;
    if( v20 )
    {
      v25 = v20 - 1;
      if( !v25 || v25 == 1 )
      {
        if( (*((_DWORD *)Buffer + 131) & 2) != 0 )
          goto LABEL_17;
        Object = PiDmGetObject(1, (WCHAR *)Buffer + 268, (PI_DM_OBJECT **)&inited[3]);
        v9 = Object;
        if( Object >= 0 )
          goto LABEL_17;
LABEL_53:
        if( inited )
          PiUEventFreeClientRegistrationContext(inited, v6);
        goto LABEL_55;
      }
    }
    else if( PiUEventGetDeviceInstanceIdFromUserHandle(*v12, &DeviceId, &RevocationDeviceObject) >= 0 )
    {
      v9 = PiDmGetObject(1, DeviceId->Buffer, (PI_DM_OBJECT **)&inited[3]);
      if( v9 >= 0 )
      {
        inited[4] = (_WNF_STATE_NAME)RevocationDeviceObject;
        LOBYTE(inited[5].Data[0]) = 0;
        goto LABEL_17;
      }
      goto LABEL_53;
    }
LABEL_52:
    v9 = -1073741811;
    goto LABEL_53;
  }
  if( (*((_DWORD *)Buffer + 131) & 1) == 0 )
    *(_OWORD *)inited[3].Data = *(_OWORD *)v12;
LABEL_17:
  *(_WNF_STATE_NAME *)Buffer = inited[11];
  IoStatus->Information = 8i64;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 7040));
  v15 = *((_DWORD *)Buffer + 132);
  if( v15 )
  {
    v21 = v15 - 1;
    if( v21 )
    {
      v26 = v21 - 1;
      if( v26 )
      {
        if( v26 != 1 )
        {
          v9 = -1073741811;
          goto LABEL_23;
        }
        if( (*((_DWORD *)Buffer + 131) & 2) != 0 )
          v31 = 13;
        else
          PiUEventHashStringIntoBucket((const WCHAR *)Buffer + 268);
        v32 = (char *)&PnpReplaceEvent + 16 * v31 + 7552;
        v33 = (_WNF_STATE_NAME **)*((_QWORD *)v32 + 1);
        if( *v33 == (_WNF_STATE_NAME *)v32 )
        {
          ++*(&stru_140CF2E80 + 1630);
          *inited = (_WNF_STATE_NAME)v32;
          inited[1] = (_WNF_STATE_NAME)v33;
          *v33 = inited;
          *((_QWORD *)v32 + 1) = inited;
          goto LABEL_22;
        }
      }
      else
      {
        if( (*((_DWORD *)Buffer + 131) & 2) != 0 )
          v27 = 13;
        else
          PiUEventHashStringIntoBucket((const WCHAR *)Buffer + 268);
        v28 = (char *)&PnpReplaceEvent + 16 * v27 + 7104;
        v29 = (_WNF_STATE_NAME **)*((_QWORD *)v28 + 1);
        if( *v29 == (_WNF_STATE_NAME *)v28 )
        {
          ++PiUEventDevInstanceClientCount;
          *inited = (_WNF_STATE_NAME)v28;
          inited[1] = (_WNF_STATE_NAME)v29;
          *v29 = inited;
          *((_QWORD *)v28 + 1) = inited;
          goto LABEL_22;
        }
      }
    }
    else
    {
      PiUEventHashStringIntoBucket(*(const WCHAR **)(*(_QWORD *)&inited[3] + 16i64));
      v23 = (char *)&PnpReplaceEvent + 16 * v22 + 7328;
      v24 = (_WNF_STATE_NAME **)*((_QWORD *)v23 + 1);
      if( *v24 == (_WNF_STATE_NAME *)v23 )
      {
        ++PiUEventDevHandleClientCount;
        *inited = (_WNF_STATE_NAME)v23;
        inited[1] = (_WNF_STATE_NAME)v24;
        *v24 = inited;
        *((_QWORD *)v23 + 1) = inited;
        goto LABEL_22;
      }
    }
LABEL_70:
    __fastfail(3u);
  }
  if( (*((_DWORD *)Buffer + 131) & 1) != 0 )
    v16 = 13;
  else
    v16 = PiUEventHashGuidIntoBucket((_GUID *)((char *)Buffer + 536));
  v17 = (char *)&PnpReplaceEvent + 16 * v16 + 6816;
  v18 = (_WNF_STATE_NAME **)*((_QWORD *)v17 + 1);
  if( *v18 != (_WNF_STATE_NAME *)v17 )
    goto LABEL_70;
  ++PiUEventDevInterfaceClientCount;
  *inited = (_WNF_STATE_NAME)v17;
  inited[1] = (_WNF_STATE_NAME)v18;
  *v18 = inited;
  *((_QWORD *)v17 + 1) = inited;
LABEL_22:
  v6 = 1;
LABEL_23:
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 7040));
  if( v9 < 0 )
    goto LABEL_53;
  FileObject->FsContext2 = inited;
LABEL_25:
  if( v9 < 0 )
    goto LABEL_53;
  return v9;
}

Referenced by:

PiUEventHandleIoctl