That little testing program shows that your processor is working correctly.
The Microsoft SetThreadAffinityMask() function forces the program to move to different cores. You follow the numbers down the Core 0 Column and then the Core 1 Column, Core 2 Column and finally the Core 3 column.
In this program, cores have this value:
Core 0 - 1
Core 1 - 2
Core 2 - 4
Core 3 - 8
When this program first starts it reports 15 which is equivalent to 1 + 2 + 4 + 8 which means the task has access to all 4 cores. My program then locks it to Core 0 so it reports 1 and when it locks it to core 2 it reports 4 and when it locks it to core 3 it reports 8. This shows all your cores are there.
The RealTemp code organizes the threads so they are associated with the correct core. The code I have written works 100% in Vista and Windows 7 but in some versions of XP and Server 2003, the MS functions I use to query the CPU about how many cores it has sometimes returns an incorrect value.
Anyway, the information you have provided me will greatly help me come up with a fix for you. I might have to come up with an INI option like ForceQuad=1 or some other trick to make sure that it has access to all 4 cores. I should have some time the next few days to work on RealTemp and hopefully get this problem solved for you.