diff --git a/README.md b/README.md
index 5c93804..07071cd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
 GoModules
 ===============
 
-Golang modules dumping ground
\ No newline at end of file
+Golang modules dumping ground
+
+**<u>WindowsShortcutFull</u>**
+
+view, modify and create windows shortcut files (.lnk)
\ No newline at end of file

diff --git a/README.md b/README.md
index 5c93804..07071cd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
 GoModules
 ===============
 
-Golang modules dumping ground
\ No newline at end of file
+Golang modules dumping ground
+
+**<u>WindowsShortcutFull</u>**
+
+view, modify and create windows shortcut files (.lnk)
\ No newline at end of file
diff --git a/WindowsShortcutFull-Example.go b/WindowsShortcutFull-Example.go
new file mode 100644
index 0000000..39971fb
--- /dev/null
+++ b/WindowsShortcutFull-Example.go
@@ -0,0 +1,42 @@
+package main
+
+import (
+	"fmt"
+
+	shortcut "GoModules/Modules/WindowsShortcutFull"
+)
+
+func main() {
+
+	/***
+	 * read shortcut data
+	 */
+	Description, workingDir, targetPath, Arguments, Icon, err := shortcut.Read("C:\\Users\\User\\Desktop\\vlc.lnk")
+	if err != nil {
+		print(err)
+		return false
+	}
+	fmt.Printf("[info][Shortcut] %s\n", dstsct)
+	fmt.Printf("[info][Description] %s\n", Description)
+	fmt.Printf("[info][Working Dir] %s\n", workingDir)
+	fmt.Printf("[info][Target] %s\n", targetPath)
+	fmt.Printf("[info][Arguments] %s\n", Arguments)
+	fmt.Printf("[info][Icon] %s\n", Icon)
+
+	/***
+	 * create new OR update existing shortcut
+	 */
+	newTarget := "C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"
+	newArgs := "--fullscreen"
+	newDescription := "VLC Media Player"
+	newWorkingDir := "C:\\"
+	newIcon := "C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"
+
+	err = shortcut.Make("C:\\Users\\User\\Desktop\\vlc.lnk", newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+	if err != nil {
+		print(err)
+		return false
+	}
+
+}
+

diff --git a/README.md b/README.md
index 5c93804..07071cd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
 GoModules
 ===============
 
-Golang modules dumping ground
\ No newline at end of file
+Golang modules dumping ground
+
+**<u>WindowsShortcutFull</u>**
+
+view, modify and create windows shortcut files (.lnk)
\ No newline at end of file
diff --git a/WindowsShortcutFull-Example.go b/WindowsShortcutFull-Example.go
new file mode 100644
index 0000000..39971fb
--- /dev/null
+++ b/WindowsShortcutFull-Example.go
@@ -0,0 +1,42 @@
+package main
+
+import (
+	"fmt"
+
+	shortcut "GoModules/Modules/WindowsShortcutFull"
+)
+
+func main() {
+
+	/***
+	 * read shortcut data
+	 */
+	Description, workingDir, targetPath, Arguments, Icon, err := shortcut.Read("C:\\Users\\User\\Desktop\\vlc.lnk")
+	if err != nil {
+		print(err)
+		return false
+	}
+	fmt.Printf("[info][Shortcut] %s\n", dstsct)
+	fmt.Printf("[info][Description] %s\n", Description)
+	fmt.Printf("[info][Working Dir] %s\n", workingDir)
+	fmt.Printf("[info][Target] %s\n", targetPath)
+	fmt.Printf("[info][Arguments] %s\n", Arguments)
+	fmt.Printf("[info][Icon] %s\n", Icon)
+
+	/***
+	 * create new OR update existing shortcut
+	 */
+	newTarget := "C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"
+	newArgs := "--fullscreen"
+	newDescription := "VLC Media Player"
+	newWorkingDir := "C:\\"
+	newIcon := "C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"
+
+	err = shortcut.Make("C:\\Users\\User\\Desktop\\vlc.lnk", newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+	if err != nil {
+		print(err)
+		return false
+	}
+
+}
+
diff --git a/WindowsShortcutFull/WindowsShortcutFull.go b/WindowsShortcutFull/WindowsShortcutFull.go
new file mode 100644
index 0000000..7eaab8a
--- /dev/null
+++ b/WindowsShortcutFull/WindowsShortcutFull.go
@@ -0,0 +1,187 @@
+/***
+ * Module to manipulate windows .lnk files
+ * modified from: https://github.com/nyaosorg/go-windows-shortcut
+ * Typical usage:
+
+ //import
+ 	shortcut "InfectShortcuts/Modules/WindowsShortcutFull"
+
+ //main
+	// read shortcut data
+	Description, workingDir, targetPath, Arguments, Icon, err := shortcut.Read("C:\\Users\\User\\Desktop\\vlc.lnk")
+	
+	// create new OR update existing shortcut
+	err := shortcut.Make("C:\\Users\\User\\Desktop\\vlc.lnk", newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+
+	// create VB script to generate/update a .lnk file (useful for debugging)
+	shortcut.CreateVBS("C:\\Users\\User\\Desktop\\vlc.lnk", newTarget, newArgs, newWorkingDir, newDescription, newScriptName)
+*/
+package WindowsShortcutFull
+
+import (
+	"bytes"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"os/exec"
+	"path/filepath"
+
+	"github.com/go-ole/go-ole"
+	"github.com/go-ole/go-ole/oleutil"
+)
+
+// _WShell is the OLE Object for "WScript.Shell"
+type _WShell struct {
+	agent    *ole.IUnknown
+	dispatch *ole.IDispatch
+}
+
+// _NewWShell creates OLE Object for "WScript.Shell".
+func _NewWShell() (*_WShell, error) {
+	agent, err := oleutil.CreateObject("WScript.Shell")
+	if err != nil {
+		return nil, err
+	}
+	dispatch, err := agent.QueryInterface(ole.IID_IDispatch)
+	if err != nil {
+		agent.Release()
+		return nil, err
+	}
+	return &_WShell{agent: agent, dispatch: dispatch}, nil
+}
+
+// Close releases the OLE Object for "WScript.Shell".
+func (wsh *_WShell) Close() {
+	wsh.dispatch.Release()
+	wsh.agent.Release()
+}
+
+// Read reads the data of shortcut file. `path` must be absolute path.
+func (wsh *_WShell) Read(path string) (description string, workingdir string, targetpath string, arguments string, icon string, err error) {
+	shortcut, err := oleutil.CallMethod(wsh.dispatch, "CreateShortCut", path)
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	shortcutDis := shortcut.ToIDispatch()
+	defer shortcutDis.Release()
+	Description, err := oleutil.GetProperty(shortcutDis, "Description")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	workingDir, err := oleutil.GetProperty(shortcutDis, "WorkingDirectory")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	targetPath, err := oleutil.GetProperty(shortcutDis, "TargetPath")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	Arguments, err := oleutil.GetProperty(shortcutDis, "Arguments")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	Icon, err := oleutil.GetProperty(shortcutDis, "IconLocation")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+
+	return Description.ToString(), workingDir.ToString(), targetPath.ToString(), Arguments.ToString(), Icon.ToString(), err
+}
+
+func _read(path string) (Description string, workingDir string, targetPath string, Arguments string, Icon string, err error) {
+	path, err = filepath.Abs(path)
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	wsh, err := _NewWShell()
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	defer wsh.Close()
+
+	return wsh.Read(path)
+}
+
+// Make makes a shortcut file. `to` must be absolute path.
+func (wsh *_WShell) Make(to string, newDescription string, newWorkingDir string, newTarget string, newArgs string, newIcon string) error {
+	shortcut, err := oleutil.CallMethod(wsh.dispatch, "CreateShortCut", to)
+	if err != nil {
+		return err
+	}
+	shortcutDis := shortcut.ToIDispatch()
+	defer shortcutDis.Release()
+	_ = oleutil.MustPutProperty(shortcutDis, "TargetPath", newTarget)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "WorkingDirectory", newWorkingDir)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "Arguments", newArgs)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "Description", newDescription)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "IconLocation", newIcon)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.CallMethod(shortcutDis, "Save")
+	return err
+}
+
+func _make(to string, newDescription string, newWorkingDir string, newTarget string, newArgs string, newIcon string) error {
+	to, err := filepath.Abs(to)
+	if err != nil {
+		return err
+	}
+	wsh, err := _NewWShell()
+	if err != nil {
+		return err
+	}
+	defer wsh.Close()
+
+	return wsh.Make(to, newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+}
+
+func CreateVBS(linkName string, target string, arguments string, directory string, description string, destination string) {
+	var scriptTxt bytes.Buffer
+	scriptTxt.WriteString("option explicit\n\n")
+	scriptTxt.WriteString("sub CreateShortCut()\n")
+	scriptTxt.WriteString("dim objShell, strDesktopPath, objLink\n")
+	scriptTxt.WriteString("set objShell = CreateObject(\"WScript.Shell\")\n")
+	scriptTxt.WriteString("set objLink = objShell.CreateShortcut( \"")
+	scriptTxt.WriteString(linkName)
+	scriptTxt.WriteString(".lnk\")\n")
+	scriptTxt.WriteString("objLink.Arguments = \"")
+	scriptTxt.WriteString(arguments)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.Description = \"")
+	scriptTxt.WriteString(description)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.TargetPath = \"")
+	scriptTxt.WriteString(target)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.WindowStyle = 1\n")
+	scriptTxt.WriteString("objLink.WorkingDirectory = \"")
+	scriptTxt.WriteString(directory)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.Save\nend sub\n\n")
+	scriptTxt.WriteString("call CreateShortCut()")
+	fmt.Print(scriptTxt.String())
+
+	filename := fmt.Sprintf("lnkTo%s.vbs", destination)
+	ioutil.WriteFile(filename, scriptTxt.Bytes(), 0777)
+	cmd := exec.Command("wscript", filename)
+	err := cmd.Run()
+	if err != nil {
+		fmt.Println(err)
+	}
+	cmd.Wait()
+	os.Remove(filename)
+	return
+}

diff --git a/README.md b/README.md
index 5c93804..07071cd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
 GoModules
 ===============
 
-Golang modules dumping ground
\ No newline at end of file
+Golang modules dumping ground
+
+**<u>WindowsShortcutFull</u>**
+
+view, modify and create windows shortcut files (.lnk)
\ No newline at end of file
diff --git a/WindowsShortcutFull-Example.go b/WindowsShortcutFull-Example.go
new file mode 100644
index 0000000..39971fb
--- /dev/null
+++ b/WindowsShortcutFull-Example.go
@@ -0,0 +1,42 @@
+package main
+
+import (
+	"fmt"
+
+	shortcut "GoModules/Modules/WindowsShortcutFull"
+)
+
+func main() {
+
+	/***
+	 * read shortcut data
+	 */
+	Description, workingDir, targetPath, Arguments, Icon, err := shortcut.Read("C:\\Users\\User\\Desktop\\vlc.lnk")
+	if err != nil {
+		print(err)
+		return false
+	}
+	fmt.Printf("[info][Shortcut] %s\n", dstsct)
+	fmt.Printf("[info][Description] %s\n", Description)
+	fmt.Printf("[info][Working Dir] %s\n", workingDir)
+	fmt.Printf("[info][Target] %s\n", targetPath)
+	fmt.Printf("[info][Arguments] %s\n", Arguments)
+	fmt.Printf("[info][Icon] %s\n", Icon)
+
+	/***
+	 * create new OR update existing shortcut
+	 */
+	newTarget := "C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"
+	newArgs := "--fullscreen"
+	newDescription := "VLC Media Player"
+	newWorkingDir := "C:\\"
+	newIcon := "C:\\Program Files\\VideoLAN\\VLC\\vlc.exe"
+
+	err = shortcut.Make("C:\\Users\\User\\Desktop\\vlc.lnk", newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+	if err != nil {
+		print(err)
+		return false
+	}
+
+}
+
diff --git a/WindowsShortcutFull/WindowsShortcutFull.go b/WindowsShortcutFull/WindowsShortcutFull.go
new file mode 100644
index 0000000..7eaab8a
--- /dev/null
+++ b/WindowsShortcutFull/WindowsShortcutFull.go
@@ -0,0 +1,187 @@
+/***
+ * Module to manipulate windows .lnk files
+ * modified from: https://github.com/nyaosorg/go-windows-shortcut
+ * Typical usage:
+
+ //import
+ 	shortcut "InfectShortcuts/Modules/WindowsShortcutFull"
+
+ //main
+	// read shortcut data
+	Description, workingDir, targetPath, Arguments, Icon, err := shortcut.Read("C:\\Users\\User\\Desktop\\vlc.lnk")
+	
+	// create new OR update existing shortcut
+	err := shortcut.Make("C:\\Users\\User\\Desktop\\vlc.lnk", newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+
+	// create VB script to generate/update a .lnk file (useful for debugging)
+	shortcut.CreateVBS("C:\\Users\\User\\Desktop\\vlc.lnk", newTarget, newArgs, newWorkingDir, newDescription, newScriptName)
+*/
+package WindowsShortcutFull
+
+import (
+	"bytes"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"os/exec"
+	"path/filepath"
+
+	"github.com/go-ole/go-ole"
+	"github.com/go-ole/go-ole/oleutil"
+)
+
+// _WShell is the OLE Object for "WScript.Shell"
+type _WShell struct {
+	agent    *ole.IUnknown
+	dispatch *ole.IDispatch
+}
+
+// _NewWShell creates OLE Object for "WScript.Shell".
+func _NewWShell() (*_WShell, error) {
+	agent, err := oleutil.CreateObject("WScript.Shell")
+	if err != nil {
+		return nil, err
+	}
+	dispatch, err := agent.QueryInterface(ole.IID_IDispatch)
+	if err != nil {
+		agent.Release()
+		return nil, err
+	}
+	return &_WShell{agent: agent, dispatch: dispatch}, nil
+}
+
+// Close releases the OLE Object for "WScript.Shell".
+func (wsh *_WShell) Close() {
+	wsh.dispatch.Release()
+	wsh.agent.Release()
+}
+
+// Read reads the data of shortcut file. `path` must be absolute path.
+func (wsh *_WShell) Read(path string) (description string, workingdir string, targetpath string, arguments string, icon string, err error) {
+	shortcut, err := oleutil.CallMethod(wsh.dispatch, "CreateShortCut", path)
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	shortcutDis := shortcut.ToIDispatch()
+	defer shortcutDis.Release()
+	Description, err := oleutil.GetProperty(shortcutDis, "Description")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	workingDir, err := oleutil.GetProperty(shortcutDis, "WorkingDirectory")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	targetPath, err := oleutil.GetProperty(shortcutDis, "TargetPath")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	Arguments, err := oleutil.GetProperty(shortcutDis, "Arguments")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	Icon, err := oleutil.GetProperty(shortcutDis, "IconLocation")
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+
+	return Description.ToString(), workingDir.ToString(), targetPath.ToString(), Arguments.ToString(), Icon.ToString(), err
+}
+
+func _read(path string) (Description string, workingDir string, targetPath string, Arguments string, Icon string, err error) {
+	path, err = filepath.Abs(path)
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	wsh, err := _NewWShell()
+	if err != nil {
+		return "", "", "", "", "", err
+	}
+	defer wsh.Close()
+
+	return wsh.Read(path)
+}
+
+// Make makes a shortcut file. `to` must be absolute path.
+func (wsh *_WShell) Make(to string, newDescription string, newWorkingDir string, newTarget string, newArgs string, newIcon string) error {
+	shortcut, err := oleutil.CallMethod(wsh.dispatch, "CreateShortCut", to)
+	if err != nil {
+		return err
+	}
+	shortcutDis := shortcut.ToIDispatch()
+	defer shortcutDis.Release()
+	_ = oleutil.MustPutProperty(shortcutDis, "TargetPath", newTarget)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "WorkingDirectory", newWorkingDir)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "Arguments", newArgs)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "Description", newDescription)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.PutProperty(shortcutDis, "IconLocation", newIcon)
+	if err != nil {
+		return err
+	}
+	_, err = oleutil.CallMethod(shortcutDis, "Save")
+	return err
+}
+
+func _make(to string, newDescription string, newWorkingDir string, newTarget string, newArgs string, newIcon string) error {
+	to, err := filepath.Abs(to)
+	if err != nil {
+		return err
+	}
+	wsh, err := _NewWShell()
+	if err != nil {
+		return err
+	}
+	defer wsh.Close()
+
+	return wsh.Make(to, newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+}
+
+func CreateVBS(linkName string, target string, arguments string, directory string, description string, destination string) {
+	var scriptTxt bytes.Buffer
+	scriptTxt.WriteString("option explicit\n\n")
+	scriptTxt.WriteString("sub CreateShortCut()\n")
+	scriptTxt.WriteString("dim objShell, strDesktopPath, objLink\n")
+	scriptTxt.WriteString("set objShell = CreateObject(\"WScript.Shell\")\n")
+	scriptTxt.WriteString("set objLink = objShell.CreateShortcut( \"")
+	scriptTxt.WriteString(linkName)
+	scriptTxt.WriteString(".lnk\")\n")
+	scriptTxt.WriteString("objLink.Arguments = \"")
+	scriptTxt.WriteString(arguments)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.Description = \"")
+	scriptTxt.WriteString(description)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.TargetPath = \"")
+	scriptTxt.WriteString(target)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.WindowStyle = 1\n")
+	scriptTxt.WriteString("objLink.WorkingDirectory = \"")
+	scriptTxt.WriteString(directory)
+	scriptTxt.WriteString("\"\n")
+	scriptTxt.WriteString("objLink.Save\nend sub\n\n")
+	scriptTxt.WriteString("call CreateShortCut()")
+	fmt.Print(scriptTxt.String())
+
+	filename := fmt.Sprintf("lnkTo%s.vbs", destination)
+	ioutil.WriteFile(filename, scriptTxt.Bytes(), 0777)
+	cmd := exec.Command("wscript", filename)
+	err := cmd.Run()
+	if err != nil {
+		fmt.Println(err)
+	}
+	cmd.Wait()
+	os.Remove(filename)
+	return
+}
diff --git a/WindowsShortcutFull/main.go b/WindowsShortcutFull/main.go
new file mode 100644
index 0000000..96d38d9
--- /dev/null
+++ b/WindowsShortcutFull/main.go
@@ -0,0 +1,11 @@
+package WindowsShortcutFull
+
+// Read the data of shortcut file. `path` can be relative path.
+func Read(path string) (Description string, workingDir string, targetPath string, Arguments string, Icon string, err error) {
+	return _read(path)
+}
+
+// Makes a shortcut file. `from`,`to` can be relative paths
+func Make(to string, newDescription string, newWorkingDir string, newTarget string, newArgs string, newIcon string) error {
+	return _make(to, newDescription, newWorkingDir, newTarget, newArgs, newIcon)
+}