Mercurial > cpython-lru_cache-weakref
annotate PC/dl_nt.c @ 54294:dba767bc3155 legacy-trunk
remove mention of old ctypes version
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Sat, 23 May 2009 20:59:09 +0000 |
| parents | 0522cfee879a |
| children | fd25030223b0 |
| rev | line source |
|---|---|
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /* |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 Entry point for the Windows NT DLL. |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 About the only reason for having this, is so initall() can automatically |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 be called, removing that burden (and possible source of frustration if |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 forgotten) from the programmer. |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 */ |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
18835
diff
changeset
|
10 |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
18835
diff
changeset
|
11 #include "Python.h" |
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 #include "windows.h" |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
41969
diff
changeset
|
14 #ifdef Py_ENABLE_SHARED |
|
6355
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
15 char dllVersionBuffer[16] = ""; // a private buffer |
|
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
16 |
|
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
17 // Python Globals |
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 HMODULE PyWin_DLLhModule = NULL; |
|
6355
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
19 const char *PyWin_DLLVersionString = dllVersionBuffer; |
|
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
20 |
|
51130
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
21 // Windows "Activation Context" work: |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
22 // Our .pyd extension modules are generally built without a manifest (ie, |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
23 // those included with Python and those built with a default distutils. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
24 // This requires we perform some "activation context" magic when loading our |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
25 // extensions. In summary: |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
26 // * As our DLL loads we save the context being used. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
27 // * Before loading our extensions we re-activate our saved context. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
28 // * After extension load is complete we restore the old context. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
29 // As an added complication, this magic only works on XP or later - we simply |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
30 // use the existence (or not) of the relevant function pointers from kernel32. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
31 // See bug 4566 (http://python.org/sf/4566) for more details. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
32 |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
33 typedef BOOL (WINAPI * PFN_GETCURRENTACTCTX)(HANDLE *); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
34 typedef BOOL (WINAPI * PFN_ACTIVATEACTCTX)(HANDLE, ULONG_PTR *); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
35 typedef BOOL (WINAPI * PFN_DEACTIVATEACTCTX)(DWORD, ULONG_PTR); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
36 typedef BOOL (WINAPI * PFN_ADDREFACTCTX)(HANDLE); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
37 typedef BOOL (WINAPI * PFN_RELEASEACTCTX)(HANDLE); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
38 |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
39 // locals and function pointers for this activation context magic. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
40 static HANDLE PyWin_DLLhActivationContext = NULL; // one day it might be public |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
41 static PFN_GETCURRENTACTCTX pfnGetCurrentActCtx = NULL; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
42 static PFN_ACTIVATEACTCTX pfnActivateActCtx = NULL; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
43 static PFN_DEACTIVATEACTCTX pfnDeactivateActCtx = NULL; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
44 static PFN_ADDREFACTCTX pfnAddRefActCtx = NULL; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
45 static PFN_RELEASEACTCTX pfnReleaseActCtx = NULL; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
46 |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
47 void _LoadActCtxPointers() |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
48 { |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
49 HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
50 if (hKernel32) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
51 pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
52 // If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
53 if (pfnGetCurrentActCtx) { |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
54 pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
55 pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
56 pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
57 pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
58 } |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
59 } |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
60 |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
61 ULONG_PTR _Py_ActivateActCtx() |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
62 { |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
63 ULONG_PTR ret = 0; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
64 if (PyWin_DLLhActivationContext && pfnActivateActCtx) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
65 if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) { |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
66 OutputDebugString("Python failed to activate the activation context before loading a DLL\n"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
67 ret = 0; // no promise the failing function didn't change it! |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
68 } |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
69 return ret; |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
70 } |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
71 |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
72 void _Py_DeactivateActCtx(ULONG_PTR cookie) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
73 { |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
74 if (cookie && pfnDeactivateActCtx) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
75 if (!(*pfnDeactivateActCtx)(0, cookie)) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
76 OutputDebugString("Python failed to de-activate the activation context\n"); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
77 } |
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
79 BOOL WINAPI DllMain (HANDLE hInst, |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 ULONG ul_reason_for_call, |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 LPVOID lpReserved) |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 { |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 switch (ul_reason_for_call) |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 { |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 case DLL_PROCESS_ATTACH: |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 PyWin_DLLhModule = hInst; |
|
6355
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
87 // 1000 is a magic number I picked out of the air. Could do with a #define, I spose... |
|
2e40e27f8b26
DLL version is now loaded from a string resource.
Guido van Rossum <guido@python.org>
parents:
5412
diff
changeset
|
88 LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer)); |
|
51130
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
89 |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
90 // and capture our activation context for use when loading extensions. |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
91 _LoadActCtxPointers(); |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
92 if (pfnGetCurrentActCtx && pfnAddRefActCtx) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
93 if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext)) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
94 if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext)) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
95 OutputDebugString("Python failed to load the default activation context\n"); |
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 break; |
|
51130
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
97 |
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 case DLL_PROCESS_DETACH: |
|
51130
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
99 if (pfnReleaseActCtx) |
|
0522cfee879a
Merged revisions 69041 via svnmerge from
Mark Hammond <mhammond@skippinet.com.au>
parents:
44070
diff
changeset
|
100 (*pfnReleaseActCtx)(PyWin_DLLhActivationContext); |
|
4087
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 break; |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 } |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 return TRUE; |
|
740def697d8b
NT specific files supplied by Mark Hammond
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
104 } |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
41969
diff
changeset
|
105 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
41969
diff
changeset
|
106 #endif /* Py_ENABLE_SHARED */ |
