NtAlpcQueryInformation
NTSTATUS __stdcall NtAlpcQueryInformation(
VOID *PortHandle,
_ALPC_PORT_INFORMATION_CLASS PortInformationClass,
VOID *PortInformation,
UINT64 Length,
UINT64 *ReturnLength){
unsigned int v5;
UINT64 *v6;
_ETHREAD *CurrentThread;
char PreviousMode;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
UINT64 *v14;
__int64 v15;
_ADAPTER_OBJECT *v16;
int v17;
int ServerSessionInfo;
_ETHREAD *v19;
bool v20;
__int32 v22;
__int32 v23;
__int32 v24;
PVOID *Object;
PVOID v26;
v5 = Length;
v6 = (UINT64 *)PortInformation;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
if( !PortInformation )
{
v17 = -1073741811;
goto LABEL_24;
}
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
if( ((PortInformationClass - 3) & 0xFFFFFFF7) != 0 && (_DWORD)Length )
{
v11 = (unsigned __int64)PortInformation;
if( ((unsigned __int8)PortInformation & 3) != 0 )
ExRaiseDatatypeMisalignment();
v12 = (unsigned __int64)PortInformation + (unsigned int)Length - 1;
if( (unsigned __int64)PortInformation > v12
|| (PortInformation = (VOID *)0x7FFFFFFF0000i64, v12 >= 0x7FFFFFFF0000i64) )
{
ExRaiseAccessViolation();
}
v13 = (v12 & 0xFFFFFFFFFFFFF000ui64) + 4096;
do
{
*(_BYTE *)v11 = *(_BYTE *)v11;
v11 = (v11 & 0xFFFFFFFFFFFFF000ui64) + 4096;
}
while( v11 != v13 );
}
else
{
PortInformation = (VOID *)0x7FFFFFFF0000i64;
}
v14 = ReturnLength;
if( ReturnLength )
{
v15 = (__int64)ReturnLength;
if( (unsigned __int64)ReturnLength >= 0x7FFFFFFF0000i64 )
v15 = 0x7FFFFFFF0000i64;
*(_DWORD *)v15 = *(_DWORD *)v15;
}
}
else
{
v14 = ReturnLength;
}
v16 = 0i64;
if( !PortHandle
|| (v26 = 0i64,
v17 = ObReferenceObjectByHandle(PortHandle, 0x20000ui64, AlpcPortObjectType, PreviousMode, &v26, 0i64),
v16 = (_ADAPTER_OBJECT *)v26,
v17 >= 0) )
{
if( PortInformationClass )
{
v22 = PortInformationClass - 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((_ALPC_PORT *)v16, v6, v5, v14);
}
else
{
ServerSessionInfo = AlpcpWaitForPortReferences((_ALPC_PORT *)v16, v6, v5, v14, PreviousMode);
}
}
else
{
LOBYTE(Object) = PreviousMode;
ServerSessionInfo = AlpcpPortQueryServerInfo((INT64)v16, (INT64)v6, v5, v14, (_KPROCESSOR_MODE)Object);
}
}
else
{
LOBYTE(Object) = PreviousMode;
ServerSessionInfo = AlpcpPortQueryConnectedSidInfo((_ALPC_PORT *)v16, v6, PortInformation, v14, (INT64)Object);
}
}
else
{
ServerSessionInfo = AlpcpPortQueryBasicInfo(
(_ALPC_PORT *)v16,
(_ALPC_BASIC_INFORMATION *)v6,
v5,
v14,
(CHAR)Object);
}
v17 = ServerSessionInfo;
goto LABEL_22;
}
LABEL_24:
v19 = (_ETHREAD *)KeGetCurrentThread();
v20 = v19->Tcb.KernelApcDisable++ == -1;
if( v20
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v19->Tcb.ApcState.ApcListHead[0].Flink != &v19->Tcb.152
&& !v19->Tcb.SpecialApcDisable )
{
KiCheckForKernelApcDelivery();
}
return v17;
}Referenced by:
No references.