Books and other resources for learning about Windows CE

Posted by: Sue Loh

I am occasionally asked whether I know any good books or other resources to help learn about Windows CE internals, APIs, and more.  I wish we had the Windows CE equivalent of the deep Windows Internals books written by Russinovich and Solomon.  But we don’t.  There is an old book, “Inside Microsoft Windows CE,” which I believe was Microsoft Press’ attempt to take the same type of look at Windows CE.  But it was written about CE 3.0; it was hot off the presses when I started working at Microsoft back in 1999.  Needless to say, it’s a little outdated now.  I heard a rumor years ago that MS-Press refuses to do another revision because that book didn’t sell enough copies.  I don’t know if that’s true.  Anyway, it’s probably still not a bad introduction for a newcomer; many of the concepts in that book are still the same in Windows CE today.  Plus you get the added bonus of seeing pictures of some people who now don’t have quite so much hair.

I hesitate to list other books because I must confess, I haven’t read any of them.  But the major ones I see out there are:

Doug, Jim and Paul are all very knowledgeable about Windows CE.

[UPDATE: 4/2/2009]  I am updating this article to mention a new important book, “Windows Embedded CE 6.0 Preparation Kit which you can download for free from Microsoft.  It is packed with information to tell OEM developers how to build devices.

Some of the posts on this blog are my own attempt at providing information about the internals of Windows CE.  For example my API call post and memory marshalling post.  I confess I don’t read most of the networking team’s blog posts in detail, because they’re far outside my own realm of understanding, but I think they make similar efforts over there.  The WindowsMobile blog discussions are usually more user-level than deep into the internals of the system, but sometimes you’ll see some internals there.  Also look to the Windows Mobile shell team’s blog; I hope they keep posting more information like they have in the past.

If you are building a BSP and looking for a resource about BSP development, look at the BSP wiki on Channel9

Microsoft doesn’t offer training classes, but there is third-party training you can take, and it is probably the quickest way to introduce yourself to Windows CE and Windows Mobile.  Multiple companies offer training courses.  Here are a few, in no particular order.  I am not listing these to favor these companies; please shop around, and if you feel others should be listed, please feel free to post a reply with your own opinions for other people to see.

Boling Consulting
The Paul Yao Company

Additionally, we hold an annual Developer’s Conference.  At the conference there are many talks, some labs, and personal access to Microsoft engineers as well as our eMVPs.  You can find information about this year’s MEDC (Mobile & Embedded Developers Conference) at  They also usually hold a series of smaller international DevCons around the world following the big one in the U.S.

If you are looking for help on a particular problem, my recommendation is to ask your question on one of our newsgroups.  There is a list of mobile and embedded newsgroups you can look at, but these are my main recommendations:


Microsoft engineers do read and reply to questions on the newsgroups, but you can also get expert help there from our eMVPs and from other members of our community.  Actually I prefer using the newsgroups to having people email me (or my team, via this blog) with questions.  That way, not only can you get help from the rest of the community, but also other people who have similar questions can search and find the discussion.  Know how to search old posts — I use to search only in microsoft.public.windowsce.*

Once a month we also hold chats about Windows CE (and Windows Mobile).  Usually we have about 20 Microsoft engineers on the chat.  See for the schedule, and for transcripts of past chats.

I don’t have a lot of experience with managed programming, but I know if you are interested in managed programming on mobile and embedded devices, you can’t go wrong with OpenNetCF.orgChris Tacke and the other people there are very experienced and very helpful.  Other resources on managed code come from a few blogs run by the Microsoft .NET Compact Framework team members; see for a start.  Finally, I think the .NET Compact Framework team holds monthly chats.  Just like the general Windows CE chats, the schedule for .NET CF chats is at, and has transcripts of past chats.

If you are part of a university or other academic organization, and looking to teach classes using Windows Embedded, there is an official academic curriculum you should check out.

Another thing people occasionally ask for is information about the Windows CE APIs, and listings of registry settings.  The main resource for the APIs would be in Platform Builder or Visual Studio help, which is also online on MSDN.

Note also that many Win32 APIs from desktop Windows are used in Windows CE, with some behavior differences and unsupported features.  You could use desktop references to learn about the APIs, but only if you’re careful to cross-reference with the Windows CE documentation to find out what’s different.  Implementations may be different and may be more limited.  Ported APIs like DirectX probably diverge less.  Similarly, registry settings are rarely in common between Windows CE and the desktop.

Finally, there are many links for OEMs and application developers at our online portals:


UPDATE Sept 4, 2007:  Added link to Microsoft Mobile Development Handbook.
UPDATE Mar 28, 2008: Added link to BSP wiki

Comments (7)

  1. Just to add my two (euro)cents of information:

    He’s also a very kind and very open to suggestions and material for his project.

    • For non-american people who are looking for training in their own country and in their own language (as this message shows some people have problems in understanding and expressing themselves in good english :)) the mswep site can be a good starting point:

    I work for a company that offers training and support in Italy, for example (try to find it on the site :)).

    • The shared source is another great source of information and knowledge (I’m sorry to say that sometimes is the only one for "poor" developers like me :)). If you don’t have a WINCE500PRIVATE or WINCE600PRIVATE directory in your subtree, find the installation CD and re-run the setup to install also this code! The PUBLICCOMMONOAKDRIVERS and PUBLICCOMMONOAKCSP (or PLATFORMSRCSOC on CE 6) subdirs are also a "gold-mine" for people who need to develop drivers or BSPs.
  2. ce_base says:

    Excellent information, thank you Vuemme!

  3. Javier Santoro says:


    I know this is not the right post for this question but your "OS updates and the hive-based registry" post is closed, so I thought on trying it here.

    In our Ce5 platform we have been using the RAM base registry with IPSM as the persistent registry storage. Under this setup we implemented a way of maintaining the registry across image updates.

    Because of hardware changes we need to move to hive registry. We would like to keep the registry across image updates. We have a plan on how to do it that would be more or less the same as your option number 2 in the "OS updates and the hive-based registry" post, basically keeping a copy of the whole registry and merging it when there’s an image update.

    We have another situation where we want to merge some registry entries into the current image registry, but we need to do it before any drivers get loaded.

    The question is that it would be very helpful if there would be a kernel iocontrol signalling the current image hive registry (ROM hive and FileSystem hive) is completely mounted, so we can go ahead and merge our copy of the registry.

    As far as I can tell there is only one IOcontrol that we could use:


    The first time it is called we know that the ROM System Hive has been mounted, but the FileSystem system hive has not been mounted yet. So if we write somthing at this point it will get overwritten by the FileSystem hive.

    The second time we know that the ROM and FileSystem system have been mounted and also the ROM User hive, but not the FileSystem user hive.

    So, is there a way (before drivers get loaded in the second boot phase) to tell that the all ROM and FileSystem hives have been mounted and that the full registry is available.

    It would be like the IOCTL_HAL_INITREGISTRY but after all the hives are up and running.

    Thank you very much,


  4. ce_base says:

    Well, IOCTL_HAL_GET_HIVE_CLEAN_FLAG is called at about the same time as IOCTL_HAL_INITREGISTRY.  Both are after the boot registry is loaded but before the "real" registry is loaded.  I think you would probably be OK doing your updates in IOCTL_HAL_INITREGISTRY.  If you want to wait until after all the registry initialization is done, then your best option is probably to make a driver do the registry update, and load it first in the 2nd boot phase.  You can use the "Order" values in the driver registry settings to control driver load order.


  5. Javier Santoro says:

    Thanks Sue,

    I thought about doing it with a driver but I think I’m going to do it with an application. I’ll set the app to be launched first with InitLaunchXX order of 01, so this app would be launch before device.exe. I can make device.exe wait on this app with the DependXX entry. In this way I’m sure that our registry is fully merge before device.exe even run and also I don’t have to worry about other drivers that may have the Order set to 0.

    Thank you,


  6. ce_base says:

    For some reason I was thinking that wouldn’t work, but you’re right, it would.  That’s simpler than setting up the driver too.  Should be fine.