/** * 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 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #include #include /* #include */ #include #include #include #include #include /* #include */ #include #include #include #include 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