summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2017-05-03 22:52:50 +0200
committerGiampaolo Rodola <g.rodola@gmail.com>2017-05-03 22:52:50 +0200
commit7e86fc4d18ef6715b38c9e1122329e16c4d33e89 (patch)
tree04e833623c070aef1f05bbba2e076514fd74efe6
parente47981f672ac9336ab0d61ea766c807f531e80a8 (diff)
downloadpsutil-7e86fc4d18ef6715b38c9e1122329e16c4d33e89.tar.gz
#1040: use QueryServiceConfig2W() and return unicode for windows service description()
-rw-r--r--psutil/arch/windows/services.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/psutil/arch/windows/services.c b/psutil/arch/windows/services.c
index 85ea6ff4..c65b50e5 100644
--- a/psutil/arch/windows/services.c
+++ b/psutil/arch/windows/services.c
@@ -21,7 +21,7 @@ psutil_get_service_handler(char *service_name, DWORD scm_access, DWORD access)
ENUM_SERVICE_STATUS_PROCESS *lpService = NULL;
SC_HANDLE sc = NULL;
SC_HANDLE hService = NULL;
- SERVICE_DESCRIPTION *scd = NULL;
+ SERVICE_DESCRIPTIONW *scd = NULL;
sc = OpenSCManager(NULL, NULL, scm_access);
if (sc == NULL) {
@@ -366,7 +366,7 @@ psutil_winservice_query_descr(PyObject *self, PyObject *args) {
DWORD resumeHandle = 0;
DWORD dwBytes = 0;
SC_HANDLE hService = NULL;
- SERVICE_DESCRIPTION *scd = NULL;
+ SERVICE_DESCRIPTIONW *scd = NULL;
char *service_name;
PyObject *py_retstr = NULL;
@@ -380,22 +380,22 @@ psutil_winservice_query_descr(PyObject *self, PyObject *args) {
// This first call to QueryServiceConfig2() is necessary in order
// to get the right size.
bytesNeeded = 0;
- QueryServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, NULL, 0,
- &bytesNeeded);
+ QueryServiceConfig2W(hService, SERVICE_CONFIG_DESCRIPTION, NULL, 0,
+ &bytesNeeded);
if (GetLastError() == ERROR_MUI_FILE_NOT_FOUND) {
// Also services.msc fails in the same manner, so we return an
// empty string.
CloseServiceHandle(hService);
- return Py_BuildValue("s", "");
+ return Py_BuildValue("u", "");
}
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
PyErr_SetFromWindowsErr(0);
goto error;
}
- scd = (SERVICE_DESCRIPTION *)malloc(bytesNeeded);
- ok = QueryServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION,
- (LPBYTE)scd, bytesNeeded, &bytesNeeded);
+ scd = (SERVICE_DESCRIPTIONW *)malloc(bytesNeeded);
+ ok = QueryServiceConfig2W(hService, SERVICE_CONFIG_DESCRIPTION,
+ (LPBYTE)scd, bytesNeeded, &bytesNeeded);
if (ok == 0) {
PyErr_SetFromWindowsErr(0);
goto error;
@@ -405,11 +405,8 @@ psutil_winservice_query_descr(PyObject *self, PyObject *args) {
py_retstr = Py_BuildValue("s", "");
}
else {
- py_retstr = PyUnicode_Decode(
- scd->lpDescription,
- _tcslen(scd->lpDescription),
- Py_FileSystemDefaultEncoding,
- "replace");
+ py_retstr = PyUnicode_FromWideChar(
+ scd->lpDescription, wcslen(scd->lpDescription));
}
if (!py_retstr)
goto error;