You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.5 KiB
93 lines
2.5 KiB
/******************************************************************** |
|
|
|
import_nt.c |
|
|
|
Win32 specific import code. |
|
|
|
*/ |
|
|
|
#include "Python.h" |
|
#include "osdefs.h" |
|
#ifdef MS_XBOX |
|
#include <xtl.h> |
|
#else |
|
#include <windows.h> |
|
#endif |
|
#include "importdl.h" |
|
#include "malloc.h" /* for alloca */ |
|
|
|
/* a string loaded from the DLL at startup */ |
|
extern const char *PyWin_DLLVersionString; |
|
|
|
FILE *PyWin_FindRegisteredModule(const char *moduleName, |
|
struct filedescr **ppFileDesc, |
|
char *pathBuf, |
|
int pathLen) |
|
{ |
|
#ifndef MS_XBOX |
|
char *moduleKey; |
|
const char keyPrefix[] = "Software\\Python\\PythonCore\\"; |
|
const char keySuffix[] = "\\Modules\\"; |
|
#ifdef _DEBUG |
|
/* In debugging builds, we _must_ have the debug version |
|
* registered. |
|
*/ |
|
const char debugString[] = "\\Debug"; |
|
#else |
|
const char debugString[] = ""; |
|
#endif |
|
struct filedescr *fdp = NULL; |
|
FILE *fp; |
|
HKEY keyBase = HKEY_CURRENT_USER; |
|
int modNameSize; |
|
long regStat; |
|
|
|
/* Calculate the size for the sprintf buffer. |
|
* Get the size of the chars only, plus 1 NULL. |
|
*/ |
|
size_t bufSize = sizeof(keyPrefix)-1 + |
|
strlen(PyWin_DLLVersionString) + |
|
sizeof(keySuffix) + |
|
strlen(moduleName) + |
|
sizeof(debugString) - 1; |
|
/* alloca == no free required, but memory only local to fn, |
|
* also no heap fragmentation! |
|
*/ |
|
moduleKey = alloca(bufSize); |
|
PyOS_snprintf(moduleKey, bufSize, |
|
"Software\\Python\\PythonCore\\%s\\Modules\\%s%s", |
|
PyWin_DLLVersionString, moduleName, debugString); |
|
|
|
modNameSize = pathLen; |
|
regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize); |
|
if (regStat != ERROR_SUCCESS) { |
|
/* No user setting - lookup in machine settings */ |
|
keyBase = HKEY_LOCAL_MACHINE; |
|
/* be anal - failure may have reset size param */ |
|
modNameSize = pathLen; |
|
regStat = RegQueryValue(keyBase, moduleKey, |
|
pathBuf, &modNameSize); |
|
|
|
if (regStat != ERROR_SUCCESS) |
|
return NULL; |
|
} |
|
/* use the file extension to locate the type entry. */ |
|
for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { |
|
size_t extLen = strlen(fdp->suffix); |
|
assert(modNameSize >= 0); /* else cast to size_t is wrong */ |
|
if ((size_t)modNameSize > extLen && |
|
strnicmp(pathBuf + ((size_t)modNameSize-extLen-1), |
|
fdp->suffix, |
|
extLen) == 0) |
|
break; |
|
} |
|
if (fdp->suffix == NULL) |
|
return NULL; |
|
fp = fopen(pathBuf, fdp->mode); |
|
if (fp != NULL) |
|
*ppFileDesc = fdp; |
|
return fp; |
|
#else |
|
return NULL; |
|
#endif |
|
}
|
|
|