Skip to content

gotopkg/mslnk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mslnk

Create Microsoft .LNK files with Go

mslnk is a Golang module (with CLI) implementing Microsoft's Shell Link Binary File Format (MS-SHLLINK) without external dependencies

Introduction

Sometimes you may need to link somewhere with a shortcut file which contains additional details and can be moved around freely. That's the purpose of shell link files on Window$. They are something like XDG Desktop Entries (*.desktop files), but obfuscated in a binary file format and documented in a worse manner.

This project's goal is to make the creation of those files painless by bringing you simple command line tools and exposing an easy-to-understand library API for your Go programs. Creating a list of relevant resources would also be a desirable side effect.

Usage

command line

createlnk
$ ./createlnk 
usage:	createlnk [target] [name]

	target:	path to link target
	name:	path to output file

programming

import "github.com/gotopkg/mslnk/pkg/mslnk"

func main() {
	mslnk.LinkFile("C:\\path-to\\a-file.txt", "mylink.lnk")
}

Despite what the function name might suggest, linking to a folder that way should work too. Basic functions reside in pkg/mslnk/mslnk.go If you are familiar with the format specification, you can manipulate exposed structures directly.

Installation

It's as simple as go get and go build. All you need is a Go compiler!

$ go get -u github.com/gotopkg/mslnk
$ go build github.com/gotopkg/mslnk/cmd/createlnk

Implementation

mslnk is not yet a full implementation, but it already gets the job done.

Resources

Specification

Implementation is based on microsoft's specification, revision 5.0. To be precise, I was using this pdf during development.

Libraries

Go

Some structs were copied from github.com/parsiya/golnk with slight modifications. I wanted to fork it at first, but the code was of no use for me, so I wrote the rest from scratch. It is a nice project if you want to parse and read .lnk files instead of writing them.

Java

The other useful project is Dmitrii Shamrikov's mslinks Java library. I used it as a reference for the implementation of the undocumented ItemID Data field.

Python

I am also aware of the pylnk project for Python, but have not looked into it.

C, bash

There are some scripts, which do what our createlnk does, but in a hacky way. Most notably: https://www.mamachine.org/mslink/index.en.html

Contribute

Resources

If you know of any additional documents I might have overlooked, or resources which might be helpful, please let me know. You are welcome to list it on this page.

Releases

No releases published

Packages

No packages published

Languages