SiTranslateSymbolicLink
NTSTATUS __stdcall SiTranslateSymbolicLink(WCHAR *LinkName, WCHAR **ResultName){
NTSTATUS result;
unsigned __int16 v4;
int v5;
wchar_t *Buffer;
_UNICODE_STRING LinkTarget;
_UNICODE_STRING DestinationString;
_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);
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.ObjectName = &DestinationString;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
result = ZwOpenSymbolicLinkObject(&LinkHandle, 1, &ObjectAttributes);
if( result >= 0 )
{
RtlInitUnicodeString(&LinkTarget, 0i64);
v4 = 0;
LODWORD(ReturnedLength) = 0;
do
{
while( 1 )
{
v5 = ZwQuerySymbolicLinkObject(LinkHandle, &LinkTarget, &ReturnedLength);
if( v5 == -1073741789 )
break;
ZwClose((_HANDLE)LinkHandle);
Buffer = LinkTarget.Buffer;
LinkHandle = 0i64;
if( v5 < 0 )
goto LABEL_16;
LinkTarget.Buffer[(unsigned __int64)LinkTarget.Length >> 1] = 0;
ObjectAttributes.ObjectName = &LinkTarget;
LinkTarget.MaximumLength = v4;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwOpenSymbolicLinkObject(&LinkHandle, 1, &ObjectAttributes) < 0 )
{
Buffer = LinkTarget.Buffer;
v5 = 0;
*ResultName = LinkTarget.Buffer;
goto LABEL_7;
}
}
if( LinkTarget.Buffer )
ExFreePoolWithTag(LinkTarget.Buffer, 0);
LinkTarget.MaximumLength = ReturnedLength;
v4 = ReturnedLength + 2;
Buffer = (wchar_t *)ExAllocatePoolWithTag(1ui64, (unsigned int)(ReturnedLength + 2), 1263556947i64);
LinkTarget.Buffer = Buffer;
}
while( Buffer );
v5 = -1073741670;
LABEL_7:
if( LinkHandle )
{
ZwClose((_HANDLE)LinkHandle);
Buffer = LinkTarget.Buffer;
LinkHandle = 0i64;
}
if( v5 < 0 )
{
LABEL_16:
if( Buffer )
ExFreePoolWithTag(Buffer, 0);
}
return v5;
}
return result;
}Referenced by:
SiGetBootDeviceName
SiGetFirmwareSystemPartition
SiGetSystemDisk
SiIsWinPeHardDiskZeroUfdBoot