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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 */