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.
574 lines
12 KiB
574 lines
12 KiB
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
NCPADTCT.CXX: Netcard detection interface.
|
|
|
|
|
|
FILE HISTORY:
|
|
DavidHov 10/31/92 Created
|
|
|
|
*/
|
|
|
|
#include "pchncpa.hxx" // Precompiled header
|
|
#include "ncpapp.hxx"
|
|
|
|
#if defined(DEBUG) && defined(TRACE)
|
|
// #define TESTING_ONLY
|
|
#endif
|
|
|
|
// Access rights required for using Service Controller, et al.
|
|
|
|
#define SVC_CTRL_ACCESS (GENERIC_ALL)
|
|
#define SVC_CTRL_START_ACCESS (GENERIC_READ | GENERIC_EXECUTE)
|
|
|
|
|
|
class DETECT_DIALOG : public DIALOG_WINDOW
|
|
{
|
|
public:
|
|
DETECT_DIALOG ( HWND hwndOwner, DETECTION_MANAGER & dtMgr ) ;
|
|
~ DETECT_DIALOG () ;
|
|
|
|
protected:
|
|
BOOL OnOK () ;
|
|
|
|
BOOL OnCommand ( const CONTROL_EVENT & event ) ;
|
|
|
|
VOID FillNetcardsListbox () ;
|
|
VOID DrainFound () ;
|
|
APIERR AddFound ( CARD_REFERENCE * pCardRef ) ;
|
|
|
|
APIERR Detect ( BOOL fFirst = TRUE ) ;
|
|
|
|
VOID ShowCardTypeParameters () ;
|
|
VOID ShowCardParameters () ;
|
|
VOID VerifyCardParameters () ;
|
|
|
|
VOID Log ( const TCHAR * pszData ) ;
|
|
VOID Log ( const NLS_STR & nlsData ) ;
|
|
VOID FlushLog () ;
|
|
|
|
private:
|
|
DETECTION_MANAGER & _dtMgr ;
|
|
PUSH_BUTTON _butnNext ;
|
|
PUSH_BUTTON _butnParam ;
|
|
PUSH_BUTTON _butnVerify ;
|
|
STRING_LISTBOX _strLbCards ;
|
|
STRING_LISTBOX _strLbFound ;
|
|
MLE _mleParam ;
|
|
SLIST_OF_CARD_REFERENCE _slCardRef ;
|
|
NLS_STR _nlsLog ;
|
|
DISKFILE _dfLog ;
|
|
};
|
|
|
|
#define LOGCOMMENT(s) Log(SZ(s))
|
|
|
|
|
|
#if defined(TESTING_ONLY)
|
|
|
|
// Given a list in SProlog form, convert it
|
|
// to SETUP INF form, display the results,
|
|
// then parse the SETUP INF form, regenerate
|
|
// the list, display the results.
|
|
|
|
VOID testListification( const TCHAR * pszData )
|
|
{
|
|
CFG_RULE_SET crsTest,
|
|
crsInf ;
|
|
APIERR err ;
|
|
TEXT_BUFFER txBuff ;
|
|
|
|
err = crsTest.Parse( pszData, PARSE_CTL_FULL_SYNTAX ) ;
|
|
|
|
if ( err )
|
|
{
|
|
TRACEEOL( "NCPA/DTCT/TEST: list parse failed, err "
|
|
<< err ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( err = crsTest.TextifyInf( & txBuff ) )
|
|
{
|
|
TRACEEOL( "NCPA/DTCT/TEST: INF textification failed, err "
|
|
<< err ) ;
|
|
return ;
|
|
}
|
|
|
|
TRACEEOL( "NCPA/DTCT/TEST: INF list generated: "
|
|
<< txBuff.QueryPch() ) ;
|
|
|
|
if ( err = crsInf.ParseInfList( txBuff.QueryPch() ) )
|
|
{
|
|
TRACEEOL( "NCPA/DTCT/TEST: INF list parse failed, err "
|
|
<< err ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( err = crsInf.TextifyInf( & txBuff ) )
|
|
{
|
|
TRACEEOL( "NCPA/DTCT/TEST: INF retextification failed, err "
|
|
<< err ) ;
|
|
return ;
|
|
}
|
|
|
|
TRACEEOL( "NCPA/DTCT/TEST: INF list regenerated: "
|
|
<< txBuff.QueryPch() ) ;
|
|
}
|
|
|
|
#define TESTLISTIFICATION(list) testListification(list)
|
|
#else
|
|
#define TESTLISTIFICATION(list)
|
|
#endif
|
|
|
|
|
|
DETECT_DIALOG :: DETECT_DIALOG (
|
|
HWND hwndOwner,
|
|
DETECTION_MANAGER & dtMgr )
|
|
: DIALOG_WINDOW( DLG_NM_DETECT, hwndOwner ),
|
|
_dtMgr( dtMgr ),
|
|
_butnNext( this, IDC_DETECT_BUTN_NEXT ),
|
|
_butnParam( this, IDC_DETECT_BUTN_PARAM ), // Button is named Query
|
|
_butnVerify( this, IDC_DETECT_BUTN_VERIFY ),
|
|
_strLbCards( this, IDC_DETECT_LIST_CARDS ),
|
|
_strLbFound( this, IDC_DETECT_LIST_FOUND ),
|
|
_mleParam( this, IDC_DETECT_EDIT_PARAM ),
|
|
_dfLog( SZ("NETCARD.LOG"), OF_WRITE )
|
|
{
|
|
if ( QueryError() )
|
|
return ;
|
|
|
|
FillNetcardsListbox() ;
|
|
}
|
|
|
|
DETECT_DIALOG :: ~ DETECT_DIALOG ()
|
|
{
|
|
DrainFound() ;
|
|
FlushLog() ;
|
|
}
|
|
|
|
VOID DETECT_DIALOG :: FillNetcardsListbox ()
|
|
{
|
|
INT iCard ;
|
|
CARDTYPE_REFERENCE * pCardType ;
|
|
TCHAR tchBuffer [500] ;
|
|
|
|
|
|
LOGCOMMENT( "Refill netcards listbox:" );
|
|
|
|
for ( iCard = 0 ;
|
|
pCardType = _dtMgr.NthCardType( iCard ) ;
|
|
iCard++ )
|
|
{
|
|
::wsprintf( tchBuffer, SZ("%s: %s %ld"),
|
|
pCardType->Dll()->Name().QueryPch(),
|
|
pCardType->QueryOptionName(),
|
|
pCardType->QueryType() ) ;
|
|
|
|
Log( tchBuffer );
|
|
|
|
_strLbCards.AddItem( tchBuffer ) ;
|
|
}
|
|
|
|
if ( iCard )
|
|
{
|
|
_strLbCards.SelectItem( 0 ) ;
|
|
}
|
|
|
|
FlushLog() ;
|
|
}
|
|
|
|
VOID DETECT_DIALOG :: DrainFound ()
|
|
{
|
|
ITER_SL_OF(CARD_REFERENCE) islCardRef( _slCardRef ) ;
|
|
|
|
CARD_REFERENCE * pCardRef ;
|
|
|
|
LOGCOMMENT("Discard all found netcards");
|
|
|
|
while ( pCardRef = _slCardRef.Remove( islCardRef ) )
|
|
{
|
|
_dtMgr.ReleaseCard( pCardRef ) ;
|
|
}
|
|
|
|
_strLbFound.DeleteAllItems() ;
|
|
}
|
|
|
|
APIERR DETECT_DIALOG :: AddFound ( CARD_REFERENCE * pCardRef )
|
|
{
|
|
TCHAR tchBuffer [500] ;
|
|
|
|
LOGCOMMENT("Add a card to the found netcards:");
|
|
|
|
::wsprintf( tchBuffer, SZ("[%ld/%ld] %s %ld"),
|
|
(LONG) pCardRef->QueryIfType(),
|
|
pCardRef->QueryBus(),
|
|
pCardRef->QueryCardType()->QueryOptionName(),
|
|
pCardRef->QueryCardType()->QueryType() ) ;
|
|
|
|
APIERR err = _slCardRef.Append( pCardRef ) ;
|
|
|
|
if ( err == 0 )
|
|
{
|
|
Log( tchBuffer );
|
|
_strLbFound.AddItem( tchBuffer ) ;
|
|
}
|
|
FlushLog() ;
|
|
return err ;
|
|
}
|
|
|
|
BOOL DETECT_DIALOG :: OnCommand ( const CONTROL_EVENT & event )
|
|
{
|
|
BOOL fDefault = TRUE ;
|
|
BOOL fResult = FALSE ;
|
|
BOOL fOk = TRUE ;
|
|
|
|
switch ( event.QueryCid() )
|
|
{
|
|
case IDC_DETECT_LIST_CARDS:
|
|
switch ( event.QueryCode() )
|
|
{
|
|
case LBN_SELCHANGE:
|
|
_strLbFound.RemoveSelection();
|
|
break ;
|
|
case LBN_DBLCLK:
|
|
ShowCardTypeParameters() ;
|
|
break ;
|
|
default:
|
|
break ;
|
|
}
|
|
break ;
|
|
|
|
case IDC_DETECT_LIST_FOUND:
|
|
switch ( event.QueryCode() )
|
|
{
|
|
case LBN_SELCHANGE:
|
|
_strLbCards.RemoveSelection();
|
|
break ;
|
|
case LBN_DBLCLK:
|
|
ShowCardParameters() ;
|
|
break ;
|
|
default:
|
|
break ;
|
|
}
|
|
break ;
|
|
|
|
case IDC_DETECT_BUTN_NEXT:
|
|
Detect( FALSE ) ;
|
|
break ;
|
|
|
|
case IDC_DETECT_BUTN_PARAM:
|
|
if ( _strLbCards.QueryCurrentItem() >= 0 )
|
|
{
|
|
ShowCardTypeParameters() ;
|
|
}
|
|
else
|
|
{
|
|
ShowCardParameters() ;
|
|
}
|
|
break ;
|
|
|
|
case IDC_DETECT_BUTN_VERIFY:
|
|
VerifyCardParameters() ;
|
|
break ;
|
|
|
|
default:
|
|
break ;
|
|
}
|
|
|
|
if ( fDefault )
|
|
{
|
|
fResult = DIALOG_WINDOW::OnCommand( event ) ;
|
|
}
|
|
return fResult ;
|
|
}
|
|
|
|
// Fill the edit control with card type parameter
|
|
// information.
|
|
|
|
VOID DETECT_DIALOG :: ShowCardTypeParameters ()
|
|
{
|
|
TCHAR * pszConfigOptions = NULL ;
|
|
INT iSel ;
|
|
CARDTYPE_REFERENCE * pCardType = NULL ;
|
|
|
|
_mleParam.SetText( SZ("") );
|
|
RepaintNow();
|
|
|
|
if ( (iSel = _strLbCards.QueryCurrentItem()) < 0 )
|
|
return ;
|
|
|
|
pCardType = _dtMgr.NthCardType( iSel ) ;
|
|
|
|
if ( pCardType == NULL )
|
|
return ;
|
|
|
|
LOGCOMMENT("Get configuration options for netcard: ");
|
|
Log( pCardType->QueryOptionName() );
|
|
|
|
pszConfigOptions = pCardType->QueryConfigurationOptions() ;
|
|
|
|
if ( pszConfigOptions )
|
|
{
|
|
_mleParam.SetText( pszConfigOptions );
|
|
Log( pszConfigOptions ) ;
|
|
|
|
TESTLISTIFICATION( pszConfigOptions );
|
|
}
|
|
else
|
|
{
|
|
_mleParam.SetText( SZ("** PARAMETER INFO UNAVAILABLE **") );
|
|
LOGCOMMENT("** QUERY OPERATION FAILED **");
|
|
}
|
|
|
|
FlushLog() ;
|
|
|
|
delete pszConfigOptions ;
|
|
}
|
|
|
|
// Fill the edit control with parameter information
|
|
// about the detected card.
|
|
|
|
VOID DETECT_DIALOG :: ShowCardParameters ()
|
|
{
|
|
TCHAR * pszCardParameters = NULL ;
|
|
AUTO_CURSOR cursAuto ;
|
|
|
|
_mleParam.SetText( SZ("") );
|
|
RepaintNow();
|
|
|
|
INT iSel = _strLbFound.QueryCurrentItem() ;
|
|
|
|
if ( iSel < 0 )
|
|
return ;
|
|
|
|
ITER_SL_OF(CARD_REFERENCE) islCardRef( _slCardRef ) ;
|
|
CARD_REFERENCE * pCardRef ;
|
|
|
|
for ( INT i = 0 ; pCardRef = islCardRef.Next() ; i++ )
|
|
{
|
|
if ( i == iSel )
|
|
break ;
|
|
}
|
|
|
|
if ( pCardRef )
|
|
{
|
|
LOGCOMMENT("Get detected card parameters for: ");
|
|
Log( pCardRef->QueryCardType()->QueryOptionName() );
|
|
|
|
if ( pszCardParameters = pCardRef->QueryConfiguration() )
|
|
{
|
|
_mleParam.SetText( pszCardParameters ) ;
|
|
Log( pszCardParameters ) ;
|
|
|
|
TESTLISTIFICATION( pszCardParameters );
|
|
}
|
|
else
|
|
{
|
|
LOGCOMMENT("** QUERY DETECTED PARAMETERS FAILED **");
|
|
}
|
|
}
|
|
|
|
FlushLog() ;
|
|
delete pszCardParameters ;
|
|
}
|
|
|
|
|
|
APIERR DETECT_DIALOG :: Detect ( BOOL fFirst )
|
|
{
|
|
CARD_REFERENCE * pCardRef = NULL ;
|
|
APIERR err = 0 ;
|
|
AUTO_CURSOR cursAuto ;
|
|
|
|
_mleParam.SetText( SZ("") );
|
|
RepaintNow();
|
|
|
|
LOGCOMMENT("Run detection algorithm.");
|
|
|
|
if ( fFirst )
|
|
{
|
|
// Drain the "cards found" listbox and
|
|
// start the iteration over.
|
|
|
|
DrainFound() ;
|
|
|
|
_dtMgr.ResetIteration();
|
|
}
|
|
|
|
// Detect the first/next netcard
|
|
|
|
if ( (err = _dtMgr.DetectCard( & pCardRef )) == 0 )
|
|
{
|
|
err = AddFound( pCardRef ) ;
|
|
}
|
|
|
|
if ( err )
|
|
{
|
|
if ( pCardRef )
|
|
_dtMgr.ReleaseCard( pCardRef ) ;
|
|
|
|
cursAuto.TurnOff() ;
|
|
|
|
::MsgPopup( this, err ) ;
|
|
}
|
|
|
|
return err ;
|
|
}
|
|
|
|
// NOTE: The OK button is named "Detect"
|
|
|
|
BOOL DETECT_DIALOG :: OnOK ()
|
|
{
|
|
Detect( TRUE ) ;
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
|
|
VOID DETECT_DIALOG :: VerifyCardParameters ()
|
|
{
|
|
NLS_STR nlsMle ;
|
|
INT iSel = _strLbFound.QueryCurrentItem() ;
|
|
APIERR err = 0 ;
|
|
|
|
if ( iSel < 0 )
|
|
return ;
|
|
|
|
ITER_SL_OF(CARD_REFERENCE) islCardRef( _slCardRef ) ;
|
|
CARD_REFERENCE * pCardRef ;
|
|
|
|
for ( INT i = 0 ; pCardRef = islCardRef.Next() ; i++ )
|
|
{
|
|
if ( i == iSel )
|
|
break ;
|
|
}
|
|
|
|
if ( pCardRef )
|
|
{
|
|
LOGCOMMENT("Verify parameters for card: ");
|
|
|
|
Log( pCardRef->QueryCardType()->QueryOptionName() );
|
|
|
|
// Get the current text from the MLE.
|
|
|
|
if ( _mleParam.QueryText( & nlsMle ) )
|
|
return ;
|
|
|
|
Log( nlsMle ) ;
|
|
|
|
// Use that to verify the configuration.
|
|
|
|
if ( err = _dtMgr.VerifyConfiguration( pCardRef,
|
|
nlsMle.QueryPch(),
|
|
FALSE ) )
|
|
{
|
|
LOGCOMMENT("** VERIFICATION FAILED **");
|
|
}
|
|
else
|
|
{
|
|
LOGCOMMENT("Verification was successful.");
|
|
}
|
|
}
|
|
|
|
if ( err )
|
|
{
|
|
::MsgPopup( this, err ) ;
|
|
}
|
|
}
|
|
|
|
VOID DETECT_DIALOG :: Log ( const TCHAR * pszData )
|
|
{
|
|
const TCHAR * const pszEol = SZ("\r\n");
|
|
|
|
_nlsLog.Append( pszData ) ;
|
|
_nlsLog.Append( pszEol ) ;
|
|
}
|
|
|
|
VOID DETECT_DIALOG :: Log ( const NLS_STR & nlsData )
|
|
{
|
|
Log( nlsData.QueryPch() ) ;
|
|
}
|
|
|
|
VOID DETECT_DIALOG :: FlushLog ()
|
|
{
|
|
if ( _nlsLog.QueryTextLength() == 0 )
|
|
return ;
|
|
|
|
if ( _dfLog.QueryOpen() )
|
|
{
|
|
_dfLog.Write( (TCHAR *) _nlsLog.QueryPch(),
|
|
_nlsLog.QueryTextLength() ) ;
|
|
}
|
|
_nlsLog = SZ("") ;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: NCPA_WND::RunDetect
|
|
|
|
SYNOPSIS: Exercise detection algorithm
|
|
|
|
ENTRY: Nothing
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
|
|
********************************************************************/
|
|
|
|
VOID NCPA_WND :: RunDetect ()
|
|
{
|
|
AUTO_CURSOR cursAuto ;
|
|
APIERR err = 0 ;
|
|
|
|
// Debugging: allow bypassing of NetDetect service
|
|
|
|
static BOOL fStartService = TRUE ;
|
|
|
|
if ( fStartService )
|
|
{
|
|
err = NcpaStartService( SZ("NetDetect") ) ;
|
|
}
|
|
|
|
if ( err == 0 )
|
|
{
|
|
DETECTION_MANAGER dtMgr ;
|
|
|
|
if ( dtMgr.QueryError() )
|
|
{
|
|
cursAuto.TurnOff() ;
|
|
|
|
::MsgPopup( this, (MSGID) IDS_NCPA_DTMGR_FAILED ) ;
|
|
}
|
|
else
|
|
{
|
|
DETECT_DIALOG dlgDt( QueryHwnd(), dtMgr );
|
|
|
|
cursAuto.TurnOff() ;
|
|
|
|
if ( dlgDt.QueryError() )
|
|
{
|
|
err = IDS_NCPA_DTDLG_FAILED ;
|
|
}
|
|
else
|
|
{
|
|
dlgDt.Process() ;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( err )
|
|
{
|
|
::MsgPopup( this, err ) ;
|
|
}
|
|
}
|
|
|
|
// End of NCPDDTCT.CXX
|
|
|
|
|