Annotation of ntddk/src/mmedia/sndblst/dll/config.c, revision 1.1.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.