Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
28.06.2014
Размер:
45.62 Кб
Скачать
/*
 #########################################################################
 ## Installation program for Windows 95 / NT driver                     ##
 ##                 Dialog module ( linked with INSTDRV.C )             ##
 ##                                                 by Gonzo 1997-99    ##
 #########################################################################
*/

#include <windows.h>
#include <stdio.h>

#include "instdrv.h"
#include "inststr.h"
#include "instdrvs.h"
#include "instdrvf.h"


#define PORT_PRESENT(a)  (bPort&(1<<a))

extern void TryToExitWindows        ( void );
extern char* RS                     ( int  );

int          CheckDriver            ( void );
void         SetPortSettings        ( HWND, int );
void         SetAvailiblePorts      ( HWND );
void         EnableChecks           ( HWND, int, int );
BOOL         CheckEditBox           ( HWND, int, float, float, float*, int );
BOOL         CheckEditBoxInt        ( HWND, int, int, int, int*, int );
BOOL         SetupFriendlyLPTNames  ( void );
void         ShowAlert              ( HWND, int );
void         CheckRadio             ( HWND, int );
void         EnableRadios           ( HWND, int, int, int );

BOOL _export CALLBACK ConfigDlgProc95     ( HWND, UINT, WPARAM, LPARAM);
BOOL _export CALLBACK ConfigDlgProcNT     ( HWND, UINT, WPARAM, LPARAM);
BOOL _export CALLBACK AdvancedDlgProc     ( HWND, UINT, WPARAM, LPARAM);
BOOL _export CALLBACK MsgDlgProc          ( HWND, UINT, WPARAM, LPARAM);


struct _CFG_CRC    // We store configuration to this structure to
                   // recognize any changes
{
 DWORD Timeout;
 DWORD M1,M2,M3;
 BYTE  I1,I2,I3;
 BYTE  Port;
 DWORD CfgFlags;
} CfgCrc;

// Operations with 'CRC' - sign of changed configuration
#define MAKE_CFG_CRC {CfgCrc.Timeout=dwTimeOut;CfgCrc.M1=Prt[0].Method;CfgCrc.M2=Prt[1].Method;\
                      CfgCrc.M3=Prt[2].Method;CfgCrc.Port=bPort;CfgCrc.I1=Prt[0].Irql;\
                      CfgCrc.I2=Prt[1].Irql;CfgCrc.I3=Prt[2].Irql;CfgCrc.CfgFlags=dwConfigFlags;}
#define _CRC_CHECK  ((CfgCrc.Timeout==dwTimeOut)&&(CfgCrc.Port==bPort)&& \
                     (CfgCrc.M1==Prt[0].Method)&&(CfgCrc.M2==Prt[1].Method)&&(CfgCrc.M3==Prt[2].Method)&& \
                     (CfgCrc.I1==Prt[0].Irql)&&(CfgCrc.I2==Prt[1].Irql)&&(CfgCrc.I3==Prt[2].Irql)&&\
                     (CfgCrc.CfgFlags==dwConfigFlags))

extern int  CurDrvVer;
extern BOOL bRus;
extern BOOL bWinNT;
extern BOOL bInfo;
extern HINSTANCE hMainInstance;
extern TDriverState DrvState;

static char szText[0x100];         // String for any use


// This variables for configuration dialog...
TLPTinfo Prt[3];                   // Information structure ( for each port )
BYTE  bPort = 7;                   // Mask of ports that user-marked for use
int   nCur = 0;                    // Current port number (0 means LPT1 etc.)
DWORD dwConfigFlags = 0x8000;      // Driver configuration
DWORD dwTimeOut = 10000;           // Current TimeOut value
WORD  wTimers = gd_TIMELOOP_AUTO;  // Current Timer and Delay methods
HWND  hCfgWnd;                     // Handle of configuration window

GD_DRIVER_INFO DI;                 // Driver Info structure

//******************************************************************
// This routine checks driver with GD_CheckDriver() and
// fills the DrvState structure with driver state information

int CheckDriver()
{
 int nRet;
 switch (nRet = GD_CheckDriver(&DI,sizeof(DI)))
 {
    case ge_NO_ERROR:
       DrvState.Present = 1;
       DrvState.Age     = DRIVER_AGE_EQUAL;
    break;
    case ge_DRIVER_BUSY:
        GD_GetLastErrorDescription ( szText, 0x100 );
        DrvState.Present = 1;
        DrvState.Age     = DRIVER_AGE_EQUAL;
    break;
    case ge_DRIVER_NOT_FOUND:
       DrvState.Present = 0;
    break;
    case ge_DRIVER_NEWER_VERSION:
       DrvState.Present = 1;
       DrvState.Age     = DRIVER_AGE_NEWER;
    break;
    case ge_DIOCTL_FAIL:
    case ge_DRIVER_OLD_VERSION:
       DrvState.Present = 1;
       DrvState.Age     = DRIVER_AGE_OLDER;
    break;
    case ge_REBOOT_NEEDED:
       DrvState.RebootNeeded = 1;
       DrvState.Present = 1;
    break;
 }
 return nRet;
}
//******************************************************************
// Sets up the 'FRIENDLY NAMES' - strings with friendly description
// of the port. The strings come from registry. Registry keys
// come from driver.
//             Friendly names supported for Windows 95 for the time.
BOOL SetupFriendlyLPTNames()
{
 int i;
 BOOL bPresent = 0;
 DWORD size=100;

 for (i=0;i<3;i++)
   if (!RegQueryValueEx((HKEY)Prt[i].RegKey,"FRIENDLYNAME",NULL,NULL,(void*)szText,&size)) // == SUCCESS
   {
      memccpy (Prt[i].FriendlyName,szText,0,100);
      bPresent = 1;
   }

 return bPresent;
}
//******************************************************************
// This routine sets 'YES-NO' radio button state and friendly name for port
void SetPortSettings(HWND hWnd,int PortNum)
{
 if (PORT_PRESENT(PortNum))
 {
    CheckDlgButton(hWnd,IDC_RADIOBUTTON_YES,1);
    CheckDlgButton(hWnd,IDC_RADIOBUTTON_NO ,0);
    SendMessage(hWnd,WM_COMMAND,IDC_RADIOBUTTON_YES,0);
 }
 else
 {
    CheckDlgButton(hWnd,IDC_RADIOBUTTON_NO ,1);
    CheckDlgButton(hWnd,IDC_RADIOBUTTON_YES,0);
    SendMessage(hWnd,WM_COMMAND,IDC_RADIOBUTTON_NO ,0);
 }
 SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT_FR_NAME),Prt[PortNum].FriendlyName);
}
//******************************************************************
//  This routine fills listbox with present ports list
//
void SetAvailiblePorts(HWND hWnd)
{
 int i,f=0;

 for (i=0;i<3;i++)
 {
    Prt[i].Base = DI.di_awBase[i];
    Prt[i].RegKey = DI.di_adwHKey[i];

    if (Prt[i].Base)
    {
       f = 1;
       sprintf( szText, "LPT%d  ( %03Xh )", i+1, Prt[i].Base );
       SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_ADDSTRING,0,(LPARAM)szText);
    }
    else
       bPort &= (BYTE)((1<<i)^0xFF); // Clear this bit because no such hrd port at all!!!
 }

 if (!f)
 {
    MessageBox(hWnd,RS(S_NOLPTFOUND),"Error",MB_);
    EndDialog(hWnd,RET_CANCEL);
 }


}
//***************************************************************************
//  This routine enables and checks all method checkboxes for current port
//
void EnableChecks(HWND hWnd,int notAuto,int nOff)
{
// notAuto is negative for Auto method:
//                      if TRUE  -> Auto is off and we need to show all
//                      if FALSE -> Auto is on and only grayed default needed
// nOff is for unused port. if it's 0, then all checks is off.
 EnableWindow(GetDlgItem(hWnd,IDC_STATICTEXT_METHODS), nOff );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_STEAL   ),notAuto & DI.di_Flags.mSteal );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_ACQUIRE ),notAuto & DI.di_Flags.mAquire );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_CS      ),notAuto & DI.di_Flags.mCrSect );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_MASK    ),notAuto & DI.di_Flags.mMask );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_CLI     ),notAuto & DI.di_Flags.mCli );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_ALLOC   ),notAuto & DI.di_Flags.mAlloc );
 EnableWindow(GetDlgItem(hWnd,IDC_CHECK_IRQL    ),notAuto & DI.di_Flags.mIrql );
 if ( bWinNT )
 {
    sprintf(szText,"%d",Prt[nCur].Irql);
    SetWindowText(GetDlgItem(hWnd,IDC_EDIT_IRQL),szText);
 }
 if (notAuto)
 {  // Then check the box we consider with following parameters:
    //  Is this method used for this port? and
    //  Is this method supported by driver?

    CheckDlgButton(hWnd,IDC_CHECK_STEAL  ,(Prt[nCur].Method & gd_METHOD_STEAL  )&& DI.di_Flags.mSteal );
    CheckDlgButton(hWnd,IDC_CHECK_ACQUIRE,(Prt[nCur].Method & gd_METHOD_ACQUIRE)&& DI.di_Flags.mAquire );
    CheckDlgButton(hWnd,IDC_CHECK_CS     ,(Prt[nCur].Method & gd_METHOD_CS     )&& DI.di_Flags.mCrSect );
    CheckDlgButton(hWnd,IDC_CHECK_MASK   ,(Prt[nCur].Method & gd_METHOD_MASK   )&& DI.di_Flags.mMask );
    CheckDlgButton(hWnd,IDC_CHECK_CLI    ,(Prt[nCur].Method & gd_METHOD_CLI    )&& DI.di_Flags.mCli );
    CheckDlgButton(hWnd,IDC_CHECK_ALLOC  ,(Prt[nCur].Method & gd_METHOD_ALLOC  )&& DI.di_Flags.mAlloc );
    CheckDlgButton(hWnd,IDC_CHECK_IRQL   ,(Prt[nCur].Method & gd_METHOD_IRQL   )&& DI.di_Flags.mIrql );
    if (( Prt[nCur].Method & gd_METHOD_IRQL   )&& DI.di_Flags.mIrql )
        EnableWindow  (GetDlgItem(hWnd,IDC_EDIT_IRQL),1);
    else
        EnableWindow  (GetDlgItem(hWnd,IDC_EDIT_IRQL),0);
 }
 else
 {
    CheckDlgButton(hWnd,IDC_CHECK_STEAL  ,(gd_METHOD_AUTO_95 & gd_METHOD_STEAL   & nOff )&& DI.di_Flags.mSteal );
    CheckDlgButton(hWnd,IDC_CHECK_ACQUIRE,(gd_METHOD_AUTO_95 & gd_METHOD_ACQUIRE & nOff )&& DI.di_Flags.mAquire );
    CheckDlgButton(hWnd,IDC_CHECK_CS     ,(gd_METHOD_AUTO_95 & gd_METHOD_CS      & nOff )&& DI.di_Flags.mCrSect );
    CheckDlgButton(hWnd,IDC_CHECK_MASK   ,(gd_METHOD_AUTO_95 & gd_METHOD_MASK    & nOff )&& DI.di_Flags.mMask );
    CheckDlgButton(hWnd,IDC_CHECK_CLI    ,(gd_METHOD_AUTO_95 & gd_METHOD_CLI     & nOff )&& DI.di_Flags.mCli );
    CheckDlgButton(hWnd,IDC_CHECK_ALLOC  ,(gd_METHOD_AUTO_NT & gd_METHOD_ALLOC   & nOff )&& DI.di_Flags.mAlloc );
    CheckDlgButton(hWnd,IDC_CHECK_IRQL   ,(gd_METHOD_AUTO_NT & gd_METHOD_IRQL    & nOff )&& DI.di_Flags.mIrql );
    EnableWindow  (GetDlgItem(hWnd,IDC_EDIT_IRQL    ),0);
 }
}
//*****************************************************************************
//   This routine checks FLOAT value in the given editbox
//   It takes Dialog,Item,Ranges(Min & Max), Result and Error message ID
//
BOOL CheckEditBox(HWND hWnd,int IDC,float min,float max,float * Res,int MsgID)
{
 HWND EditItem = GetDlgItem(hWnd,IDC);
 GetWindowText(EditItem,szText,10);
 if ((sscanf(szText,"%g",Res)!=1)||(*Res < min)||(*Res > max))
 {
    if (MsgID>=0)
    {
       sprintf(szText,RS(MsgID),min,max);
       MessageBox(hWnd,szText,"Error",MB_);
    }
    else
       SetFocus(hWnd);
    SetFocus(EditItem);
    SendMessage(EditItem,EM_SETSEL,0,-1);
    return 0;
 }
 return 1;
}
//*****************************************************************************
//  This routine is the same as previous but checks INTEGER value
//
BOOL CheckEditBoxInt(HWND hWnd,int IDC,int min,int max,int * Res,int MsgID)
{
 HWND EditItem = GetDlgItem(hWnd,IDC);

 GetWindowText(EditItem,szText,10);
 if ((sscanf(szText,"%d",Res)!=1)||(*Res < min)||(*Res > max))
 {
    if (MsgID>=0)
    {
       sprintf(szText,RS(MsgID),min,max);
       MessageBox(hWnd,szText,"Error",MB_);
    }
    else
       SetFocus(hWnd);
    SetFocus(EditItem);
    SendMessage(EditItem,EM_SETSEL,0,-1);
    return 0;
 }
 sprintf(szText,"%d",*Res);
 SetWindowText(EditItem,szText);
 return 1;
}
//*****************************************************************************
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//*****************************************************************************
//   This is DialogProc for main dialog
//
BOOL _export CALLBACK MsgDlgProc( HWND hWnd, UINT uMsg,
                                  WPARAM wParam, LPARAM lParam )
{
 RECT rc;
 DWORD s1;
 static int DlgX=-600,DlgY;  // -600 used as sign of first usage

 switch( uMsg )
 {
   case WM_INITDIALOG:

       // Print version to left low coner of dialog.
       // Version 1.10 appears like '1.1';  1.12 appears as is
       sprintf (szText,"v %d.%d", CurDrvVer>>8,((CurDrvVer&0xFF)%10)?CurDrvVer&0xff:(CurDrvVer&0xff)/10);

       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT2),szText);
       SetWindowText(hWnd,RS(S_TITLE));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT1),RS(S_WELCOME));
       SetWindowText(GetDlgItem(hWnd,IDEXIT),RS(S_BTNEXIT));
       SetWindowText(GetDlgItem(hWnd,IDINSTALL),RS(S_BTNINSTALL));
       SetWindowText(GetDlgItem(hWnd,IDREMOVE),RS(S_BTNUNINSTALL));
       SetWindowText(GetDlgItem(hWnd,IDCONFIG),RS(S_BTNCONFIG));
       GetWindowRect(hWnd,&rc);
       s1 = rc.right - rc.left;
       GetWindowRect(GetDlgItem(hWnd,IDC_STATICBITMAP1),&rc);
       if (DlgX!=-600) // Not the first time!
          SetWindowPos(hWnd,HWND_BOTTOM,DlgX,DlgY,0,0,SWP_NOSIZE+SWP_NOZORDER);
       SetWindowPos(GetDlgItem(hWnd,IDC_STATICBITMAP1),HWND_BOTTOM,
          (int)(s1-(rc.right - rc.left)-5),-10,0,0,SWP_NOSIZE+SWP_NOZORDER);

       // All other business we'll do after this dialog appears:
       PostMessage(hWnd,WM_COMMAND,345,0);
       break;

   case WM_DESTROY:
       {
         RECT rc;
         GetWindowRect(hWnd,&rc);
         DlgX = rc.left;
         DlgY = rc.top;
       }
       break;

   case WM_COMMAND:
       switch( wParam )
       {
       // User-defined message. To allow dialog to be shown.
       case 345:
            if (!DrvState.Present)
            {
                SetWindowText(GetDlgItem(hWnd,IDINSTALL),RS(S_BTNINSTALL));
                EnableWindow(GetDlgItem(hWnd,IDCONFIG),0);
                EnableWindow(GetDlgItem(hWnd,IDREMOVE),0);
                EnableWindow(GetDlgItem(hWnd,IDINSTALL),1);
            }
            else
            {
                SetWindowText(GetDlgItem(hWnd,IDINSTALL),RS(S_BTNREINSTALL));
                if (!DI.di_Flags.fConfigurable)
                    EnableWindow(GetDlgItem(hWnd,IDCONFIG),0);
                else
                    EnableWindow(GetDlgItem(hWnd,IDCONFIG),1);
                EnableWindow(GetDlgItem(hWnd,IDREMOVE),1);
                EnableWindow(GetDlgItem(hWnd,IDINSTALL),1);

                if (DrvState.Age != DRIVER_AGE_EQUAL)
                {
                   GD_GetLastErrorDescription  ( szText, 0x100 );
                   if (!bInfo) // else message appears from DLL
                      MessageBox(NULL, szText, RS(S_TITLE),MB_);
                }

            }
            break;

       case IDINSTALL:
            GD_PrintLog(" ==== Install Button pressed ====");
            EndDialog(hWnd,0);
            break;

       case IDREMOVE:
            GD_PrintLog(" ==== Remove Button pressed ====");
            EndDialog(hWnd,COMMAND_UNINST);
            break;

       case IDCONFIG:
            GD_PrintLog(" ==== Config Button pressed ====");
            if ( bWinNT )
                 DialogBox(hMainInstance,MAKEINTRESOURCE(IDD_CONFIG_NT),hWnd,(DLGPROC)ConfigDlgProcNT);
            else
                 DialogBox(hMainInstance,MAKEINTRESOURCE(IDD_CONFIG),hWnd,(DLGPROC)ConfigDlgProc95);
            break;

       case IDEXIT:
            GD_PrintLog(" ==== Exit Button pressed ====");
            EndDialog(hWnd,COMMAND_EXIT);
            break;
       }
       break;
 default: return FALSE;
 }
 return (BOOL)DefWindowProc(hWnd,uMsg,wParam,lParam);
}
//*****************************************************************************
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//))))  #    #  ##### ))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//((((  ##   #    #   ((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//))))  # #  #    #   ))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//((((  #  # #    #   ((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//))))  #   ##    #   ))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//*****************************************************************************
//   This is DialogProc for configuration dialog.  Windows NT variant
//
BOOL _export CALLBACK ConfigDlgProcNT( HWND hWnd, UINT uMsg,
                                     WPARAM wParam, LPARAM lParam )
{
 float fTimeOut;
 int   iIRQL,i;

 switch( uMsg )
 {
   case WM_INITDIALOG:

       hCfgWnd = hWnd;
       // Initialize: Title
       SetWindowText(hWnd,RS(S_TITLE_CFG));
       // All static texts
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT2),RS(S_CONFIGTEXT));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT3),RS(S_TIMEOUT));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT4),RS(S_SEC));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT_METHODS),RS(S_STEALTYPE));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT_USE),RS(S_USEPORT));
       // Radio buttons and check boxes
       if (bRus)
       {
             SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_YES),"Да");
             SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_NO ),"Нет");
             SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_CANCEL  ),"Отмена");
             SetWindowText(GetDlgItem(hWnd,IDC_CHECK_ALLOC    ),"Захват LPT порта");
             SetWindowText(GetDlgItem(hWnd,IDC_CHECK_IRQL     ),"Изменить IRQL на");
             SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_ADVANCED),"Дополнительно");
       }
       else
       {
             SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_YES),"Yes");
             SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_NO ),"No");
             SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_CANCEL  ),"Cancel");
             SetWindowText(GetDlgItem(hWnd,IDC_CHECK_ALLOC    ),"Catch LPT port");
             SetWindowText(GetDlgItem(hWnd,IDC_CHECK_IRQL     ),"Change IRQL to");
             SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_ADVANCED),"Advanced");
       }

       // Ports ------------------------------
       bPort = DI.di_bPort;
       // Methods and Irqls ------------------
       for (i=0;i<3;i++)
       {
          Prt[i].Method = DI.di_adwMethod[i];
          Prt[i].Irql   = DI.di_abIrql[i];
       }
       // TimeOut ----------------------------
       dwTimeOut = DI.di_dwTimeout;
       sprintf(szText,"%lg",dwTimeOut/1000.0);
       SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),szText);
       // Configuration Flags ------------------
       dwConfigFlags = DI.di_dwConfigFlags;
       wTimers = (WORD)(DI.di_dwTimeLoop & 0xFFFF) ;

       // Port list
       SetAvailiblePorts(hWnd);
       SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_SETCURSEL,0,0);
       SendMessage(hWnd,WM_COMMAND,IDC_LISTBOX1 | 0x10000,0);
       MAKE_CFG_CRC;

       break;
   case WM_COMMAND:

       switch( LOWORD(wParam) )
       {
       case IDC_LISTBOX1:
           if (HIWORD(wParam)==1) // Item changes...
           {
               nCur=SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_GETCURSEL,0,0);
               SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_GETTEXT,nCur,(LPARAM)szText);
               nCur=szText[3]-'1';
               SetPortSettings(hWnd,nCur);
               return 0;
            }
            break;
       case IDC_EDIT1:
           if (HIWORD(wParam)==EN_KILLFOCUS)
           {
              if (CheckEditBox(hWnd,IDC_EDIT1,MIN_TIMEOUT,MAX_TIMEOUT,&fTimeOut,S_TIMEOUTMSG))
                 fTimeOut=fTimeOut*1000.0+0.5;
                 dwTimeOut=(DWORD)(fTimeOut);
           }
           break;
       case IDC_EDIT_IRQL:
           if (HIWORD(wParam)==EN_KILLFOCUS)
           {
              if (CheckEditBoxInt(hWnd,IDC_EDIT_IRQL,MIN_IRQL,MAX_IRQL,&iIRQL,S_IRQLOUTOFRANGE))
                 Prt[nCur].Irql=(BYTE)(iIRQL);
           }
           break;
       case IDC_RADIOBUTTON_YES:
            bPort=(BYTE)(bPort|(1<<nCur));
            EnableWindow(GetDlgItem(hWnd,IDC_CHECK_AUTO),TRUE);
            if (Prt[nCur].Method & gd_METHOD_AUTO)
               CheckDlgButton(hWnd,IDC_CHECK_AUTO,TRUE);
            else
               CheckDlgButton(hWnd,IDC_CHECK_AUTO,FALSE);
            SendMessage(hWnd,WM_COMMAND,IDC_CHECK_AUTO,0);
            return 0;

       case IDC_RADIOBUTTON_NO:
            bPort=(BYTE)(bPort&((1<<nCur)^(0xFF)));
            EnableWindow(GetDlgItem(hWnd,IDC_CHECK_AUTO),FALSE);
            CheckDlgButton(hWnd,IDC_CHECK_AUTO,FALSE);
            EnableChecks(hWnd,FALSE,0);
            return 0;
       case IDC_CHECK_AUTO:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_AUTO)==BST_CHECKED)
            {
               Prt[nCur].Method |= gd_METHOD_AUTO;
               Prt[nCur].Irql = gd_IRQL_AUTO;
               EnableChecks(hWnd,FALSE,0xFF);
            }
            else
            {
               EnableChecks(hWnd,TRUE,0xFF);
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_AUTO);
            }
            return 0;
       case IDC_CHECK_ALLOC:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_ALLOC)==BST_CHECKED)
               Prt[nCur].Method |= gd_METHOD_ALLOC;
            else
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_ALLOC);
            return 0;
       case IDC_CHECK_IRQL:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_IRQL)==BST_CHECKED)
            {
               Prt[nCur].Method |= gd_METHOD_IRQL;
               EnableWindow(GetDlgItem(hWnd,IDC_EDIT_IRQL),TRUE);
            }
            else
            {
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_IRQL);
               EnableWindow(GetDlgItem(hWnd,IDC_EDIT_IRQL),FALSE);
            }
            return 0;
        case IDC_BUTTON_ADVANCED:
         {
            DWORD dwTmp;
            dwTmp = wTimers | ( DI.di_dwTimeLoop & 0xFFFF0000 );
            GD_PrintLog(" ==== Advanced Button pressed ====");
            wTimers = (WORD)DialogBoxParam(hMainInstance,MAKEINTRESOURCE(IDD_ADVANCED),hWnd,(DLGPROC)AdvancedDlgProc, dwTmp );
            break;
         }
       case IDC_BUTTON_OK:

            GD_PrintLog(" ==== Config Dialog OK pressed ====");
            if ( CheckEditBox ( hWnd, IDC_EDIT1, MIN_TIMEOUT, MAX_TIMEOUT, &fTimeOut, S_TIMEOUTMSG ) )
            {
                 fTimeOut = fTimeOut * 1000.0 + 0.5;
                 dwTimeOut = ( DWORD )( fTimeOut );
            }
            else
                return 0;

            if (CheckEditBoxInt(hWnd,IDC_EDIT_IRQL,MIN_IRQL,MAX_IRQL,&iIRQL,S_IRQLOUTOFRANGE))
                Prt[nCur].Irql=(BYTE)(iIRQL);
            else
                return 0;

            dwConfigFlags = wTimers;        

            if ( !_CRC_CHECK )
            {
                GD_ConfigPortsUse(bPort);
                GD_ConfigTimeOut(dwTimeOut);
                GD_ConfigFlags(dwConfigFlags);
                for ( i=0; i<3; i++ )
                {
                    GD_ConfigIrql((BYTE)i,Prt[i].Irql);
                    GD_ConfigPortAlloc((BYTE)i,Prt[i].Method);
                }
                i = GD_ReconfigureDriver();
                if ( i != ge_NO_ERROR)
                {
                   GD_GetLastErrorDescription(szText,0x100);
                   if (i!=ge_PORTS_NOT_USED) //YES-NO dialog in DLL always
                     if (!bInfo)// else message appears from DLL
                        MessageBox(NULL,szText,"Error",MB_);

                   // if driver is busy we ignore OK button to avoid 
                   // new configuration to be lost
                      return 0;

                }
                CheckDriver();
                EndDialog(hWnd,RET_OK);
            }
            else
            {
                GD_PrintLog("      Config Dialog closed with NO CHANGES ====");
                EndDialog(hWnd,RET_CANCEL);
            }
            return 0;

       case IDC_BUTTON_CANCEL:
            GD_PrintLog(" ==== Config Dialog canceled... ====");
            EndDialog(hWnd,RET_CANCEL);
            return 0;
       }
       break;
 default: return FALSE;
 }
return (BOOL)DefWindowProc(hWnd,uMsg,wParam,lParam);
}
//*****************************************************************************
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))MMMM)))MMMMM))))))))))))))))))))))))))))))))))))))))))))))))))))))
//((((((((((MM((MM((M((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))MMMMM))MMMM)))))))))))))))))))))))))))))))))))))))))))))))))))))))
//(((((((((((((MM((((((M(((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))MMMMM)))MMMM))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//*****************************************************************************
//   This is DialogProc for configuration dialog.  Windows 95/98 variant
//
BOOL _export CALLBACK ConfigDlgProc95 ( HWND hWnd, UINT uMsg,
                                        WPARAM wParam, LPARAM lParam )
{
 float fTimeOut;
 int i;

 switch( uMsg )
 {
   case WM_INITDIALOG:
       hCfgWnd = hWnd;
       // Initialize: Title
       SetWindowText(hWnd,RS(S_TITLE_CFG));
       // All static texts
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT2),RS(S_CONFIGTEXT));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT3),RS(S_TIMEOUT));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT4),RS(S_SEC));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT_METHODS),RS(S_STEALTYPE));
       SetWindowText(GetDlgItem(hWnd,IDC_STATICTEXT_USE),RS(S_USEPORT));
       // Radio buttons
       if (bRus)
       {
           SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_YES),"Да");
           SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_NO ),"Нет");
           SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_CANCEL  ),"Отмена");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_AUTO     ),"Автоматический");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_STEAL    ),"Захват LPT порта");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_ACQUIRE  ),"Захват I/O диапазона");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_CS       ),"Критическая секция");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_MASK     ),"Маскирование прерываний");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_CLI      ),"Запрет прерываний");
           SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_ADVANCED),"Дополнительно");
       }
       else
       {
           SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_YES),"Yes");
           SetWindowText(GetDlgItem(hWnd,IDC_RADIOBUTTON_NO ),"No");
           SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_CANCEL  ),"Cancel");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_AUTO     ),"Auto");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_STEAL    ),"Catch LPT port");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_ACQUIRE  ),"Catch I/O range");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_CS       ),"Critical section");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_MASK     ),"Masking interupts");
           SetWindowText(GetDlgItem(hWnd,IDC_CHECK_CLI      ),"Disabling interupts");
           SetWindowText(GetDlgItem(hWnd,IDC_BUTTON_ADVANCED),"Advanced");       
       }
       EnableWindow ( GetDlgItem(hWnd,IDC_BUTTON_ADVANCED), DI.di_Flags.cTimers );

       // Ports ------------------------------
       bPort = DI.di_bPort;
       // Methods ----------------------------
       Prt[0].Method = DI.di_adwMethod[0];
       Prt[1].Method = DI.di_adwMethod[1];
       Prt[2].Method = DI.di_adwMethod[2];
       // TimeOut ----------------------------
       dwTimeOut = DI.di_dwTimeout;
       // Configuration Flags ------------------
       dwConfigFlags = DI.di_dwConfigFlags;

       // Timer / Loop method
       wTimers = (WORD)(DI.di_dwTimeLoop & 0xFFFF) ;

       sprintf(szText,"%lg",dwTimeOut/1000.0);
       SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),szText);
       // Port list
       SetAvailiblePorts(hWnd);
       SetupFriendlyLPTNames();
       SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_SETCURSEL,0,0);
       SendMessage(hWnd,WM_COMMAND,IDC_LISTBOX1 | 0x10000,0);
       MAKE_CFG_CRC;

       break;
   case WM_COMMAND:

       switch( LOWORD(wParam) )
       {

       case IDC_LISTBOX1:
           if (HIWORD(wParam)==1) // Item changes...
           {
               nCur=SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_GETCURSEL,0,0);
               SendMessage(GetDlgItem(hWnd,IDC_LISTBOX1),LB_GETTEXT,nCur,(LPARAM)szText);
               nCur=szText[3]-'1';
               SetPortSettings(hWnd,nCur);
               return 0;
           }
           break;
       case IDC_EDIT1:
           if (HIWORD(wParam)==EN_KILLFOCUS)
              if (CheckEditBox(hWnd, IDC_EDIT1, MIN_TIMEOUT,MAX_TIMEOUT, &fTimeOut, S_TIMEOUTMSG))
              {
                  fTimeOut=fTimeOut*1000.0+0.5;
                  dwTimeOut=(DWORD)(fTimeOut);
              }
           break;
       case IDC_RADIOBUTTON_YES:
            bPort=(BYTE)(bPort| (1<<nCur));
            EnableWindow(GetDlgItem(hWnd,IDC_CHECK_AUTO),TRUE);
            if (Prt[nCur].Method & gd_METHOD_AUTO)
               CheckDlgButton(hWnd,IDC_CHECK_AUTO,TRUE);
            else
               CheckDlgButton(hWnd,IDC_CHECK_AUTO,FALSE);
            SendMessage(hWnd,WM_COMMAND,IDC_CHECK_AUTO,0);
            return 0;

       case IDC_RADIOBUTTON_NO:
            bPort=(BYTE)(bPort&( (1<<nCur) ^ 0xFF ));
            EnableWindow(GetDlgItem(hWnd,IDC_CHECK_AUTO),FALSE);
            CheckDlgButton(hWnd,IDC_CHECK_AUTO,FALSE);
            EnableChecks(hWnd,FALSE,0);
            return 0;
       case IDC_CHECK_AUTO:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_AUTO)==BST_CHECKED)
            {
               EnableChecks(hWnd,FALSE,0xFF);
               Prt[nCur].Method |= gd_METHOD_AUTO;
            }
            else
            {
               EnableChecks(hWnd,TRUE,0xFF);
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_AUTO);
            }
            return 0;
       case IDC_CHECK_STEAL:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_STEAL)==BST_CHECKED)
               Prt[nCur].Method |= gd_METHOD_STEAL;
            else
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_STEAL);
            return 0;
       case IDC_CHECK_ACQUIRE:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_ACQUIRE)==BST_CHECKED)
               Prt[nCur].Method |= gd_METHOD_ACQUIRE;
            else
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_ACQUIRE);
            return 0;
       case IDC_CHECK_CS:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_CS)==BST_CHECKED)
               Prt[nCur].Method |= gd_METHOD_CS;
            else
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_CS);
            return 0;
       case IDC_CHECK_MASK:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_MASK)==BST_CHECKED)
               Prt[nCur].Method |= gd_METHOD_MASK;
            else
               Prt[nCur].Method &= (0xFFFF ^ gd_METHOD_MASK);
            return 0;
       case IDC_CHECK_CLI:
            if (IsDlgButtonChecked(hWnd,IDC_CHECK_CLI)==BST_CHECKED)
               Prt[nCur].Method |=  gd_METHOD_CLI;
            else
               Prt[nCur].Method &=  (0xFFFF ^ gd_METHOD_CLI);
            return 0;
       case IDC_BUTTON_ADVANCED:
         {
            DWORD dwTmp;
            dwTmp = wTimers | ( DI.di_dwTimeLoop & 0xFFFF0000 );

///            dwTmp &= 0xeeeeeeee

            GD_PrintLog(" ==== Advanced Button pressed ====");
            wTimers = (WORD) DialogBoxParam(hMainInstance,MAKEINTRESOURCE(IDD_ADVANCED),hWnd,(DLGPROC)AdvancedDlgProc, dwTmp );
            break;
         }
        case IDC_BUTTON_OK:
            GD_PrintLog(" ==== Config Dialog OK pressed ====");
            if (CheckEditBox(hWnd, IDC_EDIT1, MIN_TIMEOUT,MAX_TIMEOUT, &fTimeOut, -1))
            {
                fTimeOut=fTimeOut*1000.0+0.5;
                dwTimeOut=(DWORD)(fTimeOut);
            }
            else
                break;
            dwConfigFlags = wTimers;
            if ( !_CRC_CHECK )
            {

                GD_ConfigPortsUse(bPort);
                GD_ConfigTimeOut(dwTimeOut);
                GD_ConfigFlags(dwConfigFlags);
                for ( i=0; i<3; i++ )
                {
                    GD_ConfigPortAlloc((BYTE)i,Prt[i].Method);
                }
                i = GD_ReconfigureDriver();
                if ( i != ge_NO_ERROR)
                {
                   GD_GetLastErrorDescription(szText,0x100);
                   if (i!=ge_PORTS_NOT_USED) //YES-NO dialog in DLL always
                     if (!bInfo)// else message appears from DLL
                        MessageBox(NULL,szText,"Error",MB_);

                   // if driver is busy we ignore OK button to avoid 
                   // new configuration to be lost
                      return 0;
                }
                CheckDriver();
                EndDialog(hWnd,RET_OK);

            }
            else
            {
                GD_PrintLog("      Config Dialog closed with NO CHANGES ====");
                EndDialog(hWnd,RET_CANCEL);
            }
            return 0;

       case IDC_BUTTON_CANCEL:
            GD_PrintLog(" ==== Config Dialog canceled... ====");
            EndDialog(hWnd,RET_CANCEL);
            return 0;
       }
       break;
 default: return FALSE;
 }
return (BOOL)DefWindowProc(hWnd,uMsg,wParam,lParam);
}

//*****************************************************************************
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))   A D V A N C E D      C o n f i g u r a t i o n   ))))))))))))))))))
//(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
//)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
//*****************************************************************************
void EnableRadios (HWND hDlg, int i, int w, int s)
{ // Parameters is:
  //  i : On/Off flag
  //  w : State
  //  s : Support

 // Enable group boxes
 EnableWindow ( GetDlgItem ( hDlg, IDC_GROUPBOX1 ), i );
 EnableWindow ( GetDlgItem ( hDlg, IDC_GROUPBOX2 ), i );

 // Enable radio buttons
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON1 ), i && ( w & gd_TIME_SYSTEM ) );
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON2 ), i && ( w & gd_TIME_TRADITIONAL ) );
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON3 ), i && ( w & gd_TIME_SECONDARY ) );
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON4 ), i && ( w & gd_LOOP_PENTIUM ));
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON5 ), i && ( w & gd_LOOP_BSF ));
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON6 ), i && ( w & gd_LOOP_TRADITIONAL ));
 EnableWindow ( GetDlgItem ( hDlg, IDC_RADIOBUTTON7 ), i && ( w & gd_LOOP_SECONDARY ));

 // Show '!' pictures
 s = i ? (( s ^ 0xFFFF ) & w) : 0 ;

 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP1 ), (s & gd_TIME_SYSTEM)?1:0 );
 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP2 ), (s & gd_TIME_TRADITIONAL)?1:0 );
 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP3 ), (s & gd_TIME_SECONDARY)?1:0 );
 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP4 ), (s & gd_LOOP_PENTIUM)?1:0 );
 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP5 ), (s & gd_LOOP_BSF)?1:0 );
 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP6 ), (s & gd_LOOP_TRADITIONAL)?1:0 );
 ShowWindow   ( GetDlgItem ( hDlg, IDC_STATICBITMAP7 ), (s & gd_LOOP_SECONDARY)?1:0 );
}
//*****************************************************************************
//  Checks given timer radiobutton and loop radiobutton
//
void CheckRadio (HWND hDlg, int mask )
{
 int timer =  mask & 0x00FF;
 int loop  = (mask & 0xFF00);

 if (timer != 0xFF)
 {
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON1, 0 );
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON2, 0 );
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON3, 0 );
   switch ( timer )
   {
     case gd_TIME_SYSTEM:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON1, 1 );
     break;
     case gd_TIME_TRADITIONAL:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON2, 1 );
     break;
     case gd_TIME_SECONDARY:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON3, 1 );
     break;
   }
 }
 if (loop != 0xFF00)
 {
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON4, 0 );
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON5, 0 );
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON6, 0 );
   CheckDlgButton ( hDlg, IDC_RADIOBUTTON7, 0 );
   switch ( loop )
   {
     case gd_LOOP_PENTIUM:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON4, 1 );
     break;
     case gd_LOOP_BSF:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON5, 1 );
     break;
     case gd_LOOP_TRADITIONAL:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON6, 1 );
          SendMessage    ( hDlg, WM_COMMAND, IDC_RADIOBUTTON6, 0 );
     break;
     case gd_LOOP_SECONDARY:
          CheckDlgButton ( hDlg, IDC_RADIOBUTTON7, 1 );
     break;
   }
 }
}
//*****************************************************************************
//  Shows exclamation about possible damages caused by unsupported timers
//
void ShowAlert ( HWND hDlg, int nShow )
{
   ShowWindow ( GetDlgItem ( hDlg, IDC_STATICBITMAP_DOWN ), nShow );
   ShowWindow ( GetDlgItem ( hDlg, IDC_STATICTEXT_WARN ), nShow );
}
//*****************************************************************************
//*****************************************************************************


extern int WINAPI GD_GetAutoTimeMethods( WORD * wTimers ); // Undocumented function.
// Gets best timer/loop method directly from driver.
// Return corresponding bits in wTimers
// See gd_TIME_XXXXXX & gd_LOOP_XXXXXX constants for details

//*****************************************************************************
//   This is DialogProc for Advanced options dialog
//
BOOL _export CALLBACK AdvancedDlgProc( HWND hDlg, UINT uMsg,
                                      WPARAM wParam, LPARAM lParam )
{
int i;
static int wSupp;   // Supported by system
static int wCur;    // Current selected
static int wState;  // Current availible
static int wInitial;
HCURSOR hCur;
// All prev. variables is actualy WORD, but used int declaration to prevent
// "Conversion may loose significant difits" message
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 // lParam is a bit mask:
 //             Byte
 //             0 (low)   Current timer
 //             1         Current loop
 //             2         Supported timers
 //             3         Supported loops
 switch( uMsg )
 {

   case WM_INITDIALOG:
       wSupp = (WORD)( lParam >> 16 );

       // We disable only PENTIUM method if no pentium found...
       wState = wSupp | ( 0xFFFF ^ gd_LOOP_PENTIUM );

       wInitial = wCur  = (WORD)(lParam & 0xFFFF);

       SetWindowText ( hDlg, RS ( S_ADVANCEDOPTIONS ));
       SetWindowText ( GetDlgItem ( hDlg, IDC_STATICTEXT_WARN ), RS ( S_TIMEREXCLAM ));
       SetWindowText ( GetDlgItem ( hDlg, IDC_STATICTEXT1 ), RS ( S_TIMELOOPTITLE ));
       ShowAlert ( hDlg, ( wCur & wSupp ) != (wCur & 0x7FFF) );

       EnableRadios  ( hDlg, 1, wState, wSupp );
       if ( wCur & gd_TIMELOOP_AUTO ) // Auto mode
       {
          CheckDlgButton (  hDlg, IDC_CHECKBOX_AUTO, 1 );
          SendMessage ( hDlg, WM_COMMAND, IDC_CHECKBOX_AUTO, 0 );
       }
       else
          CheckRadio ( hDlg, wCur );

       if (bRus)
       {
           SetWindowText(GetDlgItem(hDlg,IDCANCEL          ),"Отмена");
           SetWindowText(GetDlgItem(hDlg,IDC_CHECK_AUTO    ),"Автоматически");
           SetWindowText(GetDlgItem(hDlg,IDC_GROUPBOX1     ),"Таймер");
           SetWindowText(GetDlgItem(hDlg,IDC_GROUPBOX2     ),"Метод задержек");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON1  ),"Системный");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON2  ),"Традиционный");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON3  ),"Дополнительный");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON4  ),"Счетчик Pentium");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON5  ),"Счетчик BSF");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON6  ),"Традиционный");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON7  ),"Дополнительный");
       }
       else
       {
           SetWindowText(GetDlgItem(hDlg,IDC_BUTTON_CANCEL ),"Cancel");
           SetWindowText(GetDlgItem(hDlg,IDC_CHECK_AUTO    ),"Auto");
           SetWindowText(GetDlgItem(hDlg,IDC_GROUPBOX1     ),"Timer");
           SetWindowText(GetDlgItem(hDlg,IDC_GROUPBOX2     ),"Delay method");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON1  ),"System");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON2  ),"Traditional");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON3  ),"Secondary");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON4  ),"Pentium counter");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON5  ),"BSF tick");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON6  ),"Traditional");
           SetWindowText(GetDlgItem(hDlg,IDC_RADIOBUTTON7  ),"Secondary");
       }
   break;

   case WM_COMMAND:
       switch( wParam )
       {
       case IDC_CHECKBOX_AUTO:
       if ( IsDlgButtonChecked ( hDlg, IDC_CHECKBOX_AUTO ) )
       {
           WORD wTMAuto;
           EnableRadios ( hDlg, 0, wState, wSupp );
           ShowAlert ( hDlg, 0 );
           wCur |= gd_TIMELOOP_AUTO;

           hCur = SetCursor(LoadCursor(NULL,IDC_WAIT));

           if ( GD_GetAutoTimeMethods( &wTMAuto ) != ge_NO_ERROR )
           {
               GD_GetLastErrorDescription ( szText, 0x100 );
               if (!bInfo) // else message appears from DLL
                   MessageBox  ( NULL, szText, "Error", MB_ );
               PostMessage ( hDlg, WM_COMMAND, IDCANCEL, 0 );
           }

           CheckRadio ( hDlg, wTMAuto );

           SetCursor(hCur);
       }
       else
       {
           EnableRadios ( hDlg, 1, wState, wSupp );
           wCur &= 0xFFFF ^ gd_TIMELOOP_AUTO;
           CheckRadio ( hDlg, wCur );
           ShowAlert ( hDlg, ( wCur & wSupp ) != wCur );
       }
       break;
       case IDC_RADIOBUTTON6:
            if ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON6 ) )
            {
               wState = wState & ( 0xFF02 );
               wCur = gd_TIME_TRADITIONAL + gd_LOOP_TRADITIONAL;
               CheckRadio ( hDlg, 0xFF02 );
               ShowAlert ( hDlg, ( wCur & wSupp ) != wCur ); // This uses same 3ch as timer method
            }

            EnableRadios (hDlg, !IsDlgButtonChecked(hDlg, IDC_CHECKBOX_AUTO), wState, wSupp );
       break;
       case IDC_RADIOBUTTON1:
            wCur = (wCur & 0xFF00) + gd_TIME_SYSTEM;
            ShowAlert ( hDlg, ( wCur & wSupp ) != wCur );
            goto TotalEnable;
       case IDC_RADIOBUTTON2:
            wCur = (wCur & 0xFF00) + gd_TIME_TRADITIONAL;
            ShowAlert ( hDlg, ( wCur & wSupp ) != wCur );
            if ( !IsDlgButtonChecked(hDlg, IDC_RADIOBUTTON6) )
               goto TotalEnable;
            break;
       case IDC_RADIOBUTTON3:
            wCur = (wCur & 0xFF00) + gd_TIME_SECONDARY;
            ShowAlert ( hDlg, ( wCur & wSupp ) != wCur );
            goto TotalEnable;
       case IDC_RADIOBUTTON4:
            wCur = (wCur & 0xFF  ) + gd_LOOP_PENTIUM;
            goto TotalEnable;
       case IDC_RADIOBUTTON5:
            wCur = (wCur & 0xFF  ) + gd_LOOP_BSF;
            goto TotalEnable;
       case IDC_RADIOBUTTON7:
            wCur = (wCur & 0xFF  ) + gd_LOOP_SECONDARY;
            ShowAlert ( hDlg, ( wCur & wSupp ) != wCur ); // This uses same 0ch as timer method
TotalEnable:
            wState = wSupp | ( 0xFFFF ^ gd_LOOP_PENTIUM );
            EnableRadios (hDlg, !IsDlgButtonChecked(hDlg, IDC_CHECKBOX_AUTO), wState, wSupp );
       break;
       case IDOK:
            i = ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON1 ) ? gd_TIME_SYSTEM : 0 )      |
                ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON2 ) ? gd_TIME_TRADITIONAL : 0 ) |
                ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON3 ) ? gd_TIME_SECONDARY : 0 )   |
                ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON4 ) ? gd_LOOP_PENTIUM : 0 )       |
                ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON5 ) ? gd_LOOP_BSF : 0 )         |
                ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON6 ) ? gd_LOOP_TRADITIONAL : 0 ) |
                ( IsDlgButtonChecked ( hDlg, IDC_RADIOBUTTON7 ) ? gd_LOOP_SECONDARY : 0 )   |
                ( IsDlgButtonChecked ( hDlg, IDC_CHECKBOX_AUTO) ? gd_TIMELOOP_AUTO : 0 );
            sprintf(szText," ==== Advansed Dialog closed by OK button with flags==0x%08lX ====",i);
            GD_PrintLog(szText);
            EndDialog ( hDlg, i );
       break;
       case IDCANCEL:
            GD_PrintLog(" ==== Advanced Dialog canceled... ====");
            EndDialog ( hDlg, wInitial );
       break;
       }
       break;
 default: return FALSE;
 }
 return (BOOL)DefWindowProc(hDlg,uMsg,wParam,lParam);
}
Соседние файлы в папке INST.DLL
  • #
    28.06.201447 б3BccW32.cfg
  • #
    28.06.201445.62 Кб4DIALOG.C
  • #
    28.06.20144.72 Кб3GRD_KEY.BMP
  • #
    28.06.201446.16 Кб3INSTDEMO.IDE
  • #
    28.06.20141.8 Кб3INSTDEMO.MAK
  • #
    28.06.20149.26 Кб3INSTDMS.LIB
  • #
    28.06.20149.75 Кб3INSTDRV.C