PiDevCfgCopyObjectProperties

NTSTATUS __stdcall PiDevCfgCopyObjectProperties(
        VOID *SourceObjectBaseKey,
        WCHAR *TargetObjectName,
        PNP_OBJECT_TYPE TargetObjectType,
        VOID *TargetObjectBaseKey){
  WCHAR *v4; 
  NTSTATUS ObjectPropertyKeys; 
  NTSTATUS ObjectProperty; 
  VOID *v12; 
  VOID **PoolWithTag; 
  VOID *v14; 
  NTSTATUS GenericStorePropertyKeys; 
  VOID **v16; 
  unsigned int v17; 
  VOID *v18; 
  unsigned int v19; 
  WCHAR *v20; 
  INT64 v21; 
  INT64 v22; 
  VOID *v23; 
  INT64 v24; 
  INT64 v25; 
  WCHAR *v26; 
  INT64 v27; 
  _DEVPROPKEY *PropertyKey; 
  INT64 v29; 
  VOID *Handle; 
  UINT64 BufferSize; 
  UINT64 v32; 
  UINT64 PropertyType; 
  WCHAR *hPnpCtx; 
  INT64 v37; 
  UINT64 NumberOfBytes; 
  __int64 v39; 
  UINT64 v40; 
  WCHAR *PropertyLocaleName; 
  unsigned __int8(__fastcall *v42)(char *, __int64); 
  __int64 v43; 

  v4 = (WCHAR *)*(&stru_140CF2E80 + 607);
  hPnpCtx = (WCHAR *)*(&stru_140CF2E80 + 607);
  Handle = 0i64;
  v32 = 0i64;
  LODWORD(v37) = 0;
  LODWORD(v29) = 1;
  LODWORD(NumberOfBytes) = 0;
  if( !TargetObjectBaseKey )
  {
    ObjectProperty = PnpOpenObjectRegKey(
                       (__int64)SourceObjectBaseKey,
                       (__int64)TargetObjectName,
                       TargetObjectType,
                       33554433,
                       0,
                       (__int64)&Handle);
    if( ObjectProperty < 0 )
      goto LABEL_8;
    v4 = hPnpCtx;
  }
  if( PropertyLocaleName
    || (ObjectProperty = PnpOpenObjectRegKey((__int64)v4, v39, v40, 33554433, 0, (__int64)&v32), ObjectProperty >= 0) )
  {
    if( TargetObjectType )
    {
      v12 = Handle;
      LODWORD(v25) = 0;
      if( TargetObjectBaseKey )
        v12 = TargetObjectBaseKey;
      ObjectPropertyKeys = PnpGetObjectPropertyKeys(
                             (INT64)SourceObjectBaseKey,
                             (INT64)TargetObjectName,
                             (unsigned int)TargetObjectType,
                             (INT64)v12,
                             v21,
                             0,
                             0i64,
                             v25,
                             (INT64)&v37);
    }
    else
    {
      ObjectPropertyKeys = PnpGetGenericStorePropertyKeys(
                             (__int64)SourceObjectBaseKey,
                             TargetObjectBaseKey,
                             0i64,
                             0,
                             0i64,
                             0,
                             (__int64)&v37);
    }
    ObjectProperty = ObjectPropertyKeys;
    if( (int)(ObjectPropertyKeys + 0x80000000) < 0 || ObjectPropertyKeys == -1073741789 )
    {
      if( !(_DWORD)v37 )
      {
        ObjectProperty = 0;
        goto LABEL_8;
      }
      PoolWithTag = ExAllocatePoolWithTag(1ui64, 20i64 * (unsigned int)v37, 1667526736i64);
      if( !PoolWithTag )
      {
        ObjectProperty = -1073741670;
        goto LABEL_8;
      }
      if( TargetObjectType )
      {
        v14 = Handle;
        if( TargetObjectBaseKey )
          v14 = TargetObjectBaseKey;
        LODWORD(v25) = v37;
        GenericStorePropertyKeys = PnpGetObjectPropertyKeys(
                                     (INT64)SourceObjectBaseKey,
                                     (INT64)TargetObjectName,
                                     (unsigned int)TargetObjectType,
                                     (INT64)v14,
                                     v22,
                                     0,
                                     (INT64)PoolWithTag,
                                     v25,
                                     (INT64)&v37);
      }
      else
      {
        GenericStorePropertyKeys = PnpGetGenericStorePropertyKeys(
                                     (__int64)SourceObjectBaseKey,
                                     TargetObjectBaseKey,
                                     0i64,
                                     0,
                                     (__int64)PoolWithTag,
                                     v37,
                                     (__int64)&v37);
      }
      ObjectProperty = GenericStorePropertyKeys;
      if( GenericStorePropertyKeys < 0 )
        goto LABEL_57;
      BufferSize = 256i64;
      v16 = ExAllocatePoolWithTag(1ui64, 0x100ui64, 1667526736i64);
      if( !v16 )
      {
        ObjectProperty = -1073741670;
LABEL_57:
        ExFreePoolWithTag(PoolWithTag, 0);
        goto LABEL_8;
      }
      v17 = 0;
      if( !(_DWORD)v37 )
      {
LABEL_55:
        if( v16 )
          ExFreePoolWithTag(v16, 0);
        goto LABEL_57;
      }
      while( 1 )
      {
        if( v42 && !v42((char *)PoolWithTag + 20 * v17, v43) )
          goto LABEL_51;
        if( TargetObjectType )
        {
          v18 = Handle;
          v19 = BufferSize;
          if( TargetObjectBaseKey )
            v18 = TargetObjectBaseKey;
          PropertyType = (UINT64)PoolWithTag + 20 * v17;
          PropertyKey = (_DEVPROPKEY *)&NumberOfBytes;
          LODWORD(v27) = BufferSize;
          ObjectProperty = PnpGetObjectProperty(
                             (ULONG)SourceObjectBaseKey,
                             (INT64)TargetObjectName,
                             (unsigned int)TargetObjectType,
                             (INT64)v18,
                             0i64,
                             PropertyType,
                             (INT64)&v29,
                             (INT64)v16);
          if( ObjectProperty == -1073741822 )
          {
            ObjectProperty = 0;
            goto LABEL_51;
          }
        }
        else
        {
          v19 = BufferSize;
          LODWORD(v24) = BufferSize;
          PropertyType = (UINT64)PoolWithTag + 20 * v17;
          ObjectProperty = PnpGetGenericStoreProperty(
                             (HPNPCTX *)SourceObjectBaseKey,
                             TargetObjectBaseKey,
                             0i64,
                             (_DEVPROPKEY *)PropertyType,
                             (UINT64 *)&v29,
                             (UINT8 *)v16,
                             v24,
                             &NumberOfBytes,
                             v27);
        }
        if( ObjectProperty == -1073741789 )
        {
          if( (unsigned int)NumberOfBytes <= v19 )
          {
            ObjectProperty = -1073741595;
            goto LABEL_55;
          }
          ExFreePoolWithTag(v16, 0);
          BufferSize = (unsigned int)NumberOfBytes;
          v16 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1667526736i64);
          if( !v16 )
          {
            ObjectProperty = -1073741670;
            goto LABEL_55;
          }
          ObjectProperty = 0;
          --v17;
        }
        else
        {
          if( ObjectProperty < 0 )
            goto LABEL_55;
          v20 = (WCHAR *)v32;
          if( PropertyLocaleName )
            v20 = PropertyLocaleName;
          LODWORD(PropertyKey) = NumberOfBytes;
          LODWORD(v26) = v29;
          ObjectProperty = PiDevCfgSetObjectProperty(
                             hPnpCtx,
                             0i64,
                             v39,
                             (WCHAR *)(unsigned int)v40,
                             v20,
                             v23,
                             PropertyType,
                             v26,
                             (UINT64)v16,
                             PropertyKey);
          if( ObjectProperty == -1073741790 )
            ObjectProperty = 0;
          if( ObjectProperty < 0 )
            goto LABEL_55;
        }
LABEL_51:
        if( ++v17 >= (unsigned int)v37 )
          goto LABEL_55;
      }
    }
  }
LABEL_8:
  if( Handle )
    ZwClose((_HANDLE)Handle);
  if( v32 )
    ZwClose(v32);
  return ObjectProperty;
}

Referenced by:

PiDevCfgConfigureDeviceDriverConfiguration
PiDevCfgConfigureDeviceInterface
PiDevCfgInitDriverDatabaseCallback