cloudstack/thirdparty/vnc/repeater/gui.cpp

1005 lines
30 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002 Ultr@VNC Team Members. All Rights Reserved.
//
//
// The VNC system is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
//
//
/////////////////////////////////////////////////////////////////////////////
#include <setjmp.h>
#include <windows.h>
#include <windowsx.h>
#include <shellapi.h>
#include <string.h>
#include "resources.h"
#include "resource.h"
#define UWM_SYSTRAY (WM_USER + 1) /* sent to us by the taskbar */
#define LOG_LINES 250
#define STRLEN 1024
#define LOG_EMERG 0
#define LOG_ALERT 1
#define LOG_CRIT 2
#define LOG_ERR 3
#define LOG_WARNING 4
#define LOG_NOTICE 5
#define LOG_INFO 6
#define LOG_DEBUG 7
#define safecopy(dst, src) \
(dst[STRLEN-1]='\0', strncpy((dst), (src), STRLEN-1))
#define safeconcat(dst, src) \
(dst[STRLEN-1]='\0', strncat((dst), (src), STRLEN-strlen(dst)-1))
BOOL taskbar=TRUE;
int num_clients;//undefined
typedef enum {
CRIT_KEYGEN, CRIT_NTOA, CRIT_CLIENTS, CRIT_WIN_LOG, CRIT_SECTIONS
} section_code;
/* Externals */
int unix_main(int, char *[]);
/* Prototypes */
static DWORD WINAPI ThreadFunc(LPVOID);
static LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);
static int win_main(HINSTANCE, HINSTANCE, LPSTR, int);
static void save_file(HWND);
static LRESULT CALLBACK settings_proc(HWND, UINT, WPARAM, LPARAM);
static LRESULT CALLBACK about_proc(HWND, UINT, WPARAM, LPARAM);
static LRESULT CALLBACK pass_proc(HWND, UINT, WPARAM, LPARAM);
static char *log_txt(void);
static void set_visible(int);
/* NT Service related function */
static int start_service(void);
static int install_service(void);
static int uninstall_service(void);
static void WINAPI service_main(DWORD, LPTSTR *);
static void WINAPI control_handler(DWORD);
/* Global variables */
static struct LIST {
struct LIST *next;
int len;
char txt[1]; /* single character for trailing '\0' */
} *head=NULL, *tail=NULL;
static HINSTANCE ghInst;
static HWND EditControl=NULL;
static HMENU htraymenu, hmainmenu;
static HMENU hpopup;
static HWND hwnd=NULL;
static HICON small_icon; /* 16x16 icon */
static char service_path[MAX_PATH];
static SERVICE_STATUS serviceStatus;
static SERVICE_STATUS_HANDLE serviceStatusHandle=0;
static HANDLE stopServiceEvent=0;
static int visible=0, error_mode=0;
static jmp_buf jump_buf;
int portA=5901;
int portS=5500;
int portB=5500;
BOOL enabled=1;
BOOL enabled2=1;
BOOL enabled3=1;
BOOL enabled4=1;
BOOL allow=1;
BOOL refuse=1;
BOOL refuse2=1;
char sample1[1024];
char sample2[1024];
char sample3[1024];
int saved_portA=5901;
int saved_portS=0;
int saved_portB=5500;
BOOL saved_enabled=0;
BOOL saved_enabled2=1;
BOOL saved_enabled3=1;
BOOL saved_enabled4=1;
BOOL saved_allow=0;
BOOL saved_refuse=0;
BOOL saved_refuse2=0;
char saved_sample1[1024];
char saved_sample2[1024];
char saved_sample3[1024];
char temp1[50][16];
int rule1=0;
char temp2[50][16];
int rule2=0;
char temp3[50][16];
int rule3=0;
static char passphrase[STRLEN];
void win_log(char *line);
void
Read_settings()
{
char szFileName[MAX_PATH];
HANDLE hFile=NULL;
if (GetModuleFileName(NULL, szFileName, MAX_PATH))
{
char* p = strrchr(szFileName, '\\');
*p = '\0';
strcat (szFileName,"\\settings.txt");
}
hFile=CreateFile((LPCSTR)szFileName, GENERIC_READ,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
saved_portA=5901;
saved_portS=5900;
saved_portB=5500;
saved_enabled=1;
saved_enabled2=1;
saved_enabled3=1;
saved_enabled4=1;
saved_allow=0;
saved_refuse=0;
saved_refuse2=0;
strcpy(saved_sample1,"");
strcpy(saved_sample2,"");
strcpy(saved_sample3,"");
}
else
{
unsigned long readbytes;
char *test;
char *pos;
int ch = ';';
ReadFile(hFile,&saved_portA,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_portB,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_portS,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_enabled,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_enabled2,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_enabled3,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_enabled4,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_allow,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_refuse,sizeof(int),&readbytes,NULL);
ReadFile(hFile,&saved_refuse2,sizeof(int),&readbytes,NULL);
ReadFile(hFile,saved_sample1,1024,&readbytes,NULL);
ReadFile(hFile,saved_sample2,1024,&readbytes,NULL);
ReadFile(hFile,saved_sample3,1024,&readbytes,NULL);
test=strchr(saved_sample1,ch);
pos=saved_sample1;
while (test)
{
int len=test-pos;
strncpy(temp1[rule1],pos,len);
temp1[rule1][len]=0;
rule1++;
pos+=len+1;
test=strchr(pos,ch);
}
strcpy(temp1[rule1],pos);
rule1++;
test=strchr(saved_sample2,ch);
pos=saved_sample2;
while (test)
{
int len=test-pos;
strncpy(temp2[rule2],pos,len);
temp2[rule2][len]=0;
rule2++;
pos+=len+1;
test=strchr(pos,ch);
}
strcpy(temp2[rule2],pos);
rule2++;
test=strchr(saved_sample3,ch);
pos=saved_sample3;
while (test)
{
int len=test-pos;
strncpy(temp3[rule3],pos,len);
temp3[rule3][len]=0;
rule3++;
pos+=len+1;
test=strchr(pos,ch);
}
strcpy(temp3[rule3],pos);
rule3++;
CloseHandle(hFile);
}
}
void
Save_settings()
{
char szFileName[MAX_PATH];
HANDLE hFile=NULL;
if (GetModuleFileName(NULL, szFileName, MAX_PATH))
{
char* p = strrchr(szFileName, '\\');
*p = '\0';
strcat (szFileName,"\\settings.txt");
}
hFile=CreateFile((LPCSTR)szFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
return ;
}
else
{
unsigned long readbytes;
WriteFile(hFile,&saved_portA,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_portB,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_portS,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_enabled,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_enabled2,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_enabled3,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_enabled4,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_allow,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_refuse,sizeof(int),&readbytes,NULL);
WriteFile(hFile,&saved_refuse2,sizeof(int),&readbytes,NULL);
WriteFile(hFile,saved_sample1,1024,&readbytes,NULL);
WriteFile(hFile,saved_sample2,1024,&readbytes,NULL);
WriteFile(hFile,saved_sample3,1024,&readbytes,NULL);
CloseHandle(hFile);
}
}
void main_initialize(char *arg1, char *arg2)
{
Read_settings();
}
int main_test();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
char exe_file_name[MAX_PATH], dir[MAX_PATH], *ptr;
static struct WSAData wsa_state;
ghInst=hInstance;
GetModuleFileName(0, exe_file_name, MAX_PATH);
/* set current directory */
strcpy(dir, exe_file_name);
ptr=strrchr(dir, '\\'); /* last backslash */
if(ptr)
ptr[1]='\0'; /* truncate program name */
if(!SetCurrentDirectory(dir)) {
MessageBox(hwnd, "Cannot set current directory",
"Ultravnc", MB_ICONERROR);
return 1;
}
/* setup service_path for CreateService() */
strcpy(service_path, "\"");
strcat(service_path, exe_file_name);
strcat(service_path, "\" -service");
/* strcat(service_path, lpszCmdLine); */
if(WSAStartup(0x0101, &wsa_state)) {
// win_log("Failed to initialize winsock");
error_mode=1;
}
if(!strcmpi(lpszCmdLine, "-service")) {
if(!setjmp(jump_buf))
main_initialize(NULL, NULL);
return start_service(); /* Always start service with -service option */
}
if(!error_mode && !setjmp(jump_buf)) { /* TRY */
if(!strcmpi(lpszCmdLine, "-install")) {
main_initialize(NULL, NULL);
return install_service();
} else if(!strcmpi(lpszCmdLine, "-uninstall")) {
main_initialize(NULL, NULL);
return uninstall_service();
} else { /* not -service, -install or -uninstall */
main_initialize(lpszCmdLine[0] ? lpszCmdLine : NULL, NULL);
}
}
Read_settings();
/* CATCH */
return win_main(hInstance, hPrevInstance, lpszCmdLine, nCmdShow);
}
static int win_main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
WNDCLASSEX wc;
MSG msg;
char classname[]="UltraVNC_Repeater";
DWORD iID;
RECT rect;
/* register the class */
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_VREDRAW|CS_HREDRAW;
wc.lpfnWndProc=wndProc;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName=NULL;
wc.lpszClassName=classname;
small_icon=(HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0);
wc.hIconSm=small_icon; /* 16x16 icon */
RegisterClassEx(&wc);
/* create main window */
if(taskbar) {/* save menu resources */
htraymenu=LoadMenu(ghInst, MAKEINTRESOURCE(IDM_TRAYMENU));
hpopup=GetSubMenu(htraymenu, 0);
}
hmainmenu=LoadMenu(ghInst, MAKEINTRESOURCE(IDM_MAINMENU));
hwnd=CreateWindow(classname, "UltraVNC_Repeater", WS_TILEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hmainmenu, hInstance, NULL);
/* create child edit window */
EditControl=CreateWindow ("EDIT", NULL,
WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_READONLY,
0, 0, 0, 0, hwnd, NULL, hInstance, NULL);
SendMessage(EditControl, WM_SETFONT, (WPARAM)GetStockObject(OEM_FIXED_FONT),
MAKELPARAM(FALSE, 0)); /* no need to redraw right, now */
GetClientRect(hwnd, &rect);
MoveWindow(EditControl, 0, 0, rect.right, rect.bottom, TRUE);
SetFocus(EditControl);
if(error_mode) /* log window is hidden by default */
set_visible(1);
//else /* create the main thread */
CloseHandle(CreateThread(NULL, 0, ThreadFunc, NULL, 0, &iID));
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
static void update_taskbar(void) { /* create the taskbar icon */
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(nid));
nid.cbSize=sizeof(NOTIFYICONDATA); /* size */
nid.hWnd=hwnd; /* window to receive notifications */
nid.uID=1; /* application-defined ID for icon */
if(error_mode)
strcpy(nid.szTip, "Server is down");
else
strcpy(nid.szTip, "UltraVnc Repeater");
nid.uFlags=NIF_TIP;
/* only nid.szTip and nid.uID are valid, change tip */
if(Shell_NotifyIcon(NIM_MODIFY, &nid)) /* modify tooltip */
return; /* OK: taskbar icon exists */
/* trying to update tooltip failed - lets try to create the icon */
nid.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage=UWM_SYSTRAY;
nid.hIcon=small_icon; /* 16x16 icon */
Shell_NotifyIcon(NIM_ADD, &nid); /* this adds the icon */
}
static DWORD WINAPI ThreadFunc(LPVOID arg) {
if(!setjmp(jump_buf))
main_test();
else
set_visible(1); /* could be unsafe to call it from another thread */
return 0;
}
static LRESULT CALLBACK wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
POINT pt;
NOTIFYICONDATA nid;
RECT rect;
char *txt;
#if 0
if(message!=WM_CTLCOLORSTATIC && message!=WM_TIMER)
log(LOG_DEBUG, "Window message: %d", message);
#endif
switch (message) {
case WM_CREATE:
if (taskbar) /* taskbar update enabled? */
SetTimer(hwnd, 0x29a, 1000, NULL); /* 1-second timer */
return TRUE;
case WM_SIZE:
GetClientRect(hwnd, &rect);
MoveWindow(EditControl, 0, 0, rect.right, rect.bottom, TRUE);
UpdateWindow(EditControl);
return TRUE;
case WM_SETFOCUS:
txt=log_txt();
SetWindowText(EditControl, txt);
free(txt);
SetFocus(EditControl);
return TRUE;
case WM_TIMER:
update_taskbar();
return TRUE;
case WM_CLOSE:
set_visible(0);
return TRUE;
case WM_DESTROY:
DestroyMenu(hmainmenu);
DestroyMenu(htraymenu);
ZeroMemory(&nid, sizeof(nid));
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=hwnd;
nid.uID=1;
nid.uFlags=NIF_TIP; /* not really sure what to put here, but it works */
Shell_NotifyIcon(NIM_DELETE, &nid); /* this removes the icon */
PostQuitMessage(0);
KillTimer(hwnd, 0x29a);
return TRUE;
case WM_COMMAND:
switch(wParam) {
case IDM_ABOUT:
DialogBox(ghInst, MAKEINTRESOURCE(ID_ABOUT), hwnd, (DLGPROC)about_proc);
break;
case IDM_SETTINGS:
DialogBox(ghInst, MAKEINTRESOURCE(ID_SETTINGS), hwnd, (DLGPROC)settings_proc);
break;
case IDM_LOG:
set_visible(!visible);
break;
case IDM_CLOSE:
set_visible(0);
break;
case IDM_EXIT:
DestroyWindow(hwnd);
break;
case IDM_SAVEAS:
save_file(hwnd);
break;
case IDM_SETUP:
MessageBox(hwnd, "Function not implemented",
"UltraVNC_Repeater", MB_ICONERROR);
break;
};
return TRUE;
case UWM_SYSTRAY:
switch (lParam) {
case WM_RBUTTONUP: /* track a popup menu */
/* http://support.microsoft.com/support/kb/articles/Q135/7/88.asp */
GetCursorPos(&pt);
SetForegroundWindow(hwnd);
TrackPopupMenu(hpopup, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
PostMessage(hwnd, WM_NULL, 0, 0); /* see above */
break;
case WM_LBUTTONDBLCLK: /* switch log window visibility */
set_visible(!visible);
break;
}
return TRUE;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
static LRESULT CALLBACK settings_proc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam) {
char tempchar[25];
switch(message) {
case WM_INITDIALOG:
//win_log("init settings");
portA=saved_portA;
portB=saved_portB;
portS=saved_portS;
enabled=saved_enabled;
enabled2=saved_enabled2;
enabled3=saved_enabled3;
enabled4=saved_enabled4;
allow=saved_allow;
refuse=saved_refuse;
refuse2=saved_refuse2;
strcpy(sample1,saved_sample1);
strcpy(sample2,saved_sample2);
strcpy(sample3,saved_sample3);
SetDlgItemText(hDlg, IDC_ACCEPTPORT, itoa(portA,tempchar,10));
SetDlgItemText(hDlg, IDC_LISTENPORT, itoa(portB,tempchar,10));
SendDlgItemMessage(hDlg, IDC_ENABLE,BM_SETCHECK,enabled,0);
SendDlgItemMessage(hDlg, IDC_ENABLE2,BM_SETCHECK,enabled2,0);
SendDlgItemMessage(hDlg, IDC_ENABLE3,BM_SETCHECK,enabled3,0);
SendDlgItemMessage(hDlg, IDC_ENABLE4,BM_SETCHECK,enabled4,0);
SendDlgItemMessage(hDlg, IDC_ALLOW,BM_SETCHECK,allow,0);
SendDlgItemMessage(hDlg, IDC_REFUSE,BM_SETCHECK,refuse,0);
SendDlgItemMessage(hDlg, IDC_REFUSE2,BM_SETCHECK,refuse2,0);
SetDlgItemText(hDlg, IDC_EDITALLOW, sample1);
SetDlgItemText(hDlg, IDC_EDITREFUSE, sample2);
SetDlgItemText(hDlg, IDC_EDITREFUSE2, sample3);
SetDlgItemText(hDlg, IDC_PORTSERVER, itoa(portS,tempchar,10));
if (enabled)
{
EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 1);
EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 1);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 0);
EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 0);
}
if (allow) EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 1);
else EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 0);
if (refuse) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 1);
else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 0);
if (refuse2) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 1);
else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 0);
return TRUE;
case WM_COMMAND:
switch(wParam) {
case IDC_ENABLE:
if (SendDlgItemMessage(hDlg, IDC_ENABLE,BM_GETCHECK,0,0)== BST_CHECKED)
enabled=1;
else enabled=0;
if (enabled)
{
EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 1);
EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 1);
}
else {
EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 0);
EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 0);
}
break;
case IDC_ENABLE2:
if (SendDlgItemMessage(hDlg, IDC_ENABLE2,BM_GETCHECK,0,0)== BST_CHECKED)
enabled2=1;
else enabled2=0;
case IDC_ENABLE3:
if (SendDlgItemMessage(hDlg, IDC_ENABLE3,BM_GETCHECK,0,0)== BST_CHECKED)
enabled3=1;
else enabled3=0;
case IDC_ENABLE4:
if (SendDlgItemMessage(hDlg, IDC_ENABLE3,BM_GETCHECK,0,0)== BST_CHECKED)
enabled4=1;
else enabled4=0;
case IDC_ALLOW:
if (SendDlgItemMessage(hDlg, IDC_ALLOW,BM_GETCHECK,0,0)== BST_CHECKED)
allow=1;
else allow=0;
if (allow) EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 1);
else EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 0);
break;
case IDC_REFUSE:
if(SendDlgItemMessage(hDlg, IDC_REFUSE,BM_GETCHECK,0,0)== BST_CHECKED)
refuse=1;
else refuse=0;
if (refuse) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 1);
else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 0);
break;
case IDC_REFUSE2:
if(SendDlgItemMessage(hDlg, IDC_REFUSE2,BM_GETCHECK,0,0)== BST_CHECKED)
refuse2=1;
else refuse2=0;
if (refuse2) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 1);
else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 0);
break;
case IDOK:
GetDlgItemText(hDlg, IDC_ACCEPTPORT, tempchar, 25);
portA=atoi(tempchar);
GetDlgItemText(hDlg, IDC_LISTENPORT, tempchar, 25);
portB=atoi(tempchar);
GetDlgItemText(hDlg, IDC_PORTSERVER, tempchar, 25);
portS=atoi(tempchar);
GetDlgItemText(hDlg, IDC_EDITALLOW, sample1,1024);
GetDlgItemText(hDlg, IDC_EDITREFUSE, sample2,1024);
GetDlgItemText(hDlg, IDC_EDITREFUSE2, sample3,1024);
saved_portA=portA;
saved_portB=portB;
saved_portS=portS;
saved_enabled=enabled;
saved_enabled2=enabled2;
saved_enabled3=enabled3;
saved_enabled4=enabled4;
saved_allow=allow;
saved_refuse=refuse;
saved_refuse2=refuse2;
strcpy(saved_sample1,sample1);
strcpy(saved_sample2,sample2);
strcpy(saved_sample3,sample3);
Save_settings();
win_log("Settings Saved: WARNING, new settings become active after restart !");
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
}
}
return FALSE;
}
static LRESULT CALLBACK pass_proc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam) {
char titlebar[STRLEN];
WORD cchPassword;
switch (message) {
case WM_INITDIALOG:
/* Set the default push button to "Cancel." */
SendMessage(hDlg, DM_SETDEFID, (WPARAM) IDCANCEL, (LPARAM) 0);
safecopy(titlebar, "Private key: ");
safeconcat(titlebar, "options.key");
SetWindowText(hDlg, titlebar);
win_log("init");
return TRUE;
case WM_COMMAND:
/* Set the default push button to "OK" when the user enters text. */
if(HIWORD (wParam) == EN_CHANGE && LOWORD(wParam) == IDE_PASSWORDEDIT)
SendMessage(hDlg, DM_SETDEFID, (WPARAM) IDOK, (LPARAM) 0);
switch(wParam) {
case IDOK:
/* Get number of characters. */
cchPassword = (WORD) SendDlgItemMessage(hDlg,
IDE_PASSWORDEDIT, EM_LINELENGTH, (WPARAM) 0, (LPARAM) 0);
if(cchPassword==0 || cchPassword>=STRLEN) {
EndDialog(hDlg, FALSE);
return FALSE;
}
/* Put the number of characters into first word of buffer. */
*((LPWORD)passphrase) = cchPassword;
/* Get the characters. */
SendDlgItemMessage(hDlg, IDE_PASSWORDEDIT, EM_GETLINE,
(WPARAM) 0, /* line 0 */ (LPARAM) passphrase);
passphrase[cchPassword] = 0; /* Null-terminate the string. */
EndDialog(hDlg, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, FALSE);
return TRUE;
}
return 0;
}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}
static void save_file(HWND hwnd) {
char szFileName[MAX_PATH];
OPENFILENAME ofn;
HANDLE hFile;
BOOL bResult;
char *txt;
DWORD nToWrite, nWritten;
ZeroMemory(&ofn, sizeof(ofn));
szFileName[0]='\0';
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hwnd;
ofn.lpstrFilter="Log Files (*.log)\0*.log\0All Files (*.*)\0*.*\0\0";
ofn.lpstrFile=szFileName;
ofn.nMaxFile=MAX_PATH;
ofn.lpstrDefExt="LOG";
ofn.lpstrInitialDir=".";
ofn.lpstrTitle="Save Log";
ofn.Flags=OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT;
if(!GetSaveFileName(&ofn))
return;
if((hFile=CreateFile((LPCSTR)szFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL))==INVALID_HANDLE_VALUE) {
MessageBox(hwnd, "File open failed", "UltraVNC_Repeater", MB_ICONERROR);
return;
}
txt=log_txt();
nToWrite=strlen(txt);
bResult=WriteFile(hFile, txt, nToWrite, &nWritten, NULL);
free(txt);
if(!bResult)
MessageBox(hwnd, "File write failed"," settings.txt", MB_ICONERROR);
CloseHandle(hFile);
}
void win_log(char *line) { /* Also used in log.c */
struct LIST *curr;
int len;
static int log_len=0;
char *txt;
len=strlen(line);
curr=(LIST *)malloc(sizeof(struct LIST)+len);
curr->len=len;
strcpy(curr->txt, line);
curr->next=NULL;
// enter_critical_section(CRIT_WIN_LOG);
if(tail)
tail->next=curr;
tail=curr;
if(!head)
head=tail;
log_len++;
while(log_len>LOG_LINES) {
curr=head;
head=head->next;
free(curr);
log_len--;
}
// leave_critical_section(CRIT_WIN_LOG);
if(visible) {
txt=log_txt();
SetWindowText(EditControl, txt);
free(txt);
}
}
static char *log_txt(void) {
char *buff;
int ptr=0, len=0;
struct LIST *curr;
// enter_critical_section(CRIT_WIN_LOG);
for(curr=head; curr; curr=curr->next)
len+=curr->len+2; /* +2 for trailing '\r\n' */
buff=(char *)malloc(len+1); /* +1 for trailing '\0' */
for(curr=head; curr; curr=curr->next) {
memcpy(buff+ptr, curr->txt, curr->len);
ptr+=curr->len;
if(curr->next) {
buff[ptr++]='\r';
buff[ptr++]='\n';
}
}
buff[ptr]='\0';
// leave_critical_section(CRIT_WIN_LOG);
return buff;
}
static void set_visible(int i) {
char *txt;
visible=i; /* setup global variable */
CheckMenuItem(hpopup, GetMenuItemID(hpopup, 1),
visible?MF_CHECKED:MF_UNCHECKED); /* check or uncheck menu item */
if(visible) {
txt=log_txt();
SetWindowText(EditControl, txt); /* setup window content */
free(txt);
ShowWindow(hwnd, SW_SHOWNORMAL); /* show window */
SetForegroundWindow(hwnd); /* bring on top */
} else
ShowWindow(hwnd, SW_HIDE); /* hide window */
}
static int start_service(void) {
SERVICE_TABLE_ENTRY serviceTable[]={
{"repeater_service", service_main},
{0, 0}
};
if(!StartServiceCtrlDispatcher(serviceTable)) {
MessageBox(hwnd, "Unable to start the service",
"repeater_service", MB_ICONERROR);
return 1;
}
return 0; /* NT service started */
}
static int install_service(void) {
SC_HANDLE scm, service;
scm=OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
if(!scm) {
MessageBox(hwnd, "Failed to open service control manager",
"repeater_service", MB_ICONERROR);
return 1;
}
service=CreateService(scm,
"repeater_service", "repeater_service", SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, service_path,
NULL, NULL, NULL, NULL, NULL);
if(!service) {
MessageBox(hwnd, "Failed to create a new service",
"repeater_service", MB_ICONERROR);
CloseServiceHandle(scm);
return 1;
}
MessageBox(hwnd, "Service installed", "repeater_service",
MB_ICONINFORMATION);
CloseServiceHandle(service);
CloseServiceHandle(scm);
return 0;
}
static int uninstall_service(void) {
SC_HANDLE scm, service;
SERVICE_STATUS serviceStatus;
scm=OpenSCManager(0, 0, SC_MANAGER_CONNECT);
if(!scm) {
MessageBox(hwnd, "Failed to open service control manager",
"repeater_service", MB_ICONERROR);
return 1;
}
service=OpenService(scm, "repeater_service",
SERVICE_QUERY_STATUS | DELETE);
if(!service) {
MessageBox(hwnd, "Failed to open the service",
"repeater_service", MB_ICONERROR);
CloseServiceHandle(scm);
return 1;
}
if(!QueryServiceStatus(service, &serviceStatus)) {
MessageBox(hwnd, "Failed to query service status",
"repeater_service", MB_ICONERROR);
CloseServiceHandle(service);
CloseServiceHandle(scm);
return 1;
}
if(serviceStatus.dwCurrentState!=SERVICE_STOPPED) {
MessageBox(hwnd, "The service is still running",
"repeater_service", MB_ICONERROR);
CloseServiceHandle(service);
CloseServiceHandle(scm);
return 1;
}
if(!DeleteService(service)) {
MessageBox(hwnd, "Failed to delete the service",
"repeater_service", MB_ICONERROR);
CloseServiceHandle(service);
CloseServiceHandle(scm);
return 1;
}
MessageBox(hwnd, "Service uninstalled", "repeater_service",
MB_ICONINFORMATION);
CloseServiceHandle(service);
CloseServiceHandle(scm);
return 0;
}
static void WINAPI service_main(DWORD argc, LPTSTR* argv) {
/* initialise service status */
serviceStatus.dwServiceType=SERVICE_WIN32;
serviceStatus.dwCurrentState=SERVICE_STOPPED;
serviceStatus.dwControlsAccepted=0;
serviceStatus.dwWin32ExitCode=NO_ERROR;
serviceStatus.dwServiceSpecificExitCode=NO_ERROR;
serviceStatus.dwCheckPoint=0;
serviceStatus.dwWaitHint=0;
serviceStatusHandle=
RegisterServiceCtrlHandler("repeater_service", control_handler);
if(serviceStatusHandle) {
/* service is starting */
serviceStatus.dwCurrentState=SERVICE_START_PENDING;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
/* do initialisation here */
stopServiceEvent=CreateEvent(0, FALSE, FALSE, 0);
/* running */
serviceStatus.dwControlsAccepted|=
(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
serviceStatus.dwCurrentState=SERVICE_RUNNING;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
win_main(ghInst, NULL, "", 0);
/* service was stopped */
serviceStatus.dwCurrentState=SERVICE_STOP_PENDING;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
/* do cleanup here */
CloseHandle(stopServiceEvent);
stopServiceEvent=0;
/* service is now stopped */
serviceStatus.dwControlsAccepted&=
~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
serviceStatus.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
}
static void WINAPI control_handler(DWORD controlCode) {
switch (controlCode) {
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
serviceStatus.dwCurrentState=SERVICE_STOP_PENDING;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
PostMessage(hwnd, WM_COMMAND, IDM_EXIT, 0);
SetEvent(stopServiceEvent);
return;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
default:
if(controlCode >= 128 && controlCode <= 255)
break; /* user defined control code */
else
break; /* unrecognised control code */
}
SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
static LRESULT CALLBACK about_proc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(wParam) {
case IDOK:
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
}
}
return FALSE;
}
/* End of gui.c */