static void load_link(PCWSTR file) { CComPtr lnk; HRESULT hr = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_ALL, IID_PPV_ARGS(&lnk)); CComQIPtr pf(lnk); hr = pf->Load(file, STGM_READ); CComQIPtr list(lnk); DWORD flags; hr = list->GetFlags(&flags); if (flags & SLDF_RUN_WITH_SHIMLAYER) { printf("SLDF_RUN_WITH_SHIMLAYER: %ls\n", file); } CHeapPtr rawData; hr = list->CopyDataBlock(EXP_SHIM_SIG, &rawData); if (SUCCEEDED(hr)) { auto linkData = reinterpret_cast(static_cast(rawData)); printf("Shim data: %ls\n", file); } } static void test_link(PCWSTR file1, PCWSTR file2) { CComPtr lnk; HRESULT hr = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_ALL, IID_PPV_ARGS(&lnk)); CComQIPtr pf(lnk); hr = pf->Load(file1, STGM_READ); CComQIPtr list(lnk); DWORD flags; hr = list->GetFlags(&flags); flags |= SLDF_RUN_WITH_SHIMLAYER; hr = list->SetFlags(flags); CHeapPtr rawData; rawData.AllocateBytes(0x88); auto shimData = reinterpret_cast(static_cast(rawData)); memset(shimData, 0, 0x88); shimData->dbh.cbSize = 0x88; shimData->dbh.dwSignature = EXP_SHIM_SIG; wcscpy_s(shimData->szwLayerName, 0x80 / 2, L"DisableThemes"); hr = list->AddDataBlock(shimData); hr = pf->Save(file2, FALSE); hr = pf->SaveCompleted(file2); }