IoIsValidNameGraftingBuffer
INT8 __fastcall IoIsValidNameGraftingBuffer(INT64 a1, UINT16 *a2){
__int64 v2;
unsigned int v4;
UINT16 v5;
UINT16 v6;
VOID **PoolWithTag;
VOID **v8;
NTSTATUS v10;
UINT16 v11;
UINT16 v12;
UINT16 v13;
VOID *LinkHandle;
_UNICODE_STRING LinkTarget;
_UNICODE_STRING DestinationString;
_OBJECT_ATTRIBUTES ObjectAttributes;
WCHAR SourceString[8];
v2 = *(_QWORD *)(a1 + 184);
DestinationString = 0i64;
v4 = *(_DWORD *)(v2 + 8);
if( v4 && v4 < a2[5] + (unsigned int)a2[7] + 20 )
return 0;
v5 = a2[5];
if( v5 > 6u && a2[8] == 92 && a2[9] == 92 )
{
v6 = a2[10];
if( v6 != 46 && v6 != 63 )
return 0;
}
if( v5 > 0x10u
&& a2[8] == 92
&& a2[9] == 63
&& a2[10] == 63
&& a2[11] == 92
&& a2[12] == 85
&& a2[13] == 78
&& a2[14] == 67
&& a2[15] == 92 )
{
return 0;
}
if( v5 > 0xCu && a2[8] == 92 && a2[9] == 63 && a2[10] == 63 && a2[11] == 92 && a2[13] == 58 )
{
*(_DWORD *)(&LinkTarget.MaximumLength + 1) = 0;
*(&ObjectAttributes.Length + 1) = 0;
*(_OWORD *)SourceString = *(_OWORD *)L"\\??\\C:";
*(&ObjectAttributes.Attributes + 1) = 0;
LinkHandle = 0i64;
RtlInitUnicodeString(&DestinationString, SourceString);
DestinationString.Buffer[4] = a2[12];
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwOpenSymbolicLinkObject(&LinkHandle, 1, &ObjectAttributes) >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x208ui64, 538996553i64);
v8 = PoolWithTag;
if( !PoolWithTag )
{
ZwClose((_HANDLE)LinkHandle);
return 0;
}
LinkTarget.Buffer = (wchar_t *)PoolWithTag;
*(_DWORD *)&LinkTarget.Length = 34078720;
v10 = ZwQuerySymbolicLinkObject(LinkHandle, &LinkTarget, 0i64);
ZwClose((_HANDLE)LinkHandle);
if( v10 >= 0
&& *LinkTarget.Buffer == 92
&& LinkTarget.Buffer[1] == 68
&& LinkTarget.Buffer[2] == 101
&& LinkTarget.Buffer[3] == 118
&& LinkTarget.Buffer[4] == 105
&& LinkTarget.Buffer[5] == 99
&& LinkTarget.Buffer[6] == 101
&& LinkTarget.Buffer[7] == 92
&& LinkTarget.Buffer[8] == 76
&& LinkTarget.Buffer[9] == 97
&& LinkTarget.Buffer[10] == 110
&& LinkTarget.Buffer[14] == 82
&& LinkTarget.Buffer[15] == 101
&& LinkTarget.Buffer[16] == 100
&& LinkTarget.Buffer[17] == 105
&& LinkTarget.Buffer[18] == 114
&& LinkTarget.Buffer[23] == 114
&& LinkTarget.Buffer[24] == 92 )
{
ExFreePoolWithTag(v8, 0);
return 0;
}
ExFreePoolWithTag(v8, 0);
}
}
v11 = a2[5];
if( v11 < 0xCu )
return 0;
v12 = a2[8];
if( v12 != 92 || a2[9] != 63 || a2[10] != 63 || a2[11] != 92 || a2[13] != 58 )
{
if( v11 != 96 && (v11 != 98 || a2[56] != 92) )
return 0;
if( v12 != 92 )
return 0;
v13 = a2[9];
if( v13 != 63 && v13 != 92 )
return 0;
if( a2[10] != 63
|| a2[11] != 92
|| a2[12] != 86
|| a2[13] != 111
|| a2[14] != 108
|| a2[15] != 117
|| a2[16] != 109
|| a2[17] != 101
|| a2[18] != 123
|| a2[27] != 45
|| a2[32] != 45
|| a2[37] != 45
|| a2[42] != 45
|| a2[55] != 125 )
{
return 0;
}
}
return 1;
}Referenced by:
No references.