HdlspSetBlueScreenInformation

INT64 __fastcall HdlspSetBlueScreenInformation(UINT64 *a1, INT64 a2){
  PKSPIN_LOCK v2; 
  unsigned int v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  KSPIN_LOCK v8; 
  char **v9; 
  char *v10; 
  int v11; 
  int v12; 
  __int64 v13; 
  char *v14; 
  __int64 v15; 
  CHAR *PoolWithTag; 
  CHAR *v17; 
  PKSPIN_LOCK v18; 
  unsigned __int8 *v19; 
  KSPIN_LOCK v20; 
  char *v21; 
  CHAR *v22; 
  CHAR *v23; 
  PKSPIN_LOCK v24; 
  v2 = HeadlessGlobals;
  if( (HeadlessGlobals[6] & 2) != 0 )
    return 3221225473i64;
  v5 = 0;
  if( a1 )
  {
    v6 = *(unsigned int *)a1;
    if( (unsigned int)v6 >= 2 )
    {
      v7 = (unsigned int)v6;
      if( v6 < a2 - 8 && !*((_BYTE *)a1 + (unsigned int)(v6 - 1) + 4) && !*((_BYTE *)a1 + a2 - 4) )
      {
        v8 = HeadlessGlobals[5];
        v9 = (char **)v8;
        if( v8 )
        {
          do
          {
            v10 = *v9;
            do
            {
              v11 = (unsigned __int8)v10[(char *)a1 + 4 - *v9];
              v12 = (unsigned __int8)*v10 - v11;
              if( v12 )
                break;
              ++v10;
            }
            while( v11 );
            if( !v12 )
              break;
            v8 = (KSPIN_LOCK)v9;
            v9 = (char **)v9[2];
          }
          while( v9 );
        }
        v13 = -1i64;
        v14 = (char *)a1 + v7;
        v15 = -1i64;
        do
          ++v15;
        while( v14[v15 + 4] );
        if( v9 )
        {
          if( v15 )
          {
            PoolWithTag = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, v15 + 1, 0x736C6448ui64);
            v17 = PoolWithTag;
            if( PoolWithTag )
            {
              strcpy_s(PoolWithTag, v15 + 1, v14 + 4);
              v18 = HeadlessGlobals;
              v19 = (unsigned __int8 *)v9[1];
              v9[1] = v17;
              if( (v18[6] & 2) == 0 )
                goto LABEL_40;
            }
            else
            {
              return(unsigned int)-1073741801;
            }
            return v5;
          }
          v20 = (KSPIN_LOCK)v9[2];
          *(_QWORD *)(v8 + 16) = v20;
          if( (char **)v2[5] == v9 )
            v2[5] = v20;
          if( (v2[6] & 2) != 0 )
            return v5;
          ExFreePoolWithTag(v9[1], 0);
          v21 = *v9;
        }
        else
        {
          if( !v15 )
            return(unsigned int)-1073741811;
          v9 = (char **)ExAllocatePoolWithTag(NonPagedPoolNx, 0x18ui64, 0x736C6448ui64);
          if( !v9 )
            return v5;
          v22 = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, v15 + 1, 0x736C6448ui64);
          v9[1] = v22;
          if( !v22 )
          {
            v5 = -1073741801;
            goto LABEL_39;
          }
          strcpy_s(v22, v15 + 1, v14 + 4);
          do
            ++v13;
          while( *((_BYTE *)a1 + v13 + 4) );
          if( v13 )
          {
            v23 = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, v13 + 1, 0x736C6448ui64);
            *v9 = v23;
            if( v23 )
            {
              strcpy_s(v23, v13 + 1, (PSTR)a1 + 4);
              v24 = HeadlessGlobals;
              v9[2] = (char *)HeadlessGlobals[5];
              v24[5] = (KSPIN_LOCK)v9;
              return v5;
            }
            v5 = -1073741801;
          }
          else
          {
            v5 = -1073741811;
          }
          v21 = v9[1];
        }
        ExFreePoolWithTag(v21, 0);
LABEL_39:
        v19 = (unsigned __int8 *)v9;
LABEL_40:
        ExFreePoolWithTag(v19, 0);
        return v5;
      }
    }
  }
  return 3221225485i64;
}

Referenced by:

HdlspDispatch