Buffer overflows have been prevented on many Unix systems by things like address space randomization, randomizing where libraries are loaded, etc. Windows is a) insecure by design, b) insecure by architecture (the GUI graphics drivers run INSIDE the kernel), c) insecure by implementation .
Those methods won't prevent buffer overflows, but they can limit the damage after a buffer overflow exploit occurs.