Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

779 lines
19 KiB

//////////////////////////////////////////////////////////////////////////////
//
//
//
//////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <commdlg.h>
#include "resource.h"
//////////////////////////////////////////////////////////////////////////////
// PROTOTYPES
//////////////////////////////////////////////////////////////////////////////
static BOOL CreateMainWindow (int nCmdShow);
BOOL CALLBACK RepeaterDlgProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
BOOL DoInstall(HWND);
BOOL DoUninstall(HWND);
BOOL DoMoreInfo();
//////////////////////////////////////////////////////////////////////////////
// GLOBALS
//////////////////////////////////////////////////////////////////////////////
HINSTANCE ghInstance;
BOOL gbIsNT = FALSE;
//////////////////////////////////////////////////////////////////////////////
//
// WinMain()
//
//////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
ghInstance = GetModuleHandle(NULL);
if (GetVersion() < 0x80000000)
{
gbIsNT = TRUE;
}
DialogBox(ghInstance,
MAKEINTRESOURCE(IDD_REPEATER),
GetDesktopWindow(),
(DLGPROC)RepeaterDlgProc);
return 1;
}
//*****************************************************************************
// MainWndProc()
//*****************************************************************************
BOOL CALLBACK RepeaterDlgProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
SetWindowPos(hwnd,
HWND_TOP,
GetSystemMetrics(SM_CXSCREEN)/4,
GetSystemMetrics(SM_CYSCREEN)/4,
0,
0,
SWP_NOSIZE);
SetFocus(GetDlgItem(hwnd,
IDC_SPNAME));
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_UNINSTALL:
if (DoUninstall(hwnd))
{
MessageBox(hwnd,
"Repeater successfully uninstalled.",
"Repeater Setup",
NULL);
EndDialog(hwnd, 1);
}
break;
case ID_INSTALL:
if (DoInstall(hwnd))
{
MessageBox(hwnd,
"Repeater successfully installed.",
"Repeater Setup",
NULL);
EndDialog(hwnd, 1);
}
break;
case ID_MOREINFO:
if (DoMoreInfo())
{
EndDialog(hwnd, 1);
}
break;
case IDCANCEL:
EndDialog(hwnd, 0);
break;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
#define SZTAPIKEY "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Telephony"
#define SZREPEATERSETUP "Repeater Setup"
#define SZPROVIDERS "Providers"
#define SZREPEATER "Repeater"
#define SZNUMPROVIDERS "NumProviders"
#define SZREPEATERFILENAME "Repeater.TSP"
#define SZLOGDIR "LogFileDirectory"
#define SZPROVIDERFILENAME "ProviderFilename"
#define SZPROVIDER "Provider"
#define SZPROVIDERID "ProviderID"
#define SZTELEPHONINI "TELEPHON.INI"
BOOL DoInstall(HWND hWnd)
{
char szSPName[256];
char szLogFilePath[256];
char szTestName[256];
int i;
HANDLE hFileHandle;
DWORD dwSize;
DWORD dwHold, dwNumProviders;
HKEY hTapiKey, hProvidersKey, hRepeaterKey;
char szbuf[64], szfilebuf[256];
char sznum[16];
GetDlgItemText(hWnd,
IDC_SPNAME,
szSPName,
256);
GetDlgItemText(hWnd,
IDC_FILEDIRECTORY,
szLogFilePath,
256);
i = lstrlen(szLogFilePath);
if (szLogFilePath[i-1] != '\\')
{
szLogFilePath[i+1]=0;
szLogFilePath[i]='\\';
}
wsprintf(szTestName, "%s%s", szLogFilePath, "testme");
if ((hFileHandle = CreateFile(szTestName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Directory does not exist", NULL, MB_OK);
return FALSE;
}
else
{
CloseHandle(hFileHandle);
DeleteFile(szTestName);
}
if (gbIsNT)
{
// get tapi key
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
SZTAPIKEY,
0,
KEY_ALL_ACCESS,
&hTapiKey);
// get providers key
RegOpenKeyEx(hTapiKey,
SZPROVIDERS,
0,
KEY_ALL_ACCESS,
&hProvidersKey);
// create repeater key
RegCreateKeyEx(hTapiKey,
SZREPEATER,
0,
"Repeater Type",
REG_OPTION_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hRepeaterKey,
&dwHold);
// get number of providers
dwSize = sizeof(DWORD);
RegQueryValueEx(hProvidersKey,
SZNUMPROVIDERS,
NULL,
NULL,
(LPBYTE)&dwNumProviders,
&dwSize);
// find the provider
for (i = 0; i < (int)dwNumProviders; i++)
{
wsprintf(szbuf, "%s%d",SZPROVIDERFILENAME, i);
dwSize = 256;
RegQueryValueEx(hProvidersKey,
szbuf,
NULL,
NULL,
(LPBYTE)szfilebuf,
&dwSize);
// if it's the same break
if (!lstrcmpi(szfilebuf, szSPName))
{
break;
}
}
// didn't find the provider
if (i == (int)dwNumProviders)
{
char szmessage[256];
wsprintf(szmessage,
"Provider %s is not installed\n",
szSPName);
MessageBox(hWnd,
szmessage,
SZREPEATERSETUP,
MB_OK);
// return false so they can reenter the name correctly
return FALSE;
}
}
else // win95
{
// get number of providers
dwNumProviders = GetPrivateProfileInt(SZPROVIDERS,
SZNUMPROVIDERS,
0,
SZTELEPHONINI);
// find the provider
for (i = 0; i < (int)dwNumProviders; i++)
{
wsprintf(szbuf, "%s%d",SZPROVIDERFILENAME, i);
GetPrivateProfileString(SZPROVIDERS,
szbuf,
"",
szfilebuf,
256,
SZTELEPHONINI);
// if it's the same break
if (!lstrcmpi(szfilebuf, szSPName))
{
break;
}
}
// didn't find the provider
if (i == (int)dwNumProviders)
{
char szmessage[256];
wsprintf(szmessage,
"Provider %s is not installed\n",
szSPName);
MessageBox(hWnd,
szmessage,
SZREPEATERSETUP,
MB_OK);
// return false so they can reenter the name correctly
return FALSE;
}
}
// ok now copy repeater
{
char szfile[MAX_PATH];
char sztarget[MAX_PATH];
char szdir[MAX_PATH];
int j;
GetModuleFileName(NULL,
szdir,
MAX_PATH);
j = lstrlen(szdir);
while (szdir[j] != '\\')
{
szdir[j] = 0;
j--;
}
// get rid of \ too
szdir[j] = 0;
wsprintf(szfile, "%s\\%s", szdir, SZREPEATERFILENAME);
GetSystemDirectory(szdir, MAX_PATH);
wsprintf(sztarget, "%s\\%s", szdir, SZREPEATERFILENAME);
if (!CopyFile(szfile,
sztarget,
FALSE))
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
// ask them where the file is
OPENFILENAME ofn;
BOOL bReturn;
szfile[0] = '\0';
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.hInstance = ghInstance;
ofn.lpstrFilter = "TSP Files\0*.tsp\0\0";
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = szfile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle ="Location of REPEATER.TSP";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = "TSP";
ofn.lCustData = 0;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
bReturn = GetOpenFileName(&ofn);
if (!bReturn)
{
return FALSE;
}
if (!CopyFile(szfile,
sztarget,
FALSE))
{
MessageBox(NULL, "Copy file failed", NULL, MB_OK);
return FALSE;
}
}
else
{
MessageBox(NULL, "CopyFile failed", NULL, MB_OK);
return FALSE;
}
}
}
if (gbIsNT)
{
// now i is the provider number, so put repeater there
// and move provider's info to repeater key
// set ProviderFilenameX=repeater.tsp
dwSize = lstrlen(SZREPEATERFILENAME) + 1;
RegSetValueEx(hProvidersKey,
szbuf,
0,
REG_SZ,
(LPBYTE)SZREPEATERFILENAME,
dwSize);
// set providerfilename0 = szProviderName
dwSize = lstrlen(szSPName) + 1;
wsprintf(szfilebuf, "%s%d", SZPROVIDERFILENAME, 0);
RegSetValueEx(hRepeaterKey,
szfilebuf,
0,
REG_SZ,
(LPBYTE)szSPName,
dwSize);
// get provider id
wsprintf(szbuf, "%s%d", SZPROVIDERID, i);
dwSize = sizeof(DWORD);
RegQueryValueEx(hProvidersKey,
szbuf,
NULL,
NULL,
(LPBYTE)&dwHold,
&dwSize);
// write in as provider ID 0
wsprintf(szbuf, "%s%d", SZPROVIDERID, 0);
dwSize = sizeof(DWORD);
RegSetValueEx(hRepeaterKey,
szbuf,
0,
REG_DWORD,
(LPBYTE)&dwHold,
dwSize);
// write num providers in repeater key (always 1)
dwHold = 1;
dwSize = sizeof(DWORD);
RegSetValueEx(hRepeaterKey,
SZNUMPROVIDERS,
0,
REG_DWORD,
(LPBYTE)&dwHold,
dwSize);
dwSize = lstrlen(szLogFilePath) + 1;
RegSetValueEx(hRepeaterKey,
SZLOGDIR,
0,
REG_SZ,
(LPBYTE)szLogFilePath,
dwSize);
RegCloseKey(hRepeaterKey);
RegCloseKey(hProvidersKey);
RegCloseKey(hTapiKey);
}
else
{
// now i is the provider number, so put repeater there
// and move provider's info to repeater key
// set ProviderFilenameX=repeater.tsp
WritePrivateProfileString(SZPROVIDERS,
szbuf,
SZREPEATERFILENAME,
SZTELEPHONINI);
// set providerfilename0 = szProviderName
wsprintf(szfilebuf, "%s%d", SZPROVIDERFILENAME, 0);
WritePrivateProfileString(SZREPEATER,
szfilebuf,
szSPName,
SZTELEPHONINI);
// get provider id
wsprintf(szbuf, "%s%d", SZPROVIDERID, i);
dwHold = GetPrivateProfileInt(SZPROVIDERS,
szbuf,
0,
SZTELEPHONINI);
// write in as provider ID 0
wsprintf(szbuf, "%s%d", SZPROVIDERID, 0);
wsprintf(sznum, "%d", dwHold);
WritePrivateProfileString(SZREPEATER,
szbuf,
sznum,
SZTELEPHONINI);
// write num providers in repeater key (always 1)
WritePrivateProfileString(SZREPEATER,
SZNUMPROVIDERS,
"1",
SZTELEPHONINI);
WritePrivateProfileString(SZREPEATER,
SZLOGDIR,
szLogFilePath,
SZTELEPHONINI);
}
return TRUE;
}
BOOL DoUninstall(HWND hWnd)
{
if (gbIsNT)
{
DWORD dwSize, dwHold, dwNumProviders;
HKEY hTapiKey, hProvidersKey, hRepeaterKey;
char szbuf[64], szfilebuf[256];
int i;
// get tapi key
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
SZTAPIKEY,
0,
KEY_ALL_ACCESS,
&hTapiKey);
// get providers key
RegOpenKeyEx(hTapiKey,
SZPROVIDERS,
0,
KEY_ALL_ACCESS,
&hProvidersKey);
RegOpenKeyEx(hTapiKey,
SZREPEATER,
0,
KEY_ALL_ACCESS,
&hRepeaterKey);
// get number of providers
dwSize = sizeof(DWORD);
RegQueryValueEx(hProvidersKey,
SZNUMPROVIDERS,
NULL,
NULL,
(LPBYTE)&dwNumProviders,
&dwSize);
// find the provider
for (i = 0; i < (int)dwNumProviders; i++)
{
wsprintf(szbuf, "%s%d",SZPROVIDERFILENAME, i);
dwSize = 256;
RegQueryValueEx(hProvidersKey,
szbuf,
NULL,
NULL,
(LPBYTE)szfilebuf,
&dwSize);
// if it's the same break
if (!lstrcmpi(szfilebuf, SZREPEATERFILENAME))
{
break;
}
}
// didn't find the repeater provider
if (i == (int)dwNumProviders)
{
MessageBox(hWnd,
"Repeater is not installed",
SZREPEATERSETUP,
MB_OK);
return TRUE;
}
// now i is the provider number, so put repeater there
// and move provider's info to repeater key
// get original sp's name
wsprintf(szbuf, "%s%d", SZPROVIDERFILENAME, 0);
dwSize = 256;
RegQueryValueEx(hRepeaterKey,
szbuf,
NULL,
NULL,
(LPBYTE)szfilebuf,
&dwSize);
// write name back into provider's key
wsprintf(szbuf, "%s%d", SZPROVIDERFILENAME, i);
dwSize = lstrlen(szfilebuf) + 1;
RegSetValueEx(hProvidersKey,
szbuf,
0,
REG_SZ,
(LPBYTE)szfilebuf,
dwSize);
// get provider id
wsprintf(szbuf, "%s%d", SZPROVIDERID, 0);
dwSize = sizeof(DWORD);
RegQueryValueEx(hRepeaterKey,
szbuf,
NULL,
NULL,
(LPBYTE)&dwHold,
&dwSize);
// write in as provider ID
wsprintf(szbuf, "%s%d", SZPROVIDERID, i);
dwSize = sizeof(DWORD);
RegSetValueEx(hProvidersKey,
szbuf,
0,
REG_DWORD,
(LPBYTE)&dwHold,
dwSize);
RegCloseKey(hRepeaterKey);
RegCloseKey(hProvidersKey);
RegDeleteKey(hTapiKey,
SZREPEATER);
RegCloseKey(hTapiKey);
}
else // win95
{
DWORD dwHold, dwNumProviders;
char szbuf[64], szfilebuf[256];
int i;
// get number of providers
dwNumProviders = GetPrivateProfileInt(SZPROVIDERS,
SZNUMPROVIDERS,
0,
SZTELEPHONINI);
// find the provider
for (i = 0; i < (int)dwNumProviders; i++)
{
wsprintf(szbuf, "%s%d",SZPROVIDERFILENAME, i);
GetPrivateProfileString(SZPROVIDERS,
szbuf,
"",
szfilebuf,
256,
SZTELEPHONINI);
// if it's the same break
if (!lstrcmpi(szfilebuf, SZREPEATERFILENAME))
{
break;
}
}
// didn't find the repeater provider
if (i == (int)dwNumProviders)
{
MessageBox(hWnd,
"Repeater is not installed",
SZREPEATERSETUP,
MB_OK);
return TRUE;
}
// now i is the provider number, so put repeater there
// and move provider's info to repeater key
// get original sp's name
wsprintf(szbuf, "%s%d", SZPROVIDERFILENAME, 0);
GetPrivateProfileString(SZREPEATER,
szbuf,
"",
szfilebuf,
256,
SZTELEPHONINI);
// write name back into provider's key
wsprintf(szbuf, "%s%d", SZPROVIDERFILENAME, i);
WritePrivateProfileString(SZPROVIDERS,
szbuf,
szfilebuf,
SZTELEPHONINI);
// get provider id
wsprintf(szbuf, "%s%d", SZPROVIDERID, 0);
dwHold = GetPrivateProfileInt(SZREPEATER,
szbuf,
0,
SZTELEPHONINI);
// write in as provider ID
wsprintf(szbuf, "%s%d", SZPROVIDERID, i);
wsprintf(szfilebuf, "%d", dwHold);
WritePrivateProfileString(SZPROVIDERS,
szbuf,
szfilebuf,
SZTELEPHONINI);
}
// ok now copy repeater
{
char szfile[MAX_PATH];
char szdir[MAX_PATH];
GetSystemDirectory(szdir, MAX_PATH);
wsprintf(szfile, "%s\\%s", szdir, SZREPEATERFILENAME);
if (!DeleteFile(szfile))
{
MessageBox(NULL, "DeleteFile failed", NULL, MB_OK);
return FALSE;
}
}
return TRUE;
}
BOOL DoMoreInfo()
{
char szname[MAX_PATH], szbuf[MAX_PATH];
int i;
PROCESS_INFORMATION pi;
STARTUPINFO si;
FillMemory(&si,
sizeof(si),
0);
si.cb = sizeof(si);
GetModuleFileName(NULL,
szname,
MAX_PATH);
i = lstrlen(szname);
while (szname[i] != '\\')
{
szname[i] = 0;
i--;
}
wsprintf(szbuf, "notepad.exe %srepeater.txt", szname);
CreateProcess(NULL,
szbuf,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi);
return FALSE;
}