config.c

来自「wince下的源代码集合打包」· C语言 代码 · 共 494 行 · 第 1/2 页

C
494
字号
{    //    // Parity options and settable bits from winbase.h    //    switch (dwParity) {    case NOPARITY:      if (dwSettableParity & PARITY_NONE) return TRUE; break;    case ODDPARITY:     if (dwSettableParity & PARITY_ODD)  return TRUE; break;    case EVENPARITY:    if (dwSettableParity & PARITY_EVEN) return TRUE; break;    case MARKPARITY:    if (dwSettableParity & PARITY_MARK) return TRUE; break;    case SPACEPARITY:   if (dwSettableParity & PARITY_SPACE)return TRUE; break;    }    return FALSE;}   // IsValidParityBOOLIsValidStopBits(    DWORD dwStopBits,    DWORD dwSettableStopBits    ){    //    // Stop bit values and settable bits from winbase.h    //    switch (dwStopBits) {    case ONESTOPBIT:    if (dwSettableStopBits & STOPBITS_10) return TRUE; break;    case ONE5STOPBITS:  if (dwSettableStopBits & STOPBITS_15) return TRUE; break;    case TWOSTOPBITS:   if (dwSettableStopBits & STOPBITS_20) return TRUE; break;    }    return FALSE;}   // IsValidStopBitsBOOLIsBadStringPtr(    LPCWSTR lpStr,    DWORD dwMaxLen    ){    DWORD len;    BOOL bRet;    bRet = FALSE;    try {        len = wcslen(lpStr);    } except (EXCEPTION_EXECUTE_HANDLER) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:IsBadStringPtr: Exception!\n")));                bRet = TRUE;    }    if (bRet) {        if (len > dwMaxLen) {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:IsBadStringPtr: String too long %d > %d\n"), len, dwMaxLen));            bRet = TRUE;        }    }    return bRet;}   // IsBadStringPtr//// Function to edit the specific property of a PDEVMINICONFIG//LONGDevSpecificLineConfigEdit(    PTLINEDEV   pLineDev,    PUNIMDM_CHG_DEVCFG pChg    ){    DWORD dwSettableBaud;    DWORD dwSettableData;    DWORD dwSettableStopParity;    DWORD rc;    PDEVMINICFG  pDevMiniCfg;    LPVARSTRING  lpDevConfig;    LPWSTR lpszDeviceClass;    LPWSTR lpszDialModifier;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+DevSpecificLineConfigEdit\n")));    if (IsBadReadPtr(pChg, sizeof(UNIMDM_CHG_DEVCFG))) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid PUNIMDM_CHG_DEVCFG\n")));        rc = LINEERR_INVALPOINTER;        goto exitPoint;    }    lpszDeviceClass = (LPWSTR)MapPtrToProcess((LPVOID)pChg->lpszDeviceClass, GetCallerProcess());    if (!ValidateDevCfgClass(lpszDeviceClass)) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: LINEERR_INVALDEVICECLASS\n")));        rc = LINEERR_INVALDEVICECLASS;        goto exitPoint;    }        //    // Validate the buffer pointers    //    if (pChg->lpDevConfig == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: LINEERR_INVALPOINTER\n")));        rc = LINEERR_INVALPOINTER;        goto exitPoint;    }    lpDevConfig = (LPVARSTRING)MapPtrToProcess((LPVOID)pChg->lpDevConfig, GetCallerProcess());    pDevMiniCfg = (PDEVMINICFG)(((LPBYTE)lpDevConfig) + sizeof(VARSTRING));    //    // Validate the buffer size    //    if (lpDevConfig->dwTotalSize < sizeof(VARSTRING) + sizeof(DEVMINICFG)) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: LINEERR_STRUCTURETOOSMALL\n")));        lpDevConfig->dwNeededSize = sizeof(VARSTRING) + sizeof(DEVMINICFG);        rc = LINEERR_STRUCTURETOOSMALL;        goto exitPoint;    }    lpDevConfig->dwNeededSize = sizeof(VARSTRING) + sizeof(DEVMINICFG);    lpDevConfig->dwUsedSize   = sizeof(VARSTRING) + sizeof(DEVMINICFG);        //    // If they specify version 0, then they want the default devconfig.     //    if (pDevMiniCfg->wVersion == 0) {        getDefaultDevConfig( pLineDev, pDevMiniCfg );            }        rc =  LINEERR_INVALPARAM;    if (pLineDev->DevMiniCfg.wVersion != (pDevMiniCfg->wVersion)) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid DevConfig\n")));        goto exitPoint;    }    switch (pChg->dwOption) {    case UNIMDM_OPT_BAUDRATE:    case UNIMDM_OPT_BYTESIZE:    case UNIMDM_OPT_PARITY:    case UNIMDM_OPT_STOPBITS:        dwSettableData = dwSettableStopParity = 0;        GetSettableFields(            pLineDev,            &dwSettableBaud,            (WORD *)&dwSettableData,            (WORD *)&dwSettableStopParity            );    }    switch (pChg->dwOption) {    case UNIMDM_OPT_BAUDRATE:        if (IsValidBaudRate(pChg->dwValue, dwSettableBaud)) {            pDevMiniCfg->dwBaudRate = pChg->dwValue;        } else {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Unsupported baud rate\n")));            goto exitPoint;        }        break;    case UNIMDM_OPT_BYTESIZE:        if (IsValidByteSize(pChg->dwValue, dwSettableData)) {            pDevMiniCfg->ByteSize = (BYTE)pChg->dwValue;        } else {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Unsupported byte size\n")));            goto exitPoint;        }        break;    case UNIMDM_OPT_PARITY:        if (IsValidParity(pChg->dwValue, dwSettableStopParity)) {            pDevMiniCfg->Parity = (BYTE)pChg->dwValue;        } else {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Unsupported parity\n")));            goto exitPoint;        }        break;    case UNIMDM_OPT_STOPBITS:        if (IsValidStopBits(pChg->dwValue, dwSettableStopParity)) {            pDevMiniCfg->StopBits = (BYTE)pChg->dwValue;        } else {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Unsupported stop bits\n")));            goto exitPoint;        }        break;    case UNIMDM_OPT_WAITBONG:        pDevMiniCfg->wWaitBong = (WORD)pChg->dwValue;        break;    case UNIMDM_OPT_MDMOPTIONS: // MDM_* values from mcx.h        //        // Currently CE unimodem only looks at:        // MDM_BLIND_DIAL        // MDM_FLOWCONTROL_HARD        // MDM_FLOWCONTROL_SOFT        // MDM_SPEED_ADJUST (enables DCC client automatic baud rate detection)        //        if (pChg->dwValue > (MDM_V23_OVERRIDE * 2 - 1)) {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid modem option\n")));            goto exitPoint;        }        pDevMiniCfg->dwModemOptions = pChg->dwValue;        break;    case UNIMDM_OPT_TIMEOUT:        pDevMiniCfg->dwCallSetupFailTimer = pChg->dwValue;        break;    case UNIMDM_OPT_TERMOPTIONS:    // NETUI_LCD_TRMOPT_* values from netui.h        if (pChg->dwValue == 0) {            pDevMiniCfg->fwOptions = TERMINAL_NONE;        } else {            pDevMiniCfg->fwOptions = 0;            if (pChg->dwValue & NETUI_LCD_TRMOPT_MANUAL_DIAL) {                pDevMiniCfg->fwOptions |= MANUAL_DIAL;            }            if (pChg->dwValue & NETUI_LCD_TRMOPT_PRE_DIAL) {                pDevMiniCfg->fwOptions |= TERMINAL_PRE;            }            if (pChg->dwValue & NETUI_LCD_TRMOPT_POST_DIAL) {                pDevMiniCfg->fwOptions |= TERMINAL_POST;            }        }        break;    case UNIMDM_OPT_DIALMOD:        lpszDialModifier = (LPWSTR)MapPtrToProcess((LPVOID)pChg->dwValue, GetCallerProcess());        if (IsBadStringPtr(lpszDialModifier, DIAL_MODIFIER_LEN)) {            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid dial modifier\n")));            goto exitPoint;        }        wcscpy(pDevMiniCfg->szDialModifier, lpszDialModifier);        break;            default:        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid dwOption\n")));        goto exitPoint;    }        rc = 0;exitPoint:    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-DevSpecificLineConfigEdit: returning 0x%x\n"), rc));    return rc;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?