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.
 
 
 
 
 
 

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