some comments
svn: r3510
This commit is contained in:
parent
e21a9c093a
commit
d448f27c23
|
@ -78,6 +78,7 @@
|
||||||
#define TO_PATH(x) (SCHEME_PATHP(x) ? (x) : scheme_char_string_to_path(x))
|
#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
|
/* 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},
|
only available in NT 4.0 and later. The alternative, Module32{First,Next},
|
||||||
|
@ -89,17 +90,20 @@ START_XFORM_SKIP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int epm_tried = 1;
|
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;
|
EnumProcessModules_t _EnumProcessModules;
|
||||||
#include <tlhelp32.h>
|
#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) {
|
if (!epm_tried) {
|
||||||
HMODULE hm;
|
HMODULE hm;
|
||||||
hm = LoadLibrary("psapi.dll");
|
hm = LoadLibrary("psapi.dll");
|
||||||
if (hm) {
|
if (hm) {
|
||||||
_EnumProcessModules = (EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
|
_EnumProcessModules =
|
||||||
|
(EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
|
||||||
}
|
}
|
||||||
epm_tried = 1;
|
epm_tried = 1;
|
||||||
}
|
}
|
||||||
|
@ -111,21 +115,22 @@ BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD
|
||||||
MODULEENTRY32 mod;
|
MODULEENTRY32 mod;
|
||||||
int i, ok;
|
int i, ok;
|
||||||
|
|
||||||
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
|
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
|
||||||
|
GetCurrentProcessId());
|
||||||
if (snapshot == INVALID_HANDLE_VALUE)
|
if (snapshot == INVALID_HANDLE_VALUE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; 1; i++) {
|
for (i = 0; 1; i++) {
|
||||||
mod.dwSize = sizeof(mod);
|
mod.dwSize = sizeof(mod);
|
||||||
if (!i)
|
if (!i)
|
||||||
ok = Module32First(snapshot, &mod);
|
ok = Module32First(snapshot, &mod);
|
||||||
else
|
else
|
||||||
ok = Module32Next(snapshot, &mod);
|
ok = Module32Next(snapshot, &mod);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
break;
|
break;
|
||||||
if (cb >= sizeof(HMODULE)) {
|
if (cb >= sizeof(HMODULE)) {
|
||||||
lphModule[i] = mod.hModule;
|
lphModule[i] = mod.hModule;
|
||||||
cb -= sizeof(HMODULE);
|
cb -= sizeof(HMODULE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +208,7 @@ static Scheme_Object *foreign_ffi_lib(int argc, Scheme_Object *argv[])
|
||||||
Scheme_Hash_Table *ht;
|
Scheme_Hash_Table *ht;
|
||||||
#ifdef WINDOWS_DYNAMIC_LOAD
|
#ifdef WINDOWS_DYNAMIC_LOAD
|
||||||
if (name==NULL) {
|
if (name==NULL) {
|
||||||
|
/* openning the executable is marked by a NULL handle */
|
||||||
handle = NULL;
|
handle = NULL;
|
||||||
null_ok = 1;
|
null_ok = 1;
|
||||||
} else
|
} else
|
||||||
|
@ -309,6 +315,8 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
|
||||||
if (lib->handle) {
|
if (lib->handle) {
|
||||||
dlobj = GetProcAddress(lib->handle, dlname);
|
dlobj = GetProcAddress(lib->handle, dlname);
|
||||||
} else {
|
} 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
|
# define NUM_QUICK_MODS 16
|
||||||
HMODULE *mods, me, quick_mods[NUM_QUICK_MODS];
|
HMODULE *mods, me, quick_mods[NUM_QUICK_MODS];
|
||||||
DWORD cnt = NUM_QUICK_MODS * sizeof(HMODULE), actual_cnt, i;
|
DWORD cnt = NUM_QUICK_MODS * sizeof(HMODULE), actual_cnt, i;
|
||||||
|
|
|
@ -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))
|
#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
|
/* 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},
|
only available in NT 4.0 and later. The alternative, Module32{First,Next},
|
||||||
|
@ -96,17 +97,20 @@ START_XFORM_SKIP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int epm_tried = 1;
|
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;
|
EnumProcessModules_t _EnumProcessModules;
|
||||||
#include <tlhelp32.h>
|
#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) {
|
if (!epm_tried) {
|
||||||
HMODULE hm;
|
HMODULE hm;
|
||||||
hm = LoadLibrary("psapi.dll");
|
hm = LoadLibrary("psapi.dll");
|
||||||
if (hm) {
|
if (hm) {
|
||||||
_EnumProcessModules = (EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
|
_EnumProcessModules =
|
||||||
|
(EnumProcessModules_t)GetProcAddress(hm, "EnumProcessModules");
|
||||||
}
|
}
|
||||||
epm_tried = 1;
|
epm_tried = 1;
|
||||||
}
|
}
|
||||||
|
@ -118,21 +122,22 @@ BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD
|
||||||
MODULEENTRY32 mod;
|
MODULEENTRY32 mod;
|
||||||
int i, ok;
|
int i, ok;
|
||||||
|
|
||||||
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
|
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
|
||||||
|
GetCurrentProcessId());
|
||||||
if (snapshot == INVALID_HANDLE_VALUE)
|
if (snapshot == INVALID_HANDLE_VALUE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; 1; i++) {
|
for (i = 0; 1; i++) {
|
||||||
mod.dwSize = sizeof(mod);
|
mod.dwSize = sizeof(mod);
|
||||||
if (!i)
|
if (!i)
|
||||||
ok = Module32First(snapshot, &mod);
|
ok = Module32First(snapshot, &mod);
|
||||||
else
|
else
|
||||||
ok = Module32Next(snapshot, &mod);
|
ok = Module32Next(snapshot, &mod);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
break;
|
break;
|
||||||
if (cb >= sizeof(HMODULE)) {
|
if (cb >= sizeof(HMODULE)) {
|
||||||
lphModule[i] = mod.hModule;
|
lphModule[i] = mod.hModule;
|
||||||
cb -= sizeof(HMODULE);
|
cb -= sizeof(HMODULE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,6 +183,7 @@ static Scheme_Hash_Table *opened_libs;
|
||||||
Scheme_Hash_Table *ht;
|
Scheme_Hash_Table *ht;
|
||||||
#ifdef WINDOWS_DYNAMIC_LOAD
|
#ifdef WINDOWS_DYNAMIC_LOAD
|
||||||
if (name==NULL) {
|
if (name==NULL) {
|
||||||
|
/* openning the executable is marked by a NULL handle */
|
||||||
handle = NULL;
|
handle = NULL;
|
||||||
null_ok = 1;
|
null_ok = 1;
|
||||||
} else
|
} else
|
||||||
|
@ -248,6 +254,8 @@ static Scheme_Hash_Table *opened_libs;
|
||||||
if (lib->handle) {
|
if (lib->handle) {
|
||||||
dlobj = GetProcAddress(lib->handle, dlname);
|
dlobj = GetProcAddress(lib->handle, dlname);
|
||||||
} else {
|
} 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
|
# define NUM_QUICK_MODS 16
|
||||||
HMODULE *mods, me, quick_mods[NUM_QUICK_MODS];
|
HMODULE *mods, me, quick_mods[NUM_QUICK_MODS];
|
||||||
DWORD cnt = NUM_QUICK_MODS * sizeof(HMODULE), actual_cnt, i;
|
DWORD cnt = NUM_QUICK_MODS * sizeof(HMODULE), actual_cnt, i;
|
||||||
|
@ -1733,7 +1741,7 @@ void scheme_init_foreign(Scheme_Env *env)
|
||||||
{:(for-each
|
{:(for-each
|
||||||
(lambda (sym)
|
(lambda (sym)
|
||||||
(~ "MZ_REGISTER_STATIC("(cadr sym)");" \\
|
(~ "MZ_REGISTER_STATIC("(cadr sym)");" \\
|
||||||
(cadr sym)" = scheme_intern_symbol(\""(car sym)"\");"))
|
(cadr sym)" = scheme_intern_symbol(\""(car sym)"\");"))
|
||||||
(reverse symbols)):}
|
(reverse symbols)):}
|
||||||
{:(for-each
|
{:(for-each
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user