AdtpBuildPrivilegeAuditString
INT64 __fastcall AdtpBuildPrivilegeAuditString(
_PRIVILEGE_SET *PrivilegeSet,
_UNICODE_STRING *pResultantString,
_EVENT_DATA_DESCRIPTOR *pEtwDataDescriptor,
WCHAR *pszStringBuffer,
UINT64 *pdwCurBufferIndex,
UINT8 *pFreeWhenDone){
unsigned int PrivilegeCount;
unsigned int v7;
_UNICODE_STRING *v10;
WCHAR v13;
unsigned __int16 v14;
__int64 v15;
unsigned int v16;
WCHAR *PoolWithTag;
UINT8 *v18;
UINT64 Length;
wchar_t *Buffer;
unsigned int v21;
__int64 v22;
unsigned __int16 v23;
struct _UNICODE_STRING DestinationString;
_UNICODE_STRING v25;
UNICODE_STRING Name;
struct _UNICODE_STRING v27;
PrivilegeCount = PrivilegeSet->PrivilegeCount;
v7 = 0;
*(_DWORD *)(&v25.MaximumLength + 1) = 0;
v10 = pResultantString;
DestinationString = 0i64;
v27 = 0i64;
Name = 0i64;
if( PrivilegeCount )
{
if( PrivilegeCount - 1 > 0x41 )
return 3221225485i64;
RtlInitUnicodeString(&DestinationString, L"\r\n\t\t\t", (WCHAR)pEtwDataDescriptor);
RtlInitUnicodeString(&v27, L"?", v13);
v14 = (unsigned __int16)(LOWORD(PrivilegeSet->PrivilegeCount)
* (DestinationString.Length + AdtpWellKnownPrivilegeMaxLen)
- DestinationString.Length
+ 2) >> 1;
if( pszStringBuffer && (v15 = *(unsigned int *)pdwCurBufferIndex, v16 = v15 + v14, v16 < 0x400) )
{
PoolWithTag = &pszStringBuffer[v15];
*(_DWORD *)pdwCurBufferIndex = v16;
}
else
{
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2i64 * v14, 0x6B416553ui64);
if( !PoolWithTag )
return 3221225495i64;
*pFreeWhenDone = 1;
}
v25.Buffer = PoolWithTag;
v25.MaximumLength = 2 * v14;
v18 = (UINT8 *)PoolWithTag;
if( PrivilegeSet->PrivilegeCount )
{
do
{
if( AdtpLookupKnownPrivilegeNameQuickly(
(LUID *)((char *)&PrivilegeSet->Privilege[0].Luid + 8 * v7 + 4 * v7),
&Name) )
{
Length = v27.Length;
Buffer = v27.Buffer;
}
else
{
Length = Name.Length;
Buffer = Name.Buffer;
}
memmove(v18, (UINT8 *)Buffer, Length);
v21 = PrivilegeSet->PrivilegeCount;
v18 += Length;
if( v7 < PrivilegeSet->PrivilegeCount - 1 )
{
v22 = DestinationString.Length;
memmove(v18, (UINT8 *)DestinationString.Buffer, DestinationString.Length);
v21 = PrivilegeSet->PrivilegeCount;
v18 += v22;
}
++v7;
}
while( v7 < v21 );
v10 = pResultantString;
}
*(_WORD *)v18 = 0;
v23 = (_WORD)v18 - (_WORD)PoolWithTag;
v25.Length = v23;
if( pEtwDataDescriptor )
{
pEtwDataDescriptor->Ptr = (unsigned __int64)PoolWithTag;
*(_QWORD *)&pEtwDataDescriptor->Size = (unsigned int)v23 + 2;
}
else
{
*v10 = v25;
}
}
else if( pEtwDataDescriptor )
{
*(_QWORD *)&pEtwDataDescriptor->Size = 4i64;
pEtwDataDescriptor->Ptr = (unsigned __int64)"-";
}
else if( pResultantString )
{
RtlInitUnicodeString(pResultantString, L"-", 0);
}
return 0i64;
}Referenced by:
AdtpBuildAccessReasonAuditStringInternal
AdtpPackageParameters