/******************************************************************************
Copyright (c) 2002 Allcom Corporation
Module Name:
oid.c
******************************************************************************/
#include "precomp.h"
///////////////////////////////////////////////////////////////////////////////
/*
typedef struct _VAR_STRING {
ULONG ulTotalSize;
ULONG ulNeededSize;
ULONG ulUsedSize;
ULONG ulStringFormat;
ULONG ulStringSize;
ULONG ulStringOffset;
} VAR_STRING, *PVAR_STRING;
*/
// OID_TAPI_GET_EXTENSION_ID
/*
This OID requests the miniport to return the extension ID for the specified
line device.
typedef struct _NDIS_TAPI_GET_EXTENSION_ID {
IN ULONG ulRequestID;
IN ULONG ulDeviceID;
OUT LINE_EXTENSION_ID LineExtensionID;
} NDIS_TAPI_GET_EXTENSION_ID, *PNDIS_TAPI_GET_EXTENSION_ID;
typedef struct _LINE_EXTENSION_ID {
ULONG ulExtensionID0;
ULONG ulExtensionID1;
ULONG ulExtensionID2;
ULONG ulExtensionID3;
} LINE_EXTENSION_ID, *PLINE_EXTENSION_ID;
*/
NDIS_STATUS queryTapiGetExtId(PADAPT pAdapt, PDATABUF_DESCR buf)
{
PNDIS_TAPI_GET_EXTENSION_ID id = (PNDIS_TAPI_GET_EXTENSION_ID)buf->data;
DbgPrint("queryTapiGetExtId\n");
if(id->ulDeviceID != pAdapt->miniUlDeviceID)
{
DbgPrint("queryTapiGetExtId: NDIS_STATUS_TAPI_NODRIVER\n");
return NDIS_STATUS_TAPI_NODRIVER;
}
id->LineExtensionID.ulExtensionID0 = 0;
id->LineExtensionID.ulExtensionID1 = 0;
id->LineExtensionID.ulExtensionID2 = 0;
id->LineExtensionID.ulExtensionID3 = 0;
return NDIS_STATUS_SUCCESS;
}
// OID_TAPI_GET_ID
/*
OID_TAPI_GET_ID
This OID requests the miniport to return a device ID for the specified device
class associated with the selected line, address, or call.
typedef struct _NDIS_TAPI_GET_ID {
IN ULONG ulRequestID;
IN HDRV_LINE hdLine;
IN ULONG ulAddressID;
IN HDRV_CALL hdCall;
IN ULONG ulSelect;
IN ULONG ulDeviceClassSize;
IN ULONG ulDeviceClassOffset;
OUT VAR_STRING DeviceID;
} NDIS_TAPI_GET_ID, *PNDIS_TAPI_GET_ID;
*/
NDIS_STATUS queryTapiGetId(PADAPT pAdapt, PDATABUF_DESCR buf)
{
ULONG DeviceId;
int len = 0;
char isdn[] = "ISDN";
PNDIS_TAPI_GET_ID info = (PNDIS_TAPI_GET_ID)buf->data;
NDIS_STATUS Status = NDIS_STATUS_TAPI_INVALDEVICECLASS;
DbgPrint("queryTapiGetId: hdline: 0x%x, hdcall: 0x%x, select: %d\n",
info->hdLine, info->hdCall, info->ulSelect);
if(_strnicmp((PCHAR)info + info->ulDeviceClassOffset, "ndis", info->ulDeviceClassSize) == 0)
{
DbgPrint("queryTapiGetId: ndis\n");
if(info->ulSelect == LINECALLSELECT_CALL)
{
// This must match ConnectionWrapperID used in LINE_UP event!
DbgPrint("queryTapiGetId: ndis/LINECALLSELECT_CALL\n");
DeviceId = (ULONG)pAdapt->miniNdisLinkContext;
Status = NDIS_STATUS_SUCCESS;
}
else
{
pAdapt->isWin9x = 1;
DbgPrint("queryTapiGetId: ndis/LINECALLSELECT_LINE: 0x%x\n", pAdapt->miniHtCall);
DeviceId = (ULONG)pAdapt->miniHtCall;
len = sizeof(isdn);
Status = NDIS_STATUS_SUCCESS;
}
}
else if(_strnicmp((PCHAR)info + info->ulDeviceClassOffset, "tapi/line", info->ulDeviceClassSize) == 0)
{
DbgPrint("queryTapiGetId: tapi/line\n");
if(info->ulSelect == LINECALLSELECT_LINE)
{
// TAPI just wants the ulDeviceID for this line.
DbgPrint("queryTapiGetId: tapi/line/LINECALLSELECT_LINE\n");
DeviceId = (ULONG)pAdapt->miniHtCall;
Status = NDIS_STATUS_SUCCESS;
}
}
if(Status == NDIS_STATUS_SUCCESS)
{
info->DeviceID.ulNeededSize = sizeof(VAR_STRING) + sizeof(DeviceId) + len;
info->DeviceID.ulUsedSize = sizeof(VAR_STRING);
if(info->DeviceID.ulTotalSize >= info->DeviceID.ulNeededSize)
{
info->DeviceID.ulUsedSize = info->DeviceID.ulNeededSize;
info->DeviceID.ulStringFormat = STRINGFORMAT_BINARY;
info->DeviceID.ulStringSize = sizeof(DeviceId) + len;
info->DeviceID.ulStringOffset = sizeof(VAR_STRING);
NdisMoveMemory((PCHAR)&info->DeviceID + sizeof(VAR_STRING), &DeviceId, sizeof(DeviceId));
NdisMoveMemory((PCHAR)&info->DeviceID + sizeof(VAR_STRING) + sizeof(DeviceId), isdn, len);
DbgPrint("queryTapiGetId: ok\n");
}
else
{
DbgPrint("queryTapiGetId: needlen: %d\n", info->DeviceID.ulNeededSize);
}
}
return Status;
}
// OID_TAPI_GET_DEV_CAPS
/*
This OID requests the miniport to return the telephony capabilities of a
specified line device. The returned information is valid for all addresses
on the given line device.
typedef struct _NDIS_TAPI_GET_DEV_CAPS {
IN ULONG ulRequestID;
IN ULONG ulDeviceID;
IN ULONG ulExtVersion;
OUT LINE_DEV_CAPS LineDevCaps;
} NDIS_TAPI_GET_DEV_CAPS, *PNDIS_TAPI_GET_DEV_CAPS;
*/
NDIS_STATUS queryTapiGetDevCaps(PADAPT pAdapt, PDATABUF_DESCR buf)
{
PNDIS_TAPI_GET_DEV_CAPS req = (PNDIS_TAPI_GET_DEV_CAPS)buf->data;
PLINE_DEV_CAPS caps = &(req->LineDevCaps);
char ProviderInfo[] = "ISDN\0HYPPPOE";
char LineName[] = "PPP over Ethernet Miniport";
DbgPrint("queryTapiGetDevCaps\n");
if(req->ulDeviceID != pAdapt->miniUlDeviceID)
{
DbgPrint("queryTapiGetDevCaps: NDIS_STATUS_TAPI_NODRIVER\n");
return NDIS_STATUS_TAPI_NODRIVER;
}
// this should not hurt:
caps->ulUsedSize = sizeof(*caps);
caps->ulNeededSize = sizeof(*caps);
caps->ulPermanentLineID = 1;
//RASTAPI requires the "MediaType\0DeviceName" be placed in the
//ProviderInfo field at the end of this structure.
caps->ulNeededSize += sizeof(ProviderInfo) + sizeof(LineName);
if(caps->ulNeededSize <= caps->ulTotalSize)
{
caps->ulUsedSize += sizeof(ProviderInfo);
caps->ulProviderInfoSize = sizeof(ProviderInfo);
caps->ulProviderInfoOffset = sizeof(*caps);
NdisMoveMemory((PUCHAR)caps + caps->ulProviderInfoOffset, ProviderInfo, sizeof(ProviderInfo));
caps->ulUsedSize += sizeof(LineName);
caps->ulLineNameSize = sizeof(LineName);
caps->ulLineNameOffset = sizeof(*caps) + sizeof(ProviderInfo);
NdisMoveMemory((PUCHAR)caps + caps->ulLineNameOffset, LineName, sizeof(LineName));
}
caps->ulStringFormat = STRINGFORMAT_ASCII;
caps->ulAddressModes = LINEADDRESSMODE_ADDRESSID | LINEADDRESSMODE_DIALABLEADDR;
caps->ulNumAddresses = 1;
caps->ulBearerModes = LINEBEARERMODE_DATA;
caps->ulMaxRate = pAdapt->protoLinkSpeed;
caps->ulMediaModes = LINEMEDIAMODE_DIGITALDATA;
// Each line on the DSU only supports a single call.
caps->ulDevCapFlags = LINEDEVCAPFLAGS_CLOSEDROP;
caps->ulMaxNumActiveCalls = 1;
caps->ulAnswerMode = LINEANSWERMODE_DROP;
caps->ulLineStates = pAdapt->miniSupportedLinedevStates;
return NDIS_STATUS_SUCCESS;
}
// OID_TAPI_GET_DEV_CONFIG
/*
This OID requests the miniport to return the current configuration of
a device associated one-to-one with a particular line.
typedef struct _NDIS_TAPI_GET_DEV_CONFIG {
IN ULONG ulRequestID;
IN ULONG ulDeviceID;
IN ULONG ulDeviceClassSize;
IN ULONG ulDeviceClassOffset;
OUT VAR_STRING DeviceConfig;
} NDIS_TAPI_GET_DEV_CONFIG, *PNDIS_TAPI_GET_DEV_CONFIG;
*/
NDIS_STATUS queryTapiGetDevConfig(PADAPT pAdapt, PDATABUF_DESCR buf)
{
PNDIS_TAPI_GET_DEV_CONFIG cfg = (PNDIS_TAPI_GET_DEV_CONFIG)buf->data;
ULONG DeviceClass;
NDIS_STATUS Status = NDIS_STATUS_TAPI_INVALDEVICECLASS;
DbgPrint("queryTapiGetDevConfig\n");
if(cfg->ulDeviceID != pAdapt->miniUlDeviceID)
{
DbgPrint("queryTapiGetDevConfig: NDIS_STATUS_TAPI_NODRIVER\n");
return NDIS_STATUS_TAPI_N
关于PPPOE的实现源文件,可以为需要做以太网下的PPP提供一个很有力的参考.zip
版权申诉
28 浏览量
2023-01-12
10:30:10
上传
评论
收藏 254KB ZIP 举报
GZM888888
- 粉丝: 186
- 资源: 2962
最新资源
- (完整)数据库课程设计餐厅点餐说明书-21ab6d3c8beb172ded630b1c59eef8c75ebf952c.doc
- 2023-04-06-项目笔记 - 第一百五十四阶段 - 4.4.2.152全局变量的作用域-152 -2024.06.04
- 松哥解协议松哥解协议松哥解协议松哥解协议松哥解协议
- 618节日618节日618节日
- tensorflow-gpu-2.9.1-cp37-cp37m-win-amd64.whl
- tensorflow-gpu-2.9.0-cp37-cp37m-win-amd64.whl
- tensorflow-gpu-2.9.0-cp39-cp39-win-amd64.whl
- lcd daimalcd daima
- 电影领域-推荐算法-个性化内容-观影决策-电影推荐小程序.zip
- 电气控制PLC考试题库
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈