summaryrefslogtreecommitdiff
path: root/win
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2021-11-19 14:03:51 +0100
committerSergei Golubchik <serg@mariadb.org>2021-12-15 19:13:57 +0100
commitea0a5cb0a4efbca1fc35885599e07baf10dc3e9e (patch)
tree8282d58bf98178b764b6f6f09c594670a4091e5a /win
parent99e5ae3b1a68ad1029f06aa3d2a5078d78cf19e5 (diff)
downloadmariadb-git-ea0a5cb0a4efbca1fc35885599e07baf10dc3e9e.tar.gz
MDEV-27092 Windows - services that have non-ASCII characters do not work with activeCodePage=UTF8
CreateServiceA, OpenServiceA, and couple of other functions do not work correctly with non-ASCII character, in the special case where application has defined activeCodePage=UTF8. Workaround by redefining affected ANSI functions to own wrapper, which works by converting narrow(ANSI) to wide, then calling wide function. Deprecate original ANSI service functions, via declspec, so that we can catch their use.
Diffstat (limited to 'win')
-rw-r--r--win/upgrade_wizard/CMakeLists.txt1
-rw-r--r--win/upgrade_wizard/upgradeDlg.cpp18
2 files changed, 12 insertions, 7 deletions
diff --git a/win/upgrade_wizard/CMakeLists.txt b/win/upgrade_wizard/CMakeLists.txt
index 20a06a41215..fd3560e1ee6 100644
--- a/win/upgrade_wizard/CMakeLists.txt
+++ b/win/upgrade_wizard/CMakeLists.txt
@@ -5,6 +5,7 @@ ENDIF()
# We need MFC
# /permissive- flag does not play well with MFC, disable it.
STRING(REPLACE "/permissive-" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+REMOVE_DEFINITIONS(-DNOSERVICE) # fixes "already defined" warning in an AFX header
FIND_PACKAGE(MFC)
IF(NOT MFC_FOUND)
diff --git a/win/upgrade_wizard/upgradeDlg.cpp b/win/upgrade_wizard/upgradeDlg.cpp
index 80f7c18f757..7aae4890b51 100644
--- a/win/upgrade_wizard/upgradeDlg.cpp
+++ b/win/upgrade_wizard/upgradeDlg.cpp
@@ -141,24 +141,24 @@ void CUpgradeDlg::PopulateServicesList()
ErrorExit("OpenSCManager failed");
}
- static BYTE buf[64*1024];
+ static BYTE buf[2*64*1024];
static BYTE configBuffer[8*1024];
DWORD bufsize= sizeof(buf);
DWORD bufneed;
DWORD num_services;
- BOOL ok= EnumServicesStatusEx(scm, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,
+ BOOL ok= EnumServicesStatusExW(scm, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,
SERVICE_STATE_ALL, buf, bufsize, &bufneed, &num_services, NULL, NULL);
if(!ok)
ErrorExit("EnumServicesStatusEx failed");
- LPENUM_SERVICE_STATUS_PROCESS info =
- (LPENUM_SERVICE_STATUS_PROCESS)buf;
+ LPENUM_SERVICE_STATUS_PROCESSW info =
+ (LPENUM_SERVICE_STATUS_PROCESSW)buf;
int index=-1;
for (ULONG i=0; i < num_services; i++)
{
- SC_HANDLE service= OpenService(scm, info[i].lpServiceName,
+ SC_HANDLE service= OpenServiceW(scm, info[i].lpServiceName,
SERVICE_QUERY_CONFIG);
if (!service)
continue;
@@ -187,7 +187,11 @@ void CUpgradeDlg::PopulateServicesList()
ServiceProperties props;
props.myini= service_props.inifile;
props.datadir= service_props.datadir;
- props.servicename = info[i].lpServiceName;
+ char service_name_buf[1024];
+ WideCharToMultiByte(GetACP(), 0, info[i].lpServiceName, -1,
+ service_name_buf, sizeof(service_name_buf),
+ 0, 0);
+ props.servicename= service_name_buf;
if (service_props.version_major)
{
char ver[64];
@@ -198,7 +202,7 @@ void CUpgradeDlg::PopulateServicesList()
else
props.version= "<unknown>";
- index = m_Services.AddString(info[i].lpServiceName);
+ index = m_Services.AddString(service_name_buf);
services.resize(index+1);
services[index] = props;
}