Mercurial > cpython-lru_cache-weakref
annotate Python/dynload_win.c @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 005921fcff43 |
| children | 1434d1bc667f |
| rev | line source |
|---|---|
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* Support for dynamic loading of extension modules */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
44462
76a89dd4a512
Moved include "Python.h" in front of other imports to silence a warning.
Christian Heimes <christian@cheimes.de>
parents:
44455
diff
changeset
|
4 #include "Python.h" |
|
76a89dd4a512
Moved include "Python.h" in front of other imports to silence a warning.
Christian Heimes <christian@cheimes.de>
parents:
44455
diff
changeset
|
5 |
|
38716
42808526511c
Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
37459
diff
changeset
|
6 #ifdef HAVE_DIRECT_H |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 #include <direct.h> |
|
38716
42808526511c
Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
37459
diff
changeset
|
8 #endif |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
9 #include <ctype.h> |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 #include "importdl.h" |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
12 #include <windows.h> |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 const struct filedescr _PyImport_DynLoadFiletab[] = { |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 #ifdef _DEBUG |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 {"_d.pyd", "rb", C_EXTENSION}, |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 #else |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 {".pyd", "rb", C_EXTENSION}, |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 #endif |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 {0, 0} |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 }; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
24 /* Case insensitive string compare, to avoid any dependencies on particular |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
25 C RTL implementations */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
26 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
27 static int strcasecmp (char *string1, char *string2) |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
28 { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
29 int first, second; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
30 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
31 do { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
32 first = tolower(*string1); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
33 second = tolower(*string2); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
34 string1++; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
35 string2++; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
36 } while (first && first == second); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
37 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
38 return (first - second); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
39 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
40 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
41 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
42 /* Function to return the name of the "python" DLL that the supplied module |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
43 directly imports. Looks through the list of imported modules and |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
44 returns the first entry that starts with "python" (case sensitive) and |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
45 is followed by nothing but numbers until the separator (period). |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
46 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
47 Returns a pointer to the import name, or NULL if no matching name was |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
48 located. |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
49 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
50 This function parses through the PE header for the module as loaded in |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
51 memory by the system loader. The PE header is accessed as documented by |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
52 Microsoft in the MSDN PE and COFF specification (2/99), and handles |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
53 both PE32 and PE32+. It only worries about the direct import table and |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
54 not the delay load import table since it's unlikely an extension is |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
55 going to be delay loading Python (after all, it's already loaded). |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
56 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
57 If any magic values are not found (e.g., the PE header or optional |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
58 header magic), then this function simply returns NULL. */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
59 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
60 #define DWORD_AT(mem) (*(DWORD *)(mem)) |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
61 #define WORD_AT(mem) (*(WORD *)(mem)) |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
62 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
63 static char *GetPythonImport (HINSTANCE hModule) |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
64 { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
65 unsigned char *dllbase, *import_data, *import_name; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
66 DWORD pe_offset, opt_offset; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
67 WORD opt_magic; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
68 int num_dict_off, import_off; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
69 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
70 /* Safety check input */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
71 if (hModule == NULL) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
72 return NULL; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
73 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
74 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
75 /* Module instance is also the base load address. First portion of |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
76 memory is the MS-DOS loader, which holds the offset to the PE |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
77 header (from the load base) at 0x3C */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
78 dllbase = (unsigned char *)hModule; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
79 pe_offset = DWORD_AT(dllbase + 0x3C); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
80 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
81 /* The PE signature must be "PE\0\0" */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
82 if (memcmp(dllbase+pe_offset,"PE\0\0",4)) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
83 return NULL; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
84 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
85 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
86 /* Following the PE signature is the standard COFF header (20 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
87 bytes) and then the optional header. The optional header starts |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
88 with a magic value of 0x10B for PE32 or 0x20B for PE32+ (PE32+ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
89 uses 64-bits for some fields). It might also be 0x107 for a ROM |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
90 image, but we don't process that here. |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
91 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
92 The optional header ends with a data dictionary that directly |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
93 points to certain types of data, among them the import entries |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
94 (in the second table entry). Based on the header type, we |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
95 determine offsets for the data dictionary count and the entry |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
96 within the dictionary pointing to the imports. */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
97 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
98 opt_offset = pe_offset + 4 + 20; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
99 opt_magic = WORD_AT(dllbase+opt_offset); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
100 if (opt_magic == 0x10B) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
101 /* PE32 */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
102 num_dict_off = 92; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
103 import_off = 104; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
104 } else if (opt_magic == 0x20B) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
105 /* PE32+ */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
106 num_dict_off = 108; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
107 import_off = 120; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
108 } else { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
109 /* Unsupported */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
110 return NULL; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
111 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
112 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
113 /* Now if an import table exists, offset to it and walk the list of |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
114 imports. The import table is an array (ending when an entry has |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
115 empty values) of structures (20 bytes each), which contains (at |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
116 offset 12) a relative address (to the module base) at which a |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
117 string constant holding the import name is located. */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
118 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
119 if (DWORD_AT(dllbase + opt_offset + num_dict_off) >= 2) { |
|
32469
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
120 /* We have at least 2 tables - the import table is the second |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
121 one. But still it may be that the table size is zero */ |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
122 if (0 == DWORD_AT(dllbase + opt_offset + import_off + sizeof(DWORD))) |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
123 return NULL; |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
124 import_data = dllbase + DWORD_AT(dllbase + |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
125 opt_offset + |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
126 import_off); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
127 while (DWORD_AT(import_data)) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
128 import_name = dllbase + DWORD_AT(import_data+12); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
129 if (strlen(import_name) >= 6 && |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
130 !strncmp(import_name,"python",6)) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
131 char *pch; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
132 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
133 /* Ensure python prefix is followed only |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
134 by numbers to the end of the basename */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
135 pch = import_name + 6; |
|
32469
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
136 #ifdef _DEBUG |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
137 while (*pch && pch[0] != '_' && pch[1] != 'd' && pch[2] != '.') { |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
138 #else |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
139 while (*pch && *pch != '.') { |
|
32469
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
140 #endif |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
141 if (*pch >= '0' && *pch <= '9') { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
142 pch++; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
143 } else { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
144 pch = NULL; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
145 break; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
146 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
147 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
148 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
149 if (pch) { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
150 /* Found it - return the name */ |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
151 return import_name; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
152 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
153 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
154 import_data += 20; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
155 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
156 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
157 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
158 return NULL; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
159 } |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
160 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
161 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11599
diff
changeset
|
162 dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 const char *pathname, FILE *fp) |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 { |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 dl_funcptr p; |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
166 char funcname[258], *import_python; |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11599
diff
changeset
|
167 |
|
21077
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
168 PyOS_snprintf(funcname, sizeof(funcname), "init%.200s", shortname); |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 { |
|
17713
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
171 HINSTANCE hDLL = NULL; |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 char pathbuf[260]; |
|
17713
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
173 LPTSTR dummy; |
| 44891 | 174 unsigned int old_mode; |
|
17713
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
175 /* We use LoadLibraryEx so Windows looks for dependent DLLs |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
176 in directory of pathname first. However, Windows95 |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
177 can sometimes not work correctly unless the absolute |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
178 path is used. If GetFullPathName() fails, the LoadLibrary |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
179 will certainly fail too, so use its error code */ |
| 44891 | 180 |
| 181 /* Don't display a message box when Python can't load a DLL */ | |
| 182 old_mode = SetErrorMode(SEM_FAILCRITICALERRORS); | |
| 183 | |
|
17713
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
184 if (GetFullPathName(pathname, |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
185 sizeof(pathbuf), |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
186 pathbuf, |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
187 &dummy)) |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
188 /* XXX This call doesn't exist in Windows CE */ |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
189 hDLL = LoadLibraryEx(pathname, NULL, |
|
5e3bab8aef7b
Always pass a full path name to LoadLibraryEx(). Fixes some Windows 9x problems. As discussed on python-dev
Mark Hammond <mhammond@skippinet.com.au>
parents:
15027
diff
changeset
|
190 LOAD_WITH_ALTERED_SEARCH_PATH); |
| 44891 | 191 |
| 192 /* restore old error mode settings */ | |
| 193 SetErrorMode(old_mode); | |
| 194 | |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 if (hDLL==NULL){ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 char errBuf[256]; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 unsigned int errorCode; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
198 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 /* Get an error string from Win32 error code */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
200 char theInfo[256]; /* Pointer to error text |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
201 from system */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 int theLength; /* Length of error text */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
204 errorCode = GetLastError(); |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
205 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
206 theLength = FormatMessage( |
|
44455
de00af03bb4d
Partial port of r59682 from py3k.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
41969
diff
changeset
|
207 FORMAT_MESSAGE_FROM_SYSTEM | |
|
de00af03bb4d
Partial port of r59682 from py3k.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
41969
diff
changeset
|
208 FORMAT_MESSAGE_IGNORE_INSERTS, /* flags */ |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
209 NULL, /* message source */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
210 errorCode, /* the message (error) ID */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
211 0, /* default language environment */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
212 (LPTSTR) theInfo, /* the buffer */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
213 sizeof(theInfo), /* the buffer size */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
214 NULL); /* no additional format args. */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 /* Problem: could not get the error message. |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 This should not happen if called correctly. */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 if (theLength == 0) { |
|
21077
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
219 PyOS_snprintf(errBuf, sizeof(errBuf), |
|
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
220 "DLL load failed with error code %d", |
|
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
221 errorCode); |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
222 } else { |
|
13096
8c8de5b736dc
Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
Guido van Rossum <guido@python.org>
parents:
11618
diff
changeset
|
223 size_t len; |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 /* For some reason a \r\n |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 is appended to the text */ |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 if (theLength >= 2 && |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 theInfo[theLength-2] == '\r' && |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 theInfo[theLength-1] == '\n') { |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 theLength -= 2; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 theInfo[theLength] = '\0'; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 } |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
232 strcpy(errBuf, "DLL load failed: "); |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 len = strlen(errBuf); |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 strncpy(errBuf+len, theInfo, |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 sizeof(errBuf)-len); |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
236 errBuf[sizeof(errBuf)-1] = '\0'; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 } |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
238 PyErr_SetString(PyExc_ImportError, errBuf); |
|
25041
ed0b02672f09
Fix a couple of whitespace consistency nits.
Fred Drake <fdrake@acm.org>
parents:
24071
diff
changeset
|
239 return NULL; |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
240 } else { |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
241 char buffer[256]; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
242 |
|
32469
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
243 #ifdef _DEBUG |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
244 PyOS_snprintf(buffer, sizeof(buffer), "python%d%d_d.dll", |
|
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
245 #else |
|
21077
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
246 PyOS_snprintf(buffer, sizeof(buffer), "python%d%d.dll", |
|
32469
b8710e6d8d78
When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents:
25041
diff
changeset
|
247 #endif |
|
25041
ed0b02672f09
Fix a couple of whitespace consistency nits.
Fred Drake <fdrake@acm.org>
parents:
24071
diff
changeset
|
248 PY_MAJOR_VERSION,PY_MINOR_VERSION); |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
249 import_python = GetPythonImport(hDLL); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
250 |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
251 if (import_python && |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
252 strcasecmp(buffer,import_python)) { |
|
21077
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
253 PyOS_snprintf(buffer, sizeof(buffer), |
|
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
254 "Module use of %.150s conflicts " |
|
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
255 "with this version of Python.", |
|
379fc66f4c96
Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
21066
diff
changeset
|
256 import_python); |
|
15027
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
257 PyErr_SetString(PyExc_ImportError,buffer); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
258 FreeLibrary(hDLL); |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
259 return NULL; |
|
5ffa515e620e
Detect conflicting Python DLL on module import under Windows - as per [ Patch #101676 ]
Mark Hammond <mhammond@skippinet.com.au>
parents:
14375
diff
changeset
|
260 } |
|
11599
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
261 } |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
262 p = GetProcAddress(hDLL, funcname); |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
263 } |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
265 return p; |
|
78fe87ce0ded
The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
266 } |
