- Notifications
You must be signed in to change notification settings - Fork 31.7k
/
Copy pathimport_nt.c
86 lines (77 loc) · 2.72 KB
/
import_nt.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/********************************************************************
import_nt.c
Win32 specific import code.
*/
#include"Python.h"
#include"osdefs.h"
#include<windows.h>
#include"importdl.h"
#include"malloc.h"/* for alloca */
/* a string loaded from the DLL at startup */
externconstchar*PyWin_DLLVersionString;
FILE*PyWin_FindRegisteredModule(constchar*moduleName,
structfiledescr**ppFileDesc,
char*pathBuf,
Py_ssize_tpathLen)
{
char*moduleKey;
constcharkeyPrefix[] ="Software\\Python\\PythonCore\\";
constcharkeySuffix[] ="\\Modules\\";
#ifdef_DEBUG
/* In debugging builds, we _must_ have the debug version
* registered.
*/
constchardebugString[] ="\\Debug";
#else
constchardebugString[] ="";
#endif
structfiledescr*fdp=NULL;
FILE*fp;
HKEYkeyBase=HKEY_CURRENT_USER;
intmodNameSize;
longregStat;
/* Calculate the size for the sprintf buffer.
* Get the size of the chars only, plus 1 NULL.
*/
size_tbufSize=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);
assert(pathLen<INT_MAX);
modNameSize= (int)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= (int)pathLen;
regStat=RegQueryValue(keyBase, moduleKey,
pathBuf, &modNameSize);
if (regStat!=ERROR_SUCCESS)
returnNULL;
}
/* use the file extension to locate the type entry. */
for (fdp=_PyImport_Filetab; fdp->suffix!=NULL; fdp++) {
size_textLen=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)
returnNULL;
fp=fopen(pathBuf, fdp->mode);
if (fp!=NULL)
*ppFileDesc=fdp;
returnfp;
}