mirror of https://github.com/lianthony/NT4.0
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.
532 lines
15 KiB
532 lines
15 KiB
#include <windows.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "setup.h"
|
|
#include "stdtypes.h"
|
|
#include "setupapi.h"
|
|
#include "cui.h"
|
|
#include "setupkit.h"
|
|
#include "datadef.h"
|
|
#include "resource.h"
|
|
#include "common.h"
|
|
|
|
RC FAR PASCAL DoRPC( PCD pcd, POD pod, CAMF camf, PCAMFD pcamfd, SZ szData );
|
|
RC FAR PASCAL NeedToInstallRPC( PCD pcd, POD pod, CAMF camf, PCAMFD pcamfd, SZ szData );
|
|
RC PUBLIC RcAddToCopyList ( PCD pcd, POD pod, PCAMFDAddToCopyList pcamfd );
|
|
RC PUBLIC SetDosPath ( );
|
|
RC PUBLIC DoRpcDialog ( PCD pcd );
|
|
BOOL __export __loadds CALLBACK NSInstallDlgProc ( HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam );
|
|
BOOL __export __loadds CALLBACK NewNSDlgProc ( HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam );
|
|
|
|
extern char FAR szInternet[];
|
|
char FAR szNSInstallDlgProc[] = "NSInstallDlgProc";
|
|
char FAR szNewNSDlgProc[] = "NewNSDlgProc";
|
|
|
|
char FAR szDosPath[_MAX_PATH];
|
|
char FAR GBuf[100];
|
|
char FAR szNetAddress[100];
|
|
|
|
BOOL fCustomAdd;
|
|
BOOL fInstallRpc;
|
|
|
|
RC FAR PASCAL NeedToInstallRPC( PCD pcd, POD pod, CAMF camf, PCAMFD pcamfd, SZ szData )
|
|
{
|
|
RC rc = rcDoDefault;
|
|
|
|
Unused( szData );
|
|
Unused( pod );
|
|
Unused( pcd );
|
|
|
|
switch (camf)
|
|
{
|
|
case camfAnswerDependClause:
|
|
{
|
|
HFILE pfile;
|
|
|
|
PCAMFDAnswerDependClause pcmdfdAnswer = (PCAMFDAnswerDependClause)pcamfd;
|
|
// check whether the rpcreg.dat exist or not
|
|
char buf[_MAX_PATH];
|
|
char strDir[_MAX_PATH];
|
|
|
|
GetSystemDirectory( strDir, _MAX_PATH );
|
|
wsprintf( buf, "%s\\%s", strDir, "rpcrt4.dll" );
|
|
|
|
pfile = _lopen( buf, OF_READ );
|
|
if ( pfile == HFILE_ERROR )
|
|
{
|
|
pcmdfdAnswer->fRes = fTrue;
|
|
fInstallRpc = TRUE;
|
|
} else
|
|
{
|
|
pcmdfdAnswer->fRes = fFalse;
|
|
_lclose( pfile );
|
|
fInstallRpc = FALSE;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return(rc);
|
|
}
|
|
|
|
RC FAR PASCAL DoRPC( PCD pcd, POD pod, CAMF camf, PCAMFD pcamfd, SZ szData )
|
|
{
|
|
RC rc = rcDoDefault;
|
|
|
|
Unused( szData );
|
|
|
|
if ( fInstallRpc )
|
|
{
|
|
switch (camf)
|
|
{
|
|
case camfAddToCopyList:
|
|
{
|
|
SetDosPath();
|
|
RcAddToCopyList(pcd, pod, (PCAMFDAddToCopyList)pcamfd);
|
|
}
|
|
break;
|
|
case camfDoVisualMods:
|
|
// popup the dialog
|
|
if ( pod->ois == oisToBeInstalled )
|
|
{
|
|
SetDosPath();
|
|
DoRpcDialog( pcd );
|
|
}
|
|
rc = rcOk;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return(rc);
|
|
}
|
|
|
|
BOOL __export __loadds CALLBACK NSInstallDlgProc ( HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
Unused( lParam );
|
|
|
|
switch (uiMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
fCustomAdd = FALSE;
|
|
CenterDialog( hDlg );
|
|
SetWindowText( hDlg, "RPC Name Service Installation Options" );
|
|
SendDlgItemMessage( hDlg, IDC_B1, BM_SETCHECK, 1, 0 );
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_C:
|
|
fCustomAdd = ( SendDlgItemMessage( hDlg, IDC_B1, BM_GETCHECK, 0, 0 ) == 0 );
|
|
EndDialog( hDlg, TRUE );
|
|
ReactivateSetupScript();
|
|
break;
|
|
|
|
case IDC_X:
|
|
// do cancel
|
|
EndDialog( hDlg, 0 );
|
|
ReactivateSetupScript();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return DefWindowProc(hDlg, uiMsg, wParam, lParam );
|
|
}
|
|
|
|
|
|
BOOL __export __loadds CALLBACK NewNSDlgProc ( HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
Unused( lParam );
|
|
|
|
switch (uiMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
fCustomAdd = FALSE;
|
|
CenterDialog( hDlg );
|
|
SetWindowText( hDlg, "Define Network Address" );
|
|
break;
|
|
case WM_COMMAND:
|
|
switch (wParam)
|
|
{
|
|
case IDC_C:
|
|
// save the new address
|
|
|
|
GetDlgItemText( hDlg, IDC_EDIT, szNetAddress, 100 );
|
|
|
|
EndDialog( hDlg, TRUE );
|
|
ReactivateSetupScript();
|
|
break;
|
|
|
|
case IDC_X:
|
|
// do cancel
|
|
|
|
lstrcpy( szNetAddress, "" );
|
|
|
|
EndDialog( hDlg, 0 );
|
|
ReactivateSetupScript();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return DefWindowProc( hDlg, uiMsg, wParam, lParam );
|
|
}
|
|
|
|
|
|
#define SELECTED_TRANSPORTS "SelectedTransports"
|
|
#define MAPPED_PROTOCOLS "MappedProtocols"
|
|
#define NETBIOSMAP "NetBiosMap"
|
|
|
|
RC PUBLIC RcAddToCopyList ( PCD pcd, POD pod, PCAMFDAddToCopyList pcamfd )
|
|
{
|
|
RC rcReturn = rcOk;
|
|
char buf[_MAX_PATH];
|
|
BOOL OnWFW311 = TRUE;
|
|
UINT i;
|
|
|
|
Unused( pod );
|
|
Unused( pcamfd );
|
|
|
|
// rad the inf file
|
|
wsprintf( buf, "%sinternet.inf", pcd->rgchStfSrcDir );
|
|
ReadInfFile(buf);
|
|
|
|
// add wruntime
|
|
AddSectionFilesToCopyList("wruntime", pcd->rgchStfSrcDir,
|
|
pcd->rgchStfSysDir );
|
|
|
|
#ifdef NEVER
|
|
FindFileInTree( "ver.dll", pcd->rgchStfSysDir, buf _MAX_PATH );
|
|
if ( lstrcmp( buf, "" ) == 0)
|
|
{
|
|
AddSectionFilesToCopyList("ver", pcd->rgchStfSrcDir,
|
|
pcd->rgchStfSysDir );
|
|
|
|
}
|
|
#endif
|
|
|
|
FindTargetOnEnvVar( "netapi.dll", "PATH", buf, _MAX_PATH );
|
|
if ( lstrcmp( buf, "" ) != 0)
|
|
{
|
|
if ( NULL != strstr( buf, "SYSTEM32" ) )
|
|
{
|
|
char szDest[ _MAX_PATH ];
|
|
|
|
lstrcpyn( szDest, buf, lstrlen( buf ) - lstrlen( "\\netapi.dll" ));
|
|
|
|
AddSectionFilesToCopyList("wnetapi", pcd->rgchStfSrcDir,
|
|
szDest );
|
|
|
|
AddSectionFilesToCopyList("LM", pcd->rgchStfSrcDir,
|
|
szDest );
|
|
|
|
//BackupFile( buf, "netapi.old" );
|
|
}
|
|
} else
|
|
{
|
|
char szWFWNetDrv[_MAX_PATH];
|
|
|
|
FindFileInTree( "wfwnet.drv", pcd->rgchStfSysDir, szWFWNetDrv,
|
|
_MAX_PATH );
|
|
|
|
if ( lstrcmp( szWFWNetDrv, "" ) != 0 )
|
|
{
|
|
OnWFW311 = TRUE;
|
|
} else
|
|
{
|
|
OnWFW311 = fFalse;
|
|
}
|
|
|
|
// make sure we are in WFW
|
|
if ( !OnWFW311 )
|
|
{
|
|
FindFileInTree("netapi.dll", pcd->rgchStfSysDir, buf, _MAX_PATH );
|
|
if ( lstrcmp( buf, "" ) == 0)
|
|
{
|
|
AddSectionFilesToCopyList("dummynetapi", pcd->rgchStfSrcDir,
|
|
pcd->rgchStfSysDir );
|
|
}
|
|
}
|
|
}
|
|
|
|
// winsock
|
|
FindFileInTree( "winsock.dll", pcd->rgchStfWinDir, buf, _MAX_PATH );
|
|
if ( lstrcmp( buf, "" ) == 0 )
|
|
{
|
|
FindTargetOnEnvVar( "winsock.dll", "PATH", buf, _MAX_PATH );
|
|
}
|
|
|
|
if ( lstrcmp( buf, "") == 0 )
|
|
{
|
|
AddSectionFilesToCopyList("oldtcpwin", pcd->rgchStfSrcDir,
|
|
pcd->rgchStfSysDir );
|
|
} else
|
|
{
|
|
AddSectionFilesToCopyList("newtcpwin", pcd->rgchStfSrcDir,
|
|
pcd->rgchStfSysDir );
|
|
}
|
|
|
|
// transport stuff
|
|
MakeListFromSectionKeys( SELECTED_TRANSPORTS, "wtrans" );
|
|
|
|
for ( i = 1; i <= GetListLength( SELECTED_TRANSPORTS ); i++)
|
|
{
|
|
GetListItem( SELECTED_TRANSPORTS, i, buf, _MAX_PATH );
|
|
|
|
if ( strstr( buf, "DOS" ) != NULL )
|
|
{
|
|
AddSectionKeyFileToCopyList("dtrans", buf, pcd->rgchStfSrcDir,
|
|
szDosPath );
|
|
} else
|
|
{
|
|
AddSectionKeyFileToCopyList("wtrans", buf, pcd->rgchStfSrcDir,
|
|
pcd->rgchStfSysDir );
|
|
}
|
|
}
|
|
|
|
return(rcReturn);
|
|
}
|
|
|
|
RC PUBLIC SetDosPath()
|
|
{
|
|
char szEnv[500];
|
|
char *szStart = szEnv;
|
|
char *szString = szEnv;
|
|
char *szPtr = szEnv;
|
|
INT nCount = 0;
|
|
BOOL fSet = TRUE;
|
|
RC rcReturn = rcOk;
|
|
|
|
GetEnvVariableValue( "PATH", szEnv, 500 );
|
|
while ( *szPtr != '\0' )
|
|
{
|
|
if ( *szPtr == ';' )
|
|
{
|
|
char szTmp[_MAX_PATH];
|
|
|
|
fSet = TRUE;
|
|
lstrcpyn( szTmp, szString, nCount );
|
|
|
|
if (( strstr( szTmp, "LANMAN" ) != NULL ) ||
|
|
( strstr( szTmp, "\\netprog" ) != NULL ))
|
|
{
|
|
lstrcpy( szDosPath, szTmp );
|
|
break;
|
|
}
|
|
} else if ( fSet )
|
|
{
|
|
fSet = FALSE;
|
|
nCount = 0;
|
|
szString = szPtr;
|
|
}
|
|
|
|
nCount++;
|
|
szPtr ++;
|
|
}
|
|
return(rcReturn);
|
|
}
|
|
|
|
RC PUBLIC DoRpcDialog( PCD pcd )
|
|
{
|
|
char szProt[100];
|
|
char szEndPoint[100];
|
|
char szDefaultSyntax[100];
|
|
char szNetworkAddress[100];
|
|
char szServerNetworkAddress[100];
|
|
char buf[_MAX_PATH];
|
|
WORD wd;
|
|
HFILE RpcReg;
|
|
UINT i;
|
|
BOOL fFound;
|
|
|
|
// rad the inf file
|
|
wsprintf( buf, "%sinternet.inf", pcd->rgchStfSrcDir );
|
|
ReadInfFile(buf);
|
|
|
|
UIStartDlg(szInternet, IDD_NSInstallOptions, szNSInstallDlgProc,
|
|
0, NULL, (LPSTR)&wd, sizeof (WORD));
|
|
|
|
UIPop(1);
|
|
|
|
if ( fCustomAdd )
|
|
{
|
|
// ask the special address
|
|
|
|
lstrcpy( szProt, "\\Protocol=ncacn_ip_tcp" );
|
|
lstrcpy( szEndPoint, "\\Endpoint=" );
|
|
lstrcpy( szDefaultSyntax, "\\DefaultSyntax=3" );
|
|
|
|
UIStartDlg(szInternet, IDD_NewNS, szNewNSDlgProc,
|
|
0, NULL, (LPSTR)&wd, sizeof (WORD));
|
|
|
|
UIPop(1);
|
|
|
|
lstrcpy( szNetworkAddress, "\\NetworkAddress=" );
|
|
lstrcat( szNetworkAddress, szNetAddress );
|
|
|
|
lstrcpy( szServerNetworkAddress, "\\ServerNetworkAddress=" );
|
|
|
|
AddListItem( NETBIOSMAP, "nb=0" );
|
|
AddListItem( NETBIOSMAP, "tcp=0" );
|
|
|
|
} else
|
|
{
|
|
lstrcpy( szProt, "\\Protocol=ncacn_np" );
|
|
lstrcpy( szEndPoint, "\\Endpoint=\\pipe\\locator" );
|
|
lstrcpy( szDefaultSyntax, "\\DefaultSyntax=3" );
|
|
lstrcpy( szNetworkAddress, "\\NetworkAddress=\\\\." );
|
|
}
|
|
|
|
RpcReg = _lcreat( "c:\\rpcreg.dat",0);
|
|
|
|
if ( RpcReg != HFILE_ERROR )
|
|
{
|
|
char TmpBuf[200];
|
|
char buf[_MAX_PATH];
|
|
char szNameService[] = "\\Root\\Software\\Microsoft\\Rpc\\NameService";
|
|
|
|
if ( fCustomAdd )
|
|
{
|
|
wsprintf( TmpBuf,"%s%s\n\r", szNameService, szServerNetworkAddress );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
}
|
|
wsprintf( TmpBuf,"%s%s\n\r", szNameService, szProt );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
wsprintf( TmpBuf,"%s%s\n\r", szNameService, szNetworkAddress );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
wsprintf( TmpBuf,"%s%s\n\r", szNameService, szEndPoint );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
wsprintf( TmpBuf,"%s%s\n\r", szNameService, szDefaultSyntax );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
|
|
// transport stuff
|
|
MakeListFromSectionKeys( SELECTED_TRANSPORTS, "wtrans" );
|
|
|
|
if ( GetListLength( SELECTED_TRANSPORTS ) == 0 )
|
|
{
|
|
AddListItem( SELECTED_TRANSPORTS, "Named Pipes - Win (np=rpc16c1)");
|
|
AddListItem( SELECTED_TRANSPORTS, "IPX - Win (ipx=rpc16dg6)" );
|
|
AddListItem( SELECTED_TRANSPORTS, "NetBios - Win (nb=rpc16c5)" );
|
|
AddListItem( SELECTED_TRANSPORTS, "SPX - Win (spx=rpc16c6)" );
|
|
AddListItem( SELECTED_TRANSPORTS, "DEC NET - Win (dnet_nsp=rpc16c4)" );
|
|
}
|
|
|
|
for ( i = 1; i <= GetListLength( SELECTED_TRANSPORTS ); i++)
|
|
{
|
|
char *pStart;
|
|
|
|
fFound = FALSE;
|
|
GetListItem( SELECTED_TRANSPORTS, i, buf, _MAX_PATH );
|
|
|
|
if (( pStart = strchr( buf, '(' )) != NULL )
|
|
{
|
|
UINT j;
|
|
char szProtocolBuf[_MAX_PATH];
|
|
pStart++;
|
|
for ( j = 1; j <= GetListLength( MAPPED_PROTOCOLS ); j++ )
|
|
{
|
|
GetListItem( MAPPED_PROTOCOLS, j, szProtocolBuf, _MAX_PATH );
|
|
|
|
if ( strcmp( szProtocolBuf, pStart ) == 0 )
|
|
{
|
|
fFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( fFound )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( strstr( szProtocolBuf, "rpc16c5"/*"rpcltc5"*/ ) != NULL )
|
|
{
|
|
UINT k;
|
|
char szBIOSMap[_MAX_PATH];
|
|
char szBiosprot[_MAX_PATH];
|
|
|
|
for ( k = 1 ; k <= GetListLength( NETBIOSMAP ); k++)
|
|
{
|
|
char *pStartBiosprot;
|
|
char *pStartBiosMap;
|
|
char *pMapping;
|
|
|
|
GetListItem( NETBIOSMAP, k, szBIOSMap, _MAX_PATH );
|
|
pStartBiosprot = szBiosprot;
|
|
pStartBiosMap = szBIOSMap;
|
|
pMapping = szProtocolBuf;
|
|
|
|
while (*pStartBiosMap != '=')
|
|
{
|
|
*pStartBiosprot = *pStartBiosMap;
|
|
pStartBiosprot++;
|
|
pStartBiosMap++;
|
|
}
|
|
while ( *pMapping != '=')
|
|
{
|
|
pMapping++;
|
|
}
|
|
while ( *pMapping != '\0')
|
|
{
|
|
*pStartBiosprot = *pMapping;
|
|
pStartBiosprot++;
|
|
pMapping++;
|
|
}
|
|
pStartBiosprot='\0';
|
|
//if ( strncmp( szBiosprot, "nb=", 3) != 0 )
|
|
//{
|
|
wsprintf( TmpBuf,"%s\\ClientProtocols\\ncacn_nb_%s\n\r", szNameService, szBiosprot );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for ( i = 1; i <=GetListLength( NETBIOSMAP ); i++ )
|
|
{
|
|
char szNbMap[200];
|
|
char *pStartNbMap = szNbMap;
|
|
char szFinalNb[200];
|
|
char *pStartFinalNb = szFinalNb;
|
|
GetListItem( NETBIOSMAP, i, szNbMap, 200 );
|
|
|
|
while (*pStartNbMap != '=')
|
|
{
|
|
*pStartFinalNb = *pStartNbMap;
|
|
pStartFinalNb++;
|
|
pStartNbMap++;
|
|
}
|
|
*pStartFinalNb = '0';
|
|
pStartFinalNb++;
|
|
while ( *pStartNbMap != '\0')
|
|
{
|
|
*pStartFinalNb = *pStartNbMap;
|
|
pStartFinalNb++;
|
|
pStartNbMap++;
|
|
}
|
|
pStartFinalNb='\0';
|
|
wsprintf( TmpBuf,"%s\\NetBios\\ncacn_nb_%s\n\r", szNameService, szFinalNb );
|
|
_lwrite( RpcReg, TmpBuf, lstrlen( TmpBuf ) );
|
|
}
|
|
|
|
_lclose( RpcReg );
|
|
} else
|
|
{
|
|
wsprintf( GBuf, "write fail %d", RpcReg/*GetLastError()*/);
|
|
}
|
|
|
|
return(rcOk);
|
|
}
|
|
|