anchor.diff:  let ProgramFiles = Environment.GetFolderPath Environment.SpecialFolder.ProgramFiles
   
   /// The path of Program Files (x86)
  -/// It seems this covers all cases where PROCESSOR\_ARCHITECTURE may misreport and the case where the other variable 
  +/// It seems this covers all cases where PROCESSOR\_ARCHITECTURE may misreport and the case where the other variable
   /// PROCESSOR\_ARCHITEW6432 can be null
  -let ProgramFilesX86 = 
  +let ProgramFilesX86 =
       let wow64 = environVar "PROCESSOR_ARCHITEW6432"
       let globalArch = environVar "PROCESSOR_ARCHITECTURE"
       match wow64, globalArch with
  -    | "AMD64", "AMD64" 
  -    | null, "AMD64" 
  +    | "AMD64", "AMD64"
  +    | null, "AMD64"
       | "x86", "AMD64" -> environVar "ProgramFiles(x86)"
       | _ -> environVar "ProgramFiles"
       |> fun detected -> if detected = null then @"C:\Program Files (x86)\" else detected
   
   /// The system root environment variable. Typically "C:\Windows"
   let SystemRoot = environVar "SystemRoot"
  +
  +/// Determines if the current system is a Windows system
  +let isWindows = Environment.OSVersion.Platform = PlatformID.Win32NT
   
   /// Determines if the current system is an Unix system
   let isUnix = Environment.OSVersion.Platform = PlatformID.Unix
  
positive.code: let mutable monoArguments = ""
  
  /// Modifies the ProcessStartInfo according to the platform semantics
  let platformInfoAction (psi : ProcessStartInfo) = 
      if isMono && psi.FileName.EndsWith ".exe" then 
          psi.Arguments <- monoArguments + " \"" + psi.FileName + "\" " + psi.Arguments
          psi.FileName <- monoPath
  
  /// The path of the current target platform
  let mutable TargetPlatformPrefix = 
      let (<|>) a b = 
          match a with
          | None -> b
          | _ -> a
      environVarOrNone "FrameworkDir32" <|> if (String.IsNullOrEmpty SystemRoot) then None
                                            else Some(SystemRoot @@ @"Microsoft.NET\Framework") 
      <|> if (isUnix) then Some "/usr/lib/mono"
          else Some @"C:\Windows\Microsoft.NET\Framework"
      |> Option.get
  
negative.code:       DriveInfo : seq<string> }
  
  /// Retrieves information about the hard drives
  let getDrivesInfo() =
      Environment.GetLogicalDrives()
      |> Seq.map (fun d -> IO.DriveInfo(d))
      |> Seq.filter (fun d -> d.IsReady)
      |> Seq.map
             (fun d ->
             sprintf "%s has %0.1fGB free of %0.1fGB" (d.Name.Replace(":\\", ""))
                 (Convert.ToDouble(d.TotalFreeSpace) / (1024. * 1024. * 1024.))
                 (Convert.ToDouble(d.TotalSize) / (1024. * 1024. * 1024.)))
  
  /// Retrieves lots of machine specific information like machine name, processor count etc.
  let getMachineEnvironment() =
      { ProcessorCount = Environment.ProcessorCount
        Is64bit = Environment.Is64BitOperatingSystem
        OperatingSystem = Environment.OSVersion.ToString()
        MachineName = Environment.MachineName
        NETFrameworks = getInstalledDotNetFrameworks()
        UserDomainName = Environment.UserDomainName
        AgentVersion =
            sprintf "%A" ((System.Reflection.Assembly.GetAssembly(typedefof<MachineDetails>)).GetName().Version)
        DriveInfo = getDrivesInfo() }
  