EmpParseRuleTerm
NTSTATUS __stdcall EmpParseRuleTerm(
PVOID ParsedInfHandle,
PSTR RuleTerm,
PVOID *Record,
UINT64 **Mapping,
UINT64 *MappingCount){
char *v5;
VOID **v8;
char *v11;
char *v12;
int GuidFromName;
_DWORD *v14;
unsigned int Next;
unsigned int Next_high;
int v17;
unsigned int v18;
VOID **PoolWithTag;
_SINGLE_LIST_ENTRY *v21;
UINT64 ExpectedNumberOfEntries;
_GUID NameGuid;
v5 = RuleTerm + 1;
v8 = 0i64;
NameGuid = 0i64;
strchr((UINT8 *)RuleTerm + 1, 0x28u);
v12 = v11;
if( !v11 )
return -1073741811;
*v11 = 0;
if( *RuleTerm == 63 )
{
GuidFromName = EmpInfParseGetGuidFromName(ParsedInfHandle, (PSTR)"CallbackGuidDef", v5, &NameGuid);
if( GuidFromName < 0 )
return GuidFromName;
v21 = EmpSearchCallbackDatabase(&NameGuid);
if( v21 )
{
*Record = v21;
Next = (unsigned int)v21[7].Next;
Next_high = HIDWORD(v21[7].Next);
v17 = (int)v21[8].Next;
goto LABEL_6;
}
return -1073741275;
}
GuidFromName = EmpInfParseGetGuidFromName(ParsedInfHandle, (PSTR)"RuleNameGuidDef", v5, &NameGuid);
if( GuidFromName < 0 )
return GuidFromName;
EmpSearchRuleDatabase();
if( !v14 )
return -1073741275;
*Record = v14;
Next = v14[10];
Next_high = v14[11];
v17 = v14[12];
LABEL_6:
*v12 = 40;
v18 = v17 + Next + Next_high;
if( v18 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 4i64 * v18, 1953713477i64);
v8 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
LODWORD(ExpectedNumberOfEntries) = v17;
if( !EmpParseRuleTermArgMapping(v12, (UINT64 *)PoolWithTag, Next, Next_high, ExpectedNumberOfEntries) )
{
GuidFromName = -1073741811;
ExFreePoolWithTag(v8, 0x74734D45u);
return GuidFromName;
}
}
*Mapping = (UINT64 *)v8;
*(_DWORD *)MappingCount = v18;
return GuidFromName;
}Referenced by:
EmpParseRuleExpression