some comments

svn: r3510
This commit is contained in:
Eli Barzilay 2006-06-27 22:01:14 +00:00
parent e21a9c093a
commit d448f27c23
2 changed files with 35 additions and 19 deletions

View File

@ -78,6 +78,7 @@
#define TO_PATH(x) (SCHEME_PATHP(x) ? (x) : scheme_char_string_to_path(x))
/*****************************************************************************/
/* Defining EnumProcessModules for openning `self' as an ffi-lib */
/* We'd like to use EnumProcessModules to find all loaded DLLs, but it's
only available in NT 4.0 and later. The alternative, Module32{First,Next},
@ -89,17 +90,20 @@ START_XFORM_SKIP;
#endif
int epm_tried = 1;
typedef BOOL (*EnumProcessModules_t)(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded);
typedef BOOL (*EnumProcessModules_t)(HANDLE hProcess, HMODULE* lphModule,
DWORD cb, LPDWORD lpcbNeeded);
EnumProcessModules_t _EnumProcessModules;
#include <tlhelp32.h>
BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded)
BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule,
DWORD cb, LPDWORD lpcbNeeded)
{
if (!epm_tried) {
HMODULE hm;
hm = LoadLibrary("psapi.dll");
if (hm) {
_EnumProcessModules = (EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
_EnumProcessModules =
(EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
}
epm_tried = 1;
}
@ -111,21 +115,22 @@ BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD
MODULEENTRY32 mod;
int i, ok;
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
GetCurrentProcessId());
if (snapshot == INVALID_HANDLE_VALUE)
return FALSE;
for (i = 0; 1; i++) {
mod.dwSize = sizeof(mod);
if (!i)
ok = Module32First(snapshot, &mod);
ok = Module32First(snapshot, &mod);
else
ok = Module32Next(snapshot, &mod);
ok = Module32Next(snapshot, &mod);
if (!ok)
break;
break;
if (cb >= sizeof(HMODULE)) {
lphModule[i] = mod.hModule;
cb -= sizeof(HMODULE);
lphModule[i] = mod.hModule;
cb -= sizeof(HMODULE);
}
}
@ -203,6 +208,7 @@ static Scheme_Object *foreign_ffi_lib(int argc, Scheme_Object *argv[])
Scheme_Hash_Table *ht;
#ifdef WINDOWS_DYNAMIC_LOAD
if (name==NULL) {
/* openning the executable is marked by a NULL handle */
handle = NULL;
null_ok = 1;
} else
@ -309,6 +315,8 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
if (lib->handle) {
dlobj = GetProcAddress(lib->handle, dlname);
} else {
/* this is for the executable-open case, which was marked by a NULL
* handle, deal with it by searching all current modules */
# define NUM_QUICK_MODS 16
HMODULE *mods, me, quick_mods[NUM_QUICK_MODS];
DWORD cnt = NUM_QUICK_MODS * sizeof(HMODULE), actual_cnt, i;

View File

@ -85,6 +85,7 @@ exec mzpp -s "---begin" -o `echo "$0" | sed 's/ssc$/c/'` "$0"
#define TO_PATH(x) (SCHEME_PATHP(x) ? (x) : scheme_char_string_to_path(x))
/*****************************************************************************/
/* Defining EnumProcessModules for openning `self' as an ffi-lib */
/* We'd like to use EnumProcessModules to find all loaded DLLs, but it's
only available in NT 4.0 and later. The alternative, Module32{First,Next},
@ -96,17 +97,20 @@ START_XFORM_SKIP;
#endif
int epm_tried = 1;
typedef BOOL (*EnumProcessModules_t)(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded);
typedef BOOL (*EnumProcessModules_t)(HANDLE hProcess, HMODULE* lphModule,
DWORD cb, LPDWORD lpcbNeeded);
EnumProcessModules_t _EnumProcessModules;
#include <tlhelp32.h>
BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded)
BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule,
DWORD cb, LPDWORD lpcbNeeded)
{
if (!epm_tried) {
HMODULE hm;
hm = LoadLibrary("psapi.dll");
if (hm) {
_EnumProcessModules = (EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
_EnumProcessModules =
(EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
}
epm_tried = 1;
}
@ -118,21 +122,22 @@ BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD
MODULEENTRY32 mod;
int i, ok;
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
GetCurrentProcessId());
if (snapshot == INVALID_HANDLE_VALUE)
return FALSE;
for (i = 0; 1; i++) {
mod.dwSize = sizeof(mod);
if (!i)
ok = Module32First(snapshot, &mod);
ok = Module32First(snapshot, &mod);
else
ok = Module32Next(snapshot, &mod);
ok = Module32Next(snapshot, &mod);
if (!ok)
break;
break;
if (cb >= sizeof(HMODULE)) {
lphModule[i] = mod.hModule;
cb -= sizeof(HMODULE);
lphModule[i] = mod.hModule;
cb -= sizeof(HMODULE);
}
}
@ -178,6 +183,7 @@ static Scheme_Hash_Table *opened_libs;
Scheme_Hash_Table *ht;
#ifdef WINDOWS_DYNAMIC_LOAD
if (name==NULL) {
/* openning the executable is marked by a NULL handle */
handle = NULL;
null_ok = 1;
} else
@ -248,6 +254,8 @@ static Scheme_Hash_Table *opened_libs;
if (lib->handle) {
dlobj = GetProcAddress(lib->handle, dlname);
} else {
/* this is for the executable-open case, which was marked by a NULL
* handle, deal with it by searching all current modules */
# define NUM_QUICK_MODS 16
HMODULE *mods, me, quick_mods[NUM_QUICK_MODS];
DWORD cnt = NUM_QUICK_MODS * sizeof(HMODULE), actual_cnt, i;
@ -1733,7 +1741,7 @@ void scheme_init_foreign(Scheme_Env *env)
{:(for-each
(lambda (sym)
(~ "MZ_REGISTER_STATIC("(cadr sym)");" \\
(cadr sym)" = scheme_intern_symbol(\""(car sym)"\");"))
(cadr sym)" = scheme_intern_symbol(\""(car sym)"\");"))
(reverse symbols)):}
{:(for-each
(lambda (x)