| Index: c/os_win32_system.c
|
| diff --git a/c/os_win32_system.c b/c/os_win32_system.c
|
| deleted file mode 100644
|
| index 7d299f1d4c878b1434918e2ffe12c47357b3c730..0000000000000000000000000000000000000000
|
| --- a/c/os_win32_system.c
|
| +++ /dev/null
|
| @@ -1,473 +0,0 @@
|
| -#ifdef _WINDOWS
|
| -
|
| -/* Licensed to the Apache Software Foundation (ASF) under one or more
|
| - * contributor license agreements. See the NOTICE file distributed with
|
| - * this work for additional information regarding copyright ownership.
|
| - * The ASF licenses this file to You under the Apache License, Version 2.0
|
| - * (the "License"); you may not use this file except in compliance with
|
| - * the License. You may obtain a copy of the License at
|
| - *
|
| - * http://www.apache.org/licenses/LICENSE-2.0
|
| - *
|
| - * Unless required by applicable law or agreed to in writing, software
|
| - * distributed under the License is distributed on an "AS IS" BASIS,
|
| - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| - * See the License for the specific language governing permissions and
|
| - * limitations under the License.
|
| - */
|
| -
|
| -/*
|
| - *
|
| - * @author Mladen Turk
|
| - * @version $Id: system.c 1442587 2013-02-05 13:49:48Z rjung $
|
| - */
|
| -
|
| -#ifndef _WIN32_WINNT
|
| -#define _WIN32_WINNT 0x0500
|
| -#endif
|
| -#include <winsock2.h>
|
| -#include <mswsock.h>
|
| -#include <ws2tcpip.h>
|
| -#include <tlhelp32.h>
|
| -
|
| -#include "apr.h"
|
| -#include "apr_pools.h"
|
| -#include "apr_poll.h"
|
| -#include "apr_network_io.h"
|
| -#include "apr_arch_misc.h" /* for apr_os_level */
|
| -#include "apr_arch_atime.h" /* for FileTimeToAprTime */
|
| -
|
| -#include "tcn.h"
|
| -#ifdef HAVE_OPENSSL
|
| -#include "ssl_private.h"
|
| -#endif
|
| -
|
| -#pragma warning(push)
|
| -#pragma warning(disable : 4201)
|
| -#if (_WIN32_WINNT < 0x0501)
|
| -#include <winternl.h>
|
| -#endif
|
| -#include <psapi.h>
|
| -#pragma warning(pop)
|
| -
|
| -
|
| -static CRITICAL_SECTION dll_critical_section; /* dll's critical section */
|
| -static HINSTANCE dll_instance = NULL;
|
| -static SYSTEM_INFO dll_system_info;
|
| -static HANDLE h_kernel = NULL;
|
| -static HANDLE h_ntdll = NULL;
|
| -static char dll_file_name[MAX_PATH];
|
| -
|
| -typedef BOOL (WINAPI *pfnGetSystemTimes)(LPFILETIME, LPFILETIME, LPFILETIME);
|
| -static pfnGetSystemTimes fnGetSystemTimes = NULL;
|
| -#if (_WIN32_WINNT < 0x0501)
|
| -typedef NTSTATUS (WINAPI *pfnNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
|
| -static pfnNtQuerySystemInformation fnNtQuerySystemInformation = NULL;
|
| -#endif
|
| -
|
| -BOOL
|
| -WINAPI
|
| -DllMain(
|
| - HINSTANCE instance,
|
| - DWORD reason,
|
| - LPVOID reserved)
|
| -{
|
| -
|
| - switch (reason) {
|
| - /** The DLL is loading due to process
|
| - * initialization or a call to LoadLibrary.
|
| - */
|
| - case DLL_PROCESS_ATTACH:
|
| - InitializeCriticalSection(&dll_critical_section);
|
| - dll_instance = instance;
|
| - GetSystemInfo(&dll_system_info);
|
| - if ((h_kernel = LoadLibrary("kernel32.dll")) != NULL)
|
| - fnGetSystemTimes = (pfnGetSystemTimes)GetProcAddress(h_kernel,
|
| - "GetSystemTimes");
|
| - if (fnGetSystemTimes == NULL) {
|
| - FreeLibrary(h_kernel);
|
| - h_kernel = NULL;
|
| -#if (_WIN32_WINNT < 0x0501)
|
| - if ((h_ntdll = LoadLibrary("ntdll.dll")) != NULL)
|
| - fnNtQuerySystemInformation =
|
| - (pfnNtQuerySystemInformation)GetProcAddress(h_ntdll,
|
| - "NtQuerySystemInformation");
|
| -
|
| - if (fnNtQuerySystemInformation == NULL) {
|
| - FreeLibrary(h_ntdll);
|
| - h_ntdll = NULL;
|
| - }
|
| -#endif
|
| - }
|
| - GetModuleFileName(instance, dll_file_name, sizeof(dll_file_name));
|
| - break;
|
| - /** The attached process creates a new thread.
|
| - */
|
| - case DLL_THREAD_ATTACH:
|
| - break;
|
| -
|
| - /** The thread of the attached process terminates.
|
| - */
|
| - case DLL_THREAD_DETACH:
|
| - break;
|
| -
|
| - /** DLL unload due to process termination
|
| - * or FreeLibrary.
|
| - */
|
| - case DLL_PROCESS_DETACH:
|
| - if (h_kernel)
|
| - FreeLibrary(h_kernel);
|
| - if (h_ntdll)
|
| - FreeLibrary(h_ntdll);
|
| - DeleteCriticalSection(&dll_critical_section);
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - return TRUE;
|
| - UNREFERENCED_PARAMETER(reserved);
|
| -}
|
| -
|
| -
|
| -TCN_IMPLEMENT_CALL(jstring, OS, syserror)(TCN_STDARGS, jint err)
|
| -{
|
| - jstring str;
|
| - void *buf;
|
| -
|
| - UNREFERENCED(o);
|
| - if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
| - FORMAT_MESSAGE_FROM_SYSTEM |
|
| - FORMAT_MESSAGE_IGNORE_INSERTS,
|
| - NULL,
|
| - err,
|
| - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
| - (LPTSTR)&buf,
|
| - 0,
|
| - NULL)) {
|
| - str = AJP_TO_JSTRING("Unknown Error");
|
| - }
|
| - else {
|
| - str = AJP_TO_JSTRING((const char *)buf);
|
| - LocalFree(buf);
|
| - }
|
| - return str;
|
| -}
|
| -
|
| -TCN_IMPLEMENT_CALL(jstring, OS, expand)(TCN_STDARGS, jstring val)
|
| -{
|
| - jstring str;
|
| - jchar buf[TCN_BUFFER_SZ] = L"";
|
| - DWORD len;
|
| - TCN_ALLOC_WSTRING(val);
|
| -
|
| - UNREFERENCED(o);
|
| - TCN_INIT_WSTRING(val);
|
| -
|
| - len = ExpandEnvironmentStringsW(J2W(val), buf, TCN_BUFFER_SZ - 1);
|
| - if (len > (TCN_BUFFER_SZ - 1)) {
|
| - jchar *dbuf = malloc((len + 1) * 2);
|
| - ExpandEnvironmentStringsW(J2W(val), dbuf, len);
|
| - str = (*e)->NewString(e, dbuf, lstrlenW(dbuf));
|
| - free(dbuf);
|
| - }
|
| - else
|
| - str = (*e)->NewString(e, buf, lstrlenW(buf));
|
| -
|
| - TCN_FREE_WSTRING(val);
|
| - return str;
|
| -}
|
| -
|
| -#define LOG_MSG_EMERG 0xC0000001L
|
| -#define LOG_MSG_ERROR 0xC0000002L
|
| -#define LOG_MSG_NOTICE 0x80000003L
|
| -#define LOG_MSG_WARN 0x80000004L
|
| -#define LOG_MSG_INFO 0x40000005L
|
| -#define LOG_MSG_DEBUG 0x00000006L
|
| -#define LOG_MSG_DOMAIN "Native"
|
| -
|
| -static char log_domain[MAX_PATH] = "Native";
|
| -
|
| -static void init_log_source(const char *domain)
|
| -{
|
| - HKEY key;
|
| - DWORD ts;
|
| - char event_key[MAX_PATH];
|
| -
|
| - strcpy(event_key, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\");
|
| - strcat(event_key, domain);
|
| - if (!RegCreateKey(HKEY_LOCAL_MACHINE, event_key, &key)) {
|
| - RegSetValueEx(key, "EventMessageFile", 0, REG_SZ, (LPBYTE)&dll_file_name[0],
|
| - lstrlenA(dll_file_name) + 1);
|
| - ts = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
|
| -
|
| - RegSetValueEx(key, "TypesSupported", 0, REG_DWORD, (LPBYTE) &ts, sizeof(DWORD));
|
| - RegCloseKey(key);
|
| - }
|
| - strcpy(log_domain, domain);
|
| -}
|
| -
|
| -TCN_IMPLEMENT_CALL(void, OS, sysloginit)(TCN_STDARGS, jstring domain)
|
| -{
|
| - const char *d;
|
| - TCN_ALLOC_CSTRING(domain);
|
| -
|
| - UNREFERENCED(o);
|
| -
|
| - if ((d = J2S(domain)) == NULL)
|
| - d = LOG_MSG_DOMAIN;
|
| - init_log_source(d);
|
| -
|
| - TCN_FREE_CSTRING(domain);
|
| -}
|
| -
|
| -TCN_IMPLEMENT_CALL(void, OS, syslog)(TCN_STDARGS, jint level,
|
| - jstring msg)
|
| -{
|
| - TCN_ALLOC_CSTRING(msg);
|
| - DWORD id = LOG_MSG_DEBUG;
|
| - WORD il = EVENTLOG_SUCCESS;
|
| - HANDLE source;
|
| - const char *messages[1];
|
| - UNREFERENCED(o);
|
| -
|
| - switch (level) {
|
| - case TCN_LOG_EMERG:
|
| - id = LOG_MSG_EMERG;
|
| - il = EVENTLOG_ERROR_TYPE;
|
| - break;
|
| - case TCN_LOG_ERROR:
|
| - id = LOG_MSG_ERROR;
|
| - il = EVENTLOG_ERROR_TYPE;
|
| - break;
|
| - case TCN_LOG_NOTICE:
|
| - id = LOG_MSG_NOTICE;
|
| - il = EVENTLOG_WARNING_TYPE;
|
| - break;
|
| - case TCN_LOG_WARN:
|
| - id = LOG_MSG_WARN;
|
| - il = EVENTLOG_WARNING_TYPE;
|
| - break;
|
| - case TCN_LOG_INFO:
|
| - id = LOG_MSG_INFO;
|
| - il = EVENTLOG_INFORMATION_TYPE;
|
| - break;
|
| - }
|
| -
|
| - messages[0] = J2S(msg);
|
| - source = RegisterEventSource(NULL, log_domain);
|
| -
|
| - if (source != NULL) {
|
| - ReportEvent(source, il,
|
| - 0,
|
| - id,
|
| - NULL,
|
| - 1, 0,
|
| - messages, NULL);
|
| - DeregisterEventSource(source);
|
| - }
|
| -
|
| - TCN_FREE_CSTRING(msg);
|
| -}
|
| -
|
| -TCN_IMPLEMENT_CALL(jboolean, OS, is)(TCN_STDARGS, jint type)
|
| -{
|
| - UNREFERENCED_STDARGS;
|
| -#ifdef _WIN64
|
| - if (type == 4)
|
| - return JNI_TRUE;
|
| - else
|
| -#endif
|
| - if (type == 3)
|
| - return JNI_TRUE;
|
| - else
|
| - return JNI_FALSE;
|
| -}
|
| -
|
| -TCN_IMPLEMENT_CALL(jint, OS, info)(TCN_STDARGS,
|
| - jlongArray inf)
|
| -{
|
| - MEMORYSTATUSEX ms;
|
| - ULONGLONG st[4];
|
| - FILETIME ft[4];
|
| - PROCESS_MEMORY_COUNTERS pmc;
|
| - jint rv;
|
| - int i;
|
| - jsize ilen = (*e)->GetArrayLength(e, inf);
|
| - jlong *pvals = (*e)->GetLongArrayElements(e, inf, NULL);
|
| -
|
| - if (ilen < 16) {
|
| - return APR_EINVAL;
|
| - }
|
| - for (i = 0; i < 16; i++)
|
| - pvals[i] = 0;
|
| -
|
| - ms.dwLength = sizeof(MEMORYSTATUSEX);
|
| -
|
| - UNREFERENCED(o);
|
| - if (GlobalMemoryStatusEx(&ms)) {
|
| - pvals[0] = (jlong)ms.ullTotalPhys;
|
| - pvals[1] = (jlong)ms.ullAvailPhys;
|
| - pvals[2] = (jlong)ms.ullTotalPageFile;
|
| - pvals[3] = (jlong)ms.ullAvailPageFile;
|
| - /* Slots 4 and 5 are for shared memory */
|
| - pvals[6] = (jlong)ms.dwMemoryLoad;
|
| - }
|
| - else
|
| - goto cleanup;
|
| -
|
| - memset(st, 0, sizeof(st));
|
| -
|
| - if (fnGetSystemTimes) {
|
| - if ((*fnGetSystemTimes)(&ft[0], &ft[1], &ft[2])) {
|
| - st[0] = (((ULONGLONG)ft[0].dwHighDateTime << 32) | ft[0].dwLowDateTime) / 10;
|
| - st[1] = (((ULONGLONG)ft[1].dwHighDateTime << 32) | ft[1].dwLowDateTime) / 10;
|
| - st[2] = (((ULONGLONG)ft[2].dwHighDateTime << 32) | ft[2].dwLowDateTime) / 10;
|
| - }
|
| - else
|
| - goto cleanup;
|
| - }
|
| -#if (_WIN32_WINNT < 0x0501)
|
| - else if (fnNtQuerySystemInformation) {
|
| - BYTE buf[2048]; /* This should ne enough for 32 processors */
|
| - NTSTATUS rs = (*fnNtQuerySystemInformation)(SystemProcessorPerformanceInformation,
|
| - (LPVOID)buf, 2048, NULL);
|
| - if (rs == 0) {
|
| - PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION pspi = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)&buf[0];
|
| - DWORD i;
|
| - /* Calculate all processors */
|
| - for (i = 0; i < dll_system_info.dwNumberOfProcessors; i++) {
|
| - st[0] += pspi[i].IdleTime.QuadPart / 10;
|
| - st[1] += pspi[i].KernelTime.QuadPart / 10;
|
| - st[2] += pspi[i].UserTime.QuadPart / 10;
|
| - }
|
| - }
|
| - else
|
| - goto cleanup;
|
| - }
|
| -#endif
|
| - pvals[7] = st[0];
|
| - pvals[8] = st[1];
|
| - pvals[9] = st[2];
|
| -
|
| - memset(st, 0, sizeof(st));
|
| - if (GetProcessTimes(GetCurrentProcess(), &ft[0], &ft[1], &ft[2], &ft[3])) {
|
| - FileTimeToAprTime((apr_time_t *)&st[0], &ft[0]);
|
| - st[1] = (((ULONGLONG)ft[2].dwHighDateTime << 32) | ft[2].dwLowDateTime) / 10;
|
| - st[2] = (((ULONGLONG)ft[3].dwHighDateTime << 32) | ft[3].dwLowDateTime) / 10;
|
| - }
|
| - pvals[10] = st[0];
|
| - pvals[11] = st[1];
|
| - pvals[12] = st[2];
|
| -
|
| - if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) {
|
| - pvals[13] = pmc.WorkingSetSize;
|
| - pvals[14] = pmc.PeakWorkingSetSize;
|
| - pvals[15] = pmc.PageFaultCount;
|
| - }
|
| -
|
| - (*e)->ReleaseLongArrayElements(e, inf, pvals, 0);
|
| - return APR_SUCCESS;
|
| -cleanup:
|
| - rv = apr_get_os_error();
|
| - (*e)->ReleaseLongArrayElements(e, inf, pvals, 0);
|
| - return rv;
|
| -}
|
| -
|
| -#ifdef HAVE_OPENSSL
|
| -
|
| -static DWORD WINAPI password_thread(void *data)
|
| -{
|
| - tcn_pass_cb_t *cb = (tcn_pass_cb_t *)data;
|
| - MSG msg;
|
| - HWINSTA hwss;
|
| - HWINSTA hwsu;
|
| - HDESK hwds;
|
| - HDESK hwdu;
|
| - HWND hwnd;
|
| -
|
| - /* Ensure connection to service window station and desktop, and
|
| - * save their handles.
|
| - */
|
| - GetDesktopWindow();
|
| - hwss = GetProcessWindowStation();
|
| - hwds = GetThreadDesktop(GetCurrentThreadId());
|
| -
|
| - /* Impersonate the client and connect to the User's
|
| - * window station and desktop.
|
| - */
|
| - hwsu = OpenWindowStation("WinSta0", FALSE, MAXIMUM_ALLOWED);
|
| - if (hwsu == NULL) {
|
| - ExitThread(1);
|
| - return 1;
|
| - }
|
| - SetProcessWindowStation(hwsu);
|
| - hwdu = OpenDesktop("Default", 0, FALSE, MAXIMUM_ALLOWED);
|
| - if (hwdu == NULL) {
|
| - SetProcessWindowStation(hwss);
|
| - CloseWindowStation(hwsu);
|
| - ExitThread(1);
|
| - return 1;
|
| - }
|
| - SetThreadDesktop(hwdu);
|
| -
|
| - hwnd = CreateDialog(dll_instance, MAKEINTRESOURCE(1001), NULL, NULL);
|
| - if (hwnd != NULL)
|
| - ShowWindow(hwnd, SW_SHOW);
|
| - else {
|
| - ExitThread(1);
|
| - return 1;
|
| - }
|
| - while (1) {
|
| - if (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) {
|
| - if (msg.message == WM_KEYUP) {
|
| - int nVirtKey = (int)msg.wParam;
|
| - if (nVirtKey == VK_ESCAPE) {
|
| - DestroyWindow(hwnd);
|
| - break;
|
| - }
|
| - else if (nVirtKey == VK_RETURN) {
|
| - HWND he = GetDlgItem(hwnd, 1002);
|
| - if (he) {
|
| - int n = GetWindowText(he, cb->password, SSL_MAX_PASSWORD_LEN - 1);
|
| - cb->password[n] = '\0';
|
| - }
|
| - DestroyWindow(hwnd);
|
| - break;
|
| - }
|
| - }
|
| - TranslateMessage(&msg);
|
| - DispatchMessage(&msg);
|
| - }
|
| - else
|
| - Sleep(100);
|
| - }
|
| - /* Restore window station and desktop.
|
| - */
|
| - SetThreadDesktop(hwds);
|
| - SetProcessWindowStation(hwss);
|
| - CloseDesktop(hwdu);
|
| - CloseWindowStation(hwsu);
|
| -
|
| - ExitThread(0);
|
| - return 0;
|
| -}
|
| -
|
| -int WIN32_SSL_password_prompt(tcn_pass_cb_t *data)
|
| -{
|
| - DWORD id;
|
| - HANDLE thread;
|
| - /* TODO: See how to display this from service mode */
|
| - thread = CreateThread(NULL, 0,
|
| - password_thread, data,
|
| - 0, &id);
|
| - WaitForSingleObject(thread, INFINITE);
|
| - CloseHandle(thread);
|
| - return (int)strlen(data->password);
|
| -}
|
| -
|
| -#endif
|
| -
|
| -#endif
|
| -
|
|
|