Skip to content

Instantly share code, notes, and snippets.

@Akumzy
Last active December 27, 2019 12:30
Show Gist options
  • Save Akumzy/87267b8a364b8ce2439cc68e3273b5d9 to your computer and use it in GitHub Desktop.
Save Akumzy/87267b8a364b8ce2439cc68e3273b5d9 to your computer and use it in GitHub Desktop.
How to create Windows Explorer shell folder in Go
package main
import (
reg "golang.org/x/sys/windows/registry"
)
func createWindowsShellFolder(GUID, folderTitle, folderPath, folderIconPath string) (err error) {
var (
localKey, rootKey, tempKey reg.Key
exists bool
)
localKey, err = reg.OpenKey(reg.CURRENT_USER, "Software", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return
}
rootKey, _, err = reg.CreateKey(localKey, "Classes\\CLSID\\{"+GUID+"}", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return
}
err = rootKey.SetStringValue("", folderTitle)
if err != nil {
return
}
err = rootKey.SetDWordValue("System.IsPinnedToNameSpaceTree", uint32(0x1))
if err != nil {
return
}
err = rootKey.SetDWordValue("SortOrderIndex", uint32(0x42))
if err != nil {
return
}
// Set folder icon
tempKey, _, err = reg.CreateKey(rootKey, "DefaultIcon", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return
}
err = tempKey.SetStringValue("", folderIconPath)
if err != nil {
return
}
err = tempKey.Close()
if err != nil {
return
}
tempKey, _, err = reg.CreateKey(rootKey, "InProcServer32", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return err
}
err = tempKey.SetExpandStringValue("", "%systemroot%\\system32\\shell32.dll")
if err != nil {
return
}
err = tempKey.Close()
if err != nil {
return
}
tempKey, _, err = reg.CreateKey(rootKey, "Instance", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return err
}
err = tempKey.SetStringValue("CLSID", "{0E5AAE11-A475-4c5b-AB00-C66DE400274E}")
if err != nil {
return
}
err = tempKey.Close()
if err != nil {
return
}
tempKey, _, err = reg.CreateKey(rootKey, "Instance\\InitPropertyBag", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return
}
err = tempKey.SetDWordValue("Attributes", uint32(0x11))
if err != nil {
return
}
err = tempKey.SetExpandStringValue("TargetFolderPath", folderPath)
if err != nil {
return
}
err = tempKey.Close()
if err != nil {
return
}
tempKey, _, err = reg.CreateKey(rootKey, "ShellFolder", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return
}
err = tempKey.SetDWordValue("FolderValueFlags", uint32(0x28))
if err != nil {
return
}
err = tempKey.SetDWordValue("Attributes", uint32(0xF080004D))
if err != nil {
return
}
err = tempKey.Close()
if err != nil {
return
}
err = rootKey.Close()
tempKey, _, err = reg.CreateKey(localKey, "Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{"+GUID+"}", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return err
}
err = tempKey.SetStringValue("", folderTitle)
if err != nil {
return
}
err = tempKey.Close()
if err != nil {
return
}
tempKey, _, err = reg.CreateKey(localKey, "Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel", reg.CREATE_SUB_KEY|reg.SET_VALUE)
if err != nil {
return err
}
err = tempKey.SetDWordValue("{"+GUID+"}", uint32(0x1))
if err != nil {
return
}
err = tempKey.Close()
return
}
// I converted this C# code to Go https://stackoverflow.com/a/34737590/10365156
// Here is the main documentation https://docs.microsoft.com/en-gb/windows/win32/shell/integrate-cloud-storage?redirectedfrom=MSDN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment