IopProcessWorkItem

VOID __stdcall IopProcessWorkItem(VOID *Parameter){
  _WORD *v1; 
  void(__fastcall *v3)(_WORD *, __int64, VOID *); 
  int v4; 
  __int64 v5; 
  _ETHREAD *v6; 
  VOID *v7; 
  __int64 v8; 
  _WORD *v9; 
  __int128 v10; 

  v1 = (_WORD *)*((_QWORD *)Parameter + 5);
  v3 = (void(__fastcall *)(_WORD *, __int64, VOID *))*((_QWORD *)Parameter + 4);
  v4 = 0;
  v10 = 0i64;
  v5 = *(_QWORD *)&NullGuid.Data1 - *(_QWORD *)((char *)Parameter + 68);
  if( !v5 )
    v5 = *(_QWORD *)NullGuid.Data4 - *(_QWORD *)((char *)Parameter + 76);
  if( v5 )
  {
    v4 = 1;
    v10 = *(_OWORD *)((char *)Parameter + 68);
    KeGetCurrentThread()[1].WaitBlock[1].WaitListEntry.Flink = (_LIST_ENTRY *)&v10;
  }
  v6 = (_ETHREAD *)*((_QWORD *)Parameter + 7);
  if( v6 )
  {
    PsImpersonateContainerOfThread(v6);
    v7 = (VOID *)*((_QWORD *)Parameter + 7);
    *((_QWORD *)Parameter + 7) = 0i64;
  }
  else
  {
    v7 = 0i64;
  }
  v8 = *((_QWORD *)Parameter + 6);
  if( *((_DWORD *)Parameter + 16) )
  {
    v3(v1, v8, Parameter);
  }
  else
  {
    if( *v1 == 3 )
      v9 = v1;
    else
      v9 = 0i64;
    ((void(__fastcall *)(_WORD *, __int64))v3)(v9, v8);
  }
  ObfDereferenceObjectWithTag(v1, 0x746C6644ui64);
  if( v4 )
    KeGetCurrentThread()[1].WaitBlock[1].WaitListEntry.Flink = 0i64;
  if( v7 )
  {
    PspRevertContainerImpersonation((_ETHREAD *)KeGetCurrentThread());
    ObfDereferenceObjectWithTag(v7, 0x746C6644ui64);
  }
  if( KeGetCurrentThread()->WaitBlock[3].SpareLong )
    KeBugCheckEx(
      1u,
      v3,
      (PVOID)KeGetCurrentThread()->ApcStateIndex,
      (PVOID)KeGetCurrentThread()->CombinedApcDisable,
      0i64);
}

Referenced by:

No references.