Correct two problems, found by Martin Kochanski <cardbox@easynet.co.uk>:
1. CreateToolhelp32Snapshot returns INVALID_HANDLE_VALUE, not NULL, on error. 2. On Windows CE, a snapshot handle is closed with CloseToolhelp32Snapshot, not CloseHandle.
This commit is contained in:
parent
3aa8d3a7f1
commit
88401ed449
1 changed files with 10 additions and 4 deletions
|
@ -162,6 +162,7 @@ typedef BOOL (WINAPI *GETCURSORINFO)(PCURSORINFO);
|
|||
typedef DWORD (WINAPI *GETQUEUESTATUS)(UINT);
|
||||
|
||||
typedef HANDLE (WINAPI *CREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
|
||||
typedef BOOL (WINAPI *CLOSETOOLHELP32SNAPSHOT)(HANDLE);
|
||||
typedef BOOL (WINAPI *HEAP32FIRST)(LPHEAPENTRY32, DWORD, DWORD);
|
||||
typedef BOOL (WINAPI *HEAP32NEXT)(LPHEAPENTRY32);
|
||||
typedef BOOL (WINAPI *HEAP32LIST)(HANDLE, LPHEAPLIST32);
|
||||
|
@ -431,7 +432,7 @@ int RAND_poll(void)
|
|||
* This seeding method was proposed in Peter Gutmann, Software
|
||||
* Generation of Practically Strong Random Numbers,
|
||||
* http://www.usenix.org/publications/library/proceedings/sec98/gutmann.html
|
||||
* revised version at http://www.cryptoengines.com/~peter/06_random.pdf
|
||||
* revised version at http://www.cryptoengines.com/~peter/06_random.pdf
|
||||
* (The assignment of entropy estimates below is arbitrary, but based
|
||||
* on Peter's analysis the full poll appears to be safe. Additional
|
||||
* interactive seeding is encouraged.)
|
||||
|
@ -440,6 +441,7 @@ int RAND_poll(void)
|
|||
if (kernel)
|
||||
{
|
||||
CREATETOOLHELP32SNAPSHOT snap;
|
||||
CLOSETOOLHELP32SNAPSHOT close_snap;
|
||||
HANDLE handle;
|
||||
|
||||
HEAP32FIRST heap_first;
|
||||
|
@ -457,6 +459,8 @@ int RAND_poll(void)
|
|||
|
||||
snap = (CREATETOOLHELP32SNAPSHOT)
|
||||
GetProcAddress(kernel, TEXT("CreateToolhelp32Snapshot"));
|
||||
close_snap = (CLOSETOOLHELP32SNAPSHOT)
|
||||
GetProcAddress(kernel, TEXT("CloseToolhelp32Snapshot"));
|
||||
heap_first = (HEAP32FIRST) GetProcAddress(kernel, TEXT("Heap32First"));
|
||||
heap_next = (HEAP32NEXT) GetProcAddress(kernel, TEXT("Heap32Next"));
|
||||
heaplist_first = (HEAP32LIST) GetProcAddress(kernel, TEXT("Heap32ListFirst"));
|
||||
|
@ -472,7 +476,7 @@ int RAND_poll(void)
|
|||
heaplist_next && process_first && process_next &&
|
||||
thread_first && thread_next && module_first &&
|
||||
module_next && (handle = snap(TH32CS_SNAPALL,0))
|
||||
!= NULL)
|
||||
!= INVALID_HANDLE_VALUE)
|
||||
{
|
||||
/* heap list and heap walking */
|
||||
/* HEAPLIST32 contains 3 fields that will change with
|
||||
|
@ -534,8 +538,10 @@ int RAND_poll(void)
|
|||
do
|
||||
RAND_add(&m, m.dwSize, 9);
|
||||
while (module_next(handle, &m));
|
||||
|
||||
CloseHandle(handle);
|
||||
if (close_snap)
|
||||
close_snap(handle);
|
||||
else
|
||||
CloseHandle(handle);
|
||||
}
|
||||
|
||||
FreeLibrary(kernel);
|
||||
|
|
Loading…
Reference in a new issue