PiDmObjectGetCachedObjectPropertyData

NTSTATUS __stdcall PiDmObjectGetCachedObjectPropertyData(
        PNP_OBJECT_TYPE ObjectType,
        WCHAR *ObjectName,
        PVOID Object,
        _DEVPROPKEY *PropertyKey,
        UINT64 *PropertyType,
        _GUID *PropertyBuffer,
        UINT64 BufferSize,
        UINT64 *PropertySize){
  int v11; 
  char v12; 
  const _DEVPROPKEY *v13; 
  unsigned int v14; 
  __int64 v15; 
  unsigned int v16; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v18; 
  PI_DM_CACHED_PROPERTY_DATA *v19; 
  UINT64 CachedKeyCount; 
  _PI_DM_CACHED_PROPERTY_KEY *CachedKeys; 
  _EX_PUSH_LOCK *PushLock; 

  PushLock = (_EX_PUSH_LOCK *)Object;
  CachedKeys = 0i64;
  LODWORD(CachedKeyCount) = 0;
  v11 = -1073741802;
  v12 = 0;
  PiDmGetCacheKeys((_PNP_OBJECT_TYPE)ObjectType, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeyCount);
  if( (_DWORD)CachedKeyCount )
  {
    PiDmGetCachedKeyIndex(CachedKeys, CachedKeyCount, v13, (INT64)v13);
    v15 = v14;
    if( v14 < v16 )
    {
      if( !Object )
      {
        v11 = PiDmGetObject(ObjectType, ObjectName, (PI_DM_OBJECT **)&PushLock);
        if( v11 < 0 )
          return v11;
        v12 = 1;
      }
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      v18 = PushLock;
      ExAcquirePushLockSharedEx(PushLock, 0i64);
      v19 = (PI_DM_CACHED_PROPERTY_DATA *)&v18[2 * v15 + 14 + v15];
      if( (unsigned int)*v19 <= 1 )
        v11 = -1073741802;
      else
        v11 = PiDmCacheDataDecode(v19, PropertyType, (UINT8 *)PropertyBuffer, (unsigned int)BufferSize, PropertySize);
      ExReleasePushLockEx((ULONG_PTR)v18, 0);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      if( v12 )
        PiDmObjectRelease((_PI_DM_OBJECT *)PushLock);
    }
  }
  return v11;
}

Referenced by:

PiDmObjectGetCachedObjectProperty