#include #include #include #include void PrintIDList(LPCWSTR desc, LPITEMIDLIST pidl) { UINT cb = pidl->mkid.cb; std::wcout << desc; std::cout << ": Size: " << cb << '\n'; for(UINT i = 0; i < cb; ++i) { printf("%02x", pidl->mkid.abID[i]);; } putchar('\n'); } void EnumKnownFolders(IKnownFolderManager* pFolderMan) { KNOWNFOLDERID* pFoldersIds = NULL; UINT count = 0; pFolderMan->GetFolderIds(&pFoldersIds, &count); for(UINT i = 0; i < count; ++i) { const KNOWNFOLDERID& folderId = pFoldersIds[i]; LPOLESTR string = NULL; StringFromCLSID(folderId, &string); std::wcout << L"Folder ID: " << string << L'\n'; CoTaskMemFree(string); IKnownFolder* pFolder = NULL; HRESULT hr = S_OK; if(SUCCEEDED(hr = pFolderMan->GetFolder(folderId, &pFolder))) { KNOWNFOLDER_DEFINITION kfDef; if(SUCCEEDED(hr = pFolder->GetFolderDefinition(&kfDef))) { std::wcout << L"Name: " << (kfDef.pszName ? kfDef.pszName : L"None") << L'\n'; std::wcout << L"Parsing Name: " << (kfDef.pszParsingName ? kfDef.pszParsingName : L"None") << L'\n'; std::wcout << L"Category: " << kfDef.category << L'\n'; std::wcout << L"Flags: " << std::hex << kfDef.kfdFlags << std::dec << L'\n'; std::wcout << L"Path: " << (kfDef.pszRelativePath ? kfDef.pszRelativePath : L"None") << L'\n'; if(kfDef.pszTooltip) { WCHAR toolTip[100] = {0}; SHLoadIndirectString(kfDef.pszTooltip, toolTip, ARRAYSIZE(toolTip), NULL); std::wcout << L"Tooltip: " << toolTip << L'\n'; } FreeKnownFolderDefinitionFields(&kfDef); } else { std::wcout << L"No Def - HRESULT " << std::hex << hr << '\n'; } KF_REDIRECTION_CAPABILITIES kfCaps; if(SUCCEEDED(hr = pFolder->GetRedirectionCapabilities(&kfCaps))) { std::wcout << L"Caps: " << std::hex << kfCaps << std::dec << L'\n'; } else { std::wcout << L"No Caps - HRESULT " << std::hex << hr << '\n'; } LPWSTR folderPath; if(SUCCEEDED(hr = pFolder->GetPath(0, &folderPath))) { std::wcout << L"Path: " << folderPath << L'\n'; CoTaskMemFree(folderPath); } else { std::wcout << L"No path - HRESULT " << std::hex << hr << '\n'; } LPITEMIDLIST pidl = NULL; if(SUCCEEDED(hr = pFolder->GetIDList(0, &pidl))) { PrintIDList(L"PIDL", pidl); ILFree(pidl); } else { std::wcout << L"No PIDL - HRESULT " << std::hex << hr << '\n'; } LPWSTR pError = NULL; hr = pFolderMan->Redirect(folderId, NULL, KF_REDIRECT_CHECK_ONLY, NULL, 0, NULL, &pError); std::wcout << L"Redirected: " << (hr == S_OK) << L" (" << std::hex << hr << L")\n"; if(pError) { std::wcout << L"Error: " << pError << L'\n'; CoTaskMemFree(pError); } pFolder->Release(); } else { std::wcout << L"No Folder - HRESULT " << std::hex << hr << '\n'; } std::wcout << L'\n'; } } int __cdecl wmain(int argc, wchar_t** argv) { { //PVOID value = NULL; #ifdef _WIN64 std::cout << "x64\n\n"; #else std::cout << "x86\n\n"; #endif //Wow64DisableWow64FsRedirection(&value); CoInitialize(NULL); IKnownFolderManager* pFolderMan = NULL; CoCreateInstance(CLSID_KnownFolderManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFolderMan)); EnumKnownFolders(pFolderMan); pFolderMan->Release(); CoUninitialize(); return 0; } }