Ok, so there's a start...
Ok, but think about what you're asking... It's not just as simple as adding an address region. Virtualizing video memory so that it can be shared within multiple instances, processes or applications isn't just about address space -- you have contention, priority, and update coherence to consider. That's not a new address range to type in, that's several thousand lines of code.
There is only one VM subsystem. And that automatically takes care of all those issues. Because, those things need to be done for each and every device that is part of the logical adress range.
If you want to add a new device to the VM subsystem, you need to write a driver that implements the basic stuff as specified in the API, like reading and writing to it, and hook it up. From that moment on, the VM subsystem can take care of all those other issues.
You really believe so? There are certainly subsystems that run in user space to be sure. But not drivers; drivers within XP are written to have immediate access (direct) to the hardware. By shoving it into a non-ring level 0 state, they no longer have direct access to the hardware in the same way. Which means they must queue their data requests and pass them through the kernel. What entry point in the XP kernel is going to allow for that? Here's a hint: there isn't one. One must be written. ANd this isn't another case of a few extra lines of code to point it to a region -- this is another hunk of tens of thousands of lines of code.
Well, the code that does the direct access already exists, and it has to run in kernel space in any case, with XP as well as with Vista. But to be able to interact with applications that run in user space, it also needs a part that runs in user space. That's called a hybrid model.
The Windows Driver Foundation (WDF) model that Microsoft designed to make that possible, is supported
under windows XP as well as Vista.
Of course, as they changed the API with Vista, you need either two versions of that driver, or one that calls the right API functions depending on the OS it runs on. And under Vista, the driver needs to be able to terminate and restart on demand.
That's about it. I don't see tens of thousands of lines of new code to be written here.
You know what? They don't have to. You can keep your OS kernel 100% intact, along with your driver model, and still move DX10 over to XP. Not a problem at all.
But, not only are you not going to get the performance enhancements available with Vista, you are going to get performance detrminents due to the massive amount of shoehorning you'd have to do to juggle data in eleventy-billion ways to get around having to patch the kernel and completely redesign the driver model.
Well, they can reuse more than 90% of the code in any case, they only need to change the interface and a few low-level functions.
Depending on how they do it, it might run (slightly) slower, true. But obviously, they didn't think that was enough motivation for people to go out and buy Vista. So, they simply removed it altogether.
Writing drivers is always a question of juggling stuff around, seeing where the interaction between the API and your driver breaks down and shoehorning it into something that is useable and fast. The API is
never as you would want it. The documentation is
never good enough. But you have to make do.
And in this case, the people who write the D3D subsystem have access to the source code of everything they fancy, and they can even ask the authors for advice. Because they all work for the same company.
Again, if it cannot be done or would be too expensive, it is because they don't want to do it and there is no budget for it at all. There is no technical reason for it, and it wouldn't be very expensive.
Btw, writing 10,000 lines of code is something you can do in a few weeks, by yourself.