public static bool TryEnablePrjFlt(ITracer tracer, out string error) { error = null; EventMetadata prjFltHealthMetadata = new EventMetadata(); prjFltHealthMetadata.Add("Area", EtwArea); PhysicalFileSystem fileSystem = new PhysicalFileSystem(); lock (enablePrjFltLock) { bool isPrjfltServiceInstalled; bool isPrjfltDriverInstalled; bool isNativeProjFSLibInstalled; bool isPrjfltServiceRunning = ProjFSFilter.IsServiceRunningAndInstalled(tracer, fileSystem, out isPrjfltServiceInstalled, out isPrjfltDriverInstalled, out isNativeProjFSLibInstalled); prjFltHealthMetadata.Add($"Initial_{nameof(isPrjfltDriverInstalled)}", isPrjfltDriverInstalled); prjFltHealthMetadata.Add($"Initial_{nameof(isPrjfltServiceInstalled)}", isPrjfltServiceInstalled); prjFltHealthMetadata.Add($"Initial_{nameof(isPrjfltServiceRunning)}", isPrjfltServiceRunning); prjFltHealthMetadata.Add($"Initial_{nameof(isNativeProjFSLibInstalled)}", isNativeProjFSLibInstalled); if (!isPrjfltServiceRunning) { if (!isPrjfltServiceInstalled || !isPrjfltDriverInstalled) { uint windowsBuildNumber; bool isInboxProjFSFinalAPI; bool isProjFSFeatureAvailable; if (ProjFSFilter.TryEnableOrInstallDriver(tracer, fileSystem, out windowsBuildNumber, out isInboxProjFSFinalAPI, out isProjFSFeatureAvailable)) { isPrjfltServiceInstalled = true; isPrjfltDriverInstalled = true; } else { error = "Failed to install (or enable) PrjFlt"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } prjFltHealthMetadata.Add(nameof(windowsBuildNumber), windowsBuildNumber); prjFltHealthMetadata.Add(nameof(isInboxProjFSFinalAPI), isInboxProjFSFinalAPI); prjFltHealthMetadata.Add(nameof(isProjFSFeatureAvailable), isProjFSFeatureAvailable); } if (isPrjfltServiceInstalled) { if (ProjFSFilter.TryStartService(tracer)) { isPrjfltServiceRunning = true; } else { error = "Failed to start prjflt service"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } } } // Check again if the native library is installed. If the code above enabled the // ProjFS optional feature then the native library will now be installed. isNativeProjFSLibInstalled = ProjFSFilter.IsNativeLibInstalled(tracer, fileSystem); if (!isNativeProjFSLibInstalled) { if (isPrjfltServiceRunning) { tracer.RelatedInfo($"{nameof(TryEnablePrjFlt)}: Native ProjFS library is not installed, attempting to copy version packaged with VFS for Git"); EventLevel eventLevel; EventMetadata copyNativeLibMetadata = new EventMetadata(); copyNativeLibMetadata.Add("Area", EtwArea); string copyNativeDllError = string.Empty; if (ProjFSFilter.TryCopyNativeLibIfDriverVersionsMatch(tracer, new PhysicalFileSystem(), out copyNativeDllError)) { isNativeProjFSLibInstalled = true; eventLevel = EventLevel.Warning; copyNativeLibMetadata.Add(TracingConstants.MessageKey.WarningMessage, $"{nameof(TryEnablePrjFlt)}: Successfully copied ProjFS native library"); } else { error = $"Native ProjFS library is not installed and could not be copied: {copyNativeDllError}"; eventLevel = EventLevel.Error; copyNativeLibMetadata.Add(nameof(copyNativeDllError), copyNativeDllError); copyNativeLibMetadata.Add(TracingConstants.MessageKey.ErrorMessage, $"{nameof(TryEnablePrjFlt)}: Failed to copy ProjFS native library"); } copyNativeLibMetadata.Add(nameof(isNativeProjFSLibInstalled), isNativeProjFSLibInstalled); tracer.RelatedEvent( eventLevel, $"{nameof(TryEnablePrjFlt)}_{nameof(ProjFSFilter.TryCopyNativeLibIfDriverVersionsMatch)}", copyNativeLibMetadata, Keywords.Telemetry); } else { error = "Native ProjFS library is not installed, did not attempt to copy library because prjflt service is not running"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } } bool isAutoLoggerEnabled = ProjFSFilter.IsAutoLoggerEnabled(tracer); prjFltHealthMetadata.Add($"Initial_{nameof(isAutoLoggerEnabled)}", isAutoLoggerEnabled); if (!isAutoLoggerEnabled) { if (ProjFSFilter.TryEnableAutoLogger(tracer)) { isAutoLoggerEnabled = true; } else { tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: Failed to enable prjflt AutoLogger"); } } prjFltHealthMetadata.Add(nameof(isPrjfltDriverInstalled), isPrjfltDriverInstalled); prjFltHealthMetadata.Add(nameof(isPrjfltServiceInstalled), isPrjfltServiceInstalled); prjFltHealthMetadata.Add(nameof(isPrjfltServiceRunning), isPrjfltServiceRunning); prjFltHealthMetadata.Add(nameof(isNativeProjFSLibInstalled), isNativeProjFSLibInstalled); prjFltHealthMetadata.Add(nameof(isAutoLoggerEnabled), isAutoLoggerEnabled); tracer.RelatedEvent(EventLevel.Informational, $"{nameof(TryEnablePrjFlt)}_Summary", prjFltHealthMetadata, Keywords.Telemetry); return(isPrjfltDriverInstalled && isPrjfltServiceInstalled && isPrjfltServiceRunning && isNativeProjFSLibInstalled); } }
public static bool TryEnablePrjFlt(ITracer tracer, out string error) { error = null; EventMetadata prjFltHealthMetadata = new EventMetadata(); prjFltHealthMetadata.Add("Area", EtwArea); PhysicalFileSystem fileSystem = new PhysicalFileSystem(); lock (enablePrjFltLock) { bool isServiceInstalled; bool isDriverFileInstalled; bool isNativeLibInstalled; bool isRunning = ProjFSFilter.IsServiceRunningAndInstalled(tracer, fileSystem, out isServiceInstalled, out isDriverFileInstalled, out isNativeLibInstalled); bool isInstalled = isServiceInstalled && isDriverFileInstalled && isNativeLibInstalled; prjFltHealthMetadata.Add($"Initial_{nameof(isRunning)}", isRunning); prjFltHealthMetadata.Add($"Initial_{nameof(isServiceInstalled)}", isServiceInstalled); prjFltHealthMetadata.Add($"Initial_{nameof(isDriverFileInstalled)}", isDriverFileInstalled); prjFltHealthMetadata.Add($"Initial_{nameof(isNativeLibInstalled)}", isNativeLibInstalled); prjFltHealthMetadata.Add($"Initial_{nameof(isInstalled)}", isInstalled); if (!isRunning) { if (!isInstalled) { uint windowsBuildNumber; bool isInboxProjFSFinalAPI; bool isProjFSFeatureAvailable; if (ProjFSFilter.TryEnableOrInstallDriver(tracer, fileSystem, out windowsBuildNumber, out isInboxProjFSFinalAPI, out isProjFSFeatureAvailable)) { isInstalled = true; } else { error = "Failed to install (or enable) PrjFlt"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } prjFltHealthMetadata.Add(nameof(windowsBuildNumber), windowsBuildNumber); prjFltHealthMetadata.Add(nameof(isInboxProjFSFinalAPI), isInboxProjFSFinalAPI); prjFltHealthMetadata.Add(nameof(isProjFSFeatureAvailable), isProjFSFeatureAvailable); } if (isInstalled) { if (ProjFSFilter.TryStartService(tracer)) { isRunning = true; } else { error = "Failed to start prjflt service"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } } } isNativeLibInstalled = ProjFSFilter.IsNativeLibInstalled(tracer, new PhysicalFileSystem()); if (!isNativeLibInstalled) { string missingNativeLibMessage = "Native library is not installed"; error = string.IsNullOrEmpty(error) ? missingNativeLibMessage : $"{error}. {missingNativeLibMessage}"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {missingNativeLibMessage}"); } bool isAutoLoggerEnabled = ProjFSFilter.IsAutoLoggerEnabled(tracer); prjFltHealthMetadata.Add($"Initial_{nameof(isAutoLoggerEnabled)}", isAutoLoggerEnabled); if (!isAutoLoggerEnabled) { if (ProjFSFilter.TryEnableAutoLogger(tracer)) { isAutoLoggerEnabled = true; } else { tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: Failed to enable prjflt AutoLogger"); } } prjFltHealthMetadata.Add(nameof(isInstalled), isInstalled); prjFltHealthMetadata.Add(nameof(isRunning), isRunning); prjFltHealthMetadata.Add(nameof(isAutoLoggerEnabled), isAutoLoggerEnabled); prjFltHealthMetadata.Add(nameof(isNativeLibInstalled), isNativeLibInstalled); tracer.RelatedEvent(EventLevel.Informational, $"{nameof(TryEnablePrjFlt)}_Summary", prjFltHealthMetadata, Keywords.Telemetry); return(isInstalled && isRunning); } }
public static bool TryEnablePrjFlt(ITracer tracer, out string error) { error = null; EventMetadata prjFltHealthMetdata = new EventMetadata(); prjFltHealthMetdata.Add("Area", EtwArea); PhysicalFileSystem fileSystem = new PhysicalFileSystem(); lock (enablePrjFltLock) { bool isServiceInstalled; bool isDriverFileInstalled; bool isNativeLibInstalled; bool isRunning = ProjFSFilter.IsServiceRunningAndInstalled(tracer, fileSystem, out isServiceInstalled, out isDriverFileInstalled, out isNativeLibInstalled); bool isInstalled = isServiceInstalled && isDriverFileInstalled && isNativeLibInstalled; prjFltHealthMetdata.Add($"Initial_{nameof(isRunning)}", isRunning); prjFltHealthMetdata.Add($"Initial_{nameof(isServiceInstalled)}", isServiceInstalled); prjFltHealthMetdata.Add($"Initial_{nameof(isDriverFileInstalled)}", isDriverFileInstalled); prjFltHealthMetdata.Add($"Initial_{nameof(isNativeLibInstalled)}", isNativeLibInstalled); prjFltHealthMetdata.Add($"Initial_{nameof(isInstalled)}", isInstalled); if (!isRunning) { if (!isInstalled) { if (ProjFSFilter.TryEnableOrInstallDriver(tracer, fileSystem)) { isInstalled = true; } else { error = "Failed to install (or enable) PrjFlt"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } } if (isInstalled) { if (ProjFSFilter.TryStartService(tracer)) { isRunning = true; } else { error = "Failed to start prjflt service"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } } } else if (!isNativeLibInstalled) { tracer.RelatedWarning($"{nameof(TryEnablePrjFlt)}: prjflt service is running, but native library is not installed"); if (ProjFSFilter.TryInstallNativeLib(tracer, fileSystem)) { isInstalled = true; } else { error = "Failed to install native ProjFs library"; tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: {error}"); } } bool isAutoLoggerEnabled = ProjFSFilter.IsAutoLoggerEnabled(tracer); prjFltHealthMetdata.Add("InitiallyAutoLoggerEnabled", isAutoLoggerEnabled); if (!isAutoLoggerEnabled) { if (ProjFSFilter.TryEnableAutoLogger(tracer)) { isAutoLoggerEnabled = true; } else { tracer.RelatedError($"{nameof(TryEnablePrjFlt)}: Failed to enable prjflt AutoLogger"); } } prjFltHealthMetdata.Add(nameof(isInstalled), isInstalled); prjFltHealthMetdata.Add(nameof(isRunning), isRunning); prjFltHealthMetdata.Add(nameof(isAutoLoggerEnabled), isAutoLoggerEnabled); tracer.RelatedEvent(EventLevel.Informational, $"{nameof(TryEnablePrjFlt)}_Summary", prjFltHealthMetdata, Keywords.Telemetry); return(isInstalled && isRunning); } }