diff --git a/mingw-w64-headers/include/sphelper.h b/mingw-w64-headers/include/sphelper.h
new file mode 100644
index 0000000..83248d9
--- /dev/null
+++ b/mingw-w64-headers/include/sphelper.h
@@ -0,0 +1,78 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#ifndef SPHelper_h
+#define SPHelper_h
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#include <malloc.h>
+#include <sapi.h>
+/* #include <sapiddk.h> */
+#include <sperror.h>
+#include <limits.h>
+#include <mmsystem.h>
+#include <comcat.h>
+#include <mmreg.h>
+/* #include <atlbase.h> */
+#include <wchar.h>
+#include <tchar.h>
+#include <strsafe.h>
+#include <intsafe.h>
+
+inline HRESULT SpGetCategoryFromId(const WCHAR *category_id, ISpObjectTokenCategory **ret, BOOL fCreateIfNotExist = FALSE) {
+    ISpObjectTokenCategory *obj_token_cat;
+    HRESULT hres;
+
+    hres = ::CoCreateInstance(CLSID_SpObjectTokenCategory, NULL, CLSCTX_ALL, __uuidof(ISpObjectTokenCategory),
+            (void**)&obj_token_cat);
+    if(FAILED(hres))
+        return hres;
+
+    hres = obj_token_cat->SetId(category_id, fCreateIfNotExist);
+    if(FAILED(hres)) {
+        obj_token_cat->Release();
+        return hres;
+    }
+
+    *ret = obj_token_cat;
+    return S_OK;
+}
+
+inline HRESULT SpEnumTokens(const WCHAR *category_id, const WCHAR *req_attrs, const WCHAR *opt_attrs, IEnumSpObjectTokens **ret) {
+    ISpObjectTokenCategory *category;
+    HRESULT hres;
+
+    hres = SpGetCategoryFromId(category_id, &category);
+    if(SUCCEEDED(hres)) {
+        hres = category->EnumTokens(req_attrs, opt_attrs, ret);
+        category->Release();
+    }
+
+    return hres;
+}
+
+/* str must be at least 9 chars (8 for 32-bit integer in hex + one for '\0').  */
+inline void SpHexFromUlong(WCHAR *str, ULONG ul) {
+    ::_ultow(ul, str, 16);
+}
+
+inline HRESULT SpGetDescription(ISpObjectToken *obj_token, WCHAR **description, LANGID language = GetUserDefaultUILanguage()) {
+    WCHAR lang_id[9];
+    HRESULT hres;
+
+    SpHexFromUlong(lang_id, language);
+    hres = obj_token->GetStringValue(lang_id, description);
+    if(hres == SPERR_NOT_FOUND)
+        hres = obj_token->GetStringValue(NULL, description);
+
+    return hres;
+}
+
+#endif
+#endif
