Can't do anything low level in C????
Wrong.
You can do anything you want in C within restrictions of the OS....and for that you would use asm....but either way you should be able to accomplish the same task in both languages.
For instance all the gurus here say that interrupts are not possible in XP right? Wrong. Look at command.com and run some of your old DOS apps or your code on it. All the interrupts work fine. How is this?? Well write some code that crashes inside of command.com and watch what XP spits out.
Command.com (DOS 16-bit environment) has performed an.....blah blah blah.
Since you cannot perform interrupts in protected mode...well you can but I won't go into the IDT here, then command.com is executing your old DOS programs in virtual 8086 mode. The only way to get into virtual 8086 mode is to set the correct bit(s) in the CR0 register. XP won't let you set this.....or will it? Obviously there are ways to gain a higher privilege level in XP because command.com does it, and command.com is nothing more than another separate program written by Microsoft...it's not really part of the OS per se. So in theory I could write interrupt handlers and low level hard drive routines in C that would work under XP - given that you dismounted the volume....another convenient call inside of the XP API. This would be pretty low level and it can all be done in C. And if you don't want to use ARPL to set your privilege level then emit the correct opcode into the code stream via C.
You can do a lot of low-level stuff in C....in fact C is very very very good for low level functions.
So since command.com pops into virtual 8086 mode to execute your DOS apps, it would be possible to have your code do this as well and then call your C low-level interface functions.
With C you can program the DMA controller (was important for old school sound drivers/engines), SVGA hardware, monitor refresh rates, perform low-level IO (out* and in* family of C functions) - useful for directly programming VGA registers, floppy drive control, external device control, etc.
There are about a million things you can do and it all even works under XP contrary to what some may think. I've gotten away with murder in command.com - basically stuff that I thought Windows XP would puke on....executes flawlessly.
I'm sure you prob didn't understand much of this...but trust me you can do some pretty crazy stuff at the hardware level using pure C. All that DLL stuff you see in Windows is probably loaded into memory via C code. Probably most, if not all, of XP is written in C.
And what do you think Direct3D and OpenGL do? They access the hardware at the lowest level and many of the drivers are written in C via the DDK from MS. Most OS's, including MS's are written in C - they have a pure assembly bootstrap (since this cannot be done in pure C) that loads a pure C or C/C++ kernel and then jumps to it.
So about the only low level thing you cannot do in C that I can think of is write an OS bootstrap. That pretty much has to be in pure assembly.