windows-nt/Source/XPSP1/NT/termsrv/remdsk/server/ics/icstest/icstest.cpp
2020-09-26 16:20:57 +08:00

405 lines
8.8 KiB
C++

// ICSTEST.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include "..\icshelper\icshelpapi.h"
#include <winuser.h>
#include <mmsystem.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
DWORD hPort=0;
HANDLE hAlertEvent=0;
int iAlerts=0;
WCHAR szAddr[4096];
#ifndef ARRAYSIZE
#define ARRAYSIZE(x) sizeof(x)/sizeof(x[0])
#endif
// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// HACCEL hAccelTable;
HWND hWnd;
WNDCLASSEX wcex;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_ICSTEST, szWindowClass, MAX_LOADSTRING);
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = DLGWINDOWEXTRA;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICSTEST);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
wcex.lpszMenuName = NULL; //(LPCSTR)IDC_ICSTEST;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC)WndProc);
ShowWindow(hWnd, nCmdShow);
// hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_ICSTEST);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
// if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
void fileSpew(HANDLE hFile, WCHAR *szMessage)
{
if (hFile)
_write((int)hFile, szMessage, (2*lstrlenW(szMessage)));
}
WCHAR szLogfileName[MAX_PATH];
HANDLE OpenSpewFile(void)
{
HANDLE iDbgFileHandle;
GetSystemWindowsDirectoryW(szLogfileName, sizeof(szLogfileName)/sizeof(szLogfileName[0]));
lstrcatW(szLogfileName, L"\\PCHealthICStest.log");
iDbgFileHandle = (HANDLE)_wopen(szLogfileName, _O_APPEND | _O_BINARY | _O_RDWR, 0);
if (-1 != (int)iDbgFileHandle)
{
OutputDebugStringA("opened debug log file:");
OutputDebugStringW(szLogfileName);
OutputDebugStringA("\r\n");
}
else
{
unsigned char UniCode[2] = {0xff, 0xfe};
// we must create the file
OutputDebugStringA("must create debug log file");
iDbgFileHandle = (HANDLE)_wopen(szLogfileName, _O_BINARY | _O_CREAT | _O_RDWR, _S_IREAD | _S_IWRITE);
if (-1 != (int)iDbgFileHandle)
_write((int)iDbgFileHandle, &UniCode, sizeof(UniCode));
else
{
OutputDebugStringA("ERROR: failed to create debug log file");
iDbgFileHandle = 0;
}
}
return iDbgFileHandle;
}
void CloseSpewFile(HANDLE hSpew)
{
if (hSpew)
_close((int)hSpew);
}
void ExecSpewFile(HANDLE hSpew)
{
if (hSpew)
{
STARTUPINFOW sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui, sizeof(sui));
sui.cb = sizeof(sui);
OutputDebugStringA("start up:");
OutputDebugStringW(szLogfileName);
OutputDebugStringA("\r\n");
if (CreateProcessW(L"%windir%\notepad.exe", szLogfileName, NULL, NULL, FALSE, 0, NULL, NULL, &sui, &pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
OutputDebugStringA("started OK\r\n");
}
else
{
char foo[400];
wsprintf(foo, "failed to start [%S], err=0x%x\r\n", szLogfileName, GetLastError());
OutputDebugStringA(foo);
}
}
}
BOOL PrintSettings(HWND hWnd)
{
WCHAR scratch[2000];
ICSSTAT is;
HANDLE hSpew;
hSpew = OpenSpewFile();
fileSpew(hSpew, L"ICS test results:\r\n");
// get current address list
FetchAllAddresses(scratch, ARRAYSIZE(scratch));
fileSpew(hSpew, scratch);
// get ICS status struct
is.dwSize = sizeof(is);
GetIcsStatus(&is);
// print connection types
wcscpy(scratch, L"Connections found: ");
if (is.bModemPresent)
wcscat(scratch, L"Modem connection");
else
wcscat(scratch, L"Network (LAN) connection");
if (is.bVpnPresent)
wcscat(scratch, L" with VPN");
wcscat(scratch, L"\r\n");
fileSpew(hSpew, scratch);
if (is.bIcsFound)
{
if (is.bIcsServer)
{
// this is an ICS server
fileSpew(hSpew, L"Found, server on this machine\r\n");
}
else
{
// must be an ICS client
fileSpew(hSpew, L"Found, server not local\r\n");
}
wsprintfW(scratch, L"local addr=%s\r\npublic addr=%s\r\nDLL=%s", is.wszLocAddr, is.wszPubAddr, is.wszDllName);
fileSpew(hSpew, scratch);
}
else
{
fileSpew(hSpew, L"no ICS found");
}
CloseSpewFile(hSpew);
ExecSpewFile(hSpew);
return TRUE;
}
BOOL DisplaySettings(HWND hWnd)
{
WCHAR scratch[2000];
ICSSTAT is;
FetchAllAddresses(szAddr, ARRAYSIZE(szAddr));
SetDlgItemTextW(hWnd, IDC_ADDRLIST, szAddr);
is.dwSize = sizeof(is);
GetIcsStatus(&is);
scratch[0] = 0;
if (is.bModemPresent)
wcscat(scratch, L"Modem connection");
else
wcscat(scratch, L"Network (LAN) connection");
if (is.bVpnPresent)
wcscat(scratch, L" with VPN");
SetDlgItemTextW(hWnd, IDC_CONN_TYPES, scratch);
if (is.bIcsFound)
{
if (is.bIcsServer)
{
// this is an ICS server
SetDlgItemText(hWnd, IDC_ICS_STAT, "Found, server on this machine");
}
else
{
// must be an ICS client
SetDlgItemText(hWnd, IDC_ICS_STAT, "Found, server not local");
}
// set the addresses
SetDlgItemTextW(hWnd, IDC_LOCAL_ADDR, is.wszLocAddr);
SetDlgItemTextW(hWnd, IDC_PUBLIC_ADDR, is.wszPubAddr);
// and the support DLL name
SetDlgItemTextW(hWnd, IDC_ICS_DLL_NAME, is.wszDllName);
}
else
{
char *szNullIP = "";
SetDlgItemText(hWnd, IDC_ICS_STAT, "none found");
SetDlgItemText(hWnd, IDC_ICS_DLL_NAME, szNullIP);
SetDlgItemText(hWnd, IDC_LOCAL_ADDR, szNullIP);
SetDlgItemText(hWnd, IDC_PUBLIC_ADDR, szNullIP);
}
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
TEXTMETRIC tm;
HDC hdc;
int i;
switch (message)
{
case WM_INITDIALOG:
hAlertEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
StartICSLib();
SetAlertEvent(hAlertEvent);
Sleep(250); // gives the lib time to start up...
SetTimer(hWnd, 1, 1000, NULL);
DisplaySettings(hWnd);
break;
case WM_TIMER:
if (hAlertEvent)
{
if (WaitForSingleObjectEx(hAlertEvent, 0, FALSE) == WAIT_OBJECT_0)
{
FLASHWINFO fw;
fw.cbSize=sizeof(fw);
fw.hwnd=hWnd;
fw.dwFlags=FLASHW_ALL;
fw.uCount=8;
fw.dwTimeout=0;
DisplaySettings(hWnd);
iAlerts++;
FlashWindowEx(&fw);
PlaySound("AddressChange", NULL, SND_ASYNC);
ResetEvent(hAlertEvent);
}
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
SetFocus(hWnd);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_FILE_CLOSEPORT:
if (hPort)
{
ClosePort(hPort);
DisplaySettings(hWnd);
}
hPort = 0;
break;
case ID_FILE_CLOSEALLPORTS:
CloseAllOpenPorts();
DisplaySettings(hWnd);
hPort = 0;
break;
case ID_FILE_REFRESH:
DisplaySettings(hWnd);
break;
case IDC_MYICON:
PrintSettings(hWnd);
break;
case IDM_OPEN:
if (!hPort)
{
hPort = OpenPort(3389);
DisplaySettings(hWnd);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_DESTROY:
KillTimer(hWnd, 1);
SetAlertEvent(0);
CloseHandle(hAlertEvent);
hAlertEvent=0;
CloseAllOpenPorts();
StopICSLib();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}