Leaked source code of windows server 2003
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

/*++
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;
}