KeUserModeCallback

NTSTATUS __stdcall KeUserModeCallback(
        UINT64 ApiNumber,
        PVOID InputBuffer,
        UINT64 InputLength,
        PVOID *OutputBuffer,
        UINT64 *OutputLength){
  __int64 v5; 
  _ETHREAD *CurrentThread; 
  char v7; 
  __int64 KernelStack; 
  char *v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  char v17; 
  NTSTATUS v18; 
  NTSTATUS v19; 
  unsigned __int64 v21; 
  ULONG_PTR retaddr; 
  int v23; 
  v23 = ApiNumber;
  v5 = (unsigned int)InputLength;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*((_DWORD *)CurrentThread + 29) & 0x1000) != 0 )
    KeBugCheckEx(0x107u, (ULONG_PTR)CurrentThread, 0i64, 0i64, 0i64);
  if( KeGetCurrentIrql() )
    KeBugCheckEx(0x4Au, retaddr, KeGetCurrentIrql(), 0i64, 0i64);
  if( *((_BYTE *)CurrentThread + 586) || *((_DWORD *)CurrentThread + 121) )
    KeBugCheckEx(1u, retaddr, *((unsigned __int8 *)CurrentThread + 586), *((unsigned int *)CurrentThread + 121), 0i64);
  v7 = *((_BYTE *)CurrentThread + 731);
  *((_BYTE *)CurrentThread + 731) = v7 + 1;
  if( (unsigned __int8)(v7 + 1) > 0x1Fu )
  {
    *((_BYTE *)CurrentThread + 731) = v7;
    return -1073741571;
  }
  else
  {
    KernelStack = MmCreateKernelStack(
                    0,
                    *(unsigned __int16 *)(*((_QWORD *)*(&KiProcessorBlock + *((unsigned int *)CurrentThread + 147)) + 24)
                                        + 146i64),
                    (unsigned __int64)CurrentThread);
    v9 = (char *)KernelStack;
    if( KernelStack )
    {
      *(_QWORD *)(KernelStack - 48) = KernelStack;
      *(_QWORD *)(KernelStack - 40) = KernelStack - (unsigned int)KeKernelStackSize;
      *(_QWORD *)(KernelStack - 32) = *((_QWORD *)CurrentThread + 7);
      *(_QWORD *)(KernelStack - 24) = *((_QWORD *)CurrentThread + 6);
      *(_QWORD *)(KernelStack - 8) = *((_QWORD *)CurrentThread + 5);
      v10 = *((_QWORD *)CurrentThread + 18);
      v11 = *(_QWORD *)(v10 + 384);
      v12 = (v11 - (((v5 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 88)) & 0xFFFFFFFFFFFFFFF0ui64;
      v13 = v12;
      v14 = v12 + ((v5 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 87;
      if( v12 > v14 || v14 >= 0x7FFFFFFF0000i64 )
        ExRaiseAccessViolation();
      v15 = (v14 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      do
      {
        *(_BYTE *)v13 = *(_BYTE *)v13;
        v13 = (v13 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      }
      while( v13 != v15 );
      memmove((UINT8 *)(v12 + 88), (UINT8 *)InputBuffer, (unsigned int)v5);
      *(_QWORD *)(v12 + 32) = v12 + 88;
      *(_DWORD *)(((v11 - (((v5 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 88)) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28) = v5;
      *(_DWORD *)(((v11 - (((v5 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 88)) & 0xFFFFFFFFFFFFFFF0ui64) + 0x2C) = v23;
      *(_QWORD *)(((v11 - (((v5 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 88)) & 0xFFFFFFFFFFFFFFF0ui64) + 0x48) = v11;
      *(_QWORD *)(((v11 - (((v5 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 88)) & 0xFFFFFFFFFFFFFFF0ui64) + 0x30) = *(_QWORD *)(v10 + 360);
      v16 = 0i64;
      if( (*((_DWORD *)CurrentThread + 29) & 0x100000) != 0 )
      {
        v21 = __readmsr(0x6A0u);
        if( (v21 & 1) != 0 )
          v16 = __readmsr(0x6A7u);
      }
      v17 = *((_BYTE *)KeGetPcr() + 2131);
      *(_QWORD *)(v10 + 384) = v12;
      KiCallUserMode(OutputBuffer, OutputLength, v9 - 48, v9);
      v19 = v18;
      if( (v17 & 1) != 0 )
        KeExitRetpoline();
      _mm_lfence();
      if( *(_DWORD *)(*((_QWORD *)CurrentThread + 30) + 5952i64) )
      {
        *(_QWORD *)(v10 + 384) -= 256i64;
        PsInvokeWin32Callout(7i64, 0i64, 0i64, 0i64);
      }
      if( v16 )
        __writemsr(0x6A7u, v16);
      *(_QWORD *)(v10 + 384) = v11;
      --*((_BYTE *)CurrentThread + 731);
      MmDeleteKernelStack(v9, 0i64);
      return v19;
    }
    else
    {
      --*((_BYTE *)CurrentThread + 731);
      return -1073741801;
    }
  }
}

Referenced by:

No references.