PspWow64GetContextThread
int __fastcall PspWow64GetContextThread(__int64 a1, int *a2, int a3, char a4){
__int64 v8;
__int64 v9;
__int64 v10;
int ExtendedContextLength;
unsigned int TransactionKey_high;
unsigned __int64 v13;
void *v14;
int *p_ContextFlags;
INT64 *v16;
int *QuadPart;
unsigned __int64 v18;
signed __int64 v19;
void *v20;
void *v21;
_LARGE_INTEGER *v22;
_DWORD *v23;
INT64 v24;
int *CpuAreaContextLength;
UINT64 *CpuAreaContextLengtha;
UINT64 *CpuAreaContextAlignment;
UINT64 CpuAreaContextAlignmenta;
UINT64 v29;
UINT16 v30;
_TRANSACTION_NOTIFICATION ContextFlags;
_ETHREAD *TargetThread;
UINT64 Asynchronous[2];
__int64 v34;
INT64 result[90];
TargetThread = (_ETHREAD *)a1;
*(_QWORD *)&ContextFlags.ArgumentLength = 0i64;
memset((INT64)result, 0i64);
ContextFlags.TransactionNotification = 0;
ContextFlags.TmVirtualClock.QuadPart = 0i64;
LOBYTE(ContextFlags.TransactionKey) = 0;
*(_OWORD *)Asynchronous = 0i64;
v34 = 0i64;
if( a3 != 716 )
return -1073741820;
v8 = *(_QWORD *)(a1 + 544);
v9 = *(_QWORD *)(v8 + 1408);
if( !v9 || *(_WORD *)(v9 + 8) != 332 )
return -1073741811;
if( a4 )
{
v10 = (__int64)a2;
if( (unsigned __int64)a2 >= 0x7FFFFFFF0000i64 )
v10 = 0x7FFFFFFF0000i64;
HIDWORD(ContextFlags.TransactionKey) = *(_DWORD *)v10;
}
else
{
HIDWORD(ContextFlags.TransactionKey) = *a2;
}
ExtendedContextLength = RtlpWow64SanitizeContextFlags((UINT64 *)((char *)&ContextFlags.TransactionKey + 4), a4);
if( ExtendedContextLength >= 0 )
{
TransactionKey_high = HIDWORD(ContextFlags.TransactionKey);
if( !a4 )
{
p_ContextFlags = a2;
QuadPart = a2 + 179;
LABEL_15:
ExtendedContextLength = PspWow64ReadOrWriteThreadCpuArea(
(_EPROCESS *)v8,
TargetThread,
1u,
result,
(UINT64)CpuAreaContextLength,
(UINT64)CpuAreaContextAlignment,
0i64,
(UINT8 *)&ContextFlags,
v30);
if( ExtendedContextLength >= 0 )
{
if( LOBYTE(ContextFlags.TransactionKey) && (TransactionKey_high & 0x10040) == 65600 )
{
return -1073741637;
}
else
{
ExtendedContextLength = RtlGetExtendedContextLength(
0x4010001Fui64,
(UINT64 *)&ContextFlags.TransactionNotification);
if( ExtendedContextLength >= 0 )
{
v18 = ContextFlags.TransactionNotification + 15i64;
if( v18 <= ContextFlags.TransactionNotification )
v18 = 0xFFFFFFFFFFFFFF0i64;
v19 = v18 & 0xFFFFFFFFFFFFFFF0ui64;
v20 = alloca(v19);
v21 = alloca(v19);
ExtendedContextLength = RtlInitializeExtendedContext(
(INT64)&ContextFlags,
0x4010001Fui64,
&ContextFlags.ArgumentLength);
if( ExtendedContextLength >= 0 )
{
if( (TransactionKey_high & 0x10040) == 65600 )
{
LODWORD(Asynchronous[1]) |= 0x100040u;
v23 = *(_DWORD **)&ContextFlags.ArgumentLength;
*(_QWORD *)(*(_QWORD *)&ContextFlags.ArgumentLength + 16i64) = *((_QWORD *)QuadPart + 2);
v23[4] += (_DWORD)QuadPart - (_DWORD)v23;
v23[1] = v23[4] + v23[5] - *v23;
}
LODWORD(CpuAreaContextLengtha) = 1;
LOBYTE(v22) = 1;
ExtendedContextLength = PspGetContextThreadInternal(
TargetThread,
&ContextFlags,
0i64,
v22,
CpuAreaContextLengtha,
CpuAreaContextAlignmenta,
v29);
if( ExtendedContextLength >= 0 )
{
if( LOBYTE(ContextFlags.TransactionKey) )
ExtendedContextLength = RtlCopyContext(
(_CONTEXT *)p_ContextFlags,
(unsigned int)*p_ContextFlags,
(_CONTEXT *)result);
else
ExtendedContextLength = RtlpWow64GetContextOnAmd64(
(INT64)result,
(INT64)&ContextFlags,
(INT64)p_ContextFlags);
if( ExtendedContextLength >= 0 )
{
if( a4 )
{
ExtendedContextLength = RtlpWriteExtendedContext(
v24,
(INT64)(a2 + 179),
(INT64)Asynchronous,
TransactionKey_high,
(INT64)QuadPart);
*(&ContextFlags.TransactionNotification + 1) = ExtendedContextLength;
}
}
}
}
}
}
}
return ExtendedContextLength;
}
ExtendedContextLength = RtlGetExtendedContextLength(
HIDWORD(ContextFlags.TransactionKey),
(UINT64 *)&ContextFlags.TransactionNotification);
if( ExtendedContextLength >= 0 )
{
v13 = ContextFlags.TransactionNotification + 15i64;
if( v13 <= ContextFlags.TransactionNotification )
v13 = 0xFFFFFFFFFFFFFF0i64;
v14 = alloca(v13 & 0xFFFFFFFFFFFFFFF0ui64);
p_ContextFlags = (int *)&ContextFlags;
memset((INT64)&ContextFlags, 0i64);
ExtendedContextLength = RtlInitializeExtendedContext(
(INT64)&ContextFlags,
TransactionKey_high,
(LARGE_INTEGER *)&ContextFlags.TmVirtualClock.QuadPart);
if( ExtendedContextLength >= 0 )
{
CpuAreaContextAlignment = Asynchronous;
CpuAreaContextLength = a2;
QuadPart = (int *)ContextFlags.TmVirtualClock.QuadPart;
ExtendedContextLength = RtlpReadExtendedContext(v16, 0i64, (BYTE *)ContextFlags.TmVirtualClock.QuadPart);
if( ExtendedContextLength >= 0 )
goto LABEL_15;
}
}
}
return ExtendedContextLength;
}Referenced by:
NtQueryInformationThread
WbGetWowTrapFrame
WbSetWowTrapFrame