You can do this to an extent, but it won't be easy.
First off, you can try WINE, a Windows Compatibility Layer for Linux. You can set which version of Windows you'd like to emulate pretty easily. The downside is that application compatibility can be very hit and miss, and if your application doesn't work, you may need to figure out a workaround to make it work (if one exists at all)
The second approach, which would marry up well with your second requirement (hiding hardware details) is QEMU. QEMU is a free Virtual Machine software, and the reason I mention this over things like VMware or VirtualBox is that it gives you much more control over the kind of machine you want to build, at the cost of usability.
For, example, you can use the
-cpu flag to specify what kind of CPU you want to emulate. You can, for example use
-cpu pentium3 to emulate a Pentium 3 CPU. That's what the installed guest OS and therefore the program would see.