~ chicken-core (chicken-5) 57b0827f4f5d81788e8de5bf3157403cadb91838
commit 57b0827f4f5d81788e8de5bf3157403cadb91838
Author: felix <felix.winkelmann@bevuta.com>
AuthorDate: Wed Nov 8 15:27:04 2017 +0100
Commit: felix <felix.winkelmann@bevuta.com>
CommitDate: Wed Nov 8 15:27:04 2017 +0100
obtain ptr to RtlGenRandom dynamically by loading adavpi32.dll (thanks to TheLemonMan); drop use of random in posixwin.scm
diff --git a/Makefile.mingw b/Makefile.mingw
index c6059a85..a1cd9266 100644
--- a/Makefile.mingw
+++ b/Makefile.mingw
@@ -59,7 +59,7 @@ LINKER_LINK_SHARED_LIBRARY_OPTIONS = -shared
LIBRARIES = -lm -lws2_32
LINKER_OPTIONS += -Wl,--enable-auto-import
LIBCHICKEN_SO_LINKER_OPTIONS = -Wl,--out-implib,lib$(PROGRAM_PREFIX)chicken$(PROGRAM_SUFFIX).dll.a
-LIBCHICKEN_SO_LIBRARIES = -lm -lws2_32
+LIBCHICKEN_SO_LIBRARIES = -lm -lws2_32
LIBCHICKEN_IMPORT_LIBRARY = lib$(PROGRAM_PREFIX)chicken$(PROGRAM_SUFFIX).dll.a
MAKEDIR_COMMAND_OPTIONS =
GENERATE_DEBUGGER = type $< >$@ & echo wish $(DATADIR)\feathers.tcl %1 %2 %3 %4 %5 %6 %7 %8 %9 >>$@
diff --git a/csc.scm b/csc.scm
index 7a957302..196aa4d5 100644
--- a/csc.scm
+++ b/csc.scm
@@ -664,7 +664,7 @@ EOF
object-extension)
object-files))
(set! link-options
- (cons* "-lkernel32" "-luser32" "-lgdi32" "-ladvapi32" "-mwindows"
+ (cons* "-lkernel32" "-luser32" "-lgdi32" "-mwindows"
link-options)))]
((-deployed)
(set! deployed #t))
diff --git a/posixwin.scm b/posixwin.scm
index fecfc4e4..ac8ffd27 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -595,8 +595,7 @@ static int set_file_mtime(char *filename, C_word atime, C_word mtime)
<#
-(import (only chicken.string string-intersperse)
- (only chicken.random random))
+(import (only chicken.string string-intersperse))
;;; Lo-level I/O:
@@ -726,7 +725,8 @@ static int set_file_mtime(char *filename, C_word atime, C_word mtime)
(let loop ((count 1))
(let suffix-loop ((index (fx- tmpl-len 1)))
(when (fx>= index first-x)
- (string-set! tmpl index (string-ref diz (random diz-len)))
+ (string-set! tmpl index
+ (string-ref diz (##core#inline "C_rand" diz-len)))
(suffix-loop (fx- index 1))))
(let ((fd (##core#inline "C_open"
(##sys#make-c-string tmpl 'file-open)
diff --git a/runtime.c b/runtime.c
index eee653f0..053a6b5a 100644
--- a/runtime.c
+++ b/runtime.c
@@ -12535,14 +12535,6 @@ C_i_pending_interrupt(C_word dummy)
# include <sys/systm.h>
#endif
-#if defined(_WIN32) && !defined(__CYGWIN__)
-# define RtlGenRandom SystemFunction036
-# if defined(__cplusplus)
-extern "C"
-# endif
-BOOLEAN WINAPI RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength);
-#endif
-
#if !defined(_WIN32)
static C_word random_urandom(C_word buf, int count)
@@ -12603,6 +12595,18 @@ C_word C_random_bytes(C_word buf, C_word size)
off += r;
}
#elif defined(_WIN32) && !defined(__CYGWIN__)
+ typedef BOOLEAN (*func)(PVOID, ULONG);
+ static func RtlGenRandom = NULL;
+
+ if(RtlGenRandom == NULL) {
+ HMODULE mod = LoadLibrary("advapi32.dll");
+
+ if(mod == NULL) return C_SCHEME_FALSE;
+
+ if((RtlGenRandom = (func)GetProcAddress(mod, "SystemFunction036")) == NULL)
+ return C_SCHEME_FALSE;
+ }
+
if(!RtlGenRandom((PVOID)C_data_pointer(buf), (LONG)count))
return C_SCHEME_FALSE;
#else
Trap