PiDmObjectGetAggregatedBooleanPropertyData

NTSTATUS __stdcall PiDmObjectGetAggregatedBooleanPropertyData(
        PNP_OBJECT_TYPE ObjectType,
        WCHAR *ObjectName,
        WCHAR *PropertyLocaleName,
        _DEVPROPKEY *PropertyKey,
        UINT64 *PropertyType,
        UINT8 *PropertyBuffer,
        UINT64 BufferSize,
        UINT64 *PropertySize){
  _PI_DM_OBJECT v8; 
  _BYTE *v11; 
  int v13; 
  int v14; 
  char *v15; 
  unsigned int v16; 
  __int64 v17; 
  UINT64 v19; 
  __int64 *v20; 
  UINT64 v21; 
  _ETHREAD *CurrentThread; 
  _PI_DM_OBJECT *v23; 
  _PI_DM_OBJECT *v24; 
  _PI_DM_OBJECT v25; 
  _QWORD **v26; 
  _QWORD *v27; 
  char *v28; 
  NTSTATUS ObjectProperty; 
  _PI_DM_OBJECT *Object; 
  _PI_DM_OBJECT *v31; 
  INT64 v32; 
  int v33; 
  int v34; 
  _DWORD *v35; 

  v34 = HIDWORD(PropertyLocaleName);
  Object = 0i64;
  v8 = 0;
  v33 = 0;
  v11 = (_BYTE *)BufferSize;
  LOBYTE(v32) = 0;
  v13 = -1073741802;
  if( BufferSize )
  {
    v14 = (int)PropertySize;
    v11 = (_BYTE *)(-(__int64)((_DWORD)PropertySize != 0) & BufferSize);
  }
  else
  {
    v14 = 0;
  }
  if( ObjectType < 7 && !PropertyKey )
  {
    v15 = byte_140001538;
    v16 = 0;
    while( 1 )
    {
      v17 = *((_QWORD *)v15 + 1);
      if( *(_DWORD *)(v17 + 16) == *((_DWORD *)PropertyType + 4) )
      {
        v19 = *(_QWORD *)v17 - *PropertyType;
        if( *(_QWORD *)v17 == *PropertyType )
          v19 = *(_QWORD *)(v17 + 8) - PropertyType[1];
        if( !v19 && ObjectType == *(_DWORD *)v15 )
          break;
      }
      ++v16;
      v15 += 56;
      if( v16 >= 3 )
        return v13;
    }
    v20 = &PiDmAggregatedBooleanDefs[7 * v16];
    if( v20 )
    {
      *(_DWORD *)PropertyBuffer = 17;
      *v35 = 1;
      if( v14 )
      {
        v13 = PiDmGetObject(ObjectType, ObjectName, &Object);
        if( v13 >= 0 )
        {
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          v23 = Object;
          BufferSize = v20[6];
          v21 = BufferSize;
          v31 = Object;
          --CurrentThread->Tcb.KernelApcDisable;
          v24 = Object;
          ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
          v25 = *(_PI_DM_OBJECT *)((char *)v23 + v21);
          if( v25 == 0x80000000 )
          {
            v26 = (_QWORD **)((char *)v24 + PiDmListDefs[5 * *((int *)v20 + 10) + 1]);
            v27 = *v26;
            if( *v26 != v26 )
            {
              do
              {
                v28 = (char *)v27 - PiDmListDefs[5 * *((int *)v20 + 10) + 3];
                ObjectProperty = PnpGetObjectProperty(
                                   *(&stru_140CF2E80 + 1214),
                                   *((_QWORD *)v28 + 2),
                                   *((unsigned int *)v28 + 7),
                                   0i64,
                                   0i64,
                                   v20[1],
                                   (INT64)&v33,
                                   (INT64)&v32);
                v13 = ObjectProperty;
                if( ObjectProperty < 0 )
                {
                  if( ObjectProperty != -1073741275 )
                    goto LABEL_19;
                }
                else if( v33 == 17 && (_BYTE)v32 == 0xFF )
                {
                  ++v8;
                }
                v27 = (_QWORD *)*v27;
              }
              while( v27 != v26 );
              v21 = BufferSize;
            }
            *(_PI_DM_OBJECT *)((char *)v31 + v21) = v8;
            v25 = v8;
          }
          *v11 = (v25 <= 0) - 1;
          v13 = 0;
LABEL_19:
          ExReleasePushLockEx((ULONG_PTR)v24, 0);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          PiDmObjectRelease(Object);
        }
      }
      else
      {
        return -1073741789;
      }
    }
  }
  return v13;
}

Referenced by:

PiPnpRtlObjectActionCallback