PiControlGetDeviceStack

__int64 __fastcall PiControlGetDeviceStack(__int64 a1, int a2, __int64 a3, unsigned int *a4){
  DEVICE_OBJECT *v4; 
  unsigned int v5; 
  int v7; 
  _OBJECT_NAME_INFORMATION *v8; 
  _DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag; 
  VOID *LowerDeviceObjectWithTag; 
  void *v11; 
  PVOID *PoolWithTag; 
  PVOID *v13; 
  PVOID *v14; 
  unsigned int v15; 
  UINT8 *v16; 
  int v17; 
  __int64 v18; 
  unsigned __int16 Length; 
  UINT8 *v20; 
  unsigned int v21; 
  PVOID *v22; 
  __int64 v23; 
  UINT64 v25; 
  WCHAR v26; 
  unsigned int v27; 
  _DEVICE_OBJECT *Object; 
  PVOID P; 
  PVOID *p_P; 
  _OBJECT_NAME_INFORMATION Src; 
  UINT64 ReturnLength; 
  int v33; 
  __int64 v34; 
  unsigned int *v35; 
  v35 = a4;
  v34 = a3;
  v33 = a2;
  v4 = *(DEVICE_OBJECT **)(a1 + 32);
  p_P = &P;
  LODWORD(ReturnLength) = 0;
  v5 = a2;
  P = &P;
  v7 = 0;
  v8 = 0i64;
  Src = 0i64;
  DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(v4, 0x43706E50ui64);
  Object = DeviceAttachmentBaseRefWithTag;
  if( !DeviceAttachmentBaseRefWithTag )
  {
    v7 = -1073741808;
    goto LABEL_27;
  }
  LODWORD(LowerDeviceObjectWithTag) = IoGetAttachedDeviceReferenceWithTag(DeviceAttachmentBaseRefWithTag, 0x43706E50u);
  while( 1 )
  {
    v11 = LowerDeviceObjectWithTag;
    if( !LowerDeviceObjectWithTag )
      break;
    PoolWithTag = (PVOID *)ExAllocatePoolWithTag(PagedPool, 0x18ui64, 0x47706E50ui64);
    if( !PoolWithTag )
    {
      ObfDereferenceObjectWithTag(v11, 0x43706E50ui64);
      v7 = -1073741670;
      goto LABEL_27;
    }
    PoolWithTag[2] = v11;
    v13 = p_P;
    if( *p_P != &P )
LABEL_35:
      __fastfail(3u);
    PoolWithTag[1] = p_P;
    *PoolWithTag = &P;
    *v13 = PoolWithTag;
    p_P = PoolWithTag;
    LowerDeviceObjectWithTag = IoGetLowerDeviceObjectWithTag((INT64)v11, 0x43706E50ui64);
  }
  v14 = (PVOID *)P;
  v15 = v5;
  v27 = v5;
  v16 = (UINT8 *)a3;
  v17 = 0;
  if( P == &P )
  {
LABEL_20:
    if( v16 && v15 >= 2 )
      *(_WORD *)v16 = 0;
    v21 = v17 + 2;
    *v35 = v21;
    if( !v34 || v21 > v5 )
      v7 = -1073741789;
    goto LABEL_25;
  }
  while( 1 )
  {
    v18 = *((_QWORD *)v14[2] + 1);
    if( v18 )
      break;
    RtlInitUnicodeString(&Src.Name, L"?", 2u);
LABEL_50:
    Length = Src.Name.Length;
LABEL_14:
    if( v16 && v27 >= (unsigned __int64)Length + 2 )
    {
      memmove(v16, (UINT8 *)Src.Name.Buffer, Length);
      v20 = &v16[2 * ((unsigned __int64)Length >> 1)];
      *(_WORD *)v20 = 0;
      v16 = v20 + 2;
      v27 += -2 - Length;
    }
    v14 = (PVOID *)*v14;
    v17 += Length + 2;
    if( v14 == &P )
      goto LABEL_18;
  }
  if( *(_QWORD *)(v18 + 64) && *(_WORD *)(v18 + 56) >= 2u )
  {
    Length = _mm_cvtsi128_si32(*(__m128i *)(v18 + 56));
    Src = *(_OBJECT_NAME_INFORMATION *)(v18 + 56);
    for( Src.Name.Length = Length; Length >= 2u; Src.Name.Length = Length )
    {
      if( Src.Name.Buffer[((unsigned __int64)Length >> 1) - 1] )
        break;
      Length -= 2;
    }
  }
  else
  {
    RtlInitUnicodeString(&Src.Name, 0i64, 2u);
    Length = Src.Name.Length;
  }
  if( Length )
    goto LABEL_14;
  v25 = 272i64;
  LODWORD(ReturnLength) = 272;
  if( v8 )
  {
LABEL_44:
    v7 = ObQueryNameString((VOID *)v18, v8, v25, &ReturnLength);
    if( v7 >= 0 && (_DWORD)ReturnLength && (v26 = 2, v8->Name.Length >= 2u) )
    {
      Src = *v8;
    }
    else
    {
      RtlInitUnicodeString(&Src.Name, L"?", v26);
      v7 = 0;
    }
    goto LABEL_50;
  }
  v8 = (_OBJECT_NAME_INFORMATION *)ExAllocatePoolWithTag(PagedPool, 0x110ui64, 0x47706E50ui64);
  if( v8 )
  {
    v25 = (unsigned int)ReturnLength;
    goto LABEL_44;
  }
  v7 = -1073741670;
LABEL_18:
  if( v7 >= 0 )
  {
    v15 = v27;
    v5 = v33;
    goto LABEL_20;
  }
LABEL_25:
  if( v8 )
    ExFreePoolWithTag(v8, 0);
LABEL_27:
  while( 1 )
  {
    v22 = (PVOID *)P;
    if( P == &P )
      break;
    if( *((PVOID **)P + 1) != &P )
      goto LABEL_35;
    v23 = *(_QWORD *)P;
    if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
      goto LABEL_35;
    P = *(PVOID *)P;
    *(_QWORD *)(v23 + 8) = &P;
    ObfDereferenceObjectWithTag(v22[2], 0x43706E50ui64);
    ExFreePoolWithTag(v22, 0);
  }
  if( Object )
    ObfDereferenceObjectWithTag(Object, 0x43706E50ui64);
  return(unsigned int)v7;
}

Referenced by:

PiControlGetPropertyData