KseUnregisterShim

NTSTATUS __fastcall KseUnregisterShim(INT64 a1){
  _ETHREAD *CurrentThread; 
  int v4; 
  __int64 v5; 
  NTSTATUS v6; 
  _DWORD *v7; 
  __int64 v8; 
  _QWORD *v9; 
  VOID **v10; 
  __int64 v11; 
  __int64 v12; 
  VOID *Buffer; 

  Buffer = 0i64;
  if( !a1 )
    return -1073741811;
  if( dword_140C50324 != 2 )
    return -1073741823;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&stru_140C50350, 0i64);
  if( (unsigned int)KsepIsShimRegistered((__int64)&Engine, *(_QWORD **)(a1 + 8), v5, &Buffer) )
  {
    if( *((_DWORD *)Buffer + 6) )
    {
      v6 = -1073741790;
      v7 = Buffer;
      v8 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
      dword_140C2A864[2 * v8] = -1073741790;
      KsepHistoryErrors[2 * v8] = 131453;
      if( (KsepDebugFlag & 2) != 0 )
        KsepDebugPrint(
          3i64,
          "KSE: Ending shim [0x%08X] unregistration. Shim object [0x%08X] ref count is not 0.\n",
          **(unsigned int **)(a1 + 8),
          v7);
      KsepLogError(
        3,
        "KSE: Ending shim [0x%08X] unregistration. Shim object [0x%08X] ref count is not 0.\n",
        **(unsigned int **)(a1 + 8),
        v7);
      v7[7] |= 4u;
    }
    else
    {
      v9 = *(_QWORD **)Buffer;
      if( *(VOID **)(*(_QWORD *)Buffer + 8i64) != Buffer || (v10 = (VOID **)*((_QWORD *)Buffer + 1), *v10 != Buffer) )
        __fastfail(3u);
      *v10 = v9;
      v9[1] = v10;
      v4 = 1;
      v11 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F;
      HIDWORD(KsepHistoryMessages[v11]) = 0;
      LODWORD(KsepHistoryMessages[v11]) = 131470;
      if( (KsepDebugFlag & 1) != 0 )
        KsepDebugPrint(3i64, "KSE: Succeeded shim [0x%08X] unregistration.\n", **(unsigned int **)(a1 + 8));
      KsepLogInfo(3, "KSE: Succeeded shim [0x%08X] unregistration.\n", **(unsigned int **)(a1 + 8));
      v6 = 0;
    }
  }
  else
  {
    v6 = -1073741772;
    v12 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
    dword_140C2A864[2 * v12] = -1073741772;
    KsepHistoryErrors[2 * v12] = 131482;
    if( (KsepDebugFlag & 2) != 0 )
      KsepDebugPrint(3i64, "KSE: Failed shim [0x%08X] unregistration. Shim not found.\n", **(unsigned int **)(a1 + 8));
    KsepLogError(3, "KSE: Failed shim [0x%08X] unregistration. Shim not found.\n", **(unsigned int **)(a1 + 8));
  }
  if( (_InterlockedExchangeAdd64(&stru_140C50350._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&stru_140C50350);
  KeAbPostRelease(&stru_140C50350);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v4 )
    KsepPoolFreePaged(Buffer);
  return v6;
}

Referenced by:

No references.