PiDmObjectUpdateCachedObjectProperty

VOID __stdcall PiDmObjectUpdateCachedObjectProperty(
        UINT64 a1,
        WCHAR *a2,
        INT64 a3,
        INT64 a4,
        INT64 PropertyKey,
        INT64 PropertyType,
        WCHAR *buf2,
        UINT64 PropertySize){
  bool v8; 
  unsigned int v10; 
  INT64 v11; 
  INT64 v12; 
  unsigned int v13; 
  __int64 v14; 
  unsigned int v15; 
  _ETHREAD *CurrentThread; 
  _PI_DM_OBJECT *v17; 
  __int64 v18; 
  WCHAR *v19; 
  unsigned int v20; 
  int ObjectProperty; 
  void *v22; 
  int v23; 
  unsigned int v24; 
  _ETHREAD *v25; 
  UINT64 count; 
  VOID *buf1; 
  _PI_DM_OBJECT *Object; 
  _PI_DM_CACHED_PROPERTY_KEY *CachedKeys; 
  _PI_DM_CACHED_PROPERTY_DATA *v30; 
  int v31; 
  int v32; 
  UINT64 CachedKeysCount; 

  v32 = HIDWORD(a3);
  Object = 0i64;
  v8 = 0;
  CachedKeys = 0i64;
  LODWORD(CachedKeysCount) = 0;
  v10 = a1;
  v31 = 0;
  buf1 = 0i64;
  LODWORD(count) = 0;
  if( !a4 )
  {
    PiDmGetCacheKeys((_PNP_OBJECT_TYPE)a1, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeysCount);
    if( (_DWORD)CachedKeysCount )
    {
      v12 = PropertyKey;
      PiDmGetCachedKeyIndex(CachedKeys, CachedKeysCount, (const _DEVPROPKEY *)PropertyKey, v11);
      v14 = v13;
      if( v13 < v15 && PiDmGetObject(v10, a2, &Object) >= 0 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --CurrentThread->Tcb.KernelApcDisable;
        v17 = Object;
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
        v18 = 3 * v14;
        v19 = buf2;
        v20 = v17[2 * v18 + 28];
        v30 = &v17[2 * v18 + 28];
        LODWORD(CachedKeysCount) = v20;
        if( v20 <= 1 )
        {
          PiDmCacheDataEncode(
            (unsigned int)PropertyType,
            (UINT8 *)buf2,
            (unsigned int)PropertySize,
            (unsigned int)CachedKeys[2 * v18 + 2],
            CachedKeys[2 * v18 + 3],
            &v17[2 * v18 + 28]);
          v8 = (_DWORD)CachedKeysCount == 0;
        }
        ExReleasePushLockEx((ULONG_PTR)v17, 0);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        if( !v8 )
          goto LABEL_9;
        ObjectProperty = PnpGetObjectProperty(
                           0x5A706E50u,
                           (unsigned int)PropertySize,
                           (INT64)a2,
                           v10,
                           0i64,
                           0i64,
                           v12,
                           (INT64)&v31,
                           (__int64)&buf1,
                           (__int64)&count);
        v22 = buf1;
        v23 = ObjectProperty;
        if( ObjectProperty == -1073741275 )
        {
          v31 = 0;
          v23 = 0;
          if( buf1 )
          {
            ExFreePoolWithTag(buf1, 0x5A706E50u);
            v22 = 0i64;
            buf1 = 0i64;
          }
          v24 = 0;
        }
        else
        {
          v24 = count;
        }
        if( v23 < 0 || v31 != (_DWORD)PropertyType || v24 != (_DWORD)PropertySize )
          goto LABEL_26;
        if( v22 )
        {
          if( !v19 )
            goto LABEL_26;
        }
        else if( v19 )
        {
          goto LABEL_26;
        }
        if( !v24 )
          goto LABEL_20;
        if( !v22 )
        {
LABEL_9:
          PiDmObjectRelease(Object);
          return;
        }
        if( !memcmp(v22, v19, v24) )
        {
LABEL_20:
          if( v22 )
            ExFreePoolWithTag(v22, 0x5A706E50u);
          goto LABEL_9;
        }
LABEL_26:
        v25 = (_ETHREAD *)KeGetCurrentThread();
        --v25->Tcb.KernelApcDisable;
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
        PiDmCacheDataFree(v30);
        ExReleasePushLockEx((ULONG_PTR)Object, 0);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        v22 = buf1;
        goto LABEL_20;
      }
    }
  }
}

Referenced by:

PiDmObjectUpdateCachedCmProperty
PiPnpRtlObjectActionCallback