1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115

base / test / scoped_os_info_override_win.cc [blame]

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/test/scoped_os_info_override_win.h"

#include <windows.h>

#include "base/win/windows_version.h"

namespace base {
namespace test {

ScopedOSInfoOverride::ScopedOSInfoOverride(Type type)
    : original_info_(base::win::OSInfo::GetInstance()),
      overriding_info_(CreateInfoOfType(type)) {
  *base::win::OSInfo::GetInstanceStorage() = overriding_info_.get();
}

ScopedOSInfoOverride::~ScopedOSInfoOverride() {
  *base::win::OSInfo::GetInstanceStorage() = original_info_;
}

// static
ScopedOSInfoOverride::UniqueOsInfo ScopedOSInfoOverride::CreateInfoOfType(
    Type type) {
  _OSVERSIONINFOEXW version_info = {sizeof(version_info)};
  _SYSTEM_INFO system_info = {};
  int os_type = 0;

  switch (type) {
    case Type::kWin11Pro:
    case Type::kWin11Home:
    case Type::kWin11HomeN:
      version_info.dwMajorVersion = 10;
      version_info.dwMinorVersion = 0;
      version_info.dwBuildNumber = 22000;
      version_info.wServicePackMajor = 0;
      version_info.wServicePackMinor = 0;
      version_info.szCSDVersion[0] = 0;
      version_info.wProductType = VER_NT_WORKSTATION;
      version_info.wSuiteMask = VER_SUITE_PERSONAL;

      system_info.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;
      system_info.dwNumberOfProcessors = 1;
      system_info.dwAllocationGranularity = 8;

      os_type = type == Type::kWin11Home    ? PRODUCT_HOME_BASIC
                : type == Type::kWin11HomeN ? PRODUCT_HOME_BASIC_N
                                            : PRODUCT_PROFESSIONAL;
      break;
    case Type::kWinServer2022:
      version_info.dwMajorVersion = 10;
      version_info.dwMinorVersion = 0;
      version_info.dwBuildNumber = 20348;
      version_info.wServicePackMajor = 0;
      version_info.wServicePackMinor = 0;
      version_info.szCSDVersion[0] = 0;
      version_info.wProductType = VER_NT_SERVER;
      version_info.wSuiteMask = VER_SUITE_ENTERPRISE;

      system_info.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;
      system_info.dwNumberOfProcessors = 4;
      system_info.dwAllocationGranularity = 64 * 1024;

      os_type = PRODUCT_STANDARD_SERVER;
      break;
    case Type::kWin10Pro21H1:
    case Type::kWin10Pro:
    case Type::kWin10Home:
      version_info.dwMajorVersion = 10;
      version_info.dwMinorVersion = 0;
      version_info.dwBuildNumber = type == Type::kWin10Pro21H1 ? 19043 : 15063;
      version_info.wServicePackMajor = 0;
      version_info.wServicePackMinor = 0;
      version_info.szCSDVersion[0] = 0;
      version_info.wProductType = VER_NT_WORKSTATION;
      version_info.wSuiteMask = VER_SUITE_PERSONAL;

      system_info.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;
      system_info.dwNumberOfProcessors = 1;
      system_info.dwAllocationGranularity = 8;

      os_type =
          type == Type::kWin10Home ? PRODUCT_HOME_BASIC : PRODUCT_PROFESSIONAL;
      break;
    case Type::kWinServer2016:
      version_info.dwMajorVersion = 10;
      version_info.dwMinorVersion = 0;
      version_info.dwBuildNumber = 17134;
      version_info.wServicePackMajor = 0;
      version_info.wServicePackMinor = 0;
      version_info.szCSDVersion[0] = 0;
      version_info.wProductType = VER_NT_SERVER;
      version_info.wSuiteMask = VER_SUITE_ENTERPRISE;

      system_info.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;
      system_info.dwNumberOfProcessors = 4;
      system_info.dwAllocationGranularity = 64 * 1024;

      os_type = PRODUCT_STANDARD_SERVER;
      break;
  }

  return UniqueOsInfo(new base::win::OSInfo(version_info, system_info, os_type),
                      &ScopedOSInfoOverride::deleter);
}

// static
void ScopedOSInfoOverride::deleter(base::win::OSInfo* info) {
  delete info;
}

}  // namespace test
}  // namespace base