Das Thema ist zwar schon alt, aber ich bin über den selben Fehler gestolpert.
Das Problem ist nicht Windows 7, sondern der neue Prozessor (oder DIE Prozessoren / Prozessorkerne).
Zur Erklärung:
if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION), 0)= NO_ERROR) then "<-- Bei dieser Zeile flieg ich raus"
Wenn man die Funktion NTQuerySystemInformation() mit dem Parameter SYS_PERFORMANCE_INFO aufruft, werden die Informationen zu allen Prozessorkernen in den zweiten Parameter (@spi) geschrieben. Wenn man aber als Parameterlänge nur die
einfache Größe angibt (
sizeof(SYSTEM_PERFORMANCE_INFORMATION)
), dann passen dort auch nur die Informationen zu
einem CPU-Kern rein. Als Folge entsteht dieser Fehlercode.
Richtig müsste es also so aussehen:
Delphi-Quellcode:
var
spi : SYSTEM_PERFORMANCE_INFORMATION;
sti : SYSTEM_TIME_INFORMATION;
sbi : SYSTEM_BASIC_INFORMATION;
begin
result := 0;
if (NTQuerySystemInformation(SYS_BASIC_INFO, @sbi, sizeof(SYSTEM_BASIC_INFORMATION), 0) = NO_ERROR) then
begin
if (NTQuerySystemInformation(SYS_TIME_INFO, @sti, sizeof(SYSTEM_TIME_INFORMATION), 0) = NO_ERROR) then
if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION) * sbi.bKeNumberProcessors, 0) = NO_ERROR) then
...
Leider ist das ganze (wie so oft) nicht gut dokumentiert. Im
MSDN-Eintrag zu
NtQuerySystemInformation findet man im Abschnitt SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION den Hinweis, dass der Buffer groß genug sein muss, um ein Array von SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION mit der Länge der im System vorhandenen Prozessoren aufzunehmen. Offenbar trifft das auch auf SYSTEM_PERFORMANCE_INFORMATION zu, ist dort aber nicht dokumentiert ...