ntdll: NtQuerySystemInformation(SystemProcessorPerformanceInformation) fix return value
Make return value to work like in Windows where given size must match for STATUS_SUCCESS result.
For more context/background info see !4832 (closed)
Merge request reports
Activity
This is current behavior on Windows 10 22H2:
NULL buffer and size = 0 -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) NULL buffer and size > 0 -> STATUS_ACCESS_VIOLATION, ReturnLength=0 valid buffer and size = 0 -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size > 0 -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size < 1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size = 1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS, ReturnLength= 1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size > 1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size = 2*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS, ReturnLength= 2*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size < cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size = cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) valid buffer and size > cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
Wine has few differences regarding this but here this MR fixes only single case
size % sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS
Handling of
STATUS_ACCESS_VIOLATION
andReturnLength
is not changed.And regarding test, actually Wine already has such test, see info.c#752
ok( status == STATUS_SUCCESS || status == STATUS_INFO_LENGTH_MISMATCH /* vista */, "Expected STATUS_SUCCESS or STATUS_INFO_LENGTH_MISMATCH, got %08lx\n", status);
It looks like before Vista it returned
STATUS_SUCCESS
which is current Wine implementation, but since Vista it started to returnSTATUS_INFO_LENGTH_MISMATCH
insteadWe didn't know so we just tried this but in the end it didn't make any difference.
So no I don't know any such app. And it's such an edge case that I guess only way for it to matter is if someone compares
GetVersion()
with result (eg. to detect poor sandbox etc) but that seems incredibly unlikely and there's probably hundreds of other functions to compare aswell.
added 187 commits
-
34e296a8...35ac0e7a - 186 commits from branch
wine:master
- 6cbfc007 - ntdll: NtQuerySystemInformation(SystemProcessorPerformanceInformation) fix return value
-
34e296a8...35ac0e7a - 186 commits from branch