CmpNameFromAttributes
NTSTATUS __stdcall CmpNameFromAttributes(OBJECT_ATTRIBUTES *Attributes, INT8 PreviousMode, UNICODE_STRING *FullName){
NTSTATUS v4;
unsigned __int16 v5;
wchar_t *PoolWithQuotaTag;
NTSTATUS result;
int v8;
__m128i v9;
unsigned int v10;
wchar_t *v11;
__int64 Length;
wchar_t *Buffer;
UINT64 ReturnLength;
void *Src[2];
UNICODE_STRING *v16;
UNICODE_STRING Source;
OBJECT_ATTRIBUTES Handle;
UNICODE_STRING ObjectInformation;
v16 = FullName;
Source = 0i64;
v4 = 0;
ReturnLength = 0i64;
FullName->Buffer = 0i64;
if( PreviousMode == 1 && ((unsigned __int8)Attributes & 3) != 0 )
ExRaiseDatatypeMisalignment();
Handle = *Attributes;
*(_UNICODE_STRING *)Src = *Handle.ObjectName;
if( PreviousMode == 1 )
{
v5 = (unsigned __int16)Src[0];
if( LOWORD(Src[0]) )
{
if( ((__int64)Src[1] & 1) != 0 )
ExRaiseDatatypeMisalignment();
if( (char *)Src[1] + LOWORD(Src[0]) > (void *)0x7FFFFFFF0000i64 || (char *)Src[1] + LOWORD(Src[0]) < Src[1] )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
v5 = (unsigned __int16)Src[0];
}
if( (v5 & 1) != 0 )
return -1073741765;
if( !Handle.RootDirectory )
{
if( !v5 )
return -1073741765;
FullName->Length = v5;
FullName->MaximumLength = v5;
PoolWithQuotaTag = (wchar_t *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v5, 0x6E664D43ui64);
FullName->Buffer = PoolWithQuotaTag;
if( !PoolWithQuotaTag )
return -1073741670;
memmove((UINT8 *)PoolWithQuotaTag, (UINT8 *)Src[1], v5);
return v4;
}
if( SLODWORD(Handle.RootDirectory) < 0 && PreviousMode == 1 )
return -1073741816;
if( Src[1] && v5 >= 2u && *(_WORD *)Src[1] == 92 )
return -1073741765;
result = IoConvertFileHandleToKernelHandle(Handle.RootDirectory, PreviousMode, 0x20ui64, 1u, &Handle.RootDirectory);
if( result >= 0 )
{
v8 = ZwQueryObject(Handle.RootDirectory, ObjectNameInformation, &ObjectInformation, 0x200ui64, &ReturnLength);
ZwClose(Handle.RootDirectory);
if( v8 < 0 )
return v8;
v9 = (__m128i)ObjectInformation;
Source = ObjectInformation;
FullName->Length = 0;
v10 = (unsigned __int16)_mm_cvtsi128_si32(v9) + 2 + v5;
HIDWORD(ReturnLength) = v10;
if( v10 > 0xFFFF )
return -1073741767;
FullName->MaximumLength = v10;
v11 = (wchar_t *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, (unsigned __int16)v10, 0x6E664D43ui64);
FullName->Buffer = v11;
if( !v11 )
return -1073741670;
RtlAppendUnicodeStringToString(FullName, &Source);
Length = FullName->Length;
if( (_WORD)Length )
{
Buffer = FullName->Buffer;
if( *(wchar_t *)((char *)Buffer + Length - 2) != 92 )
{
*(wchar_t *)((char *)Buffer + Length) = 92;
FullName->Length += 2;
}
}
return RtlAppendUnicodeStringToString(FullName, (UNICODE_STRING *)Src);
}
return result;
}Referenced by:
CmLoadDifferencingKey
NtReplaceKey