From 3198f74280f7e2e2e445ff179c0eebb2924a6a1a Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 5 Jan 2016 15:52:02 +0100 Subject: [run-virt] openslx.exe: Rename Shutdown button to "Abmelden" (Win7 only) --- .../data/opt/openslx/vmchooser/data/openslx.exe | Bin 14336 -> 14848 bytes remote/modules/run-virt/winres.c | 141 +++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 remote/modules/run-virt/winres.c (limited to 'remote') diff --git a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe index 31666278..eec60c3a 100755 Binary files a/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe and b/remote/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe differ diff --git a/remote/modules/run-virt/winres.c b/remote/modules/run-virt/winres.c new file mode 100644 index 00000000..1af91d33 --- /dev/null +++ b/remote/modules/run-virt/winres.c @@ -0,0 +1,141 @@ +#define NTDDI_VERSION NTDDI_VISTA +#define WINVER 0x0602 +#define _WIN32_WINNT 0x0602 +//#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_GUID(ID_IAudioEndpointVolume, 0x5CDF2C82, 0x841E, 0x4546, 0x97, 0x22, 0x0C, 0xF7, 0x40, 0x78, 0x22, 0x9A); +DEFINE_GUID(ID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6); +DEFINE_GUID(ID_MMDeviceEnumerator, 0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E); + +static int setResolution(); +static int muteSound(); +static int setShutdownText(); + +int main(int argc, char ** argv) +{ + int ret; + /* + // Part 1: Auf UDP Paket vom Host warten, mit Anweisungen zur Auflösung + WSADATA wsa; + WSAStartup(MAKEWORD(2, 0), &wsa); + if (ret != 0) return 1; + SOCKET s = socket(PF_INET, SOCK_DGRAM, 0); + if (s == INVALID_SOCKET) return 2; + SOCKADDR_IN local, remote; + local.sin_family = AF_INET; + local.sin_port = htons(2013); + local.sin_addr.s_addr = ADDR_ANY; + ret = bind(s, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); + if (ret == SOCKET_ERROR) return 3; + for (;;) { + recvfrom(s, + } + */ + OSVERSIONINFO version; + version.dwOSVersionInfoSize = sizeof(version); + BOOL retVer = GetVersionEx(&version); + setResolution(); + if (retVer && version.dwMajorVersion >= 6) + muteSound(); + ret = setShutdownText(); + char buffer[100]; + snprintf(buffer, 100, "Returned %d", ret); + if (ret != 0) + MessageBoxA(0, buffer, "Set caption", 0); + return 0; +} + +static int setResolution() +{ + int ret, i; + int width, height; + // Quicker way: use config file in floppy + FILE *h = fopen("B:\\hostres.txt", "rb"); + if (h == NULL) return 4; + char data[200] = ""; + fread(data, 200, 1, h); + char *x = strchr(data, 'x'); + if (x == NULL) return 5; + *x++ = '\0'; + width = atoi(data); + height = atoi(x); + fclose(h); + // Part 2: Auflösung setzen und verabschieden + DEVMODE mode; + int query = 1337; + for (i = 0; i < 6; ++i) { + memset(&mode, 0, sizeof(mode)); + mode.dmSize = sizeof(mode); + // MSDN recommends to fill the struct first by querying.... + query = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &mode); + // Then set our own desired mode + mode.dmPelsWidth = width; + mode.dmPelsHeight = height; + mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + ret = ChangeDisplaySettings(&mode , (i < 3 ? CDS_GLOBAL : 0) | (i < 2 ? CDS_UPDATEREGISTRY : 0)); + if (ret == DISP_CHANGE_SUCCESSFUL) break; + Sleep(1000); + } + if (ret != DISP_CHANGE_SUCCESSFUL) { + char err[200]; + snprintf(err, 200, + "Fehler beim Setzen der Aufloesung: %d (soll: 0) / %d ( soll: !0)\r\n" + "Zielaufloesung: %d * %d", ret, query, width, height); + MessageBoxA(0, err, "OpenSLX", 0); + } + return 0; +} + +static int muteSound() +{ + CoInitialize(NULL); + IMMDeviceEnumerator *deviceEnumerator = NULL; + HRESULT hr = CoCreateInstance(&ID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &ID_IMMDeviceEnumerator, (LPVOID *)&deviceEnumerator); + if (hr != S_OK) { + MessageBoxA(0, "CoCreateInstance failed. Cannot mute.", "OpenSLX", 0); + return 1; + } + //deviceEnumerator->lpVtbl->AddRef(deviceEnumerator); + IMMDevice *defaultDevice = NULL; + hr = deviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(deviceEnumerator, eRender, eConsole, &defaultDevice); + if (hr != S_OK) { + MessageBoxA(0, "GetDefaultAudioEndpoint failed. Cannot mute.", "OpenSLX", 0); + return 2; + } + //defaultDevice->lpVtbl->AddRef(defaultDevice); + //deviceEnumerator->lpVtbl->Release(deviceEnumerator); + IAudioEndpointVolume *endpointVolume = NULL; + hr = defaultDevice->lpVtbl->Activate(defaultDevice, &ID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); + if (hr != S_OK) { + MessageBoxA(0, "IMMDevice::Activate() failed. Cannot mute.", "OpenSLX", 0); + return 3; + } + //endpointVolume->lpVtbl->AddRef(endpointVolume); + //defaultDevice->lpVtbl->Release(defaultDevice); + float targetVolume = 1; + endpointVolume->lpVtbl->SetMasterVolumeLevelScalar(endpointVolume, targetVolume, NULL); + endpointVolume->lpVtbl->SetMute(endpointVolume, TRUE, NULL); + //endpointVolume->lpVtbl->Release(endpointVolume); + //CoUninitialize(); + return 0; +} + +static int setShutdownText() +{ + HWND hMenu = FindWindowA("DV2ControlHost", NULL); + if (hMenu == NULL) return 1; + HWND hPane = FindWindowExA(hMenu, NULL, "DesktopLogoffPane", NULL); + if (hMenu == NULL) return 2; + HWND hButton = FindWindowExA(hPane, NULL, "Button", NULL); + if (hButton == NULL) return 3; + if (SendMessage(hButton, WM_SETTEXT, 0, (LPARAM)"Abmelden") != TRUE) return 4; + return 0; +} + -- cgit v1.2.3-55-g7522