PfCalculateProcessHash
NTSTATUS __stdcall PfCalculateProcessHash(_EPROCESS *Process, _UNICODE_STRING **FullImageName){
_QWORD *v2;
int v4;
NTSTATUS AllocatedFullProcessImageName;
_UNICODE_STRING *v6;
int v7;
__int64 Length;
__int64 v9;
unsigned __int8 *Buffer;
unsigned __int64 v11;
__int64 v12;
__int64 v13;
int v15;
int v16;
int v17;
int v18;
int v19;
int v20;
_UNICODE_STRING *DestinationString;
v2 = (_QWORD *)((unsigned __int64)FullImageName & 0xFFFFFFFFFFFFFFFEui64);
DestinationString = 0i64;
v4 = (unsigned __int8)FullImageName & 1;
if( ((unsigned __int8)FullImageName & 1) == 0 )
v2 = FullImageName;
if( !Process->SectionObject )
{
v7 = -1073741275;
return v2 != 0i64 ? v7 : 0;
}
AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageName(Process, &DestinationString);
v6 = DestinationString;
v7 = AllocatedFullProcessImageName;
if( AllocatedFullProcessImageName >= 0 )
{
if( DestinationString->Length )
{
RtlUpcaseUnicodeString(DestinationString, DestinationString, 0);
if( Process->ImagePathHash )
{
LABEL_18:
if( v4 )
PfpLogApplicationEvent(Process, v6, 0);
if( v2 )
{
*v2 = v6;
v6 = 0i64;
}
v7 = 0;
goto LABEL_23;
}
Length = v6->Length;
v9 = 314159i64;
Buffer = (unsigned __int8 *)v6->Buffer;
if( (unsigned __int64)Length >= 8 )
{
v11 = (unsigned __int64)v6->Length >> 3;
Length = v6->Length - 8 * v11;
do
{
v12 = Buffer[7];
v13 = 37
* (Buffer[6]
+ 37
* (Buffer[5]
+ 37 * (Buffer[4] + 37 * (Buffer[3] + 37 * (Buffer[2] + 37 * (Buffer[1] + 37 * (*Buffer + 37 * v9)))))));
Buffer += 8;
v9 = v12 + v13;
--v11;
}
while( v11 );
}
if( Length >= 1 && Length <= 7 )
{
v15 = Length - 1;
if( v15 )
{
v16 = v15 - 1;
if( v16 )
{
v17 = v16 - 1;
if( v17 )
{
v18 = v17 - 1;
if( v18 )
{
v19 = v18 - 1;
if( v19 )
{
v20 = v19 - 1;
if( v20 )
{
if( v20 != 1 )
goto LABEL_15;
LODWORD(v9) = *Buffer++ + 37 * v9;
}
LODWORD(v9) = *Buffer++ + 37 * v9;
}
LODWORD(v9) = *Buffer++ + 37 * v9;
}
LODWORD(v9) = *Buffer++ + 37 * v9;
}
LODWORD(v9) = *Buffer++ + 37 * v9;
}
LODWORD(v9) = *Buffer++ + 37 * v9;
}
LODWORD(v9) = *Buffer + 37 * v9;
}
LABEL_15:
if( (unsigned int)v9 <= 1 )
LODWORD(v9) = 1;
Process->ImagePathHash = v9;
goto LABEL_18;
}
v7 = -1073741198;
}
LABEL_23:
if( v6 )
ExFreePoolWithTag(v6, 0);
return v2 != 0i64 ? v7 : 0;
}Referenced by:
PfProcessCreateNotification
PfSnBeginAppLaunch
PfSnOperationProcess