Paul Gofman pgofman@codeweavers.com writes:
On 3/29/21 22:33, Alexandre Julliard wrote:
Paul Gofman pgofman@codeweavers.com writes:
@@ -2651,6 +2743,10 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, break; }
- case SystemCpuSetInformation:
return is_win64 ? NtQuerySystemInformationEx(class, NULL, 0, info, size, ret_size)
: STATUS_INVALID_INFO_CLASS;
- case SystemRecommendedSharedDataAlignment: { len = sizeof(DWORD);
@@ -2773,6 +2869,31 @@ NTSTATUS WINAPI NtQuerySystemInformationEx( SYSTEM_INFORMATION_CLASS class, break; }
- case SystemCpuSetInformation:
- {
unsigned int cpu_count = NtCurrentTeb()->Peb->NumberOfProcessors;
PROCESS_BASIC_INFORMATION pbi;
HANDLE process;
if (!query || query_len < sizeof(HANDLE) || (is_win64 && query_len != sizeof(HANDLE)))
return STATUS_INVALID_PARAMETER;
I suspect these 64-bit differences are side-effects of the WoW translation rather than fundamental limitations. We may not be able to find a 32-bit Windows version to verify this, but there doesn't seem to be a reason to deliberately break these calls on 32-bit Wine.
As for the first difference (NtQuerySystemInformation), it is just a matter of return error value, it doesn't work on neither 64 nor 32 bit as seems to always require NtQuerySystemInformationEx() to pass the process handle through its parameters. NtQuerySystemInformationEx() should work on 32 bit Wine as well.
As for the second condition in NtQuerySystemInformationEx(), as far as my testing goes on Windows 32bit (wow64) it allows bigger query len than sizeof(HANDLE) and still succeeds while on win64 requires the exact match, so it still works on 32 bit Wine.
Or did I misunderstand the concern?
The concern is having explicit is_win64 checks, we shouldn't need that. Just pick the behavior that makes the most sense.