On Tue Jan 23 13:57:14 2024 +0000, Fabian Maurer wrote:
It copies but then gives `STATUS_INFO_LENGTH_MISMATCH`? And returning `STATUS_ACCESS_VIOLATION` has priority over `STATUS_INFO_LENGTH_MISMATCH`? Not saying you're wrong, just wondering. Would you mind adding tests for that?
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` and `ReturnLength` is not changed.
And regarding test, actually Wine already has such test, see [info.c#752](https://gitlab.winehq.org/wine/wine/-/blob/master/dlls/ntdll/tests/info.c?re...) ```c 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 return `STATUS_INFO_LENGTH_MISMATCH` instead