PiDmObjectCreate

NTSTATUS __stdcall PiDmObjectCreate(PNP_OBJECT_TYPE ObjectType, WCHAR *ObjectName, PI_DM_OBJECT **Object){
  __int64 v5; 
  size_t v6; 
  VOID **PoolWithTag; 
  VOID **v8; 
  INT64 *v9; 
  WCHAR *v10; 
  NTSTATUS PWSTR; 
  INT64 v12; 
  INT64 v13; 
  wchar_t *v14; 
  wchar_t *v15; 
  __int64 v16; 
  __int64 v17; 
  INT64 v18; 
  _DWORD *v19; 
  __int64 v20; 
  unsigned int v21; 
  const _DEVPROPKEY **v22; 
  _PI_DM_CACHED_PROPERTY_KEY *v23; 
  unsigned int v25; 
  wchar_t *v26; 
  _QWORD *v27; 
  UINT64 CachedKeysCount; 
  _PI_DM_CACHED_PROPERTY_KEY *CachedKeys; 
  _UNICODE_STRING String; 
  UINT8 PropertyBuffer; 

  *Object = 0i64;
  CachedKeys = 0i64;
  LODWORD(CachedKeysCount) = 0;
  PropertyBuffer = 0;
  PiDmGetCacheKeys((_PNP_OBJECT_TYPE)ObjectType, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeysCount);
  v5 = (unsigned int)CachedKeysCount;
  v6 = 24 * CachedKeysCount + 112;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 1517317712i64);
  v8 = PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  memset(PoolWithTag, 0i64, v6);
  *v8 = 0i64;
  v9 = (INT64 *)(v8 + 2);
  *((_DWORD *)v8 + 2) = 1;
  *((_DWORD *)v8 + 7) = ObjectType;
  PWSTR = PnpAllocatePWSTR(ObjectName, 0x7FFFFFFFui64, 0x5A706E50u, v8 + 2);
  if( PWSTR < 0 )
    goto LABEL_41;
  v12 = *v9;
  if( ObjectType == 3 )
  {
    PWSTR = CmSetDeviceInterfacePathFormat(v10, v12);
    if( PWSTR < 0 )
      goto LABEL_41;
    v13 = *v9;
    PWSTR = 0;
    String = 0i64;
    v14 = (wchar_t *)(v13 + 8);
    if( v14 )
    {
      v15 = v14;
      v16 = 0x7FFFi64;
      do
      {
        if( !*v15 )
          break;
        ++v15;
        --v16;
      }
      while( v16 );
      goto LABEL_9;
    }
  }
  else
  {
    PWSTR = PnpValidateObjectName((__int64)v10, v12, ObjectType);
    if( PWSTR < 0 )
      goto LABEL_41;
    v14 = (wchar_t *)*v9;
    PWSTR = 0;
    String = 0i64;
    if( v14 )
    {
      v26 = v14;
      v16 = 0x7FFFi64;
      do
      {
        if( !*v26 )
          break;
        ++v26;
        --v16;
      }
      while( v16 );
LABEL_9:
      v17 = (0x7FFF - v16) & -(__int64)(v16 != 0);
      PWSTR = v16 == 0 ? 0xC000000D : 0;
      if( v16 )
      {
        String.Buffer = v14;
        String.Length = 2 * v17;
        String.MaximumLength = 2 * v17 + 2;
      }
    }
  }
  if( PWSTR < 0 )
    goto LABEL_41;
  PWSTR = RtlHashUnicodeString(&String, 1u, 0i64, (UINT64 *)v8 + 3);
  switch( ObjectType )
  {
    case 1:
      v27 = v8 + 11;
      break;
    case 2:
    case 4:
      v27 = v8 + 5;
      break;
    case 5:
    case 6:
      v8[6] = v8 + 5;
      v8[5] = v8 + 5;
      v27 = v8 + 8;
      break;
    default:
      goto LABEL_17;
  }
  *v27 = v27;
  v27[1] = v27;
LABEL_17:
  if( (_DWORD)v5 )
  {
    v19 = v8 + 14;
    v20 = v5;
    do
    {
      *v19 = 1;
      v19 += 6;
      --v20;
    }
    while( v20 );
  }
  v21 = 0;
  v22 = (const _DEVPROPKEY **)&off_140001528;
  v23 = CachedKeys;
  while( ObjectType != *((_DWORD *)v22 - 2) )
  {
LABEL_22:
    ++v21;
    v22 += 7;
    if( v21 >= 3 )
      goto LABEL_23;
  }
  PiDmGetCachedKeyIndex(v23, v5, *v22, v18);
  if( v25 < (unsigned int)v5 )
  {
    PWSTR = PiDmCacheDataEncode(
              0x11ui64,
              &PropertyBuffer,
              1ui64,
              (unsigned int)v23[6 * v25 + 2],
              v23[6 * v25 + 3],
              (PI_DM_CACHED_PROPERTY_DATA *)&v8[3 * v25 + 14]);
    if( PWSTR < 0 )
      goto LABEL_41;
    goto LABEL_22;
  }
  PWSTR = -1073741595;
LABEL_23:
  if( PWSTR < 0 )
  {
LABEL_41:
    PiDmObjectRelease((_PI_DM_OBJECT *)v8);
    return PWSTR;
  }
  *Object = (PI_DM_OBJECT *)v8;
  return PWSTR;
}

Referenced by:

PiDmAddCacheReferenceForObject
PiDmObjectManagerPopulate