diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2017-05-03 23:09:34 +0200 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2017-05-03 23:09:34 +0200 |
commit | 3fccfda70bec96223b3447594b23789e8755854c (patch) | |
tree | a214686206d6443f3850eaab0ec1f0c003674840 | |
parent | 7e86fc4d18ef6715b38c9e1122329e16c4d33e89 (diff) | |
download | psutil-3fccfda70bec96223b3447594b23789e8755854c.tar.gz |
#1040: use EnumServiceStatusExW and return proper unicode for service enumerate() and display_name()
-rw-r--r-- | psutil/arch/windows/services.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/psutil/arch/windows/services.c b/psutil/arch/windows/services.c index c65b50e5..52b3d99c 100644 --- a/psutil/arch/windows/services.c +++ b/psutil/arch/windows/services.c @@ -18,10 +18,9 @@ SC_HANDLE psutil_get_service_handler(char *service_name, DWORD scm_access, DWORD access) { - ENUM_SERVICE_STATUS_PROCESS *lpService = NULL; + ENUM_SERVICE_STATUS_PROCESSW *lpService = NULL; SC_HANDLE sc = NULL; SC_HANDLE hService = NULL; - SERVICE_DESCRIPTIONW *scd = NULL; sc = OpenSCManager(NULL, NULL, scm_access); if (sc == NULL) { @@ -96,7 +95,7 @@ get_state_string(DWORD state) { */ PyObject * psutil_winservice_enumerate(PyObject *self, PyObject *args) { - ENUM_SERVICE_STATUS_PROCESS *lpService = NULL; + ENUM_SERVICE_STATUS_PROCESSW *lpService = NULL; BOOL ok; SC_HANDLE sc = NULL; DWORD bytesNeeded = 0; @@ -106,7 +105,8 @@ psutil_winservice_enumerate(PyObject *self, PyObject *args) { DWORD i; PyObject *py_retlist = PyList_New(0); PyObject *py_tuple = NULL; - PyObject *py_unicode_display_name = NULL; + PyObject *py_name = NULL; + PyObject *py_display_name = NULL; if (py_retlist == NULL) return NULL; @@ -118,7 +118,7 @@ psutil_winservice_enumerate(PyObject *self, PyObject *args) { } for (;;) { - ok = EnumServicesStatusEx( + ok = EnumServicesStatusExW( sc, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, // XXX - extend this to include drivers etc.? @@ -134,31 +134,31 @@ psutil_winservice_enumerate(PyObject *self, PyObject *args) { if (lpService) free(lpService); dwBytes = bytesNeeded; - lpService = (ENUM_SERVICE_STATUS_PROCESS*)malloc(dwBytes); + lpService = (ENUM_SERVICE_STATUS_PROCESSW*)malloc(dwBytes); } for (i = 0; i < srvCount; i++) { - // Get unicode display name. - py_unicode_display_name = NULL; - py_unicode_display_name = PyUnicode_Decode( - lpService[i].lpDisplayName, - _tcslen(lpService[i].lpDisplayName), - Py_FileSystemDefaultEncoding, - "replace"); - if (py_unicode_display_name == NULL) + // Get unicode name / display name. + py_name = NULL; + py_name = PyUnicode_FromWideChar( + lpService[i].lpServiceName, wcslen(lpService[i].lpServiceName)); + if (py_name == NULL) + goto error; + + py_display_name = NULL; + py_display_name = PyUnicode_FromWideChar( + lpService[i].lpDisplayName, wcslen(lpService[i].lpDisplayName)); + if (py_display_name == NULL) goto error; // Construct the result. - py_tuple = Py_BuildValue( - "(sO)", - lpService[i].lpServiceName, // name - py_unicode_display_name // display_name - ); + py_tuple = Py_BuildValue("(OO)", py_name, py_display_name); if (py_tuple == NULL) goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_unicode_display_name); + Py_DECREF(py_display_name); + Py_DECREF(py_name); Py_DECREF(py_tuple); } @@ -168,7 +168,8 @@ psutil_winservice_enumerate(PyObject *self, PyObject *args) { return py_retlist; error: - Py_XDECREF(py_unicode_display_name); + Py_DECREF(py_name); + Py_XDECREF(py_display_name); Py_XDECREF(py_tuple); Py_DECREF(py_retlist); if (sc != NULL) @@ -360,7 +361,7 @@ error: */ PyObject * psutil_winservice_query_descr(PyObject *self, PyObject *args) { - ENUM_SERVICE_STATUS_PROCESS *lpService = NULL; + ENUM_SERVICE_STATUS_PROCESSW *lpService = NULL; BOOL ok; DWORD bytesNeeded = 0; DWORD resumeHandle = 0; @@ -386,7 +387,7 @@ psutil_winservice_query_descr(PyObject *self, PyObject *args) { // Also services.msc fails in the same manner, so we return an // empty string. CloseServiceHandle(hService); - return Py_BuildValue("u", ""); + return Py_BuildValue("s", ""); } if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { PyErr_SetFromWindowsErr(0); |