NtCreateSymbolicLinkObject

NTSTATUS __stdcall NtCreateSymbolicLinkObject(
        PVOID *LinkHandle,
        UINT64 DesiredAccess,
        OBJECT_ATTRIBUTES *ObjectAttributes,
        UNICODE_STRING *LinkTarget){
  unsigned int v6; 
  WCHAR v8; 
  INT8 v9; 
  struct _UNICODE_STRING v10; 
  struct _UNICODE_STRING *v11; 
  unsigned __int16 v12; 
  NTSTATUS SymbolicLink; 
  UINT64 v14; 
  unsigned int v15; 
  __int64 v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned int v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned __int16 v24; 
  wchar_t *v25; 
  wchar_t *v26; 
  __int64 v27; 
  __int16 v28; 
  struct _UNICODE_STRING v29; 
  unsigned int v30; 
  NTSTATUS v31; 
  struct _UNICODE_STRING DestinationString; 
  struct _UNICODE_STRING *ObjectName; 
  INT64 a4; 
  struct _UNICODE_STRING v35; 
  EVENT_DATA_DESCRIPTOR UserData[6]; 
  v6 = DesiredAccess;
  v29 = 0i64;
  DestinationString = 0i64;
  RtlInitUnicodeString(&DestinationString, 0i64, (WCHAR)ObjectAttributes);
  RtlInitUnicodeString(&v29, 0i64, v8);
  v9 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( v9 )
  {
    if( ((unsigned __int8)ObjectAttributes & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    ObjectName = ObjectAttributes->ObjectName;
    if( ObjectName )
    {
      DestinationString = *ObjectName;
      v24 = _mm_cvtsi128_si32((__m128i)DestinationString);
      if( v24 )
      {
        v25 = (wchar_t *)((char *)DestinationString.Buffer + v24);
        if( (unsigned __int64)v25 > 0x7FFFFFFF0000i64 || v25 < DestinationString.Buffer )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
    v29 = *LinkTarget;
    if( v29.MaximumLength )
    {
      v26 = (wchar_t *)((char *)v29.Buffer + v29.MaximumLength);
      if( (unsigned __int64)v26 > 0x7FFFFFFF0000i64 || v26 < v29.Buffer )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    v27 = (__int64)LinkHandle;
    if( (unsigned __int64)LinkHandle >= 0x7FFFFFFF0000i64 )
      v27 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v27 = *(_QWORD *)v27;
    v10 = v29;
  }
  else
  {
    v10 = *LinkTarget;
    v29 = *LinkTarget;
    v11 = ObjectAttributes->ObjectName;
    if( v11 )
      DestinationString = *v11;
  }
  if( (v10.MaximumLength & 1) != 0 )
  {
    v29.MaximumLength = v10.MaximumLength & 0xFFFE;
    v10 = v29;
  }
  if( !v29.MaximumLength )
    return -1073741811;
  v12 = _mm_cvtsi128_si32((__m128i)v10);
  if( v12 > v29.MaximumLength || (_mm_cvtsi128_si32((__m128i)v10) & 1) != 0 )
    return -1073741811;
  a4 = 0i64;
  v35 = v10;
  SymbolicLink = ObCreateSymbolicLink(LinkHandle, v6, (INT64)ObjectAttributes, (INT64)&a4, v9);
  v31 = SymbolicLink;
  v30 = v6;
  v14 = EtwApiCallsProvRegHandle;
  if( EtwApiCallsProvRegHandle )
  {
    v28 = 0;
    v15 = 0;
    if( DestinationString.Buffer )
    {
      UserData[0].Ptr = (unsigned __int64)DestinationString.Buffer;
      UserData[0].Size = DestinationString.Length;
      UserData[0].Reserved = 0;
      v15 = 1;
    }
    v16 = v15;
    UserData[v16].Ptr = (unsigned __int64)&v28;
    *(_QWORD *)&UserData[v16].Size = 2i64;
    v17 = v15 + 1;
    if( v29.Buffer )
    {
      v18 = v17;
      UserData[v18].Ptr = (unsigned __int64)v29.Buffer;
      UserData[v18].Size = v12;
      UserData[v18].Reserved = 0;
      ++v17;
    }
    v19 = v17;
    UserData[v19].Ptr = (unsigned __int64)&v28;
    *(_QWORD *)&UserData[v19].Size = 2i64;
    v20 = v17 + 1;
    v21 = v20;
    UserData[v21].Ptr = (unsigned __int64)&v30;
    *(_QWORD *)&UserData[v21].Size = 4i64;
    v22 = ++v20;
    UserData[v22].Ptr = (unsigned __int64)&v31;
    *(_QWORD *)&UserData[v22].Size = 4i64;
    EtwWrite(v14, (EVENT_DESCRIPTOR *)&KERNEL_AUDIT_API_CREATESYMBOLICLINKOBJECT, 0i64, v20 + 1, UserData);
  }
  return SymbolicLink;
}

Referenced by:

CreateSystemRootLink
IopReassignSystemRoot