NtQueueApcThreadEx

NTSTATUS __stdcall NtQueueApcThreadEx(
        PVOID ThreadHandle,
        PVOID UserApcReserveHandle,
        PVOID ApcRoutine,
        PVOID ptr32,
        PVOID ptr32a,
        PVOID SystemArgument2,
        PVOID ApcArgument1,
        PVOID ApcArgument2,
        PVOID ApcArgument3){
  VOID *v10; 
  bool v13; 
  char PreviousMode; 
  NTSTATUS result; 
  _ETHREAD *v16; 
  _EWOW64PROCESS *WoW64Process; 
  unsigned __int16 Machine; 
  _EWOW64PROCESS *v19; 
  char *PoolWithQuotaTag; 
  void *v21; 
  void(__fastcall *v22)(char *); 
  int v23; 
  PVOID Object; 
  _ETHREAD *Thread; 

  v10 = 0i64;
  v13 = 1;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( UserApcReserveHandle != (PVOID)1 )
    v10 = UserApcReserveHandle;
  Thread = 0i64;
  result = ObReferenceObjectByHandle(
             ThreadHandle,
             0x10ui64,
             (_OBJECT_TYPE *)PsThreadType,
             PreviousMode,
             (VOID **)&Thread,
             0i64);
  if( result >= 0 )
  {
    v16 = Thread;
    if( (Thread->Tcb._bf_0 & 0x400) != 0
      || (v16 = Thread, (WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process) != 0i64)
      && ((Machine = WoW64Process->Machine, Machine == 332) || Machine == 452)
      && ((v19 = Thread->Tcb.Process->WoW64Process) == 0i64 || v19->Machine == 0x8664)
      && (unsigned __int64)-((__int64)ApcRoutine >> 2) <= 0xFFFFFFFF )
    {
      v23 = -1073741816;
    }
    else if( v10 )
    {
      Object = 0i64;
      v23 = ObReferenceObjectByHandle(v10, 2ui64, PspMemoryReserveObjectTypes, PreviousMode, &Object, 0i64);
      if( v23 >= 0 )
      {
        if( !_InterlockedCompareExchange((volatile signed __int32 *)Object, 1, 0) )
        {
          v21 = PspUserApcReserveKernelRoutine;
          v16 = Thread;
          v22 = (void(__fastcall *)(char *))PspUserApcReserveKernelRoutine;
          PoolWithQuotaTag = (char *)Object + 8;
LABEL_15:
          KeInitializeApc(
            (INT64)PoolWithQuotaTag,
            (INT64)v16,
            0i64,
            (INT64)v21,
            (INT64)v22,
            (INT64)ApcRoutine,
            v13,
            (INT64)ptr32);
          if( KeInsertQueueApc((INT64)PoolWithQuotaTag, (INT64)ptr32a, (INT64)SystemArgument2, 0i64) )
          {
            v23 = 0;
          }
          else
          {
            v22(PoolWithQuotaTag);
            v23 = -1073741823;
          }
          goto LABEL_17;
        }
        HalPutDmaAdapter((PADAPTER_OBJECT)Object);
        v16 = Thread;
        v23 = -1073741584;
      }
    }
    else
    {
      PoolWithQuotaTag = (char *)ExAllocatePoolWithQuotaTag((POOL_TYPE)520, 0x58ui64, 0x70617350ui64);
      if( PoolWithQuotaTag )
      {
        v21 = KeSpecialUserApcKernelRoutine;
        v22 = (void(__fastcall *)(char *))ExFreePoolWithTag;
        v13 = UserApcReserveHandle != (PVOID)1;
        if( UserApcReserveHandle != (PVOID)1 )
          v21 = SC_ENV::Free;
        goto LABEL_15;
      }
      v23 = -1073741801;
    }
LABEL_17:
    HalPutDmaAdapter((PADAPTER_OBJECT)v16);
    return v23;
  }
  return result;
}

Referenced by:

No references.