VrpPostOpenOrCreate
NTSTATUS __stdcall VrpPostOpenOrCreate(_REG_POST_OPERATION_INFORMATION *PostInfo){
void *v1;
void *v2;
_DWORD *Object;
UNICODE_STRING *v5;
__int64 v6;
UNICODE_STRING *v7;
int v8;
UNICODE_STRING *v9;
__int64 v10;
INT64 v11;
INT64 v12;
INT64 v13;
struct _LOOKASIDE_LIST_EX *v14;
UNICODE_STRING *v15;
UNICODE_STRING *v16;
int v17;
NTSTATUS v18;
UNICODE_STRING *ExtraParameter;
int v20;
int ExtraParameterInBlock;
__int64 v22;
_QWORD *v23;
_QWORD *v24;
struct _DMA_ADAPTER *v25;
int v26;
__int64 *v27;
void *v28;
__int64 *v30;
__int64 v31;
int v32;
__int64 *v33;
__int64 v34;
int v35;
PVOID OldContext;
_DWORD *v37;
GUID ActivityId;
struct _EVENT_DATA_DESCRIPTOR v39[2];
int *v40;
int v41;
int v42;
__int64 v43;
int v44;
int v45;
PVOID *p_OldContext;
int v47;
int v48;
v2 = v1;
ActivityId = 0i64;
EtwActivityIdControl(3u, &ActivityId);
Object = PostInfo->Object;
v5 = 0i64;
v6 = *(_QWORD *)&PostInfo->Status;
v7 = 0i64;
OldContext = 0i64;
v37 = Object;
v8 = Object[2];
v9 = (UNICODE_STRING *)*((_QWORD *)Object + 4);
v10 = *((_QWORD *)Object + 2);
if( v8 < 0 )
goto LABEL_16;
CmRetrieveExtraParameter(*(_QWORD **)(v6 + 16));
if( v8 == 260 )
goto LABEL_16;
if( v8 == 872 )
{
if( !v9 )
return 0;
ExtraParameter = (UNICODE_STRING *)CmAllocateExtraParameter(v12, v11, v13, v14);
v7 = ExtraParameter;
if( !ExtraParameter )
goto LABEL_31;
VrpBuildKeyPath(0i64, v9 + 3, ExtraParameter + 1);
v18 = v20;
if( v20 < 0 )
{
LABEL_32:
if( (unsigned int)CallbackContext > 2 )
{
v30 = &EmptyUnicodeString;
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) )
v30 = *(__int64 **)v10;
v31 = v30[1];
v32 = *(unsigned __int16 *)v30;
v42 = 0;
v45 = 0;
v48 = 0;
v43 = v31;
p_OldContext = &OldContext;
v40 = &v44;
v44 = v32;
v41 = 2;
LODWORD(OldContext) = v18;
v47 = 4;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&CallbackContext,
(unsigned __int8 *)&unk_1400235F0,
&ActivityId,
0i64,
5u,
v39);
}
if( v5 )
VrpFreeKeyContext(v5);
if( v7 )
CmpFreeExtraParameter((UINT64 *)&v7[-3].Length);
goto LABEL_17;
}
ObfReferenceObjectWithTag(v9->Buffer, 0x67655256u);
*(_QWORD *)&v7->Length = v9->Buffer;
LODWORD(v7->Buffer) = *(_DWORD *)&v9[4].Length;
ExtraParameterInBlock = CmpFindExtraParameterInBlock(*(_QWORD **)(v6 + 16), &v7[-2].Length, &OldContext);
v18 = ExtraParameterInBlock;
if( ExtraParameterInBlock >= 0 )
{
v18 = -1073741771;
goto LABEL_32;
}
if( ExtraParameterInBlock == -1073741772 )
{
v24 = *(_QWORD **)(v22 + 8);
if( *v24 != v22 )
__fastfail(3u);
*v23 = v22;
v18 = 0;
v23[1] = v24;
*v24 = v23;
*(_QWORD *)(v22 + 8) = v23;
}
if( v18 < 0 )
goto LABEL_32;
LABEL_16:
v18 = 0;
goto LABEL_17;
}
LODWORD(v15) = VrpAllocateKeyContext(v2);
v5 = v15;
if( !v15 )
{
LABEL_31:
v18 = -1073741670;
goto LABEL_32;
}
v16 = v15 + 1;
VrpBuildKeyPath(0i64, v9 + 3, v15 + 1);
v18 = v17;
if( v17 < 0 )
goto LABEL_32;
*(_DWORD *)(&v5[2].MaximumLength + 1) = *(_DWORD *)&v9[4].Length;
v5[2].Length = VrpCountPathComponents(v16);
v18 = (unsigned int)CmSetCallbackObjectContext((_POOL_TYPE)**(_QWORD **)(v10 + 72), (UINT64)&VrpCallbackCookie);
if( v18 < 0 )
goto LABEL_32;
LABEL_17:
if( v9 )
{
v25 = *(struct _DMA_ADAPTER **)(v10 + 8);
if( v25 )
HalPutDmaAdapter(v25);
*(_QWORD *)(v10 + 8) = *(_QWORD *)&v9->Length;
*(_QWORD *)&v9->Length = 0i64;
v26 = v37[2];
if( v26 == 872 || v26 == 260 )
{
if( (unsigned int)CallbackContext > 5 )
{
v33 = &EmptyUnicodeString;
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) )
v33 = *(__int64 **)v10;
v34 = v33[1];
v35 = *(unsigned __int16 *)v33;
v42 = 0;
v45 = 0;
v48 = 0;
v43 = v34;
p_OldContext = &OldContext;
v40 = &v44;
v44 = v35;
v41 = 2;
LODWORD(OldContext) = v18;
v47 = 4;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&CallbackContext,
(unsigned __int8 *)word_1400233B2,
&ActivityId,
0i64,
5u,
v39);
}
}
else
{
v27 = *(__int64 **)v10;
v28 = *(void **)(*(_QWORD *)v10 + 8i64);
if( v28 )
{
ExFreePoolWithTag(v28, 0);
v27 = *(__int64 **)v10;
}
*(UNICODE_STRING *)v27 = v9[1];
*(UNICODE_STRING *)*(_QWORD *)(v10 + 112) = v9[2];
v9[1].Buffer = 0i64;
v9[2].Buffer = 0i64;
}
VrpFreeCallbackContext(v9);
}
return v18;
}Referenced by:
VrpRegistryCallback