Thursday, September 15, 2011

Windows 8 on Microsoft Surface 1.0 (video)

I've been neglecting this blog a bit since I'm trying to focus on finishing my book, but I had to break my self-imposed radio silence to break this news:

I installed Windows 8 on Microsoft Surface 1.0 hardware, and it works! By "it works", I mean the Microsoft Surface 1.0 shell and applications run as expected on Windows 8, and immersive-mode applications and regular desktop applications can be controlled using the Surface vision system touch input.

Windows 8 Start screen working on Microsoft Surface 1.0
I tweeted the above photo while video taping proof of this technical hackery. The video is embedded below:



Yes, this is the Windows 8 that was released publicly only a little over a day ago. I did not have early access, so this is another 24 hour hack for me like Kinductor from the Kinect Code Camp, though it didn't take me a full 24 hours of straight effort.

How did I do it?
Since Surface 1.0 is intended to run on Vista, the fact that any of this works is a testament to the backwards compatibility story of Windows 8. In short, I shrunk the Surface's Vista partition then installed Win 8 from USB key to the new partition (make it 40 GB minimum if you want to develop on it). The installer automatically set up dual booting, so I can boot back to Vista for the "correct" Surface 1.0 environment if I like.

The tricky part was getting the Surface SDK (full version that comes on Surface, not the workstation edition) to install (edit the msi launch conditions using Orca) and then getting the inputs from the Surface vision inputs to drive the Windows 8 UIs. To do that I used MultiTouchVista, which has a component that can connect to SurfaceInput.exe as a client as well as push touch data to an HID touch input driver. Windows 8 doesn't know it's not a capacitive touchscreen at all. (This technique also works for combining Windows 7 with Surface.) Win8 UI also won't be aware of tags or blobs but if you want to write a Surface application that uses those, just use the Surface SDK! Some other time I'll post a deep technical walkthrough, but this thread should be sufficient to get you started.

All of the Surface hardware drivers and Surface applications run great. The immersive mode touch responsiveness is a bit flaky as you can see in the video, but this could have been any number of things from the MultiTouchVista plug-ins to the Win8 touch stack to the Start screen. The Win8 touch visualizations (trails and auras) were always working fine, so I'm leaning towards the problem being in the Win8 UI layer. This is a pre-beta build though, so entirely understandable.

I do need to say that this configuration is completely unsupported and would probably violate the warranty if it wasn't already expired for this particular machine. It also has nothing to do with Surface 2.0. You won't ever see Microsoft create a configuration like this for general use since running three shells (Surface, Immersive, and Desktop) side-by-side would be entirely confusing for real users. In the video I was basically in the equivalent of Surface administrator mode, manually running SurfaceShell.exe, and then switching ad-hoc into immersive mode, which is like a full screen start menu. There are too many competing metaphors and modes for this configuration to be used by the general public.


Does Immersive mode make the Surface shell obsolete?
No way. It makes the Surface shell even more important. My initial impressions with actually using the Win8 immersive mode on Surface is that it really doesn't work for a large, horizontal, multi-user form factor. For one, everything is oriented in one direction, and two, I need to reach too far to get to certain interface elements across the table. That's the opposite of the ergonomic intent of the immersive mode, which was design for smaller screens and slates. It might do better on a vertical wall-mounted form factor. There is definitely a place here for both Immersive mode as well as the Surface shell since they are each designed to do different things in different scenarios. This is especially true if we account for the improved Surface shell that is coming soon with Surface 2.0 hardware.

I think we'll see that there will is a large difference between the design of an immersive mode application to run on a Slate or PC and used by one person, and the design of Microsoft Surface applications to be used by multiple people in a 360 degree interface.

What Surface and Win8 can learn from each other
Even though the designs for each of these modalities need to be different, there is a lot that they can learn from each other. I really like swiping in from the edge to open the charms and app bars, and could see that being incorporated into the version of Surface after 2.0. Windows 8 isn't perfect though, since as soon as there is an extra finger somewhere in immersive mode, the whole interaction breaks down.

It may just be the developer bits, but many or most of the Win8 sample games were almost unusable as a Surface application. My 3 year old tried to play a few with me but we kept getting in each others way since the games were designed for a single orientation. Worse than that, my touches would block her from interacting with the game, and vice versa. Some of the interns that developed those samples apparently did not account for multiple types of input (mouse and touch) or even multi-touch at all, indicating they were still thinking about coding interactions from a single-point mouse point-of-view.

I know that on slates and PCs with a single user they may not need to plan for a full 360 degree interface, but Windows 8 developers need to learn the lessons that Microsoft Surface developers have learned years ago about allowing multiple inputs, multiple touches, and letting the user recover from mental mistakes and accidental touches.

Watching the Windows 8 unveiling during the Build Day 1 keynote was somewhat amazing for me because all of a sudden NUI design and development skills (my focus since 2008) has gone from a small niche to a core requirement for the Windows platform. Anyone interested in building truly great Windows 8 applications needs take an active interest in learning from Surface developers. I'm expecting that some of my colleagues in the Surface community will end up coming up with the most amazing Windows 8 applications in no time at all. (Feel free to send those apps to me for testing on my FrankenSurface Window 8 machine!)

Natural User Interfaces in .NET
While at first I was nervous that the Windows 8 announcements would make my almost-complete book a waste, now that I think about it things are still pretty good. If you want to use the premier technology for creating Natural User Intefaces, then .NET and WPF is still the way to go. You can't target Surface or Kinect in immersive mode, and the immersive mode interface isn't well suited for multiple people. You also have to consider that Windows 8 is still six months to a year away, but you can develop NUIs for Windows 7 multitouch, Surface, and Kinect today with WPF. You can even give them a metro look-and-feel.

If this interests you and you haven't already, take a look at the free sample chapter of my book, and if you like it pre-order it and get the early access PDF today with all of the completed chapters.

13 comments:

  1. hey,

    i tried to do what you did -- shrinking the surface's vista partition, installing windows 8 (64-bit) on the second partition. windows 8 installed alright but the radeon x1650 drivers won't seem to install. what a pain! none of the apps run correctly because that driver isn't installed, and the amd legacy driver for vista/XP i installed doesn't seem to work either. did you have to do anything funny to make it work? did you install win 8 x32 or x64?

    ReplyDelete
  2. I used Win8 x86. You can manually update the display adapter driver and locate it in the Vista partition under the Windows directory somewhere.

    ReplyDelete
  3. That is really sweet! Where did you find a full version of the surface SDK for the surface?

    ReplyDelete
  4. The full version is only available on the Surface hardware itself in C:\SurfaceInstallers.

    ReplyDelete
  5. The surface owned by my company has been sat with a dead HD for over a year and I'd really like to get this running rather than it going in the garbage.
    I've replaced the HD and installed Windows 8 which is running but without the original Surface drivers and software i'm unable to use the multitouch surface. Can anyone with a working Surface 1.0 copy these from the Vista Partition and make them available? Without them it's a very expensive & ugly coffee table.

    ReplyDelete
    Replies
    1. @TimboRansack Were you able to find the full SDK anywhere? I have microsoft coming in to re-image it but it is 400 dollars. I would much rather download it

      Delete
    2. So tired it out today and worked great with 32bit windows 8,
      Missing drivers were updated using windows update which was quick and easy

      Delete
  6. Hello Josh,

    I wonder if you or any of you other good people can help me out.

    I purchased a Microsoft Surface 1.0 from my old company, but nobody knew any of the passwords to get in so I reset them. I now have a problem when trying to run the 'end user mode' it says that the username or password is incorrect. I know it isn't because I reset the setup account and the table user account passwords. In changing the passwords have I broken something in the background?

    Any help would be great.

    Regards,

    Michael.

    ReplyDelete
    Replies
    1. Hi Rodders,

      Sorry I missed the comment moderation notification. In case you haven't figured it out, the Surface system needs to be configured using SurfUser if you need to change the user mode account or password. Check http://technet.microsoft.com/en-us/library/ee692122(v=surface.10).aspx for more information.

      Thanks,
      Josh

      Delete
  7. Hey Josh,

    I just acquired one of these devices from my workplace and would like to put Windows 8 on it. I have an ISO installed on a USB drive (following this guide http://pcsupport.about.com/od/windows-8/a/install-windows-8-usb.htm), and have changed the boot order in the BIOS to read the USB drive before the HDD. However, it still boots straight in to windows vista. Is there some step that I am missing?

    Thanks,
    Connar

    ReplyDelete
  8. Connar,

    Sounds like you're getting started in the right way. Try booting a different computer off the USB drive to make sure the USB drive itself is not the problem. I can't remember but you might need to push a button during boot to activate the alternate boot. Also check the BIOS to see if there is a boot timeout or menu timeout option, or other settings that might be preventing it from doing what you want.

    Josh

    ReplyDelete
    Replies
    1. Josh,

      Thanks for your prompt reply! We (my roommate and I) tried the USB drive on another laptop, and it booted just fine. We have gone through all the BIOS menus and even disabled booting from the HDD just to see what would happen. No dice. I was hoping you knew the secret to finding a boot device selection menu. Oh well.

      Thanks,
      Connar

      Delete
    2. Connar,

      I don't remember having to do anything else. I believe other people have been able to get it to work.

      I should also note that in the end I ended up not booting the Surface to Windows 8 much since the Multitouch Vista driver was really flaky for me. It may have changed since then with recent versions, or the final Win8, or it may not work at all.

      The rest of my comment below is actually copied from an email I've sent a few people who asked for more information. I should have posted this before, but might as well now. It may or may not help your situation but is almost all the info I have on this scenario.
      ---

      Below is some information about my approach with the developer preview. I have no idea if it still works with the CP or RP versions.

      I defragged and shrunk the existing Vista partition and created a new partition of 40GB. (You might want to do 60GB instead if you want some breathing space after installing VS11 preview.)

      Then I used the Win7 USB Copy tool recommended for copying the WDP x86 to USB key and booted from it and installed it to the new partition. You need to set the boot order in BIOS to boot from the USB key. This will automatically set up a dual boot so you can get back into your regular Vista environment.

      After installing you can install VS11, XNA 3.1 distributables, and SurfaceSDK.msi copied from the C:\SurfaceInstallers on the Vista partition. That SurfaceSDK.msi has the vision system bits and is the only place you’ll get that version. Don’t distribute it! It’s license is tied to the hardware.

      You need to follow similar instructions from here http://www.brianpeek.com/post/2009/05/14/install-the-surface-sdk-sp1-workstation-edition-on-x64.aspx to modify the msi file. Make a copy of the msi and modify that copy with Orca, then use File | Save. (File | Save As doesn’t work!)

      You’ll need to do a new vision system calibration, or else copy and restore the calibration from Vista per http://technet.microsoft.com/en-us/library/ee692045(Surface.10).aspx .

      Now you can run Surface apps in desktop mode. If you want to run Surface apps using WPF 4 or target Surface 1 and Surface 2, see my blog post series: http://nui.joshland.org/search/label/Blake.NUI
      To
      control Windows (Desktop and immersive mode) you need to get the latest source version of MultiTouchVista from http://multitouchvista.codeplex.com/SourceControl/list/changesets compile it and install it. Install the Universal HID driver first by running Main Source/Multitouch.Driver/Multitouch.Driver/x32/Install driver.cmd. Then compile everything and run Multitouch.Service.Console.exe, then run Multitouch.Configuration.WPF and select the Surface Input and click the blue arrow to activate it, then you can close the config UI. Finally run Multitouch.Driver.Console.exe, and if you’re lucky the Surface vision input will start controlling the Windows UI.

      The Start Screen has finicky touch when controlled this way. Surface apps work well though. If you want to pin a regular app to the Start Screen you need to copy a shortcut into C:\Users\[USERNAME]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\.
      Hope this helps or at least puts you in the right direction!

      Delete