NtQueryWnfStateData
NTSTATUS __stdcall NtQueryWnfStateData(
const _WNF_STATE_NAME *StateName,
const _WNF_TYPE_ID *TypeId,
const VOID *ExplicitScope,
UINT64 *ChangeStamp,
VOID *Buffer,
UINT64 *BufferSize){
_ETHREAD *CurrentThread;
char PreviousMode;
unsigned __int64 v9;
int StateData;
VOID *v11;
unsigned __int64 v12;
unsigned int *v13;
unsigned __int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
__int64 bf_0;
unsigned __int64 v19;
int v20;
_ETHREAD *v21;
_EPROCESS *v22;
NTSTATUS v23;
UINT64 *v24;
VOID **CapturedScopeData;
_WNF_DATA_SCOPE DataScope;
unsigned int DataSize;
_WNF_NAME_INSTANCE *NameInstance;
VOID **StateNameRegistration;
_WNF_SCOPE_INSTANCE *ScopeInstance;
_EPROCESS *Process;
int v33;
_WNF_STATE_NAME_STRUCT InternalStateName;
_WNF_TYPE_ID *CapturedTypeId;
VOID *CapturedScopeInstanceId;
UINT64 *BytesCopied;
UINT64 *ChangeStampa;
VOID *Data;
_WNF_CAPTURED_INSTANCE_ID v40[4];
__int128 v41;
ChangeStampa = ChangeStamp;
Process = (_EPROCESS *)ExplicitScope;
Data = Buffer;
BytesCopied = BufferSize;
InternalStateName._bf_0 = 0i64;
v41 = 0i64;
CapturedScopeInstanceId = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
PreviousMode = KeGetCurrentThread()->PreviousMode;
StateNameRegistration = 0i64;
ScopeInstance = 0i64;
NameInstance = 0i64;
LODWORD(v9) = 0;
*(_OWORD *)v40 = 0i64;
CapturedTypeId = (_WNF_TYPE_ID *)TypeId;
StateData = ExpCaptureWnfStateName(StateName, &InternalStateName, PreviousMode);
if( StateData >= 0 )
{
if( PreviousMode )
{
if( v12 )
{
if( v12 >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
v41 = *(_OWORD *)v12;
CapturedTypeId = (_WNF_TYPE_ID *)&v41;
}
v15 = v14;
if( v14 >= 0x7FFFFFFF0000i64 )
v15 = 0x7FFFFFFF0000i64;
*(_DWORD *)v15 = *(_DWORD *)v15;
v16 = (__int64)v13;
if( (unsigned __int64)v13 >= 0x7FFFFFFF0000i64 )
v16 = 0x7FFFFFFF0000i64;
v11 = (VOID *)*(unsigned int *)v16;
DataSize = *(_DWORD *)v16;
v17 = (__int64)v13;
if( (unsigned __int64)v13 >= 0x7FFFFFFF0000i64 )
v17 = 0x7FFFFFFF0000i64;
*(_DWORD *)v17 = *(_DWORD *)v17;
if( (_DWORD)v11 )
ProbeForWrite((UINT64)Buffer, (unsigned int)v11, 1i64);
}
else
{
DataSize = *v13;
}
bf_0 = InternalStateName._bf_0;
v19 = ((unsigned __int64)InternalStateName._bf_0 >> 4) & 3;
v33 = ((unsigned __int64)InternalStateName._bf_0 >> 4) & 3;
v9 = ((unsigned __int64)InternalStateName._bf_0 >> 6) & 0xF;
DataScope = ((unsigned __int64)InternalStateName._bf_0 >> 6) & 0xF;
LOBYTE(v11) = PreviousMode;
StateData = ExpWnfCaptureScopeInstanceId(
DataScope,
(VOID *)ExplicitScope,
v11,
&CapturedScopeInstanceId,
(VOID **)v40);
if( StateData >= 0 )
{
if( PreviousMode )
{
v20 = 0;
if( Process )
{
StateData = ExpWnfCheckCrossScopeAccess((_WNF_STATE_NAME_STRUCT)bf_0);
if( StateData < 0 )
goto LABEL_31;
}
}
else
{
v20 = 1;
}
if( PreviousMode )
{
v21 = (_ETHREAD *)KeGetCurrentThread();
v22 = v21->Tcb.ApcState.Process;
bf_0 = InternalStateName._bf_0;
LODWORD(v19) = v33;
LODWORD(v9) = DataScope;
}
else
{
v21 = 0i64;
v22 = PsInitialSystemProcess;
}
Process = v22;
StateData = ExpWnfResolveScopeInstance(&ScopeInstance, v22, v21, (_WNF_DATA_SCOPE)v9, CapturedScopeInstanceId);
if( StateData >= 0 )
{
v23 = ExpWnfLookupNameInstance(ScopeInstance, (_WNF_STATE_NAME_STRUCT)bf_0, &NameInstance);
StateData = v23;
if( v23 != -1073741772 || (_DWORD)v19 == 3 )
{
if( v23 < 0 )
goto LABEL_31;
LODWORD(CapturedScopeData) = v20;
StateData = ExpWnfValidatePubSubPreconditions(
1ui64,
&NameInstance->StateNameInfo,
0i64,
CapturedTypeId,
(UINT64)CapturedScopeData);
if( StateData < 0 )
goto LABEL_31;
}
else
{
StateData = ExpWnfLookupPermanentName((_WNF_STATE_NAME_STRUCT)bf_0, &StateNameRegistration);
if( StateData < 0 )
goto LABEL_31;
LODWORD(CapturedScopeData) = v20;
StateData = ExpWnfValidatePubSubPreconditions(
1ui64,
(_WNF_STATE_NAME_REGISTRATION *)StateNameRegistration,
0i64,
CapturedTypeId,
(UINT64)CapturedScopeData);
if( StateData < 0 )
goto LABEL_31;
if( (_DWORD)v9 == 5 || (bf_0 & 0x400) != 0 )
{
StateData = ExpWnfCreateNameInstance(
ScopeInstance,
(_WNF_STATE_NAME_STRUCT)bf_0,
(_WNF_STATE_NAME_REGISTRATION *)StateNameRegistration,
Process,
&NameInstance);
ExFreePoolWithTag(StateNameRegistration, 0x20666E57u);
StateNameRegistration = 0i64;
if( StateData < 0 )
goto LABEL_31;
}
}
v24 = BytesCopied;
if( NameInstance )
{
StateData = ExpWnfReadStateData(NameInstance, ChangeStampa, Data, DataSize, BytesCopied);
}
else
{
*(_DWORD *)ChangeStampa = 0;
*(_DWORD *)v24 = 0;
StateData = 0;
}
}
}
}
LABEL_31:
if( NameInstance )
ExReleaseRundownProtection(&NameInstance->RunRef);
if( ScopeInstance )
ExReleaseRundownProtection(&ScopeInstance->RunRef);
if( StateNameRegistration )
ExFreePoolWithTag(StateNameRegistration, 0x20666E57u);
KeLeaveCriticalRegion();
ExpWnfReleaseCapturedScopeInstanceId((_WNF_DATA_SCOPE)v9, v40, PreviousMode);
return StateData;
}Referenced by:
No references.