PipGetDriverTagPriority

UINT16 __fastcall PipGetDriverTagPriority(VOID *ServiceHandle){
  UINT16 v2; 
  _WORD *v3; 
  UINT64 v4; 
  __int64 v5; 
  int v6; 
  NTSTATUS RegistryValue; 
  NTSTATUS v9; 
  unsigned __int64 v10; 
  unsigned int *v11; 
  unsigned int v12; 
  _DWORD *v13; 
  PVOID v14; 
  UNICODE_STRING KeyName; 
  PVOID P; 
  HANDLE Handle; 
  PVOID v18; 
  P = 0i64;
  v18 = 0i64;
  v14 = 0i64;
  *(_DWORD *)(&KeyName.MaximumLength + 1) = 0;
  Handle = 0i64;
  KeyName.Buffer = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\GroupOrderList";
  v2 = -1;
  *(_DWORD *)&KeyName.Length = 8650882;
  if( (int)IopOpenRegistryKeyEx(&Handle, 0i64, &KeyName, 0x20019ui64) < 0 )
    return v2;
  if( IopGetRegistryValue(ServiceHandle, (PWCHAR)L"Group", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) < 0 )
  {
LABEL_8:
    ZwClose(Handle);
    return v2;
  }
  v3 = P;
  if( *((_DWORD *)P + 1) == 1 )
  {
    v4 = *((unsigned int *)P + 3);
    if( (_DWORD)v4 )
    {
      v5 = *((unsigned int *)P + 2);
      LODWORD(P) = 0;
      PnpRegSzToString((_WORD *)((char *)v3 + v5), v4, (UINT64 *)&P);
      KeyName.Length = (unsigned __int16)P;
      KeyName.MaximumLength = v3[6];
      KeyName.Buffer = (_WORD *)((char *)v3 + *((unsigned int *)v3 + 2));
    }
  }
  v6 = 0;
  RegistryValue = IopGetRegistryValue(ServiceHandle, (PWCHAR)L"Tag", 0x50ui64, (KEY_VALUE_FULL_INFORMATION **)&v18);
  if( RegistryValue < 0
    || (*((_DWORD *)v18 + 1) != 4 || *((_DWORD *)v18 + 3) != 4 ? (RegistryValue = -1073741823) : (v6 = *(_DWORD *)((char *)v18 + *((unsigned int *)v18 + 2))),
        ExFreePoolWithTag(v18, 0),
        RegistryValue < 0) )
  {
    ExFreePoolWithTag(v3, 0);
    goto LABEL_8;
  }
  v9 = IopGetRegistryValue(Handle, KeyName.Buffer, 0x50ui64, (KEY_VALUE_FULL_INFORMATION **)&v14);
  ExFreePoolWithTag(v3, 0);
  ZwClose(Handle);
  if( v9 >= 0 )
  {
    if( *((_DWORD *)v14 + 1) == 3 )
    {
      v10 = *((unsigned int *)v14 + 3);
      if( (unsigned int)v10 >= 4 )
      {
        v11 = (unsigned int *)((char *)v14 + *((unsigned int *)v14 + 2));
        v12 = *v11;
        if( 4 * (unsigned __int64)(*v11 + 1) <= v10 )
        {
          v13 = v11 + 1;
          v2 = 1;
          if( v12 )
          {
            do
            {
              if( v6 == *v13 )
                break;
              ++v2;
              ++v13;
            }
            while( v2 <= v12 );
          }
        }
      }
    }
    ExFreePoolWithTag(v14, 0);
  }
  return v2;
}

Referenced by:

IopInitializeBootDrivers