PiPnpRtlObjectActionCallback

INT64 __fastcall PiPnpRtlObjectActionCallback(INT64 a1, WCHAR *a2, INT64 r8_0, INT64 a4, INT64 a5, INT64 arg28){
  INT64 v6; 
  unsigned int v7; 
  unsigned int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  int ObjectList; 
  __int64 v16; 
  _QWORD *v17; 
  bool v18; 
  void *PoolWithTag; 
  unsigned int v21; 
  int ObjectProperty; 
  int v23; 
  int v24; 
  _WORD *v25; 
  INT64 v26; 
  _DWORD *a6; 
  _DWORD *a6a; 
  WCHAR *v29; 
  INT64 a8; 
  INT64 a8a; 
  size_t Size; 
  INT64 a3[3]; 
  int v34; 
  v6 = arg28;
  v7 = r8_0;
  v10 = -1073741822;
  v11 = a4 - 3;
  if( !v11 )
  {
    if( (_DWORD)r8_0 != 7 )
      return v10;
    if( (_DWORD)a5 != 1 )
    {
      if( *(_QWORD *)(arg28 + 8) == 1i64 )
      {
        if( *(int *)arg28 >= 0 )
          *(_BYTE *)(arg28 + 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(unsigned int)-1073741536;
  }
  v12 = v11 - 1;
  if( !v12 )
  {
    if( (_DWORD)r8_0 != 7 )
      return v10;
    if( (_DWORD)a5 != 1 )
    {
      if( *(_DWORD *)arg28 != -1073741772 )
        return v10;
      *(_DWORD *)arg28 = 0;
      return(unsigned int)-1073741536;
    }
    ObjectList = PiDrvDbUnmountNode(a2);
    v10 = ObjectList;
    if( ObjectList >= 0 )
      return v10;
    goto LABEL_22;
  }
  v13 = v12 - 1;
  if( !v13 )
  {
    if( (_DWORD)a5 != 1 || (*(_DWORD *)(arg28 + 56) & 0x10000) != 0 )
      return v10;
    v24 = *(_DWORD *)(arg28 + 40);
    v25 = *(_WORD **)(arg28 + 32);
    if( (int)r8_0 >= 7 )
      return 0;
    a6a = *(_DWORD **)(arg28 + 48);
    a3[0] = *(_QWORD *)(arg28 + 16);
    LODWORD(v26) = v24;
    a3[1] = *(_QWORD *)(arg28 + 24);
    ObjectList = PiDmGetObjectList((unsigned int)r8_0, (INT64)PiDmPnpObjectMatchCallback, (INT64)a3, v25, v26, a6a);
    if( ObjectList == -1073741802 )
      return 0;
    goto LABEL_22;
  }
  v14 = v13 - 3;
  if( !v14 )
  {
    if( (_DWORD)a5 == 1 )
    {
      LODWORD(a8) = *(_DWORD *)(arg28 + 56);
      ObjectList = PiDmObjectGetAggregatedBooleanPropertyData(
                     (unsigned int)r8_0,
                     a2,
                     r8_0,
                     *(_QWORD *)(arg28 + 24),
                     *(_QWORD *)(arg28 + 32),
                     *(_QWORD *)(arg28 + 40),
                     *(_QWORD *)(arg28 + 48),
                     a8,
                     *(_QWORD *)(arg28 + 64));
      if( ObjectList == -1073741802 )
      {
        if( (*(_DWORD *)(v6 + 72) & 0x10000) != 0
          || (LODWORD(a8a) = *(_DWORD *)(v6 + 56),
              ObjectList = PiDmObjectGetCachedObjectProperty(
                             v7,
                             a2,
                             v16,
                             *(_QWORD *)(v6 + 24),
                             *(_QWORD *)(v6 + 32),
                             *(_DWORD **)(v6 + 40),
                             *(GUID **)(v6 + 48),
                             a8a,
                             *(unsigned int **)(v6 + 64)),
              ObjectList < 0)
          && ObjectList != -1073741275
          && ObjectList != -1073741772
          && ObjectList != -1073741789 )
        {
          v17 = (_QWORD *)(v6 + 16);
          v10 = 0;
          v18 = *(_QWORD *)(v6 + 16) == 0i64;
          goto LABEL_13;
        }
      }
      goto LABEL_22;
    }
    if( (*(_DWORD *)(arg28 + 72) & 0x10000) != 0 )
      return v10;
    if( *(int *)arg28 < 0 )
    {
      if( *(_DWORD *)arg28 == -1073741275 )
      {
        LODWORD(a8) = 0;
        v29 = 0i64;
        LODWORD(a6) = 0;
LABEL_19:
        PiDmObjectUpdateCachedObjectProperty(
          (unsigned int)r8_0,
          a2,
          r8_0,
          *(_QWORD *)(arg28 + 24),
          *(_QWORD *)(arg28 + 32),
          (INT64)a6,
          v29,
          a8);
      }
      return 0;
    }
    LODWORD(a8) = **(_DWORD **)(arg28 + 64);
    v29 = *(WCHAR **)(arg28 + 48);
    v23 = **(_DWORD **)(arg28 + 40);
LABEL_34:
    LODWORD(a6) = v23;
    goto LABEL_19;
  }
  if( v14 != 1 )
    return v10;
  if( (_DWORD)a5 != 1 )
  {
    if( *(int *)arg28 < 0 )
      return v10;
    LODWORD(a8) = *(_DWORD *)(arg28 + 56);
    v29 = *(WCHAR **)(arg28 + 48);
    v23 = *(_DWORD *)(arg28 + 40);
    goto LABEL_34;
  }
  v10 = 0;
  if( (*(_DWORD *)(arg28 + 60) & 0x20000) != 0 )
    goto LABEL_46;
  v34 = 0;
  PoolWithTag = 0i64;
  LODWORD(Size) = 0;
  v21 = *(_DWORD *)(arg28 + 56);
  if( !v21 || (PoolWithTag = ExAllocatePoolWithTag(PagedPool, v21, 0x47706E50ui64)) != 0i64 )
  {
    if( (ObjectProperty = PnpGetObjectProperty(
                             PiPnpRtlCtx,
                             (__int64)a2,
                             v7,
                             *(_QWORD *)(v6 + 16),
                             *(const wchar_t **)(v6 + 24),
                             *(_QWORD *)(v6 + 32),
                             &v34,
                             (unsigned __int64)PoolWithTag,
                             *(_DWORD *)(v6 + 56),
                             (ULONG *)&Size,
                             0),
          ObjectProperty >= 0)
      && v34 == *(_DWORD *)(v6 + 40)
      && (_DWORD)Size == *(_DWORD *)(v6 + 56)
      && !memcmp(PoolWithTag, *(PVOID *)(v6 + 48), (unsigned int)Size)
      || 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 = (_QWORD *)(v6 + 16);
      v18 = *(_QWORD *)(v6 + 16) == 0i64;
LABEL_13:
      if( v18 )
        PiPnpRtlCacheObjectBaseKey(a1, a2, v7, v17);
    }
  }
  return v10;
}

Referenced by:

No references.