You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
7.9 KiB
279 lines
7.9 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
Rcontrol.cpp
|
|
|
|
Abstract:
|
|
This is the entry of our Remote Assistance DirectPlay application.
|
|
|
|
Author:
|
|
steveshi 10/1/2000
|
|
|
|
--*/
|
|
|
|
#include "atlbase.h"
|
|
extern CComModule _Module;
|
|
#include "atlcom.h"
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "sessions.h"
|
|
#include "utils.h"
|
|
#include "rcontrol.h"
|
|
#include "rcbdyctl.h"
|
|
#include "rcbdyctl_i.c"
|
|
//#include "imsession.h"
|
|
#include "Shared.h"
|
|
#include "sessions_i.c"
|
|
|
|
//#include "sessions_i.c"
|
|
|
|
TCHAR c_szHttpPath[] = _T("http://www.microsoft.com");
|
|
|
|
CComModule _Module;
|
|
HWND g_hWnd = NULL;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
END_OBJECT_MAP()
|
|
|
|
INT WINAPI
|
|
WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
INT nShowCmd)
|
|
{
|
|
HRESULT hr;
|
|
DWORD dwID;
|
|
BOOL bIsInviter = FALSE;
|
|
IIMSession* pIMSession = NULL;
|
|
|
|
CoInitialize(NULL);
|
|
_Module.Init(NULL, hInstance);
|
|
|
|
for (LPSTR lpszToken=lpCmdLine; lpszToken && *lpszToken !='\0' && *lpszToken != '-'; lpszToken++) ;
|
|
if (lpszToken && *lpszToken == '-')
|
|
{
|
|
if (_stricmp(++lpszToken, "UnregServer")==0)
|
|
{
|
|
RegisterEXE(FALSE);
|
|
}
|
|
else if (_stricmp(lpszToken, "RegServer")==0)
|
|
{
|
|
RegisterEXE(TRUE);
|
|
}
|
|
else if (_stricmp(lpszToken, "LaunchRA")==0)
|
|
{
|
|
TCHAR szCommandLine[2000];
|
|
TCHAR szHscPath[] = _T("\\pchealth\\helpctr\\binaries\\helpctr.exe\" -FromStartHelp -url \"hcp://services/centers/support?topic=hcp://CN=Microsoft Corporation,L=Redmond,S=Washington,C=US/Remote Assistance/Escalation/Common/rcscreen1.htm\"");
|
|
PROCESS_INFORMATION ProcessInfo;
|
|
STARTUPINFO StartUpInfo;
|
|
|
|
TCHAR szWinDir[2048];
|
|
int iLen = 0;
|
|
iLen = GetWindowsDirectory(szWinDir, 2048);
|
|
if (iLen == 0)
|
|
goto done;
|
|
|
|
ZeroMemory((LPVOID)&StartUpInfo, sizeof(STARTUPINFO));
|
|
StartUpInfo.cb = sizeof(STARTUPINFO);
|
|
|
|
if ((iLen + _tcslen(szHscPath)) >= 1999) // buffer overrun
|
|
goto done;
|
|
|
|
wsprintf(szCommandLine, _T("\"%s%s"), szWinDir, szHscPath);
|
|
CreateProcess(NULL, szCommandLine,NULL,NULL,TRUE,CREATE_NEW_PROCESS_GROUP,NULL,&szWinDir[0],&StartUpInfo,&ProcessInfo);
|
|
|
|
}
|
|
else
|
|
{
|
|
// Wrong parameter. Do nothing.
|
|
}
|
|
|
|
goto done;
|
|
}
|
|
|
|
// OK, it's not Reg/UnRegserver. Lets run it.
|
|
hr = ::CoCreateInstance(CLSID_IMSession, NULL, CLSCTX_INPROC_SERVER,
|
|
IID_IIMSession, (LPVOID*)&pIMSession);
|
|
if (FAILED_HR(TEXT("CoCreate IMSession failed %s"), hr))
|
|
goto done;
|
|
|
|
dwID = GetCurrentProcessId();
|
|
hr = pIMSession->GetLaunchingSession(dwID);
|
|
if (FAILED_HR(TEXT("GetLaunchingSession failed: %s"), hr))
|
|
goto done;
|
|
|
|
hr = pIMSession->get_IsInviter(&bIsInviter);
|
|
if (FAILED_HR(TEXT("Session Get flags failed: %s"), hr))
|
|
goto done;
|
|
|
|
if (bIsInviter) // Inviter. Only happened when Messenger UI sends this invitation.
|
|
{
|
|
MSG msg;
|
|
|
|
InitInstance(hInstance, 0);
|
|
|
|
if (FAILED(hr = pIMSession->Hook(NULL, g_hWnd)))
|
|
goto done;
|
|
|
|
#define RA_TIMEOUT 300*1000 // 5 minutes
|
|
SetTimer(g_hWnd, TIMER_TIMEOUT, RA_TIMEOUT, NULL);
|
|
|
|
// Goto msg pump
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
else // Invitee: should be handled inside HelpCtr.
|
|
{
|
|
pIMSession->Release(); // since I don't need it.
|
|
pIMSession = NULL;
|
|
|
|
// 1. Create HelpCtr and pass it my process ID.
|
|
TCHAR szCommandLine[2000];
|
|
TCHAR szPath[] = _T("/Interaction/Client/rctoolScreen1.htm\" -ExtraArgument \"IM=");
|
|
PROCESS_INFORMATION ProcessInfo;
|
|
STARTUPINFO StartUpInfo;
|
|
|
|
TCHAR szWinDir[2048];
|
|
int iLen;
|
|
iLen = GetWindowsDirectory(szWinDir, 2048);
|
|
if (iLen == 0)
|
|
goto done;
|
|
|
|
ZeroMemory((LPVOID)&StartUpInfo, sizeof(STARTUPINFO));
|
|
StartUpInfo.cb = sizeof(STARTUPINFO);
|
|
|
|
if ((iLen + _tcslen(szWinDir) + _tcslen(CHANNEL_PATH) + 10) >= 1998) // Buffer overrun. Note: 10: assume dwID < 10 digits.
|
|
goto done;
|
|
|
|
wsprintf(szCommandLine, _T("\"%s%s%s%d\""), szWinDir,CHANNEL_PATH, szPath, dwID);
|
|
CreateProcess(NULL, szCommandLine,NULL,NULL,TRUE,CREATE_NEW_PROCESS_GROUP,NULL,&szWinDir[0],&StartUpInfo,&ProcessInfo);
|
|
|
|
//#define SLEEP_TIME 60 * 1000 // 60 seconds
|
|
// Sleep(SLEEP_TIME);
|
|
}
|
|
|
|
done:
|
|
if (pIMSession)
|
|
pIMSession->Release();
|
|
|
|
_Module.Term();
|
|
CoUninitialize();
|
|
|
|
return 0;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// The Inviter World: Only get called when Messenger UI starts this invitation.
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
|
{
|
|
HWND hWnd;
|
|
|
|
WNDCLASSEX wcex;
|
|
|
|
wcex.cbSize = sizeof(WNDCLASSEX);
|
|
|
|
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
|
wcex.lpfnWndProc = WndProc;
|
|
wcex.cbClsExtra = 0;
|
|
wcex.cbWndExtra = 0;
|
|
wcex.hInstance = hInstance;
|
|
wcex.hIcon = NULL; //LoadIcon(hInstance, (LPCTSTR)IDI_MARBLE);
|
|
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
wcex.lpszMenuName = NULL; //(LPCSTR)IDC_MARBLE;
|
|
wcex.lpszClassName = szWindowClass;
|
|
wcex.hIconSm = NULL; //LoadIcon(wcex.hInstance, (LPCTSTR)IDI_MARBLE);
|
|
|
|
RegisterClassEx(&wcex);
|
|
|
|
hWnd = CreateWindow(szWindowClass, TEXT("Remote Assistance"), WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL);
|
|
|
|
if (!hWnd)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
g_hWnd = hWnd; // Save the window handle
|
|
|
|
#ifdef DEBUG // Maybe it's useful for debug build.
|
|
//ShowWindow(hWnd, nCmdShow);
|
|
//UpdateWindow(hWnd);
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
|
|
void RegisterEXE(BOOL bRegister)
|
|
{
|
|
CComBSTR bstrRAName;
|
|
HKEY hKey = NULL;
|
|
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
#define REG_KEY_SESSMGR_RA _T("SOFTWARE\\Microsoft\\MessengerService\\SessionManager\\Apps\\") C_RA_APPID
|
|
//{56b994a7-380f-410b-9985-c809d78c1bdc}]
|
|
|
|
bstrRAName.LoadString(IDS_RA_NAME);
|
|
|
|
if (bRegister)
|
|
{
|
|
// Fix for Bug 617011 : Prefast bug
|
|
GetModuleFileName(NULL, szPath, MAX_PATH-1);
|
|
szPath[MAX_PATH -1] = 0;
|
|
if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_KEY_SESSMGR_RA, 0, NULL,
|
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL))
|
|
{
|
|
RegSetValueExW(hKey, L"Name", 0, REG_SZ, (LPBYTE)((BSTR)bstrRAName), bstrRAName.Length()*sizeof(WCHAR));
|
|
RegSetValueEx(hKey, _T("URL"), 0, REG_SZ, (LPBYTE)c_szHttpPath, _tcslen(c_szHttpPath)*sizeof(TCHAR));
|
|
RegSetValueEx(hKey, _T("Path"), 0, REG_SZ, (LPBYTE)szPath, _tcslen(szPath)*sizeof(TCHAR));
|
|
}
|
|
RegCloseKey(hKey);
|
|
// Need to clean up some leftover from Beta2, if it's still there.
|
|
SHDeleteKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MicroSoft\\DirectPlay\\Applications\\Remote Assistance"));
|
|
}
|
|
else
|
|
{
|
|
RegDeleteKey(HKEY_LOCAL_MACHINE, REG_KEY_SESSMGR_RA);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
int wmId, wmEvent;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_CREATE:
|
|
{
|
|
}
|
|
break;
|
|
case WM_DESTROY:
|
|
{
|
|
PostQuitMessage(0);
|
|
}
|
|
break;
|
|
case WM_TIMER:
|
|
{
|
|
if (wParam == TIMER_TIMEOUT)
|
|
{
|
|
DestroyWindow(g_hWnd);
|
|
PostQuitMessage(0);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|