Skip to content

Commit

Permalink
ntdll: Return buffer filled with random values from NtQuerySystemInfo…
Browse files Browse the repository at this point in the history
…rmation(SystemInterruptInformation).

Based on a patch by Sebastian Lackner.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
  • Loading branch information
Hans Leidekker authored and julliard committed Sep 9, 2020
1 parent 23a879e commit ec02224
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 6 deletions.
2 changes: 2 additions & 0 deletions configure
Expand Up @@ -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 \
Expand Down Expand Up @@ -17877,6 +17878,7 @@ for ac_func in \
getauxval \
getifaddrs \
getopt_long_only \
getrandom \
kqueue \
lstat \
mach_continuous_time \
Expand Down
2 changes: 2 additions & 0 deletions configure.ac
Expand Up @@ -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 \
Expand Down Expand Up @@ -2181,6 +2182,7 @@ AC_CHECK_FUNCS(\
getauxval \
getifaddrs \
getopt_long_only \
getrandom \
kqueue \
lstat \
mach_continuous_time \
Expand Down
3 changes: 2 additions & 1 deletion dlls/ntdll/tests/info.c
Expand Up @@ -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);
Expand Down
34 changes: 29 additions & 5 deletions dlls/ntdll/unix/system.c
Expand Up @@ -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
Expand All @@ -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>
Expand Down Expand Up @@ -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;
}

Expand Down
6 changes: 6 additions & 0 deletions include/config.h.in
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down

0 comments on commit ec02224

Please sign in to comment.