NtAlpcSetInformation
INT64 __fastcall NtAlpcSetInformation(VOID *a1, INT64 a2, INT64 *a3, UINT64 a4){
UINT64 v4;
int v5;
_ETHREAD *CurrentThread;
int v8;
NTSTATUS v9;
KPROCESSOR_MODE v10;
__int64 v11;
INT64 *p_result;
int v13;
int v14;
int v15;
int v16;
int v17;
int v18;
int v19;
_DWORD *v20;
volatile INT64 *v21;
void *v22;
_QWORD *v23;
volatile INT64 *v24;
volatile INT64 *v25;
_QWORD *v26;
INT64 *v27;
_QWORD *v28;
volatile INT64 *v29;
CHAR *v30;
__m128i v31;
NTSTATUS v32;
PVOID *Object;
POBJECT_HANDLE_INFORMATION HandleInformation;
KPROCESSOR_MODE v36;
PVOID v37;
INT64 *v38;
HANDLE Handle;
INT64 *v40;
INT64 result;
int v42;
unsigned __int64 v43;
v4 = (unsigned int)a4;
v5 = a2;
Handle = a1;
v38 = a3;
memset((INT64)&result, 0i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v8 = 0;
if( a1 && (v38 || v5 == 7 || v5 == 10) )
{
v10 = *((_BYTE *)KeGetCurrentThread() + 562);
v36 = v10;
v11 = (__int64)v38;
p_result = v38;
v40 = v38;
if( (_DWORD)v4 && v10 )
{
if( (unsigned int)v4 > 0x48 )
{
v9 = -1073741820;
goto LABEL_65;
}
if( (unsigned __int64)v38 >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
v38 = (INT64 *)v11;
memmove((UINT8 *)&result, (UINT8 *)v11, v4);
p_result = &result;
v40 = &result;
}
v37 = 0i64;
v9 = ObReferenceObjectByHandle(Handle, 1u, AlpcPortObjectType, v10, &v37, 0i64);
if( v9 < 0 )
goto LABEL_65;
v13 = v5 - 1;
if( v13 )
{
v14 = v13 - 1;
if( v14 )
{
v15 = v14 - 3;
if( !v15 )
{
v9 = (_DWORD)v4 != 16 ? 0xC000000D : 0;
goto LABEL_64;
}
v16 = v15 - 1;
if( v16 )
{
v17 = v16 - 1;
if( v17 )
{
v18 = v17 - 1;
if( !v18 )
{
if( (_DWORD)v4 == 4 && *(_DWORD *)p_result )
{
v26 = v37;
v27 = (INT64 *)((char *)v37 + 352);
ExAcquirePushLockSharedEx((UINT64)v37 + 352, 0i64);
if( v26[45] )
{
AlpcpAdjustCompletionListConcurrencyCount((INT64)v26, *(_DWORD *)p_result);
v9 = 0;
}
else
{
v9 = -1073741811;
}
if( _InterlockedCompareExchange64(v27, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v27);
v22 = v27;
goto LABEL_29;
}
LABEL_52:
v9 = -1073741811;
goto LABEL_64;
}
v19 = v18 - 1;
if( v19 )
{
if( v19 == 1 && !(_DWORD)v4 )
{
v20 = v37;
v21 = (volatile INT64 *)((char *)v37 + 352);
ExAcquirePushLockExclusiveEx((UINT64)v37 + 352, 0i64);
if( *((_QWORD *)v20 + 45) )
{
v20[104] &= ~0x10000u;
v9 = 0;
}
else
{
v9 = -1073741811;
}
if( (_InterlockedExchangeAdd64(v21, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v21);
v22 = (void *)v21;
LABEL_29:
KeAbPostRelease(v22);
LABEL_64:
HalPutDmaAdapter((PADAPTER_OBJECT)v37);
goto LABEL_65;
}
goto LABEL_52;
}
if( v36 )
goto LABEL_52;
ObfReferenceObject(*(PVOID *)v11);
v23 = v37;
v24 = (volatile INT64 *)((char *)v37 + 352);
ExAcquirePushLockExclusiveEx((UINT64)v37 + 352, 0i64);
v23[46] = *(_QWORD *)v11;
v23[47] = *(_QWORD *)(v11 + 8);
if( (_InterlockedExchangeAdd64(v24, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v24);
v25 = v24;
}
else
{
if( (_DWORD)v4 )
goto LABEL_52;
v28 = v37;
v29 = (volatile INT64 *)((char *)v37 + 352);
ExAcquirePushLockExclusiveEx((UINT64)v37 + 352, 0i64);
if( v28[45] )
AlpcpFreeCompletionList((INT64)v28);
if( (_InterlockedExchangeAdd64(v29, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v29);
v25 = v29;
}
KeAbPostRelease((PVOID)v25);
v9 = 0;
goto LABEL_64;
}
if( (*((_DWORD *)v37 + 104) & 6) != 2 )
goto LABEL_52;
if( (_DWORD)v4 == 16 )
{
v31 = *(__m128i *)p_result;
p_result = &result;
v30 = (CHAR *)v31.m128i_u32[0];
result = v31.m128i_u32[0];
v42 = v31.m128i_i32[1];
v43 = _mm_srli_si128(v31, 8).m128i_u64[0];
v8 = 1;
}
else
{
if( (_DWORD)v4 != 24 )
goto LABEL_52;
v30 = (CHAR *)*p_result;
}
LODWORD(HandleInformation) = v8;
LODWORD(Object) = *((_DWORD *)p_result + 4);
v32 = AlpcpInitializeCompletionList(
(INT64)v37,
v30,
*((unsigned int *)p_result + 2),
*((unsigned int *)p_result + 3),
(INT64)Object,
(INT64)HandleInformation);
LABEL_59:
v9 = v32;
goto LABEL_64;
}
if( (_DWORD)v4 == 16 )
{
v32 = AlpcpAssociateIoCompletionPort((INT64)v37, (VOID *)p_result[1], *p_result);
goto LABEL_59;
}
}
else if( (_DWORD)v4 == 72 )
{
if( (*(_DWORD *)p_result & 0xFC00FFFF) == 0 )
{
*((_DWORD *)v37 + 64) ^= (*((_DWORD *)v37 + 64) ^ *(_DWORD *)p_result) & 0x20000;
goto LABEL_64;
}
goto LABEL_52;
}
v9 = -1073741820;
goto LABEL_64;
}
v9 = -1073741811;
LABEL_65:
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return(unsigned int)v9;
}Referenced by:
No references.