IoSetDiskIoAttributionFromThread
NTSTATUS __stdcall IoSetDiskIoAttributionFromThread(_IRP *Irp, _ETHREAD *Thread){
void *WorkOnBehalfThread;
int v4;
_EPROCESS *Process;
_EPROCESS *v7;
UINT64 v8;
NTSTATUS v9;
int v11;
unsigned __int8 v12;
_QWORD *DiskIoAttribution;
unsigned __int64 v14;
int v15;
unsigned __int8 v16;
unsigned __int64 v17;
WorkOnBehalfThread = Thread->WorkOnBehalfThread;
v4 = 0;
if( !WorkOnBehalfThread )
goto LABEL_27;
if( Thread != (_ETHREAD *)KeGetCurrentThread() )
{
v16 = ExAcquireSpinLockShared(&PspThreadWorkOnBehalfLock);
WorkOnBehalfThread = Thread->WorkOnBehalfThread;
v17 = v16;
if( WorkOnBehalfThread )
{
ObfReferenceObjectWithTag(Thread->WorkOnBehalfThread, 0x746C6644ui64);
v4 = 1;
}
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&PspThreadWorkOnBehalfLock);
__writecr8(v17);
}
if( WorkOnBehalfThread )
{
v7 = (_EPROCESS *)*((_QWORD *)WorkOnBehalfThread + 68);
}
else
{
LABEL_27:
if( Thread == (_ETHREAD *)KeGetCurrentThread() )
{
Process = Thread->Tcb.ApcState.Process;
if( Process != Thread->Tcb.Process )
{
IopSetDiskIoAttributionFromProcess(Irp, Process);
if( v11 >= 0 )
{
LABEL_15:
v9 = 0;
goto LABEL_8;
}
}
}
v7 = Thread->Tcb.Process;
}
v8 = 0i64;
if( v7->DiskIoAttribution )
{
v12 = ExAcquireSpinLockShared((INT64 *)&stru_140C452E0 + 139);
DiskIoAttribution = v7->DiskIoAttribution;
v14 = v12;
if( DiskIoAttribution )
v8 = DiskIoAttribution[3];
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&stru_140C452E0 + 278);
__writecr8(v14);
if( DiskIoAttribution )
{
IopSetDiskIoAttributionExtension(Irp, v8);
v9 = v15;
if( v15 >= 0 )
v9 = 0;
}
else
{
v9 = -1073741275;
}
}
else
{
v9 = -1073741275;
}
if( v9 >= 0 )
goto LABEL_15;
LABEL_8:
if( v4 )
ObDereferenceObjectDeferDelete((UINT64)WorkOnBehalfThread);
return v9;
}Referenced by:
IoAsynchronousPageWrite
IoSetIoAttributionIrp
IoSynchronousPageWriteEx
IopBuildAsynchronousFsdRequest
IopSynchronousServiceTail