📄 tapi.c
字号:
// \LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\I
// L = The device line number associated with this line (1..NumLines)
// A = The address (channel) to be used on this line (0..NumAddresses-1)
*/
AddressLength = strlen(Link->LineAddress) + 1;
Request->LineAddressCaps.ulNeededSize += AddressLength;
if (Request->LineAddressCaps.ulNeededSize <= Request->LineAddressCaps.ulTotalSize)
{
Request->LineAddressCaps.ulAddressSize = AddressLength;
Request->LineAddressCaps.ulAddressOffset = sizeof(Request->LineAddressCaps);
NdisMoveMemory((PUCHAR) &Request->LineAddressCaps +
Request->LineAddressCaps.ulAddressOffset,
Link->LineAddress,
AddressLength
);
Request->LineAddressCaps.ulUsedSize += AddressLength;
}
/*
// Return the various address capabilites for the adapter.
*/
Request->LineAddressCaps.ulAddressSharing = LINEADDRESSSHARING_PRIVATE;
Request->LineAddressCaps.ulAddressStates = Link->AddressStatesCaps;
Request->LineAddressCaps.ulCallStates = Link->CallStatesCaps;
Request->LineAddressCaps.ulDialToneModes = LINEDIALTONEMODE_NORMAL;
Request->LineAddressCaps.ulSpecialInfo = LINESPECIALINFO_UNAVAIL;
Request->LineAddressCaps.ulDisconnectModes =
LINEDISCONNECTMODE_NORMAL |
LINEDISCONNECTMODE_UNKNOWN |
LINEDISCONNECTMODE_BUSY |
LINEDISCONNECTMODE_NOANSWER;
/*
// This device does not support conference calls, transfers, or holds.
*/
Request->LineAddressCaps.ulMaxNumActiveCalls = 1;
Request->LineAddressCaps.ulMaxNumTransConf = 1;
Request->LineAddressCaps.ulAddrCapFlags =
Link->LineMode == HTDSU_LINEMODE_LEASED ? 0 : LINEADDRCAPFLAGS_DIALED;
Request->LineAddressCaps.ulCallFeatures =
LINECALLFEATURE_ACCEPT |
LINECALLFEATURE_ANSWER |
LINECALLFEATURE_COMPLETECALL |
LINECALLFEATURE_DIAL |
LINECALLFEATURE_DROP;
DBG_LEAVE(Adapter);
return (NDIS_STATUS_SUCCESS);
}
NDIS_STATUS
HtTapiGetAddressStatus(
IN PHTDSU_ADAPTER Adapter,
IN PNDIS_TAPI_GET_ADDRESS_STATUS Request
)
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Functional Description:
This request queries the specified address for its current status.
Parameters:
Adapter _ A pointer ot our adapter information structure.
Request _ A pointer to the NDIS_TAPI request structure for this call.
typedef struct _NDIS_TAPI_GET_ADDRESS_STATUS
{
IN ULONG ulRequestID;
IN HDRV_LINE hdLine;
IN ULONG ulAddressID;
OUT LINE_ADDRESS_STATUS LineAddressStatus;
} NDIS_TAPI_GET_ADDRESS_STATUS, *PNDIS_TAPI_GET_ADDRESS_STATUS;
typedef struct _LINE_ADDRESS_STATUS
{
ULONG ulTotalSize;
ULONG ulNeededSize;
ULONG ulUsedSize;
ULONG ulNumInUse;
ULONG ulNumActiveCalls;
ULONG ulNumOnHoldCalls;
ULONG ulNumOnHoldPendCalls;
ULONG ulAddressFeatures;
ULONG ulNumRingsNoAnswer;
ULONG ulForwardNumEntries;
ULONG ulForwardSize;
ULONG ulForwardOffset;
ULONG ulTerminalModesSize;
ULONG ulTerminalModesOffset;
ULONG ulDevSpecificSize;
ULONG ulDevSpecificOffset;
} LINE_ADDRESS_STATUS, *PLINE_ADDRESS_STATUS;
Return Values:
NDIS_STATUS_SUCCESS
NDIS_STATUS_FAILURE
NDIS_STATUS_TAPI_INVALLINEHANDLE
NDIS_STATUS_TAPI_INVALADDRESSID
---------------------------------------------------------------------------*/
{
DBG_FUNC("HtTapiGetAddressStatus")
/*
// A pointer to our link information structure for the selected line device.
*/
PHTDSU_LINK Link;
DBG_ENTER(Adapter);
DBG_FILTER(Adapter, DBG_PARAMS_ON,
("hdLine=%Xh\n"
"ulAddressID=%d\n",
Request->hdLine,
Request->ulAddressID
));
/*
// This request must be associated with a line device.
*/
Link = GET_LINK_FROM_HDLINE(Adapter, Request->hdLine);
if (Link == NULL)
{
DBG_WARNING(Adapter, ("Returning NDIS_STATUS_TAPI_INVALLINEHANDLE\n"));
return (NDIS_STATUS_TAPI_INVALLINEHANDLE);
}
/*
// Make sure the address is within range - we only support one per line.
*/
if (Request->ulAddressID >= HTDSU_TAPI_NUM_ADDRESSES)
{
DBG_WARNING(Adapter, ("Returning NDIS_STATUS_TAPI_INVALADDRESSID\n"));
return (NDIS_STATUS_TAPI_INVALADDRESSID);
}
#ifndef NDISTAPI_BUG_FIXED
Request->LineAddressStatus.ulNeededSize =
Request->LineAddressStatus.ulUsedSize = sizeof(Request->LineAddressStatus);
#endif
/*
// Return the current status information for the line.
*/
Request->LineAddressStatus.ulNumInUse =
Link->CallState == LINECALLSTATE_IDLE ? 0 : 1;
Request->LineAddressStatus.ulNumActiveCalls =
Link->CallState == LINECALLSTATE_IDLE ? 0 : 1;
Request->LineAddressStatus.ulAddressFeatures =
Link->CallState == LINECALLSTATE_IDLE ?
LINEADDRFEATURE_MAKECALL : 0;
Request->LineAddressStatus.ulNumRingsNoAnswer = 999;
DBG_LEAVE(Adapter);
return (NDIS_STATUS_SUCCESS);
}
NDIS_STATUS
HtTapiGetCallAddressID(
IN PHTDSU_ADAPTER Adapter,
IN PNDIS_TAPI_GET_CALL_ADDRESS_ID Request
)
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Functional Description:
This request retrieves the address ID for the indicated call.
Parameters:
Adapter _ A pointer ot our adapter information structure.
Request _ A pointer to the NDIS_TAPI request structure for this call.
typedef struct _NDIS_TAPI_GET_CALL_ADDRESS_ID
{
IN ULONG ulRequestID;
IN HDRV_CALL hdCall;
OUT ULONG ulAddressID;
} NDIS_TAPI_GET_CALL_ADDRESS_ID, *PNDIS_TAPI_GET_CALL_ADDRESS_ID;
Return Values:
NDIS_STATUS_SUCCESS
NDIS_STATUS_FAILURE
NDIS_STATUS_TAPI_INVALCALLHANDLE
---------------------------------------------------------------------------*/
{
DBG_FUNC("HtTapiGetCallAddressID")
/*
// A pointer to our link information structure for the selected line device.
*/
PHTDSU_LINK Link;
DBG_ENTER(Adapter);
DBG_FILTER(Adapter, DBG_PARAMS_ON,
("hdCall=%Xh\n",
Request->hdCall
));
/*
// This request must be associated with a call.
*/
Link = GET_LINK_FROM_HDCALL(Adapter, Request->hdCall);
if (Link == NULL)
{
DBG_WARNING(Adapter, ("Returning NDIS_STATUS_TAPI_INVALCALLHANDLE\n"));
return (NDIS_STATUS_TAPI_INVALCALLHANDLE);
}
/*
// Return the address ID associated with this call.
*/
Request->ulAddressID = HTDSU_TAPI_ADDRESSID;
DBG_LEAVE(Adapter);
return (NDIS_STATUS_SUCCESS);
}
NDIS_STATUS
HtTapiGetCallInfo(
IN PHTDSU_ADAPTER Adapter,
IN PNDIS_TAPI_GET_CALL_INFO Request
)
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Functional Description:
This request returns detailed information about the specified call.
Parameters:
Adapter _ A pointer ot our adapter information structure.
Request _ A pointer to the NDIS_TAPI request structure for this call.
typedef struct _NDIS_TAPI_GET_CALL_INFO
{
IN ULONG ulRequestID;
IN HDRV_CALL hdCall;
OUT LINE_CALL_INFO LineCallInfo;
} NDIS_TAPI_GET_CALL_INFO, *PNDIS_TAPI_GET_CALL_INFO;
typedef struct _LINE_CALL_INFO
{
ULONG ulTotalSize;
ULONG ulNeededSize;
ULONG ulUsedSize;
ULONG hLine;
ULONG ulLineDeviceID;
ULONG ulAddressID;
ULONG ulBearerMode;
ULONG ulRate;
ULONG ulMediaMode;
ULONG ulAppSpecific;
ULONG ulCallID;
ULONG ulRelatedCallID;
ULONG ulCallParamFlags;
ULONG ulCallStates;
ULONG ulMonitorDigitModes;
ULONG ulMonitorMediaModes;
LINE_DIAL_PARAMS DialParams;
ULONG ulOrigin;
ULONG ulReason;
ULONG ulCompletionID;
ULONG ulNumOwners;
ULONG ulNumMonitors;
ULONG ulCountryCode;
ULONG ulTrunk;
ULONG ulCallerIDFlags;
ULONG ulCallerIDSize;
ULONG ulCallerIDOffset;
ULONG ulCallerIDNameSize;
ULONG ulCallerIDNameOffset;
ULONG ulCalledIDFlags;
ULONG ulCalledIDSize;
ULONG ulCalledIDOffset;
ULONG ulCalledIDNameSize;
ULONG ulCalledIDNameOffset;
ULONG ulConnectedIDFlags;
ULONG ulConnectedIDSize;
ULONG ulConnectedIDOffset;
ULONG ulConnectedIDNameSize;
ULONG ulConnectedIDNameOffset;
ULONG ulRedirectionIDFlags;
ULONG ulRedirectionIDSize;
ULONG ulRedirectionIDOffset;
ULONG ulRedirectionIDNameSize;
ULONG ulRedirectionIDNameOffset;
ULONG ulRedirectingIDFlags;
ULONG ulRedirectingIDSize;
ULONG ulRedirectingIDOffset;
ULONG ulRedirectingIDNameSize;
ULONG ulRedirectingIDNameOffset;
ULONG ulAppNameSize;
ULONG ulAppNameOffset;
ULONG ulDisplayableAddressSize;
ULONG ulDisplayableAddressOffset;
ULONG ulCalledPartySize;
ULONG ulCalledPartyOffset;
ULONG ulCommentSize;
ULONG ulCommentOffset;
ULONG ulDisplaySize;
ULONG ulDisplayOffset;
ULONG ulUserUserInfoSize;
ULONG ulUserUserInfoOffset;
ULONG ulHighLevelCompSize;
ULONG ulHighLevelCompOffset;
ULONG ulLowLevelCompSize;
ULONG ulLowLevelCompOffset;
ULONG ulChargingInfoSize;
ULONG ulChargingInfoOffset;
ULONG ulTerminalModesSize;
ULONG ulTerminalModesOffset;
ULONG ulDevSpecificSize;
ULONG ulDevSpecificOffset;
} LINE_CALL_INFO, *PLINE_CALL_INFO;
typedef struct _LINE_DIAL_PARAMS
{
ULONG ulDialPause;
ULONG ulDialSpeed;
ULONG ulDigitDuration;
ULONG ulWaitForDialtone;
} LINE_DIAL_PARAMS, *PLINE_DIAL_PARAMS;
Return Values:
NDIS_STATUS_SUCCESS
NDIS_STATUS_FAILURE
NDIS_STATUS_TAPI_INVALCALLHANDLE
---------------------------------------------------------------------------*/
{
DBG_FUNC("HtTapiGetCallInfo")
/*
// A pointer to our link information structure for the selected line device.
*/
PHTDSU_LINK Link;
DBG_ENTER(Adapter);
DBG_FILTER(Adapter, DBG_PARAMS_ON,
("hdCall=%Xh\n",
Request->hdCall
));
/*
// This request must be associated with a call.
*/
Link = GET_LINK_FROM_HDCALL(Adapter, Request->hdCall);
if (Link == NULL)
{
DBG_WARNING(Adapter, ("Returning NDIS_STATUS_TAPI_INVALCALLHANDLE\n"));
return (NDIS_STATUS_TAPI_INVALCALLHANDLE);
}
#ifndef NDISTAPI_BUG_FIXED
Request->LineCallInfo.ulNeededSize =
Request->LineCallInfo.ulUsedSize = sizeof(Request->LineCallInfo);
#endif
/*
// We don't expect user user info.
*/
ASSERT(Request->LineCallInfo.ulUserUserInfoSize == 0);
/*
// The link has all the call information we need to return.
*/
Request->LineCallInfo.hLine = (ULONG) Link;
Request->LineCallInfo.ulLineDeviceID = GET_DEVI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -