⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 WinCE5.0部分核心源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    LONG rc;
    LPWSTR lpszDeviceClass;
    PDEVMINICFG  pDevMiniCfg;
    LPVARSTRING  lpDevConfig;

    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+DevSpecificLineConfigProlog\n")));

    if (IsBadReadPtr(pChg, sizeof(UNIMDM_CHG_DEVCFG))) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigProlog: Invalid PUNIMDM_CHG_DEVCFG\n")));
        rc = LINEERR_INVALPOINTER;
        goto exitPoint;
    }

    lpszDeviceClass = (LPWSTR)MapCallerPtr((LPVOID)pChg->lpszDeviceClass, MAX_DEVICE_CLASS_NAME_LEN);
    if (!ValidateDevCfgClass(lpszDeviceClass)) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigProlog: LINEERR_INVALDEVICECLASS\n")));
        rc = LINEERR_INVALDEVICECLASS;
        goto exitPoint;
    }
    
    //
    // Validate the buffer pointers
    //
    lpDevConfig = (LPVARSTRING)MapCallerPtr((LPVOID)pChg->lpDevConfig, sizeof(DEVMINICFG));
    if (lpDevConfig == NULL) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigProlog: LINEERR_INVALPOINTER\n")));
        rc = LINEERR_INVALPOINTER;
        goto exitPoint;
    }

    pDevMiniCfg = (PDEVMINICFG)(((LPBYTE)lpDevConfig) + sizeof(VARSTRING));

    //
    // Validate the buffer size
    //
    lpDevConfig->dwNeededSize = sizeof(VARSTRING) + sizeof(DEVMINICFG);
    if (lpDevConfig->dwTotalSize < sizeof(VARSTRING) + sizeof(DEVMINICFG)) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigProlog: LINEERR_STRUCTURETOOSMALL\n")));
        rc = LINEERR_STRUCTURETOOSMALL;
        goto exitPoint;
    }

    lpDevConfig->dwUsedSize   = sizeof(VARSTRING) + sizeof(DEVMINICFG);

    //
    // If they specify version 0, then they want the default devconfig. 
    //
    if (pDevMiniCfg->wVersion == 0) {
        getDefaultDevConfig( pLineDev, pDevMiniCfg );
    }

    if (pLineDev->DevMiniCfg.wVersion != (pDevMiniCfg->wVersion)) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigProlog: Invalid DevConfig\n")));
        rc =  LINEERR_INVALPARAM;
        goto exitPoint;
    }

    rc = 0;
    *ppDevCfg = lpDevConfig;
    *ppMiniCfg = pDevMiniCfg;

exitPoint:
    return rc;

}   // DevSpecificLineConfigProlog

//
// Function to edit the specific property of a PDEVMINICONFIG
//
LONG
DevSpecificLineConfigEdit(
    PTLINEDEV   pLineDev,
    PUNIMDM_CHG_DEVCFG pChg
    )
{
    DWORD dwSettableBaud;
    DWORD dwSettableData;
    DWORD dwSettableStopParity;
    DWORD rc;

    PDEVMINICFG  pDevMiniCfg;
    LPVARSTRING  lpDevConfig;
    LPWSTR lpszDialModifier;
    LPWSTR lpszDriverName;
    BYTE  *lpConfigBlob;

    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+DevSpecificLineConfigEdit\n")));

    if (rc = DevSpecificLineConfigProlog(pLineDev, pChg, &pDevMiniCfg, &lpDevConfig)) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: DevSpecificLineConfigProlog failed\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
            );
    }

    rc = LINEERR_INVALPARAM;

    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)MapCallerPtr((LPVOID)pChg->dwValue, DIAL_MODIFIER_LEN*sizeof(WCHAR));
        if (IsBadStringPtr(lpszDialModifier, DIAL_MODIFIER_LEN)) {
            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid dial modifier\n")));
            goto exitPoint;
        }
        wcscpy(pDevMiniCfg->szDialModifier, lpszDialModifier);
        break;

    case UNIMDM_OPT_DRVNAME:
        lpszDriverName = (LPWSTR)MapCallerPtr((LPVOID)pChg->dwValue, MAX_NAME_LENGTH*sizeof(WCHAR));
        if (IsBadStringPtr(lpszDriverName, MAX_NAME_LENGTH)) {
            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid dynamic modem driver name\n")));
            goto exitPoint;
        }
        wcscpy(pDevMiniCfg->wszDriverName, lpszDriverName);
        break;

    case UNIMDM_OPT_CFGBLOB:
        lpConfigBlob = (BYTE*)MapCallerPtr((LPVOID)pChg->dwValue, MAX_CFG_BLOB);
        if (IsBadReadPtr(lpConfigBlob, MAX_CFG_BLOB)) {
            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigEdit: Invalid dynamic modem config blob\n")));
            goto exitPoint;
        }
        memcpy(pDevMiniCfg->pConfigBlob, lpConfigBlob, MAX_CFG_BLOB);
        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;
}   // DevSpecificLineConfigEdit


//
// Function to retrieve a specific property of a PDEVMINICONFIG
//
LONG
DevSpecificLineConfigGet(
    PTLINEDEV   pLineDev,
    PUNIMDM_CHG_DEVCFG pChg
    )
{
    DWORD rc;

    PDEVMINICFG  pDevMiniCfg;
    LPVARSTRING  lpDevConfig;
    LPWSTR lpszDialModifier;
    LPWSTR lpszDriverName;
    BYTE  *lpConfigBlob;

    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+DevSpecificLineConfigGet\n")));

    if (IsBadWritePtr(pChg, sizeof(UNIMDM_CHG_DEVCFG))) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigGet: Invalid PUNIMDM_CHG_DEVCFG\n")));
        rc = LINEERR_INVALPOINTER;
        goto exitPoint;
    }

    if (rc = DevSpecificLineConfigProlog(pLineDev, pChg, &pDevMiniCfg, &lpDevConfig)) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigGet: DevSpecificLineConfigProlog failed\n")));
        goto exitPoint;
    }

    switch (pChg->dwOption) {
    case UNIMDM_OPT_BAUDRATE:
        pChg->dwValue = pDevMiniCfg->dwBaudRate;
        break;

    case UNIMDM_OPT_BYTESIZE:
        pChg->dwValue = pDevMiniCfg->ByteSize;
        break;

    case UNIMDM_OPT_PARITY:
        pChg->dwValue = pDevMiniCfg->Parity;
        break;

    case UNIMDM_OPT_STOPBITS:
        pChg->dwValue = pDevMiniCfg->StopBits;
        break;

    case UNIMDM_OPT_WAITBONG:
        pChg->dwValue = pDevMiniCfg->wWaitBong;
        break;

    case UNIMDM_OPT_MDMOPTIONS: // MDM_* values from mcx.h
        pChg->dwValue = pDevMiniCfg->dwModemOptions;
        break;

    case UNIMDM_OPT_TIMEOUT:
        pChg->dwValue = pDevMiniCfg->dwCallSetupFailTimer;
        break;

    case UNIMDM_OPT_TERMOPTIONS:    // NETUI_LCD_TRMOPT_* values from netui.h
        pChg->dwValue = 0;
        if (pDevMiniCfg->fwOptions & MANUAL_DIAL) {
            pChg->dwValue |= NETUI_LCD_TRMOPT_MANUAL_DIAL;
        }
        if (pDevMiniCfg->fwOptions & TERMINAL_PRE) {
            pChg->dwValue |= NETUI_LCD_TRMOPT_PRE_DIAL;
        }
        if (pDevMiniCfg->fwOptions & TERMINAL_POST) {
            pChg->dwValue |= NETUI_LCD_TRMOPT_POST_DIAL;
        }
        break;

    case UNIMDM_OPT_DIALMOD:
        lpszDialModifier = (LPWSTR)MapCallerPtr((LPVOID)pChg->dwValue,
                                                (wcslen(pDevMiniCfg->szDialModifier) + 1)*sizeof(WCHAR));
        if (IsBadWritePtr(lpszDialModifier, DIAL_MODIFIER_LEN)) {
            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigGet: Invalid dial modifier\n")));
            rc = LINEERR_INVALPOINTER;
            goto exitPoint;
        }
        wcscpy(lpszDialModifier, pDevMiniCfg->szDialModifier);
        break;

    case UNIMDM_OPT_DRVNAME:
        lpszDriverName = (LPWSTR)MapCallerPtr((LPVOID)pChg->dwValue, MAX_NAME_LENGTH*sizeof(WCHAR));
        if (IsBadWritePtr(lpszDriverName, MAX_NAME_LENGTH)) {
            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigGet: Invalid dynamic modem driver name\n")));
            goto exitPoint;
        }
        wcscpy(lpszDriverName, pDevMiniCfg->wszDriverName);
        break;

    case UNIMDM_OPT_CFGBLOB:
        lpConfigBlob = (BYTE*)MapCallerPtr((LPVOID)pChg->dwValue, MAX_CFG_BLOB);
        if (IsBadWritePtr(lpConfigBlob, MAX_CFG_BLOB)) {
            DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigGet: Invalid dynamic modem config blob\n")));
            goto exitPoint;
        }
        memcpy(lpConfigBlob, pDevMiniCfg->pConfigBlob, MAX_CFG_BLOB);
        break;

    default:
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:DevSpecificLineConfigGet: Invalid dwOption\n")));
        rc = LINEERR_INVALPARAM;
        goto exitPoint;
    }
    
    rc = 0;

exitPoint:
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-DevSpecificLineConfigGet: returning 0x%x\n"), rc));
    return rc;
}   // DevSpecificLineConfigGet

⌨️ 快捷键说明

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