protected override bool ReleaseHandle() { if (IsInvalid) { return(true); } var error = DismNativeMethods.DismCloseSession(DangerousGetHandle()); return(error == DismNativeMethods.ERROR_SUCCESS); }
/// <summary> /// Gets the state of the feature. /// </summary> public static DismPackageFeatureState GetFeatureState(string featureName) { featureName.Validate("featureName"); var logFile = Path.GetTempFileName(); DismSession session = null; IntPtr pFeatureInfo = IntPtr.Zero; try { DeployerTrace.WriteInfo("Dism initializing..."); Execute(() => DismNativeMethods.DismInitialize(DismLogLevel.LogErrorsWarnings, logFile, null)); DeployerTrace.WriteInfo("Dism initializing completed, opening online session..."); Execute(() => DismNativeMethods.DismOpenSession(DismOnlineImagePath, null, null, out session)); if (session == null) { throw new InvalidOperationException("NativeMethods.DismOpenSession: session out parameter is null. Not continuing further."); } DeployerTrace.WriteInfo("Dism opening online session completed, getting feature info..."); Execute(() => DismNativeMethods.DismGetFeatureInfo(session, featureName, string.Empty, DismPackageIdentifier.None, out pFeatureInfo)); if (pFeatureInfo == IntPtr.Zero) { throw new InvalidOperationException("NativeMethods.DismGetFeatureInfo pFeatureInfo out parameter is Zero. Not continuing further."); } var featureInfo = (DismFeatureInfo)Marshal.PtrToStructure(pFeatureInfo, typeof(DismFeatureInfo)); DeployerTrace.WriteInfo("Dism feature {0} is in state: {1}", featureName, featureInfo.FeatureState); return(featureInfo.FeatureState); } catch (Exception ex) { DeployerTrace.WriteWarning("Error detecting if {0} feature is present. Exception: {1}", featureName, ex); throw; } finally { try { if (session != null) { DeployerTrace.WriteInfo("Dism closing session..."); Execute(() => DismNativeMethods.DismCloseSession(session.DangerousGetHandle())); DeployerTrace.WriteInfo("Dism closing session completed"); } else { DeployerTrace.WriteInfo("Dism session is null, closing session not required"); } DeployerTrace.WriteInfo("Dism shutting down..."); Execute(DismNativeMethods.DismShutdown); DeployerTrace.WriteInfo("Dism shutting down completed"); if (File.Exists(logFile)) { // log file isn't too big string text = File.ReadAllText(logFile); DeployerTrace.WriteInfo("Dism log file content: {0}{1}", Environment.NewLine, text); File.Delete(logFile); } } catch (Exception ex) { DeployerTrace.WriteWarning("Error while cleaning up Dism state. Ignoring and trying to continue. Exception: {0}", ex); } } }