KiOp_SGDTSIDT

INT64 __fastcall KiOp_SGDTSIDT(INT64 a1){
  int v2; 
  char v3; 
  __int64 v4; 
  __int64 v5; 
  __int16 v6; 
  __int64 v7; 
  char v8; 
  UINT8 *v9; 
  _TBYTE Src; 
  BYTE v12; 
  UINT8 *dst; 
  __int64 v14; 
  dst = 0i64;
  v12 = 0;
  *(_QWORD *)((char *)&Src + 2) = 0i64;
  if( (KiBugCheckActive & 3) != 0 )
  {
    v2 = 1;
    if( VslVsmEnabled )
      goto LABEL_9;
  }
  else
  {
    v2 = 0;
  }
  if( !KiNPIEPEnabled && (KeFeatureBits2 & 4) == 0 || *(_BYTE *)(a1 + 81) != 1 && !v2 )
    return 0i64;
LABEL_9:
  v3 = *(_BYTE *)(a1 + 81);
  if( (*(_BYTE *)(a1 + 65) & 0x38) != 0 )
  {
    if( v3 )
    {
      v4 = KiOpIdtr;
      goto LABEL_15;
    }
    v5 = *((_QWORD *)KeGetPcr() + 7);
    v6 = 4095;
LABEL_17:
    LOWORD(Src) = v6;
    *(_QWORD *)((char *)&Src + 2) = v5;
    goto LABEL_18;
  }
  if( !v3 )
  {
    v5 = *(_QWORD *)KeGetPcr();
    v6 = 87;
    goto LABEL_17;
  }
  v4 = KiOpGdtr;
LABEL_15:
  *(_QWORD *)&Src = v4;
  HIWORD(Src) = -1;
LABEL_18:
  v7 = *(_QWORD *)(a1 + 32);
  v14 = v7;
  *(_DWORD *)v7 = -1073741819;
  if( (int)KiOpRetrieveRegMemAddress(a1, (INT64 *)&dst, &v12, 0i64) < 0 )
  {
    dst = (UINT8 *)-1i64;
  }
  else
  {
    v8 = *(_BYTE *)(a1 + 58);
    if( v12 == 1 )
    {
      v9 = &dst[(-(__int64)(v8 != 0) & 0xFFFFFFFFFFFFFFFCui64) + 10];
      if( (unsigned __int64)v9 > 0x7FFFFFFF0000i64 || v9 < dst )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove(dst, (UINT8 *)&Src, (-(__int64)(v8 != 0) & 0xFFFFFFFFFFFFFFFCui64) + 10);
    *(_QWORD *)(*(_QWORD *)(a1 + 24) + 248i64) += (unsigned int)(*(_DWORD *)(a1 + 16) - *(_DWORD *)a1);
    ++KiOpDescriptorTableStoreSkip;
    *(_BYTE *)(a1 + 96) = 1;
  }
  if( !*(_BYTE *)(a1 + 96) )
  {
    *(_DWORD *)v7 = -1073741819;
    *(_QWORD *)(v7 + 32) = 1i64;
    *(_QWORD *)(v7 + 40) = dst;
    *(_BYTE *)(a1 + 97) = 1;
  }
  return 0i64;
}

Referenced by:

No references.