Annotation of ntddk/src/mmedia/sndblst/dll/config.c, revision 1.1

1.1     ! root        1: /****************************************************************************
        !             2:  *
        !             3:  *   config.c
        !             4:  *
        !             5:  *   Copyright (c) 1991-1992 Microsoft Corporation.  All Rights Reserved.
        !             6:  *
        !             7:  ***************************************************************************/
        !             8: 
        !             9: #include <windows.h>
        !            10: #include <mmsystem.h>
        !            11: #include "registry.h"
        !            12: #include "sndblst.h"
        !            13: 
        !            14: /*****************************************************************************
        !            15: 
        !            16:     internal function prototypes
        !            17: 
        !            18:  ****************************************************************************/
        !            19:  void Configure(HWND hDlg);
        !            20: 
        !            21: static int PortToId(DWORD wPort)
        !            22: {
        !            23:     switch(wPort) {
        !            24:         case 0x210:  return IDC_210;
        !            25:         case 0x220:  return IDC_220;
        !            26:         case 0x230:  return IDC_230;
        !            27:         case 0x240:  return IDC_240;
        !            28:         case 0x250:  return IDC_250;
        !            29:         case 0x260:  return IDC_260;
        !            30:         default:     return -1;
        !            31:     }
        !            32: }
        !            33: 
        !            34: static DWORD IdToPort(int id)
        !            35: {
        !            36:     switch(id) {
        !            37:         case IDC_210:  return 0x210;
        !            38:         case IDC_220:  return 0x220;
        !            39:         case IDC_230:  return 0x230;
        !            40:         case IDC_240:  return 0x240;
        !            41:         case IDC_250:  return 0x250;
        !            42:         case IDC_260:  return 0x260;
        !            43:         default:       return (DWORD)-1;
        !            44:     }
        !            45: }
        !            46: 
        !            47: static int IntToId(DWORD Int)
        !            48: {
        !            49:     switch(Int) {
        !            50:         case 2:  return IDC_2;
        !            51:         case 9:  return IDC_2;
        !            52:         case 3:  return IDC_3;
        !            53:         case 5:  return IDC_5;
        !            54:         case 7:  return IDC_7;
        !            55:         case 10: return IDC_10;
        !            56:         default: return (DWORD)-1;
        !            57:     }
        !            58: }
        !            59: 
        !            60: static DWORD IdToInt(int id)
        !            61: {
        !            62:     switch(id) {
        !            63:         case IDC_2:  return 9;
        !            64:         case IDC_3:  return 3;
        !            65:         case IDC_5:  return 5;
        !            66:         case IDC_7:  return 7;
        !            67:         case IDC_10: return 10;
        !            68:         default:     return (DWORD)-1;
        !            69:     }
        !            70: }
        !            71: 
        !            72: /***************************************************************************/
        !            73: 
        !            74: void ConfigErrorMsgBox(HWND hDlg, UINT StringId)
        !            75: {
        !            76: WCHAR szErrorBuffer[MAX_ERR_STRING];    /* buffer for error messages */
        !            77: 
        !            78:     LoadString(ghModule, StringId, szErrorBuffer, sizeof(szErrorBuffer));
        !            79:     MessageBox(hDlg, szErrorBuffer, STR_PRODUCTNAME, MB_OK|MB_ICONEXCLAMATION);
        !            80: }
        !            81: 
        !            82: /***************************************************************************/
        !            83: 
        !            84: LRESULT ConfigRemove(HWND hDlg)
        !            85: {
        !            86: 
        !            87:     LRESULT rc;
        !            88: 
        !            89:     //
        !            90:     // Remove the soundblaster driver entry from the registry
        !            91:     //
        !            92: 
        !            93:     rc = DrvRemoveDriver(&RegAccess);
        !            94: 
        !            95:     if (rc == DRVCNF_CANCEL) {
        !            96: 
        !            97:        /*
        !            98:         *  Tell the user there's a problem
        !            99:         */
        !           100:         ConfigErrorMsgBox(hDlg, IDS_FAILREMOVE);
        !           101: 
        !           102:     }
        !           103: 
        !           104:     return rc;
        !           105: }
        !           106: 
        !           107: /****************************************************************************
        !           108:  * @doc INTERNAL
        !           109:  *
        !           110:  * @api int | Config | This puts up the configuration dialog box.
        !           111:  *
        !           112:  * @parm HWND | hWnd | Our Window handle.
        !           113:  *
        !           114:  * @parm HANDLE | hInstance | Our instance handle.
        !           115:  *
        !           116:  * @rdesc Returns whatever was returned from the dialog box procedure.
        !           117:  ***************************************************************************/
        !           118: int Config(HWND hWnd, HANDLE hInstance)
        !           119: {
        !           120:     return DialogBox(hInstance,
        !           121:                      MAKEINTATOM(DLG_CONFIG),
        !           122:                      hWnd,
        !           123:                      (DLGPROC)ConfigDlgProc);
        !           124: }
        !           125: 
        !           126: /****************************************************************************
        !           127:  * @doc INTERNAL
        !           128:  *
        !           129:  * @api BOOL | SetDriverConfig | Callback to set config info in the registry
        !           130:  *         does not write uninitialized values (-1)
        !           131:  *
        !           132:  * @parm PVOID | Context | Our context.
        !           133:  *
        !           134:  * @rdesc Returns TRUE if success, FALSE otherwise.
        !           135:  ***************************************************************************/
        !           136: BOOL SetDriverConfig(PVOID Context)
        !           137: {
        !           138:     SB_CONFIG *Config;
        !           139: 
        !           140:     Config = (SB_CONFIG *)Context;
        !           141: 
        !           142:     /* We set the IO port and interrupt values      */
        !           143:     /* and set the returned version to 0            */
        !           144:     /*                                              */
        !           145:     /* If any of these calls fail then give up      */
        !           146: 
        !           147:     if (Config->Port != (DWORD)-1 &&
        !           148:         DrvSetDeviceParameter(
        !           149:             &RegAccess,
        !           150:             SOUND_REG_PORT,
        !           151:             Config->Port) != ERROR_SUCCESS ||
        !           152:         Config->Int != (DWORD)-1 &&
        !           153:         DrvSetDeviceParameter(
        !           154:             &RegAccess,
        !           155:             SOUND_REG_INTERRUPT,
        !           156:             Config->Int) != ERROR_SUCCESS ||
        !           157:         DrvSetDeviceParameter(
        !           158:             &RegAccess,
        !           159:             TEXT("DSP Version"),
        !           160:             0)  != ERROR_SUCCESS) {
        !           161: 
        !           162:         return FALSE;
        !           163:     } else {
        !           164:         return TRUE;
        !           165:     }
        !           166: }
        !           167: 
        !           168: /****************************************************************************
        !           169:  * @doc INTERNAL
        !           170:  *
        !           171:  * @api void | GetPortAndInt | Determines which port and interrupt settings
        !           172:  *     the user has chosen in the configuration dialog box.
        !           173:  *
        !           174:  * @parm HWND | hDlg | Handle to the configuration dialog box.
        !           175:  *
        !           176:  * @rdesc Structure containing new port and interrupt
        !           177:  ***************************************************************************/
        !           178: SB_CONFIG GetPortAndInt(HWND hDlg)
        !           179: {
        !           180:     SB_CONFIG NewConfig;
        !           181:     int  id;
        !           182: 
        !           183:     NewConfig.Port = (DWORD)-1;
        !           184:     NewConfig.Int = (DWORD)-1;
        !           185: 
        !           186:     for (id = IDC_FIRSTPORT; id <= IDC_LASTPORT; id++)
        !           187:         if (IsDlgButtonChecked(hDlg, id)) {
        !           188:             NewConfig.Port = IdToPort(id);
        !           189:             break;
        !           190:         }
        !           191: 
        !           192:     for (id = IDC_FIRSTINT; id <= IDC_LASTINT; id++)
        !           193:         if (IsDlgButtonChecked(hDlg, id)) {
        !           194:             NewConfig.Int = IdToInt(id);
        !           195:             break;
        !           196:         }
        !           197: 
        !           198:     return NewConfig;
        !           199: }
        !           200: 
        !           201: /****************************************************************************
        !           202:  * @doc INTERNAL
        !           203:  *
        !           204:  * @api int | ConfigDlgProc | Dialog proc for the configuration dialog box.
        !           205:  *
        !           206:  * @parm HWND | hDlg | Handle to the configuration dialog box.
        !           207:  *
        !           208:  * @parm WORD | msg | Message sent to the dialog box.
        !           209:  *
        !           210:  * @parm WORD | wParam | Message dependent parameter.
        !           211:  *
        !           212:  * @parm LONG | lParam | Message dependent parameter.
        !           213:  *
        !           214:  * @rdesc Returns DRV_RESTART if the user has changed settings, which will
        !           215:  *     cause the drivers applet which launched this to give the user a
        !           216:  *     message about having to restart Windows for the changes to take
        !           217:  *     effect.  If the user clicks on "Cancel" or if no settings have changed,
        !           218:  *     DRV_CANCEL is returned.
        !           219:  ***************************************************************************/
        !           220: int ConfigDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !           221: {
        !           222:     int     id;
        !           223:     static  SB_CONFIG  StartConfig;  /* Initial port */
        !           224: 
        !           225:     switch (msg) {
        !           226:         case WM_INITDIALOG:
        !           227:             StartConfig.Int = ConfigGetIRQ();
        !           228:             StartConfig.Port = ConfigGetPortBase();
        !           229: 
        !           230:             if ((id = PortToId(StartConfig.Port)) != -1)
        !           231:                 CheckRadioButton(hDlg, IDC_FIRSTPORT, IDC_LASTPORT, id);
        !           232: 
        !           233:             if ((id = IntToId(StartConfig.Int)) != -1)
        !           234:                 CheckRadioButton(hDlg, IDC_FIRSTINT, IDC_LASTINT, id);
        !           235:             break;
        !           236: 
        !           237:         case WM_COMMAND:
        !           238:             switch (LOWORD(wParam)) {
        !           239:                 case IDOK:
        !           240:                     Configure(hDlg);
        !           241:                     break;
        !           242: 
        !           243:                 case IDCANCEL:
        !           244: 
        !           245:                    /*
        !           246:                     *  Restore to state on entry to dialog if we
        !           247:                     *  possibly can
        !           248:                     */
        !           249: 
        !           250:                     if (bInstall) {
        !           251:                         DrvRemoveDriver(&RegAccess);
        !           252:                     } else {
        !           253: 
        !           254:                         DrvConfigureDriver(&RegAccess,
        !           255:                                            STR_DRIVERNAME,
        !           256:                                            SoundDriverTypeNormal,
        !           257:                                            SetDriverConfig,
        !           258:                                            &StartConfig);
        !           259:                     }
        !           260: 
        !           261:                     EndDialog(hDlg, DRVCNF_CANCEL);
        !           262:                     break;
        !           263: 
        !           264:                 case IDC_210:
        !           265:                 case IDC_220:
        !           266:                 case IDC_230:
        !           267:                 case IDC_240:
        !           268:                 case IDC_250:
        !           269:                 case IDC_260:
        !           270:                     CheckRadioButton(hDlg, IDC_FIRSTPORT, IDC_LASTPORT, wParam);
        !           271:                     break;
        !           272: 
        !           273:                 case IDC_2:
        !           274:                 case IDC_3:
        !           275:                 case IDC_5:
        !           276:                 case IDC_7:
        !           277:                 case IDC_10:
        !           278:                     CheckRadioButton(hDlg, IDC_FIRSTINT, IDC_LASTINT, wParam);
        !           279:                     break;
        !           280: 
        !           281:                 default:
        !           282:                     break;
        !           283:             }
        !           284:             break;
        !           285: 
        !           286:         default:
        !           287:             return FALSE;
        !           288:     }
        !           289: 
        !           290:     return TRUE;
        !           291: }
        !           292: 
        !           293: 
        !           294: 
        !           295: /**************************************************************************
        !           296:  *
        !           297:  * Function : Configure
        !           298:  *
        !           299:  * Arguments :
        !           300:  *
        !           301:  *    NewPort
        !           302:  *    NewInterrupt
        !           303:  *    NewChannel
        !           304:  *
        !           305:  * Description
        !           306:  *
        !           307:  *    The user has selected a (new) configuration.  There are a number
        !           308:  *    of (binary) state varibles to consider :
        !           309:  *
        !           310:  *    1) Is this a new install?
        !           311:  *
        !           312:  *    2) Was the driver previously loaded?
        !           313:  *
        !           314:  *    3) Has the configuration changed?
        !           315:  *
        !           316:  *    4) If the driver was previously loaded could it be unloaded?
        !           317:  *
        !           318:  *    5) Could the driver be loaded ?
        !           319:  *
        !           320:  *    Possible actions are :
        !           321:  *
        !           322:  *    a. Try unload
        !           323:  *
        !           324:  *    b. Try reload
        !           325:  *
        !           326:  *    c. Warn user parameters are not accepted by driver
        !           327:  *
        !           328:  *    d. Put up reboot menu
        !           329:  *
        !           330:  *    e. Update registry with new config data
        !           331:  *
        !           332:  *    f. Check version and issue necessary warnings
        !           333:  *
        !           334:  * Notes :
        !           335:  *    A - 1 & 2 should not happen
        !           336:  *
        !           337:  *    B - ~2 => 4 irrelevant
        !           338:  *
        !           339:  *    C - configuration change irrelevant for new install
        !           340:  *
        !           341:  *    There's never and point in unloading !
        !           342:  *
        !           343:  *    If the configuration changes we have to put it in the registry to
        !           344:  *    test it.
        !           345:  *
        !           346:  *    We must correctly detect the 'not loaded' state via SC manager
        !           347:  *
        !           348:  *    Don't warn them about the version if it's not an install (how
        !           349:  *    do we know ?)
        !           350:  *
        !           351:  *
        !           352:  * The logic is :
        !           353:  *
        !           354:  * 1 2 3 4 5 |    a b c d e f     Comments
        !           355:  * ----------|-------------------------------------------------------------
        !           356:  * 0 0 0 0 0 |                    Config not changed, not new so don't load
        !           357:  * 0 0 0 0 1 |                    Config not changed, not new so don't load
        !           358:  * 0 0 0 1 0 |                    B
        !           359:  * 0 0 0 1 1 |                    B
        !           360:  * 0 0 1 0 0 |      X X   X       Assume load failed due to config failure
        !           361:  * 0 0 1 0 1 |      X     X       Was not loaded, config changed, now loaded OK
        !           362:  * 0 0 1 1 0 |                    B
        !           363:  * 0 0 1 1 1 |                    B
        !           364:  * 0 1 0 0 0 |                    Config not changed, driver loaded so OK
        !           365:  * 0 1 0 0 1 |                    Config not changed, driver loaded so OK
        !           366:  * 0 1 0 1 0 |                    Config not changed, driver loaded so OK
        !           367:  * 0 1 0 1 1 |                    Config not changed, driver loaded so OK
        !           368:  * 0 1 1 0 0 |          X X       Driver was running OK with old config
        !           369:  * 0 1 1 0 1 |          X X       Driver was running OK with old config
        !           370:  * 0 1 1 1 0 |          X X       Driver was running OK with old config
        !           371:  * 0 1 1 1 1 |          X X       Driver was running OK with old config
        !           372:  * 1 0 0 0 0 |      X X   X       Assume load failed due to config failure
        !           373:  * 1 0 0 0 1 |      X     X X     Good install and load
        !           374:  * 1 0 0 1 0 |                    B
        !           375:  * 1 0 0 1 1 |                    B
        !           376:  * 1 0 1 0 0 |                    C
        !           377:  * 1 0 1 0 1 |                    C
        !           378:  * 1 0 1 1 0 |                    B
        !           379:  * 1 0 1 1 1 |                    B
        !           380:  * 1 1 0 0 0 |                    A
        !           381:  * 1 1 0 0 1 |                    A
        !           382:  * 1 1 0 1 0 |                    A
        !           383:  * 1 1 0 1 1 |                    A
        !           384:  * 1 1 1 0 0 |                    A
        !           385:  * 1 1 1 0 1 |                    A
        !           386:  * 1 1 1 1 0 |                    A
        !           387:  * 1 1 1 1 1 |                    A
        !           388:  *
        !           389:  **************************************************************************/
        !           390: 
        !           391:  void Configure(HWND hDlg)
        !           392:  {
        !           393:      DWORD DspVersion;
        !           394:      SB_CONFIG NewConfig;        /* New port and int chosen in config box */
        !           395:      BOOL Success;
        !           396: 
        !           397:     /*
        !           398:      *  Get the new configuration which the user entered
        !           399:      */
        !           400: 
        !           401:      NewConfig = GetPortAndInt(hDlg);
        !           402: 
        !           403:     /*
        !           404:      *     NOTE - even if the configuration has not changed the driver
        !           405:      *     may now load in some cases - so even in this case try it.
        !           406:      *
        !           407:      *     Put the new config in the registry
        !           408:      *
        !           409:      *     unload the driver if needed (note this may fail but we've
        !           410:      *     no way of telling whether it was  loaded in the first place).
        !           411:      *
        !           412:      *     if the driver is not loaded
        !           413:      *
        !           414:      *         try loading the driver
        !           415:      *
        !           416:      *         if the load failed put up a message
        !           417:      *
        !           418:      *         if the load succeeded put up a warning if we don't like
        !           419:      *         the version
        !           420:      *
        !           421:      *     if the driver is already loaded ask them if they would like
        !           422:      *     to reboot (ie return DRVCNF_RESTART (note that if the driver
        !           423:      *     is currently loaded then changing the config will stop it
        !           424:      *     working !).
        !           425:      *
        !           426:      */
        !           427: 
        !           428: 
        !           429:     /*
        !           430:      *  We have a new config - Configure the driver for this configuration
        !           431:      */
        !           432: 
        !           433:      Success = DrvConfigureDriver(&RegAccess,
        !           434:                                   STR_DRIVERNAME,
        !           435:                                   SoundDriverTypeNormal,
        !           436:                                   SetDriverConfig,
        !           437:                                   &NewConfig);
        !           438:     /*
        !           439:      *  Find out what we got back
        !           440:      */
        !           441: 
        !           442:      //
        !           443:      // get the version from the registry if the driver put it there
        !           444:      //
        !           445: 
        !           446:      if (DrvQueryDeviceParameter(&RegAccess,
        !           447:                                  TEXT("DSP Version"),
        !           448:                                  &DspVersion)
        !           449:          != ERROR_SUCCESS) {
        !           450:          DspVersion = 0;
        !           451:      }
        !           452: 
        !           453:     /*
        !           454:      *  See if we succeeded and interpret the 'version number'
        !           455:      *  accordingly.
        !           456:      */
        !           457: 
        !           458:      if (!Success) {
        !           459: 
        !           460:         /*
        !           461:          *  Private interface to kernel driver.
        !           462:          *  Flag 0x8000 set says it's a thunderboard
        !           463:          *  Flag 0x4000 set says wrong port
        !           464:          *  Flag 0x2000 set says wrong interrupt
        !           465:          *  Flag 0x1000 set says interrupt is in use by someone else
        !           466:          */
        !           467: 
        !           468:          ConfigErrorMsgBox(hDlg,
        !           469:                            DspVersion & 0x4000 ? IDS_ERRBADPORT :
        !           470:                            DspVersion & 0x2000 ? IDS_ERRBADINT :
        !           471:                            DspVersion & 0x1000 ? IDS_ERRINTINUSE :
        !           472:                                          IDS_ERRBADCONFIG);
        !           473: 
        !           474:      } else {
        !           475: 
        !           476:         /*
        !           477:          *  If we're an install then check out the version
        !           478:          */
        !           479: 
        !           480:          if (bInstall) {
        !           481: 
        !           482:              /*  Advise upgrade if on <= 1.00 DSP */
        !           483:              if (DspVersion <= DSP_VERSION_REQD) {
        !           484:                  /*  display error and DON'T write INI settings - */
        !           485:                  /*  this way the driver will never enable */
        !           486:                  ConfigErrorMsgBox(hDlg, IDS_ERRBADVERSION);
        !           487:              }
        !           488: 
        !           489:              /* high bit set if Thunder Board - warn them */
        !           490:              /* but continue installing */
        !           491:              if (DspVersion & 0x8000)
        !           492:                  ConfigErrorMsgBox(hDlg, IDS_WARNTHUNDER);
        !           493: 
        !           494:              /*  if installing on a Pro spectrum card, warn them */
        !           495:              /*  but continue installing */
        !           496:              else if (DspVersion & 0x800)
        !           497:                  ConfigErrorMsgBox(hDlg, IDS_WARNPROSPEC);
        !           498: 
        !           499: 
        !           500:              /*  if installing on a Pro card, warn them */
        !           501:              /*  but continue installing */
        !           502:              else if (DspVersion >= DSP_VERSION_PRO)
        !           503:                  ConfigErrorMsgBox(hDlg, IDS_WARNPROCARD);
        !           504: 
        !           505:              bInstall = FALSE;
        !           506:          }
        !           507:          EndDialog(hDlg, DRVCNF_RESTART);
        !           508:          return;
        !           509:      }
        !           510:  }
        !           511: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.