NtQueryInformationWorkerFactory
INT64 __fastcall NtQueryInformationWorkerFactory(
VOID *WorkerFactoryHandle,
INT64 WorkerFactoryInformationClass,
VOID *WorkerFactoryInformation,
UINT64 WorkerFactoryInformationLength,
UINT64 *ReturnLength,
INT64 a6,
INT64 a7,
INT64 a8){
int v8;
KPROCESSOR_MODE v11;
INT64 result;
__int64 v13;
__int64 v14;
char *v15;
__int64 v16;
int v17;
PVOID Object;
__int128 v19;
__int128 v20;
__int128 v21;
__int128 v22;
__int128 v23;
__int128 v24;
__int128 v25;
__int64 v26;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v8 = WorkerFactoryInformationLength;
memset(&LockHandle, 0, sizeof(LockHandle));
v11 = *((_BYTE *)KeGetCurrentThread() + 562);
if( (_DWORD)WorkerFactoryInformationClass != 7 )
return 3221225475i64;
if( v11 )
{
if( ((unsigned __int8)WorkerFactoryInformation & 3) != 0 )
ExRaiseDatatypeMisalignment();
v13 = 0x7FFFFFFF0000i64;
v14 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)WorkerFactoryInformation < 0x7FFFFFFF0000i64 )
v14 = (__int64)WorkerFactoryInformation;
*(_BYTE *)v14 = *(_BYTE *)v14;
*(_BYTE *)(v14 + 119) = *(_BYTE *)(v14 + 119);
if( ReturnLength )
{
if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
v13 = (__int64)ReturnLength;
*(_DWORD *)v13 = 120;
}
}
else if( ReturnLength )
{
*(_DWORD *)ReturnLength = 120;
}
if( v8 != 120 )
return 3221225476i64;
Object = 0i64;
LODWORD(result) = ObReferenceObjectByHandle(WorkerFactoryHandle, 8u, ExpWorkerFactoryObjectType, v11, &Object, 0i64);
if( (int)result >= 0 )
{
HIBYTE(v20) = 0;
HIDWORD(v22) = 0;
HIDWORD(v26) = 0;
v15 = (char *)Object;
KeAcquireInStackQueuedSpinLock(*((UINT64 **)Object + 2), &LockHandle);
v19 = 0i64;
*(_QWORD *)&v20 = *((_QWORD *)v15 + 14);
WORD4(v20) = 0;
BYTE10(v20) = (v15[312] & 8) != 0;
v16 = *((_QWORD *)v15 + 2);
v17 = *(_DWORD *)(v16 + 28);
BYTE11(v20) = v17 == 0;
BYTE12(v20) = *((_DWORD *)v15 + 76) != 0;
*(_WORD *)((char *)&v20 + 13) = *(_WORD *)(v16 + 32);
LODWORD(v21) = *((_DWORD *)v15 + 77);
*(_QWORD *)((char *)&v21 + 4) = *((_QWORD *)v15 + 35);
HIDWORD(v21) = *((_DWORD *)v15 + 74);
LODWORD(v22) = v17;
DWORD1(v22) = *((_DWORD *)v15 + 73);
DWORD2(v22) = *(_DWORD *)(v16 + 24);
*(_QWORD *)&v23 = 0i64;
*((_QWORD *)&v23 + 1) = *((_QWORD *)v15 + 3);
*(_QWORD *)&v24 = *((_QWORD *)v15 + 4);
*((_QWORD *)&v24 + 1) = *(_QWORD *)(*((_QWORD *)v15 + 6) + 1088i64);
v25 = *(_OWORD *)(v15 + 56);
LODWORD(v26) = *((_DWORD *)v15 + 80);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
ObfDereferenceObjectWithTag(v15, 0x746C6644ui64);
*(_OWORD *)WorkerFactoryInformation = v19;
*((_OWORD *)WorkerFactoryInformation + 1) = v20;
*((_OWORD *)WorkerFactoryInformation + 2) = v21;
*((_OWORD *)WorkerFactoryInformation + 3) = v22;
*((_OWORD *)WorkerFactoryInformation + 4) = v23;
*((_OWORD *)WorkerFactoryInformation + 5) = v24;
*((_OWORD *)WorkerFactoryInformation + 6) = v25;
*((_QWORD *)WorkerFactoryInformation + 14) = v26;
return 0i64;
}
return result;
}Referenced by:
No references.