If you need a real Windows version with build number that is not virtualized regarding your app.manifest file you can get a Windows kernel version from ntoskrnl.exe:
std::string GetNtDllVersion()
  {
    std::string versionString;
    DWORD someHandle;
    wchar_t systemFolderPath[ _MAX_PATH + 1 ];
    UINT systemFolderPathSize = GetSystemDirectory( systemFolderPath, _MAX_PATH );
    if ( systemFolderPathSize > 0 )
    {
      std::wstring ntDllPath( systemFolderPath, systemFolderPathSize );
      ntDllPath += L"\\ntoskrnl.exe";
      DWORD versionSize = GetFileVersionInfoSize( ntDllPath.c_str(), &someHandle );
      if ( versionSize > 0 )
      {
        LPVOID dataPtr = malloc( versionSize );
        if ( dataPtr != NULL )
        {
          if ( GetFileVersionInfo( ntDllPath.c_str(), 0, versionSize, dataPtr ))
          {
            UINT length;
            LPVOID outputPtr;
            if ( VerQueryValue( dataPtr, L"\\", &outputPtr, &length ))
            {
              VS_FIXEDFILEINFO* versionStructPtr = ( VS_FIXEDFILEINFO* )outputPtr;
              if ( versionStructPtr->dwSignature == 0xFEEF04BD )
              {
                versionString = std::to_string( HIWORD( versionStructPtr->dwFileVersionMS ));
                versionString += ".";
                versionString += std::to_string( LOWORD( versionStructPtr->dwFileVersionMS ));
                versionString += ".";
                versionString += std::to_string( HIWORD( versionStructPtr->dwFileVersionLS ));
                versionString += ".";
                versionString += std::to_string( LOWORD( versionStructPtr->dwFileVersionLS ));
              }
            }
          }
          free( dataPtr );
        }
      }
    }
    return versionString;
  }