IopSymlinkCreateECP

NTSTATUS __stdcall IopSymlinkCreateECP(
        _IRP *Irp,
        _FILE_OBJECT *CurrentFileObject,
        _UNICODE_STRING *FileName,
        UINT16 DeviceNameLength,
        _RELATIVE_SYMLINK_INFO **Extension){
  unsigned int Length; 
  char v9; 
  unsigned __int16 v10; 
  _FILE_OBJECT *RelatedFileObject; 
  _RELATIVE_SYMLINK_INFO **v12; 
  unsigned __int16 v13; 
  NTSTATUS result; 
  _RELATIVE_SYMLINK_INFO *v15; 
  WCHAR **FileObjectExtension; 
  WCHAR **v17; 
  int v18; 
  unsigned int v19; 
  UINT64 v20; 
  UINT16 DeviceNameLengtha; 
  _RELATIVE_SYMLINK_INFO *SymlinkInfo; 

  Length = FileName->Length;
  SymlinkInfo = 0i64;
  v9 = 0;
  v10 = Length;
  if( Length > 2 && FileName->Buffer[((unsigned __int64)Length >> 1) - 1] == 92 )
  {
    v10 = Length - 2;
    v9 = 1;
    FileName->Length = Length - 2;
  }
  RelatedFileObject = CurrentFileObject->RelatedFileObject;
  v12 = Extension;
  if( !RelatedFileObject )
  {
    v13 = v10;
LABEL_6:
    result = IopSymlinkAllocateAndAddECP(Irp, &SymlinkInfo, v13);
    if( result < 0 )
      goto LABEL_9;
    DeviceNameLengtha = DeviceNameLength;
    v15 = SymlinkInfo;
    IopSymlinkInitializeSymlinkInfo(
      SymlinkInfo,
      (unsigned int)FileName->Length + 32,
      FileName->Buffer,
      FileName->Length,
      0,
      0i64,
      0,
      DeviceNameLengtha,
      0,
      0i64);
    goto LABEL_8;
  }
  FileObjectExtension = (WCHAR **)IopGetFileObjectExtension(RelatedFileObject, FoExtTypeSymlink, 0i64);
  v17 = FileObjectExtension;
  if( !FileObjectExtension )
  {
    v13 = FileName->Length;
    goto LABEL_6;
  }
  v18 = FileName->Length + 2;
  v19 = v18 + *((unsigned __int16 *)FileObjectExtension + 8);
  if( v19 < 0xFFFF )
  {
    result = IopSymlinkAllocateAndAddECP(Irp, &SymlinkInfo, v18 + *((_WORD *)FileObjectExtension + 8));
    if( result >= 0 )
    {
      v20 = v19 + 32;
      v15 = SymlinkInfo;
      IopSymlinkInitializeSymlinkInfo(
        SymlinkInfo,
        v20,
        FileName->Buffer,
        FileName->Length,
        0,
        v17[3],
        *((_WORD *)v17 + 8),
        *((_WORD *)v17 + 2),
        *((_WORD *)v17 + 1),
        0i64);
      v15->ExposedNamespaceLength = *(_WORD *)v17 + v15->OpenedName.Length - *((_WORD *)v17 + 8);
LABEL_8:
      *v12 = v15;
      result = 0;
    }
  }
  else
  {
    result = -1073741562;
  }
LABEL_9:
  if( v9 )
    FileName->Length += 2;
  if( result < 0 )
    *v12 = 0i64;
  return result;
}

Referenced by:

IopParseDevice