IopCancelIrpsInCurrentThreadListSpecialApc
NTSTATUS __fastcall IopCancelIrpsInCurrentThreadListSpecialApc(__int64 a1, __int64 a2, __int64 a3, _BYTE **a4){
_ETHREAD *CurrentThread;
_BYTE *v6;
char v7;
unsigned __int64 v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
_LIST_ENTRY *v13;
int v14;
_LIST_ENTRY *v15;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = *a4;
v7 = 0;
v8 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&CurrentThread->IrpListLock);
Flink = CurrentThread->IrpList.Flink;
*v6 = 0;
*(_DWORD *)(a1 + 132) = 0;
if( &CurrentThread->IrpList == Flink )
{
KxReleaseSpinLock(&CurrentThread->IrpListLock);
__writecr8(v8);
}
else
{
do
{
if( SBYTE3(Flink[2].Flink) < SBYTE2(Flink[2].Flink) + 2 )
{
v10 = *(_LIST_ENTRY **)(a1 + 96);
if( !v10 || Flink[2].Blink == v10 )
{
v13 = *(_LIST_ENTRY **)(a1 + 88);
if( !v13 || Flink[10].Flink == v13 )
{
v14 = (int)Flink[-1].Flink;
if( (v14 & 0x402) == 0 && ((v14 & 0x84) != 0 || (HIBYTE(Flink[2].Flink) & 2) != 0) )
{
BYTE4(Flink[2].Flink) = 1;
v7 = 1;
*v6 = 1;
*(_DWORD *)(a1 + 132) = 1;
}
}
}
if( !*(_BYTE *)(a1 + 128) )
{
v11 = *(_LIST_ENTRY **)(a1 + 96);
if( !v11 || Flink[2].Blink == v11 )
{
v15 = *(_LIST_ENTRY **)(a1 + 88);
if( (!v15 || Flink[10].Flink == v15) && ((__int64)Flink[-1].Flink & 2) == 0 )
{
*v6 = 1;
*(_DWORD *)(a1 + 132) = 1;
}
}
}
}
Flink = Flink->Flink;
}
while( &CurrentThread->IrpList != Flink );
KxReleaseSpinLock(&CurrentThread->IrpListLock);
__writecr8(v8);
if( v7 )
KeAlertThread((INT64)CurrentThread, 0);
}
return KeSetEvent((PRKEVENT)(a1 + 104), 0, 0);
}Referenced by:
No references.