IopPassiveInterruptWorker

VOID __stdcall IopPassiveInterruptWorker(VOID *Context){
  UINT64 *v2; 
  char OldIrql[8]; 
  _GROUP_AFFINITY Affinity; 
  _GROUP_AFFINITY PreviousAffinity; 

  OldIrql[0] = 0;
  PreviousAffinity = 0i64;
  IopAcquireReleaseDispatcherLock((PASSIVE_INTERRUPT_BLOCK *)Context, 1u);
  if( !*((_BYTE *)Context + 28) )
  {
    Affinity = *(_GROUP_AFFINITY *)((char *)Context + 40);
    KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
  }
  IopAcquirePassiveInterruptBlockLock((PASSIVE_INTERRUPT_BLOCK *)Context, (UINT8 *)OldIrql);
  while( 1 )
  {
    v2 = (UINT64 *)((char *)Context + 56);
    if( !*((_BYTE *)Context + 65) )
      break;
    *((_BYTE *)Context + 65) = 0;
    KxReleaseSpinLock(v2);
    __writecr8((unsigned __int8)OldIrql[0]);
    KiInterruptDispatchCommon(
      (_KINTERRUPT_TYPE)(*((_BYTE *)Context + 28) != 0),
      *((unsigned int *)Context + 5),
      1ui64,
      0i64,
      0i64);
    IopAcquirePassiveInterruptBlockLock((PASSIVE_INTERRUPT_BLOCK *)Context, (UINT8 *)OldIrql);
  }
  *((_BYTE *)Context + 64) = 0;
  KxReleaseSpinLock(v2);
  __writecr8((unsigned __int8)OldIrql[0]);
  if( !*((_BYTE *)Context + 28) )
    KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  IopAcquireReleaseDispatcherLock((PASSIVE_INTERRUPT_BLOCK *)Context, 0);
  if( !*((_DWORD *)Context + 8) )
    ((void(__fastcall *)(_QWORD, __int64))off_140C00778[0])(*((unsigned int *)Context + 6), 2i64);
  IopDereferencePassiveInterruptBlock((PASSIVE_INTERRUPT_BLOCK *)Context);
}

Referenced by:

No references.