ntdll: Return buffer filled with random values from NtQuerySystemInformation(SystemInterruptInformation).

Based on a patch by Sebastian Lackner.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2020-09-07 14:10:12 +02:00 committed by Alexandre Julliard
parent 23a879ec0e
commit ec02224941
5 changed files with 41 additions and 6 deletions

2
configure vendored
View File

@ -7486,6 +7486,7 @@ for ac_header in \
sys/protosw.h \
sys/ptrace.h \
sys/queue.h \
sys/random.h \
sys/resource.h \
sys/scsiio.h \
sys/shm.h \
@ -17877,6 +17878,7 @@ for ac_func in \
getauxval \
getifaddrs \
getopt_long_only \
getrandom \
kqueue \
lstat \
mach_continuous_time \

View File

@ -514,6 +514,7 @@ AC_CHECK_HEADERS(\
sys/protosw.h \
sys/ptrace.h \
sys/queue.h \
sys/random.h \
sys/resource.h \
sys/scsiio.h \
sys/shm.h \
@ -2181,6 +2182,7 @@ AC_CHECK_FUNCS(\
getauxval \
getifaddrs \
getopt_long_only \
getrandom \
kqueue \
lstat \
mach_continuous_time \

View File

@ -643,7 +643,8 @@ static void test_query_interrupt(void)
sii = HeapAlloc(GetProcessHeap(), 0, NeededLength);
status = pNtQuerySystemInformation(SystemInterruptInformation, sii, 0, &ReturnLength);
ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
ok(ReturnLength == NeededLength, "got %u\n", ReturnLength);
/* Try it for all processors */
status = pNtQuerySystemInformation(SystemInterruptInformation, sii, NeededLength, &ReturnLength);

View File

@ -29,6 +29,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
@ -42,6 +43,9 @@
#ifdef HAVE_MACHINE_CPU_H
# include <machine/cpu.h>
#endif
#ifdef HAVE_SYS_RANDOM_H
# include <sys/random.h>
#endif
#ifdef HAVE_IOKIT_IOKITLIB_H
# include <CoreFoundation/CoreFoundation.h>
# include <IOKit/IOKitLib.h>
@ -2422,16 +2426,36 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
case SystemInterruptInformation:
{
SYSTEM_INTERRUPT_INFORMATION sii = {{ 0 }};
len = sizeof(sii);
len = NtCurrentTeb()->Peb->NumberOfProcessors * sizeof(SYSTEM_INTERRUPT_INFORMATION);
if (size >= len)
{
if (!info) ret = STATUS_ACCESS_VIOLATION;
else memcpy( info, &sii, len);
else
{
#ifdef HAVE_GETRANDOM
int ret;
do
{
ret = getrandom( info, len, 0 );
}
while (ret == -1 && errno == EINTR);
#else
int fd = open( "/dev/urandom", O_RDONLY );
if (fd != -1)
{
int ret;
do
{
ret = read( fd, info, len );
}
while (ret == -1 && errno == EINTR);
close( fd );
}
else WARN( "can't open /dev/urandom\n" );
#endif
}
}
else ret = STATUS_INFO_LENGTH_MISMATCH;
FIXME("info_class SYSTEM_INTERRUPT_INFORMATION\n");
break;
}

View File

@ -252,6 +252,9 @@
/* Define to 1 if you have the `getopt_long_only' function. */
#undef HAVE_GETOPT_LONG_ONLY
/* Define to 1 if you have the `getrandom' function. */
#undef HAVE_GETRANDOM
/* Define to 1 if you have the `getservbyport' function. */
#undef HAVE_GETSERVBYPORT
@ -1061,6 +1064,9 @@
/* Define to 1 if you have the <sys/queue.h> header file. */
#undef HAVE_SYS_QUEUE_H
/* Define to 1 if you have the <sys/random.h> header file. */
#undef HAVE_SYS_RANDOM_H
/* Define to 1 if you have the <sys/resource.h> header file. */
#undef HAVE_SYS_RESOURCE_H