ObpCaptureObjectName
NTSTATUS __stdcall ObpCaptureObjectName(
INT8 ProbeMode,
UNICODE_STRING *ObjectName,
UNICODE_STRING *CapturedObjectName,
UINT64 UseLookaside){
wchar_t *Buffer;
unsigned __int64 v6;
unsigned __int16 Length;
unsigned int v8;
struct _KPRCB *CurrentPrcb;
__int64 v10;
wchar_t *PoolWithTag;
__int64 v12;
NTSTATUS v14;
UNICODE_STRING Src;
CapturedObjectName->Buffer = 0i64;
*(_DWORD *)&CapturedObjectName->Length = 0;
v14 = 0;
if( ProbeMode && *((_BYTE *)KeGetCurrentThread() + 562) )
{
if( (unsigned __int64)ObjectName >= 0x7FFFFFFF0000i64 )
ObjectName = (UNICODE_STRING *)0x7FFFFFFF0000i64;
*(_DWORD *)&Src.Length = *(_DWORD *)&ObjectName->Length;
Buffer = ObjectName->Buffer;
Src.Buffer = Buffer;
if( (unsigned __int16)*(_DWORD *)&ObjectName->Length )
{
if( ((unsigned __int8)Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v6 = (unsigned __int64)Buffer + (unsigned __int16)*(_DWORD *)&ObjectName->Length;
if( v6 > 0x7FFFFFFF0000i64 || v6 < (unsigned __int64)Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
Src = *ObjectName;
}
if( Src.Length )
{
Length = Src.Length;
if( (Src.Length & 1) != 0 || Src.Length == 65534 )
{
return -1073741773;
}
else
{
if( (unsigned int)Src.Length + 2 < Src.Length )
return -1073741670;
v8 = Src.Length + 2;
if( (_DWORD)UseLookaside && v8 <= 0xF8 )
{
LOWORD(v8) = 248;
CurrentPrcb = KeGetCurrentPrcb();
v10 = *((_QWORD *)CurrentPrcb + 266);
++*(_DWORD *)(v10 + 20);
PoolWithTag = (wchar_t *)RtlpInterlockedPopEntrySList((PSLIST_HEADER)v10);
if( !PoolWithTag )
{
++*(_DWORD *)(v10 + 24);
v12 = *((_QWORD *)CurrentPrcb + 267);
++*(_DWORD *)(v12 + 20);
PoolWithTag = (wchar_t *)RtlpInterlockedPopEntrySList((PSLIST_HEADER)v12);
if( !PoolWithTag )
{
++*(_DWORD *)(v12 + 24);
PoolWithTag = (wchar_t *)(*(__int64(__fastcall **)(_QWORD, _QWORD, _QWORD))(v12 + 48))(
*(unsigned int *)(v12 + 36),
*(unsigned int *)(v12 + 44),
*(unsigned int *)(v12 + 40));
}
}
if( PoolWithTag )
*(_DWORD *)PoolWithTag = *((_DWORD *)CurrentPrcb + 9);
Length = Src.Length;
}
else
{
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, v8, 0x6D4E624Fui64);
}
CapturedObjectName->Length = Length;
CapturedObjectName->MaximumLength = v8;
CapturedObjectName->Buffer = PoolWithTag;
if( PoolWithTag )
{
memmove((UINT8 *)PoolWithTag, (UINT8 *)Src.Buffer, Src.Length);
PoolWithTag[(unsigned __int64)Src.Length >> 1] = 0;
}
else
{
return -1073741670;
}
}
}
return v14;
}Referenced by:
ObReferenceObjectByName
ObpCaptureObjectCreateInformation