NtAlpcQueryInformation
INT64 __fastcall NtAlpcQueryInformation(HANDLE Handle, INT64 a2, UINT64 a3, UINT64 a4, UINT64 a5){
unsigned int v5;
UINT64 *v6;
int v7;
_ETHREAD *CurrentThread;
KPROCESSOR_MODE v10;
UINT64 v11;
UINT64 v12;
unsigned __int64 v13;
UINT64 *v14;
UINT64 v15;
struct _DMA_ADAPTER *v16;
NTSTATUS v17;
NTSTATUS ServerSessionInfo;
_ETHREAD *v19;
bool v20;
int v22;
int v23;
int v24;
PVOID *Object;
PVOID v26;
v5 = a4;
v6 = (UINT64 *)a3;
v7 = a2;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
if( !a3 )
{
v17 = -1073741811;
goto LABEL_24;
}
v10 = *((_BYTE *)KeGetCurrentThread() + 562);
if( v10 )
{
if( (((_DWORD)a2 - 3) & 0xFFFFFFF7) != 0 && (_DWORD)a4 )
{
v11 = a3;
if( (a3 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v12 = a3 + (unsigned int)a4 - 1i64;
if( a3 > v12 || (a3 = 0x7FFFFFFF0000i64, v12 >= 0x7FFFFFFF0000i64) )
ExRaiseAccessViolation();
v13 = (v12 & 0xFFFFFFFFFFFFF000ui64) + 4096;
do
{
*(_BYTE *)v11 = *(_BYTE *)v11;
v11 = (v11 & 0xFFFFFFFFFFFFF000ui64) + 4096;
}
while( v11 != v13 );
}
else
{
a3 = 0x7FFFFFFF0000i64;
}
v14 = (UINT64 *)a5;
if( a5 )
{
v15 = a5;
if( a5 >= 0x7FFFFFFF0000i64 )
v15 = 0x7FFFFFFF0000i64;
*(_DWORD *)v15 = *(_DWORD *)v15;
}
}
else
{
v14 = (UINT64 *)a5;
}
v16 = 0i64;
if( !Handle
|| (v26 = 0i64,
v17 = ObReferenceObjectByHandle(Handle, 0x20000u, AlpcPortObjectType, v10, &v26, 0i64),
v16 = (struct _DMA_ADAPTER *)v26,
v17 >= 0) )
{
if( v7 )
{
v22 = v7 - 3;
if( v22 )
{
v23 = v22 - 1;
if( v23 )
{
v24 = v23 - 7;
if( v24 )
{
if( v24 != 1 )
{
v17 = -1073741811;
LABEL_22:
if( v16 )
HalPutDmaAdapter(v16);
goto LABEL_24;
}
ServerSessionInfo = AlpcpPortQueryServerSessionInfo((INT64)v16, v6, v5, v14);
}
else
{
LOBYTE(Object) = v10;
ServerSessionInfo = AlpcpWaitForPortReferences((_ALPC_PORT *)v16, v6, v5, v14, (INT64)Object);
}
}
else
{
ServerSessionInfo = AlpcpPortQueryServerInfo((INT64)v16, (INT64)v6, v5, v14, v10);
}
}
else
{
LOBYTE(Object) = v10;
ServerSessionInfo = AlpcpPortQueryConnectedSidInfo((_ALPC_PORT *)v16, v6, (VOID *)a3, v14, (INT64)Object);
}
}
else
{
ServerSessionInfo = AlpcpPortQueryBasicInfo((__int64)v16, (__int64)v6, v5, v14);
}
v17 = ServerSessionInfo;
goto LABEL_22;
}
LABEL_24:
v19 = (_ETHREAD *)KeGetCurrentThread();
v20 = (*((_WORD *)v19 + 242))++ == 0xFFFF;
if( v20 && *((_ETHREAD **)v19 + 19) != (_ETHREAD *)((char *)v19 + 152) && !*((_WORD *)v19 + 243) )
KiCheckForKernelApcDelivery();
return(unsigned int)v17;
}Referenced by:
No references.