BiTranslateSymbolicLink
INT64 __stdcall BiTranslateSymbolicLink(WCHAR *LinkName, WCHAR **ResultName){
WCHAR v2;
INT64 result;
WCHAR v5;
unsigned __int16 v6;
NTSTATUS v7;
wchar_t *PoolWithTag;
struct _UNICODE_STRING LinkTarget;
struct _UNICODE_STRING DestinationString;
struct _OBJECT_ATTRIBUTES ObjectAttributes;
UINT64 ReturnedLength;
void *LinkHandle;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
*(_QWORD *)&LinkTarget.Length = 0i64;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
LinkHandle = 0i64;
LinkTarget.Buffer = 0i64;
DestinationString = 0i64;
RtlInitUnicodeString(&DestinationString, LinkName, v2);
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.ObjectName = &DestinationString;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
LODWORD(result) = ZwOpenSymbolicLinkObject(&LinkHandle, 1ui64, &ObjectAttributes);
if( (int)result >= 0 )
{
RtlInitUnicodeString(&LinkTarget, 0i64, v5);
v6 = 0;
LODWORD(ReturnedLength) = 0;
do
{
while( 1 )
{
v7 = ZwQuerySymbolicLinkObject(LinkHandle, &LinkTarget, &ReturnedLength);
if( v7 != -1073741789 )
break;
if( LinkTarget.Buffer )
ExFreePoolWithTag(LinkTarget.Buffer, 0x4B444342u);
LinkTarget.MaximumLength = ReturnedLength;
v6 = ReturnedLength + 2;
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, (unsigned int)(ReturnedLength + 2), 0x4B444342ui64);
LinkTarget.Buffer = PoolWithTag;
if( !PoolWithTag )
{
v7 = -1073741670;
goto LABEL_11;
}
}
ZwClose(LinkHandle);
PoolWithTag = LinkTarget.Buffer;
LinkHandle = 0i64;
if( v7 < 0 )
goto LABEL_16;
LinkTarget.Buffer[(unsigned __int64)LinkTarget.Length >> 1] = 0;
ObjectAttributes.ObjectName = &LinkTarget;
LinkTarget.MaximumLength = v6;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
}
while( ZwOpenSymbolicLinkObject(&LinkHandle, 1ui64, &ObjectAttributes) >= 0 );
PoolWithTag = LinkTarget.Buffer;
v7 = 0;
*ResultName = LinkTarget.Buffer;
LABEL_11:
if( LinkHandle )
{
ZwClose(LinkHandle);
PoolWithTag = LinkTarget.Buffer;
LinkHandle = 0i64;
}
if( v7 < 0 )
{
LABEL_16:
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x4B444342u);
}
return(unsigned int)v7;
}
return result;
}Referenced by:
BiGetNtPartitionPath
BiTranslateSymbolicLinkFile