PiPnpRtlObjectActionCallback

NTSTATUS __stdcall PiPnpRtlObjectActionCallback(INT64 a1, WCHAR *a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
  INT64 v6; 
  unsigned int v7; 
  NTSTATUS v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  NTSTATUS ObjectList; 
  WCHAR *v16; 
  VOID **v17; 
  bool v18; 
  VOID **PoolWithTag; 
  unsigned int v21; 
  NTSTATUS ObjectProperty; 
  int v23; 
  int v24; 
  PI_DM_OBJECT *v25; 
  VOID *v26; 
  INT64 v27; 
  UINT8 *v28; 
  VOID *v29; 
  WCHAR *v30; 
  UINT64 *PropertySize; 
  UINT64 *PropertySizea; 
  UINT64 v33; 
  UINT64 *v34; 
  int MatchCallbackRoutine[2]; 
  __int64 v36; 
  INT64 v37; 

  v6 = a6;
  v7 = a3;
  v10 = -1073741822;
  v11 = a4 - 3;
  if( !v11 )
  {
    if( (_DWORD)a3 != 7 )
      return v10;
    if( (_DWORD)a5 != 1 )
    {
      if( *(_QWORD *)(a6 + 8) == 1i64 )
      {
        if( *(int *)a6 >= 0 )
          *(_BYTE *)(a6 + 32) = 1;
        else
          PiDrvDbUnmountNode(a2);
        *(_QWORD *)(v6 + 8) = 0i64;
      }
      return v10;
    }
    ObjectList = PiDrvDbMountNode(a2);
    v10 = ObjectList;
    if( ObjectList >= 0 )
    {
      *(_QWORD *)(v6 + 8) = 1i64;
      return v10;
    }
LABEL_22:
    *(_DWORD *)v6 = ObjectList;
    return -1073741536;
  }
  v12 = v11 - 1;
  if( !v12 )
  {
    if( (_DWORD)a3 != 7 )
      return v10;
    if( (_DWORD)a5 != 1 )
    {
      if( *(_DWORD *)a6 != -1073741772 )
        return v10;
      *(_DWORD *)a6 = 0;
      return -1073741536;
    }
    ObjectList = PiDrvDbUnmountNode(a2);
    v10 = ObjectList;
    if( ObjectList >= 0 )
      return v10;
    goto LABEL_22;
  }
  v13 = v12 - 1;
  if( !v13 )
  {
    if( (_DWORD)a5 != 1 || (*(_DWORD *)(a6 + 56) & 0x10000) != 0 )
      return v10;
    v24 = *(_DWORD *)(a6 + 40);
    v25 = *(PI_DM_OBJECT **)(a6 + 32);
    if( (int)a3 >= 7 )
      return 0;
    v28 = *(UINT8 **)(a6 + 48);
    *(_QWORD *)MatchCallbackRoutine = *(_QWORD *)(a6 + 16);
    LODWORD(v26) = v24;
    v36 = *(_QWORD *)(a6 + 24);
    ObjectList = PiDmGetObjectList(
                   a3,
                   (INT64)PiDmPnpObjectMatchCallback,
                   (INT64 *)MatchCallbackRoutine,
                   v25,
                   v26,
                   v28,
                   v29,
                   (WCHAR *)PropertySize,
                   v33,
                   v34);
    if( ObjectList == -1073741802 )
      return 0;
    goto LABEL_22;
  }
  v14 = v13 - 3;
  if( !v14 )
  {
    if( (_DWORD)a5 == 1 )
    {
      LODWORD(PropertySize) = *(_DWORD *)(a6 + 56);
      ObjectList = PiDmObjectGetAggregatedBooleanPropertyData(
                     a3,
                     a2,
                     (WCHAR *)a3,
                     *(_DEVPROPKEY **)(a6 + 24),
                     *(UINT64 **)(a6 + 32),
                     *(UINT8 **)(a6 + 40),
                     *(_QWORD *)(a6 + 48),
                     PropertySize);
      if( ObjectList == -1073741802 )
      {
        if( (*(_DWORD *)(v6 + 72) & 0x10000) != 0
          || (LODWORD(PropertySizea) = *(_DWORD *)(v6 + 56),
              ObjectList = PiDmObjectGetCachedObjectProperty(
                             v7,
                             a2,
                             v16,
                             *(_DEVPROPKEY **)(v6 + 24),
                             *(UINT64 **)(v6 + 32),
                             *(UINT8 **)(v6 + 40),
                             *(_QWORD *)(v6 + 48),
                             PropertySizea),
              ObjectList < 0)
          && ObjectList != -1073741275
          && ObjectList != -1073741772
          && ObjectList != -1073741789 )
        {
          v17 = (VOID **)(v6 + 16);
          v10 = 0;
          v18 = *(_QWORD *)(v6 + 16) == 0i64;
          goto LABEL_13;
        }
      }
      goto LABEL_22;
    }
    if( (*(_DWORD *)(a6 + 72) & 0x10000) != 0 )
      return v10;
    if( *(int *)a6 < 0 )
    {
      if( *(_DWORD *)a6 == -1073741275 )
      {
        LODWORD(PropertySize) = 0;
        v30 = 0i64;
        LODWORD(v27) = 0;
LABEL_19:
        PiDmObjectUpdateCachedObjectProperty(
          (unsigned int)a3,
          a2,
          a3,
          *(_QWORD *)(a6 + 24),
          *(_QWORD *)(a6 + 32),
          v27,
          v30,
          (UINT64)PropertySize);
      }
      return 0;
    }
    LODWORD(PropertySize) = **(_DWORD **)(a6 + 64);
    v30 = *(WCHAR **)(a6 + 48);
    v23 = **(_DWORD **)(a6 + 40);
LABEL_34:
    LODWORD(v27) = v23;
    goto LABEL_19;
  }
  if( v14 != 1 )
    return v10;
  if( (_DWORD)a5 != 1 )
  {
    if( *(int *)a6 < 0 )
      return v10;
    LODWORD(PropertySize) = *(_DWORD *)(a6 + 56);
    v30 = *(WCHAR **)(a6 + 48);
    v23 = *(_DWORD *)(a6 + 40);
    goto LABEL_34;
  }
  v10 = 0;
  if( (*(_DWORD *)(a6 + 60) & 0x20000) != 0 )
    goto LABEL_46;
  LODWORD(v37) = 0;
  PoolWithTag = 0i64;
  v21 = *(_DWORD *)(a6 + 56);
  if( !v21 || (PoolWithTag = ExAllocatePoolWithTag(1ui64, v21, 1198550608i64)) != 0i64 )
  {
    if( (ObjectProperty = PnpGetObjectProperty(
                             *(&stru_140CF2E80 + 1214),
                             (INT64)a2,
                             v7,
                             *(_QWORD *)(v6 + 16),
                             *(_QWORD *)(v6 + 24),
                             *(_QWORD *)(v6 + 32),
                             (INT64)&v37,
                             (INT64)PoolWithTag),
          ObjectProperty >= 0)
      && (_DWORD)v37 == *(_DWORD *)(v6 + 40)
      && !*(_DWORD *)(v6 + 56)
      && !memcmp(PoolWithTag, *(const VOID **)(v6 + 48), 0i64)
      || ObjectProperty == -1073741275 && !*(_DWORD *)(v6 + 40) && !*(_DWORD *)(v6 + 56) )
    {
      *(_DWORD *)v6 = ObjectProperty;
      v10 = -1073741536;
    }
    else
    {
      v10 = 0;
    }
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0x47706E50u);
    if( !v10 )
    {
LABEL_46:
      v17 = (VOID **)(v6 + 16);
      v18 = *(_QWORD *)(v6 + 16) == 0i64;
LABEL_13:
      if( v18 )
        PiPnpRtlCacheObjectBaseKey((HPNPCTX *)a1, a2, v7, v17);
    }
  }
  return v10;
}

Referenced by:

No references.