NtCreateSymbolicLinkObject
NTSTATUS __stdcall NtCreateSymbolicLinkObject(
VOID **LinkHandle,
_ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
_UNICODE_STRING *LinkTarget){
char PreviousMode;
_UNICODE_STRING v9;
_UNICODE_STRING *v10;
unsigned __int16 v11;
int SymbolicLink;
REGHANDLE v13;
unsigned int v14;
__int64 v15;
unsigned int v16;
__int64 v17;
__int64 v18;
unsigned int v19;
__int64 v20;
__int64 v21;
unsigned __int16 v23;
wchar_t *v24;
wchar_t *v25;
__int64 v26;
__int16 v27;
_UNICODE_STRING v28;
_ACCESS_MASK v29;
int v30;
_UNICODE_STRING DestinationString;
_UNICODE_STRING *ObjectName;
__int64 v33;
_UNICODE_STRING v34;
_EVENT_DATA_DESCRIPTOR UserData[6];
v28 = 0i64;
DestinationString = 0i64;
RtlInitUnicodeString(&DestinationString, 0i64);
RtlInitUnicodeString(&v28, 0i64);
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
if( ((unsigned __int8)ObjectAttributes & 3) != 0 )
ExRaiseDatatypeMisalignment();
ObjectName = ObjectAttributes->ObjectName;
if( ObjectName )
{
DestinationString = *ObjectName;
v23 = _mm_cvtsi128_si32((__m128i)DestinationString);
if( v23 )
{
v24 = (wchar_t *)((char *)DestinationString.Buffer + v23);
if( (unsigned __int64)v24 > 0x7FFFFFFF0000i64 || v24 < DestinationString.Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
v28 = *LinkTarget;
if( v28.MaximumLength )
{
v25 = (wchar_t *)((char *)v28.Buffer + v28.MaximumLength);
if( (unsigned __int64)v25 > 0x7FFFFFFF0000i64 || v25 < v28.Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
}
v26 = (__int64)LinkHandle;
if( (unsigned __int64)LinkHandle >= 0x7FFFFFFF0000i64 )
v26 = 0x7FFFFFFF0000i64;
*(_QWORD *)v26 = *(_QWORD *)v26;
v9 = v28;
}
else
{
v9 = *LinkTarget;
v28 = *LinkTarget;
v10 = ObjectAttributes->ObjectName;
if( v10 )
DestinationString = *v10;
}
if( (v9.MaximumLength & 1) != 0 )
{
v28.MaximumLength = v9.MaximumLength & 0xFFFE;
v9 = v28;
}
if( !v28.MaximumLength )
return -1073741811;
v11 = _mm_cvtsi128_si32((__m128i)v9);
if( v11 > v28.MaximumLength || (_mm_cvtsi128_si32((__m128i)v9) & 1) != 0 )
return -1073741811;
v33 = 0i64;
v34 = v9;
SymbolicLink = ObCreateSymbolicLink(
(_XSTATE_CONFIGURATION *)LinkHandle,
(unsigned int)DesiredAccess,
(EVT_WDFCX_DEVICE_PRE_SELF_MANAGED_IO_SUSPEND *)ObjectAttributes,
(_XSTATE_CONFIGURATION *)&v33,
PreviousMode);
v30 = SymbolicLink;
v29 = DesiredAccess;
v13 = *(&ExBootDevicesRemovedEvent + 379);
if( *(&ExBootDevicesRemovedEvent + 379) )
{
v27 = 0;
v14 = 0;
if( DestinationString.Buffer )
{
UserData[0].Ptr = (unsigned __int64)DestinationString.Buffer;
UserData[0].Size = DestinationString.Length;
UserData[0].Reserved = 0;
v14 = 1;
}
v15 = v14;
UserData[v15].Ptr = (unsigned __int64)&v27;
*(_QWORD *)&UserData[v15].Size = 2i64;
v16 = v14 + 1;
if( v28.Buffer )
{
v17 = v16;
UserData[v17].Ptr = (unsigned __int64)v28.Buffer;
UserData[v17].Size = v11;
UserData[v17].Reserved = 0;
++v16;
}
v18 = v16;
UserData[v18].Ptr = (unsigned __int64)&v27;
*(_QWORD *)&UserData[v18].Size = 2i64;
v19 = v16 + 1;
v20 = v19;
UserData[v20].Ptr = (unsigned __int64)&v29;
*(_QWORD *)&UserData[v20].Size = 4i64;
v21 = ++v19;
UserData[v21].Ptr = (unsigned __int64)&v30;
*(_QWORD *)&UserData[v21].Size = 4i64;
EtwWrite(v13, &KERNEL_AUDIT_API_CREATESYMBOLICLINKOBJECT, 0, v19 + 1, UserData);
}
return SymbolicLink;
}Referenced by:
CreateSystemRootLink
IopReassignSystemRoot