annotate Python/dynload_win.c @ 44825:ef859cd754a7 legacy-trunk

Fixed a wrong assumption in configure.in and Include/pyport.h. The is finite function is not called isfinite() but finite(). Sorry, my fault. :)
author Christian Heimes <christian@cheimes.de>
date Sun, 20 Jan 2008 14:28:28 +0000
parents 76a89dd4a512
children 005921fcff43
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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;
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
174 /* 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
175 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
176 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
177 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
178 will certainly fail too, so use its error code */
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 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
180 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
181 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
182 &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
183 /* 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
184 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
185 LOAD_WITH_ALTERED_SEARCH_PATH);
11599
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 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
187 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
188 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
189
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 /* 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
191 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
192 from system */
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 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
194
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 errorCode = GetLastError();
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
196
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 theLength = FormatMessage(
44455
de00af03bb4d Partial port of r59682 from py3k.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 41969
diff changeset
198 FORMAT_MESSAGE_FROM_SYSTEM |
de00af03bb4d Partial port of r59682 from py3k.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 41969
diff changeset
199 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
200 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
201 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
202 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
203 (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
204 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
205 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
206
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 /* 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
208 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
209 if (theLength == 0) {
21077
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
210 PyOS_snprintf(errBuf, sizeof(errBuf),
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
211 "DLL load failed with error code %d",
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
212 errorCode);
11599
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 } 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
214 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
215 /* 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
216 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
217 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
218 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
219 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
220 theLength -= 2;
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 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
222 }
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 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
224 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
225 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
226 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
227 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
228 }
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 PyErr_SetString(PyExc_ImportError, errBuf);
25041
ed0b02672f09 Fix a couple of whitespace consistency nits.
Fred Drake <fdrake@acm.org>
parents: 24071
diff changeset
230 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
231 } 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
232 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
233
32469
b8710e6d8d78 When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents: 25041
diff changeset
234 #ifdef _DEBUG
b8710e6d8d78 When importing an extension on Windows, the code reads the PE 'import
Thomas Heller <theller@ctypes.org>
parents: 25041
diff changeset
235 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
236 #else
21077
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
237 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
238 #endif
25041
ed0b02672f09 Fix a couple of whitespace consistency nits.
Fred Drake <fdrake@acm.org>
parents: 24071
diff changeset
239 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
240 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
241
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 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
243 strcasecmp(buffer,import_python)) {
21077
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
244 PyOS_snprintf(buffer, sizeof(buffer),
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
245 "Module use of %.150s conflicts "
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
246 "with this version of Python.",
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21066
diff changeset
247 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
248 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
249 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
250 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
251 }
11599
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 }
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 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
254 }
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
255
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 return p;
78fe87ce0ded The old platform-specific contents of importdl.c, broken down into one
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 }