PiGetDeviceRegProperty

NTSTATUS __stdcall PiGetDeviceRegProperty(
        WCHAR *DeviceInstanceId,
        UINT64 ExpectedType,
        _CM_REG_PROP RegProperty,
        VOID *Buffer,
        UINT64 *BufferSize){
  INT8 *v7; 
  NTSTATUS DeviceRegProp; 
  int v9; 
  VOID **PropertyBuffer; 
  WCHAR *v12; 
  int AlternateStringData; 
  size_t v14; 
  _WORD *v15; 
  char v16; 
  WORD *v17; 
  NTSTATUS v18; 
  __int64 v19; 
  WORD *v20; 
  INT8 *v21; 
  int v22; 
  WORD *v23; 
  UINT64 Flags; 
  UINT64 Flagsa; 
  UINT64 NumberOfBytes; 
  char CmRegPropType[12]; 
  WCHAR *MessageFormat; 
  WCHAR *v29; 
  INT8 *Arguments[20]; 
  UINT64 *BufferSizea; 

  LODWORD(Flags) = 0;
  HIDWORD(NumberOfBytes) = (_DWORD)Buffer;
  v7 = 0i64;
  LODWORD(NumberOfBytes) = *(_DWORD *)BufferSizea;
  v29 = (WCHAR *)BufferSize;
  *(_DWORD *)CmRegPropType = 0;
  DeviceRegProp = CmGetDeviceRegProp(
                    *(&stru_140CF2E80 + 607),
                    DeviceInstanceId,
                    0i64,
                    (INT64)Buffer,
                    (UINT64 *)CmRegPropType,
                    (UINT8 *)BufferSize,
                    &NumberOfBytes,
                    Flags);
  v9 = DeviceRegProp;
  if( RegProperty == CM_REG_PROP_DEVICEDESC )
  {
    if( DeviceRegProp < 0 )
    {
      if( DeviceRegProp != -1073741789 )
        return v9;
    }
    else if( *(_DWORD *)CmRegPropType != 1 )
    {
      return -1073741584;
    }
    PropertyBuffer = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1869181008i64);
    v12 = (WCHAR *)PropertyBuffer;
    if( !PropertyBuffer )
      return -1073741670;
    if( v9 != -1073741789 )
    {
      memmove(PropertyBuffer, BufferSize, NumberOfBytes);
      goto LABEL_15;
    }
    LODWORD(Flagsa) = 0;
    v18 = CmGetDeviceRegProp(
            *(&stru_140CF2E80 + 607),
            DeviceInstanceId,
            0i64,
            HIDWORD(NumberOfBytes),
            (UINT64 *)CmRegPropType,
            (UINT8 *)PropertyBuffer,
            &NumberOfBytes,
            Flagsa);
    v9 = v18;
    if( v18 < 0 )
    {
      if( v18 == -1073741789 )
        *(_DWORD *)BufferSizea = NumberOfBytes;
    }
    else
    {
      if( *(_DWORD *)CmRegPropType == 1 )
      {
LABEL_15:
        HIDWORD(NumberOfBytes) = NumberOfBytes;
        *(_QWORD *)&CmRegPropType[4] = v12;
        MessageFormat = v12;
        AlternateStringData = PnpFindAlternateStringData(
                                v12,
                                NumberOfBytes,
                                &CmRegPropType[4],
                                (_DWORD *)&NumberOfBytes + 1);
        v14 = HIDWORD(NumberOfBytes);
        v15 = *(_WORD **)&CmRegPropType[4];
        if( AlternateStringData )
        {
          MessageFormat = *(WCHAR **)&CmRegPropType[4];
          v17 = wcsstr(*(WORD **)&CmRegPropType[4], (INT8 *)L";(");
          v7 = (INT8 *)v17;
          if( v17 )
          {
            v19 = (v14 >> 1) - 2;
            if( v15[v19] == 41 )
            {
              *v17 = 0;
              v7 = (INT8 *)(v17 + 2);
              v15[v19] = 0;
              memset(&Arguments[1], 0i64, 0x98u);
              v20 = (WORD *)v7;
              Arguments[0] = v7;
              for( HIDWORD(NumberOfBytes) = 1; ; HIDWORD(NumberOfBytes) = v22 + 1 )
              {
                v23 = wcschr(v20, 44);
                if( !v23 )
                  break;
                *v23 = 0;
                v21 = (INT8 *)(v23 + 1);
                v22 = HIDWORD(NumberOfBytes);
                if( HIDWORD(NumberOfBytes) >= 0x13 )
                {
                  v16 = 1;
                  goto LABEL_17;
                }
                Arguments[HIDWORD(NumberOfBytes)] = v21;
                v20 = (WORD *)v21;
              }
            }
          }
        }
        v16 = 0;
LABEL_17:
        if( *(_DWORD *)BufferSizea < v14 )
        {
          v9 = -1073741789;
        }
        else if( v7 )
        {
          if( v16 )
          {
            v9 = -1073741619;
          }
          else
          {
            LODWORD(Flagsa) = *(_DWORD *)BufferSizea;
            v9 = RtlFormatMessageEx(MessageFormat, 0i64, 0, 0, 1u, Arguments, v29, Flagsa, BufferSizea);
          }
        }
        else
        {
          memmove(v29, v15, v14);
        }
        *(_DWORD *)BufferSizea = v14;
        goto LABEL_21;
      }
      v9 = -1073741584;
    }
LABEL_21:
    ExFreePoolWithTag(v12, 0);
    return v9;
  }
  if( DeviceRegProp >= 0 )
  {
    if( *(_DWORD *)CmRegPropType != RegProperty )
      v9 = -1073741584;
    if( v9 >= 0 )
      goto LABEL_8;
  }
  if( v9 == -1073741789 )
LABEL_8:
    *(_DWORD *)BufferSizea = NumberOfBytes;
  return v9;
}

Referenced by:

IoGetDeviceProperty
IopPnPDispatch