void ReleaseActContext(void) { void (WINAPI *ReleaseActCtx)(HANDLE); BOOL (WINAPI *DeactivateActCtx)(DWORD dwFlags, ULONG_PTR ulCookie); HANDLE k32; if (!IsXPOrLater()) return; k32 = LoadLibrary("kernel32"); ReleaseActCtx = (void*)GetProcAddress(k32, "ReleaseActCtx"); DeactivateActCtx = (void*)GetProcAddress(k32, "DeactivateActCtx"); if (!ReleaseActCtx || !DeactivateActCtx) { VS("Cannot find ReleaseActCtx/DeactivateActCtx exports in kernel32.dll\n"); return; } __try { VS("Deactivating activation context\n"); if (!DeactivateActCtx(0, actToken)) VS("Error deactivating context!\n!"); VS("Releasing activation context\n"); if (hCtx != INVALID_HANDLE_VALUE) ReleaseActCtx(hCtx); VS("Done\n"); } __except (STATUS_SXS_EARLY_DEACTIVATION) { VS("XS early deactivation; somebody left the activation context dirty, let's ignore the problem\n"); } }
int CreateActContext(char *workpath, char *thisfile) { char manifestpath[PATH_MAX]; char basename[PATH_MAX]; ACTCTX ctx; BOOL activated; HANDLE k32; HANDLE (WINAPI *CreateActCtx)(PACTCTX pActCtx); BOOL (WINAPI *ActivateActCtx)(HANDLE hActCtx, ULONG_PTR *lpCookie); // If not XP, nothing to do -- return OK if (!IsXPOrLater()) return 1; /* Setup activation context */ pyi_path_basename(basename, thisfile); pyi_path_join(manifestpath, workpath, basename); strcat(manifestpath, ".manifest"); VS("LOADER: manifestpath: %s\n", manifestpath); k32 = LoadLibrary("kernel32"); CreateActCtx = (void*)GetProcAddress(k32, "CreateActCtxA"); ActivateActCtx = (void*)GetProcAddress(k32, "ActivateActCtx"); if (!CreateActCtx || !ActivateActCtx) { VS("LOADER: Cannot find CreateActCtx/ActivateActCtx exports in kernel32.dll\n"); return 0; } ZeroMemory(&ctx, sizeof(ctx)); ctx.cbSize = sizeof(ACTCTX); ctx.lpSource = manifestpath; hCtx = CreateActCtx(&ctx); if (hCtx != INVALID_HANDLE_VALUE) { VS("LOADER: Activation context created\n"); activated = ActivateActCtx(hCtx, &actToken); if (activated) { VS("LOADER: Activation context activated\n"); return 1; } } hCtx = INVALID_HANDLE_VALUE; VS("LOADER: Error activating the context\n"); return 0; }