📄 config.c
字号:
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 + -