summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/timemodule.c7
-rw-r--r--PC/_winreg.c133
-rw-r--r--PCbuild/kill_python.vcproj8
-rw-r--r--PCbuild/pythoncore.vcproj32
-rw-r--r--Tools/buildbot/build-amd64.bat1
-rw-r--r--Tools/buildbot/build.bat1
6 files changed, 155 insertions, 27 deletions
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index bd0d063..f0edb09 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -661,7 +661,7 @@ Convert a time tuple in local time to seconds since the Epoch.");
#endif /* HAVE_MKTIME */
#ifdef HAVE_WORKING_TZSET
-void inittimezone(PyObject *module);
+static void inittimezone(PyObject *module);
static PyObject *
time_tzset(PyObject *self, PyObject *unused)
@@ -697,11 +697,12 @@ the local timezone used by methods such as localtime, but this behaviour\n\
should not be relied on.");
#endif /* HAVE_WORKING_TZSET */
-void inittimezone(PyObject *m) {
+static void
+inittimezone(PyObject *m) {
/* This code moved from inittime wholesale to allow calling it from
time_tzset. In the future, some parts of it can be moved back
(for platforms that don't HAVE_WORKING_TZSET, when we know what they
- are), and the extranious calls to tzset(3) should be removed.
+ are), and the extraneous calls to tzset(3) should be removed.
I haven't done this yet, as I don't want to change this code as
little as possible when introducing the time.tzset and time.tzsetwall
methods. This should simply be a method of doing the following once,
diff --git a/PC/_winreg.c b/PC/_winreg.c
index 84e760c..9d2014a 100644
--- a/PC/_winreg.c
+++ b/PC/_winreg.c
@@ -289,6 +289,22 @@ PyDoc_STRVAR(SetValueEx_doc,
"2048 bytes) should be stored as files with the filenames stored in \n"
"the configuration registry. This helps the registry perform efficiently.");
+PyDoc_STRVAR(DisableReflectionKey_doc,
+"Disables registry reflection for 32bit processes running on a 64bit\n"
+"Operating System. Will generally raise NotImplemented if executed on\n"
+"a 32bit Operating System.\n"
+"If the key is not on the reflection list, the function succeeds but has no effect.\n"
+"Disabling reflection for a key does not affect reflection of any subkeys.");
+
+PyDoc_STRVAR(EnableReflectionKey_doc,
+"Restores registry reflection for the specified disabled key.\n"
+"Will generally raise NotImplemented if executed on a 32bit Operating System.\n"
+"Restoring reflection for a key does not affect reflection of any subkeys.");
+
+PyDoc_STRVAR(QueryReflectionKey_doc,
+"bool = QueryReflectionKey(hkey) - Determines the reflection state for the specified key.\n"
+"Will generally raise NotImplemented if executed on a 32bit Operating System.\n");
+
/* PyHKEY docstrings */
PyDoc_STRVAR(PyHKEY_doc,
"PyHKEY Object - A Python object, representing a win32 registry key.\n"
@@ -1393,12 +1409,122 @@ PySetValueEx(PyObject *self, PyObject *args)
return Py_None;
}
+static PyObject *
+PyDisableReflectionKey(PyObject *self, PyObject *args)
+{
+ HKEY hKey;
+ PyObject *obKey;
+ HMODULE hMod;
+ typedef LONG (WINAPI *RDRKFunc)(HKEY);
+ RDRKFunc pfn = NULL;
+ LONG rc;
+
+ if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
+ return NULL;
+ if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
+ return NULL;
+
+ // Only available on 64bit platforms, so we must load it
+ // dynamically.
+ hMod = GetModuleHandle("advapi32.dll");
+ if (hMod)
+ pfn = (RDRKFunc)GetProcAddress(hMod,
+ "RegDisableReflectionKey");
+ if (!pfn) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "not implemented on this platform");
+ return NULL;
+ }
+ Py_BEGIN_ALLOW_THREADS
+ rc = (*pfn)(hKey);
+ Py_END_ALLOW_THREADS
+ if (rc != ERROR_SUCCESS)
+ return PyErr_SetFromWindowsErrWithFunction(rc,
+ "RegDisableReflectionKey");
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+PyEnableReflectionKey(PyObject *self, PyObject *args)
+{
+ HKEY hKey;
+ PyObject *obKey;
+ HMODULE hMod;
+ typedef LONG (WINAPI *RERKFunc)(HKEY);
+ RERKFunc pfn = NULL;
+ LONG rc;
+
+ if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
+ return NULL;
+ if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
+ return NULL;
+
+ // Only available on 64bit platforms, so we must load it
+ // dynamically.
+ hMod = GetModuleHandle("advapi32.dll");
+ if (hMod)
+ pfn = (RERKFunc)GetProcAddress(hMod,
+ "RegEnableReflectionKey");
+ if (!pfn) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "not implemented on this platform");
+ return NULL;
+ }
+ Py_BEGIN_ALLOW_THREADS
+ rc = (*pfn)(hKey);
+ Py_END_ALLOW_THREADS
+ if (rc != ERROR_SUCCESS)
+ return PyErr_SetFromWindowsErrWithFunction(rc,
+ "RegEnableReflectionKey");
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+PyQueryReflectionKey(PyObject *self, PyObject *args)
+{
+ HKEY hKey;
+ PyObject *obKey;
+ HMODULE hMod;
+ typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
+ RQRKFunc pfn = NULL;
+ BOOL result;
+ LONG rc;
+
+ if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
+ return NULL;
+ if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
+ return NULL;
+
+ // Only available on 64bit platforms, so we must load it
+ // dynamically.
+ hMod = GetModuleHandle("advapi32.dll");
+ if (hMod)
+ pfn = (RQRKFunc)GetProcAddress(hMod,
+ "RegQueryReflectionKey");
+ if (!pfn) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "not implemented on this platform");
+ return NULL;
+ }
+ Py_BEGIN_ALLOW_THREADS
+ rc = (*pfn)(hKey, &result);
+ Py_END_ALLOW_THREADS
+ if (rc != ERROR_SUCCESS)
+ return PyErr_SetFromWindowsErrWithFunction(rc,
+ "RegQueryReflectionKey");
+ return PyBool_FromLong(rc);
+}
+
static struct PyMethodDef winreg_methods[] = {
{"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
{"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
{"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
{"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
{"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
+ {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
+ {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
{"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
{"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
{"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
@@ -1410,6 +1536,7 @@ static struct PyMethodDef winreg_methods[] = {
{"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
{"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
{"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
+ {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
{"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
{"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
{"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
@@ -1478,6 +1605,12 @@ PyMODINIT_FUNC init_winreg(void)
ADD_INT(KEY_WRITE);
ADD_INT(KEY_EXECUTE);
ADD_INT(KEY_ALL_ACCESS);
+#ifdef KEY_WOW64_64KEY
+ ADD_INT(KEY_WOW64_64KEY);
+#endif
+#ifdef KEY_WOW64_32KEY
+ ADD_INT(KEY_WOW64_32KEY);
+#endif
ADD_INT(REG_OPTION_RESERVED);
ADD_INT(REG_OPTION_NON_VOLATILE);
ADD_INT(REG_OPTION_VOLATILE);
diff --git a/PCbuild/kill_python.vcproj b/PCbuild/kill_python.vcproj
index 9f11075..a34107a 100644
--- a/PCbuild/kill_python.vcproj
+++ b/PCbuild/kill_python.vcproj
@@ -77,8 +77,6 @@
/>
<Tool
Name="VCPostBuildEventTool"
- Description="Killing existing Python processes..."
- CommandLine="&quot;$(KillPythonExe)&quot;"
/>
</Configuration>
<Configuration
@@ -140,8 +138,6 @@
/>
<Tool
Name="VCPostBuildEventTool"
- Description="Killing existing Python processes..."
- CommandLine="&quot;$(KillPythonExe)&quot;"
/>
</Configuration>
<Configuration
@@ -202,8 +198,6 @@
/>
<Tool
Name="VCPostBuildEventTool"
- Description="Killing existing Python processes..."
- CommandLine="&quot;$(KillPythonExe)&quot;"
/>
</Configuration>
<Configuration
@@ -265,8 +259,6 @@
/>
<Tool
Name="VCPostBuildEventTool"
- Description="Killing existing Python processes..."
- CommandLine="&quot;$(KillPythonExe)&quot;"
/>
</Configuration>
</Configurations>
diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj
index 9c9c239..1ad311d 100644
--- a/PCbuild/pythoncore.vcproj
+++ b/PCbuild/pythoncore.vcproj
@@ -58,8 +58,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
/>
<Tool
Name="VCLinkerTool"
@@ -133,8 +133,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
/>
<Tool
Name="VCLinkerTool"
@@ -211,8 +211,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Debug&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Debug"
/>
<Tool
Name="VCLinkerTool"
@@ -289,8 +289,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Debug&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Debug"
/>
<Tool
Name="VCLinkerTool"
@@ -363,8 +363,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
/>
<Tool
Name="VCLinkerTool"
@@ -438,8 +438,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
/>
<Tool
Name="VCLinkerTool"
@@ -513,8 +513,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
/>
<Tool
Name="VCLinkerTool"
@@ -588,8 +588,8 @@
/>
<Tool
Name="VCPreLinkEventTool"
- Description="Generate build information and kill existing Python processes..."
- CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release&#x0D;&#x0A;&quot;$(KillPythonExe)&quot;"
+ Description="Generate build information..."
+ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
/>
<Tool
Name="VCLinkerTool"
diff --git a/Tools/buildbot/build-amd64.bat b/Tools/buildbot/build-amd64.bat
index 1d828eb..5175c62 100644
--- a/Tools/buildbot/build-amd64.bat
+++ b/Tools/buildbot/build-amd64.bat
@@ -2,4 +2,5 @@
cmd /c Tools\buildbot\external-amd64.bat
call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
cmd /c Tools\buildbot\clean-amd64.bat
+vcbuild /useenv PCbuild\kill_python.vcproj "Debug|x64" && PCbuild\amd64\kill_python_d.exe
vcbuild PCbuild\pcbuild.sln "Debug|x64"
diff --git a/Tools/buildbot/build.bat b/Tools/buildbot/build.bat
index 6bac3ed..ab3ea7d 100644
--- a/Tools/buildbot/build.bat
+++ b/Tools/buildbot/build.bat
@@ -2,5 +2,6 @@
cmd /c Tools\buildbot\external.bat
call "%VS90COMNTOOLS%vsvars32.bat"
cmd /c Tools\buildbot\clean.bat
+vcbuild /useenv PCbuild\kill_python.vcproj "Debug|Win32" && PCbuild\kill_python_d.exe
vcbuild /useenv PCbuild\pcbuild.sln "Debug|Win32"