📄 request.c
字号:
case OID_GEN_PROTOCOL_OPTIONS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_PROTOCOL_OPTIONS\r\n")));
DEBUGMSG(ZONE_ERROR, (TEXT("This is a set-only OID.\r\n")));
*lpcbWritten = 0;
status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_MAC_OPTIONS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAC_OPTIONS\r\n")));
*(UINT *)lpvBuf = (NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND);
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_CONNECT_STATUS\r\n")));
// Since we are not physically connect to a LAN, we can
// not determine whether or not we are connected, so we
// always indicate that we are.
*(UINT *)lpvBuf = NdisMediaStateConnected;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_SEND_PACKETS\r\n")));
// Currently we only support IrsirSend and not IrsirSendPackets.
*(UINT *)lpvBuf = 1;
break;
//
// Statistical OIDs.
//
case OID_GEN_XMIT_OK:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_XMIT_OK\r\n")));
*(UINT *)lpvBuf = pIrDevice->cPacketsTx;
break;
case OID_GEN_RCV_OK:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_OK\r\n")));
*(UINT *)lpvBuf = pIrDevice->cPacketsRx;
break;
case OID_GEN_XMIT_ERROR:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_XMIT_ERROR\r\n")));
*(UINT *)lpvBuf = pIrDevice->cPacketsTxDropped;
break;
case OID_GEN_RCV_ERROR:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_ERROR\r\n")));
*(UINT *)lpvBuf = pIrDevice->cPacketsRxDropped;
break;
case OID_GEN_RCV_NO_BUFFER:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_NO_BUFFER\r\n")));
*(UINT *)lpvBuf = pIrDevice->cPacketsRxOverflow;
break;
//
// IrDA OIDs.
//
case OID_IRDA_RECEIVING:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_RECEIVING\r\n")));
*(UINT *)lpvBuf = (UINT)TRUE;
break;
case OID_IRDA_TURNAROUND_TIME:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_TURNAROUND_TIME\r\n")));
*(UINT *)lpvBuf = MAX(pIrDevice->capsDongle.dwTAT_usec, 5000);
break;
case OID_IRDA_SUPPORTED_SPEEDS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_SUPPORTED_SPEEDS\r\n")));
{
DWORD i;
UINT * lpTempBuf = (UINT *)lpvBuf;
*lpcbWritten = 0;
for (i = 0; i < NUM_BAUDRATES; i++)
{
if (v_rgSupportedBaudRates[i].dwSpeedMask &
pIrDevice->dwSupportedSpeedsMask)
{
ASSERT((*lpcbWritten + sizeof(UINT)) <= cbBuf);
*lpTempBuf++ = (UINT)v_rgSupportedBaudRates[i].dwBPS;
*lpcbWritten += sizeof(UINT);
DEBUGMSG(ZONE_QUERYINFO,
(TEXT(" %s BPS Supported.\r\n"),
v_rgSupportedBaudRates[i].lpszDbgSpeed)
);
}
}
}
break;
case OID_IRDA_LINK_SPEED:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_LINK_SPEED\r\n")));
NdisAcquireSpinLock(&pIrDevice->slDevice);
ASSERT(pIrDevice->pCurrBaud != NULL);
*(UINT *)lpvBuf = (UINT)pIrDevice->pCurrBaud->dwBPS;
NdisReleaseSpinLock(&pIrDevice->slDevice);
break;
case OID_IRDA_MEDIA_BUSY:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MEDIA_BUSY\r\n")));
NdisAcquireSpinLock(&pIrDevice->slDevice);
DEBUGMSG(
ZONE_WARN && (pIrDevice->cMediaBusyRxBytes || pIrDevice->cMediaBusyRxErrs),
(TEXT("QMB: %s, cm=%#x, RxBytes=%d, RxErrs=%d\r\n"),
pIrDevice->fMediaBusy == TRUE ? TEXT("Busy") : TEXT("Idle"),
pIrDevice->dwCommMask,
pIrDevice->cMediaBusyRxBytes,
pIrDevice->cMediaBusyRxErrs));
// Get current status
if (pIrDevice->pCurrBaud->dwBPS == 576000 ||
pIrDevice->pCurrBaud->dwBPS == 1152000 ||
pIrDevice->pCurrBaud->dwBPS == 4000000 )
{
FIRMediaBusy(pIrDevice);
}
// Since we wait on CommEvents, fMediaBusy will be set if
// an error occurs.
*(UINT *)lpvBuf = (UINT)pIrDevice->fMediaBusy;
// Turn of looking for errors IFF fMediaBusy = FALSE. Otherwise,
// the recv loop will have turned it off.
if (pIrDevice->fMediaBusy == FALSE)
{
pIrDevice->dwCommMask &= ~EV_ERR;
SetCommMask(pIrDevice->hSerial, pIrDevice->dwCommMask);
DEBUGMSG(ZONE_COMMMASK,
(TEXT("QMB:SetCommMask 0x%.8X\r\n"),
pIrDevice->dwCommMask)
);
}
NdisReleaseSpinLock(&pIrDevice->slDevice);
break;
case OID_IRDA_MAX_RECEIVE_WINDOW_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MAX_RECEIVE_WINDOW_SIZE\r\n")));
*(UINT *)lpvBuf = MAX_RX_PACKETS;
break;
case OID_IRDA_MAX_SEND_WINDOW_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MAX_SEND_WINDOW_SIZE\r\n")));
*(UINT *)lpvBuf = MAX_TX_PACKETS;
break;
case OID_IRDA_EXTRA_RCV_BOFS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_EXTRA_RCV_BOFS\r\n")));
*(UINT *)lpvBuf = (UINT)pIrDevice->capsDongle.dwExtraBOFs;
break;
case OID_IRDA_RELEASE_HW_RESOURCES:
DEBUGMSG(ZONE_QUERYINFO | ZONE_WARN, (TEXT("Query: OID_IRDA_RELEASE_HW_RESOURCES\r\n")));
if (pIrDevice->hSerial != INVALID_HANDLE_VALUE)
{
PIRSIR_REQUEST pRequest;
HANDLE hRequestThread;
DWORD dwRequestThreadId;
pRequest = IrsirAlloc(MT_NOT_SPECIFIED, sizeof(IRSIR_REQUEST));
if (pRequest == NULL)
{
status = NDIS_STATUS_RESOURCES;
goto done;
}
pRequest->pIrDevice = pIrDevice;
pRequest->NdisRequest.RequestType = NdisRequestQueryInformation;
pRequest->NdisRequest.DATA.QUERY_INFORMATION.Oid = Oid;
pRequest->NdisRequest.DATA.QUERY_INFORMATION.InformationBuffer = lpvBuf;
pRequest->NdisRequest.DATA.QUERY_INFORMATION.InformationBufferLength = cbBuf;
// Worker thread frees the request object.
hRequestThread = CreateThread(NULL, 0, IrsirpNdisRequest,
pRequest, 0, &dwRequestThreadId);
if (hRequestThread == NULL)
{
status = NDIS_STATUS_RESOURCES;
goto done;
}
CloseHandle(hRequestThread);
status = NDIS_STATUS_PENDING;
}
else
{
// We already have released resources.
status = NDIS_STATUS_FAILURE;
DEBUGMSG(ZONE_ERROR,
(TEXT("IrSIR: RELEASE_RESOURCES - Already have released resources!\r\n")));
}
break;
// Unsupported IrDA OIDs.
case OID_IRDA_REACQUIRE_HW_RESOURCES:
case OID_IRDA_RATE_SNIFF:
case OID_IRDA_UNICAST_LIST:
case OID_IRDA_MAX_UNICAST_LIST_SIZE:
status = NDIS_STATUS_NOT_SUPPORTED;
break;
default:
status = NDIS_STATUS_INVALID_OID;
break;
}
done:
DEBUGMSG(ZONE_QUERYINFO,
(TEXT("-IrsirQueryInformation [status = 0x%.8X, %dL]")
TEXT(" *lpcbWritten = %d, *lpcbNeeded = %d.\r\n"),
status, status, *lpcbWritten, *lpcbNeeded)
);
return (status);
}
/*++
Function: IrsirSetInformation
Description: Allows the protocol to control the miniport by changing
some of the information the miniport maintains.
Arguments:
hContext - Handle to miniport context. (PIR_DEVICE).
Oid - System defined OID_Xxx.
lpvBuf - Buffer containing data for setting the OID information.
cbBuf - Size of lpvBuf in bytes.
lpcbWritten - Number of bytes read from lpvBuf.
lpcbNeeded - Additional bytes required if cbBuf less than the information
needed to set the OID.
Returns:
NDIS_STATUS Code.
Success - NDIS_STATUS_SUCCESS.
NDIS_STATUS_PENDING:
Will complete asynchronously and call
NdisMSetInformationComplete.
Failure - NDIS_STATUS_INVALID_OID:
Don't recognize the OID.
NDIS_STATUS_INVALID_LENGTH:
lpvBuf does not match length for OID.
NDIS_STATUS_NOT_ACCEPTED:
Failure.
NDIS_STATUS_NOT_SUPPORTED:
Do not support optional OID.
NDIS_STATUS_RESOURCES:
Failure resources allocation.
Comments:
See v_rgSupportedOids array for supported OIDs.
--*/
NDIS_STATUS
IrsirSetInformation(
IN NDIS_HANDLE hContext,
IN NDIS_OID Oid,
IN PVOID lpvBuf,
IN ULONG cbBuf,
OUT PULONG lpcbRead,
OUT PULONG lpcbNeeded
)
{
PIR_DEVICE pIrDevice = (PIR_DEVICE)hContext;
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
ASSERT(lpvBuf != NULL);
ASSERT(lpcbRead != NULL);
ASSERT(lpcbNeeded != NULL);
DEBUGMSG(ZONE_SETINFO,
(TEXT("+IrsirSetInformation(0x%.8X, 0x%.8X, 0x%.8x, %d, ")
TEXT("0x%.8X, 0x%.8X)\r\n"),
hContext, Oid, lpvBuf, cbBuf, lpcbRead, lpcbNeeded)
);
//
// Set defaults.
//
*lpcbRead = sizeof(UINT);
*lpcbNeeded = 0;
switch (Oid)
{
//
// Generic OIDs.
//
// case OID_GEN_CURRENT_PACKET_FILTER:
// DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_GEN_CURRENT_PACKET_FILTER\r\n")));
// break;
case OID_GEN_CURRENT_LOOKAHEAD:
DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_GEN_CURRENT_LOOKAHEAD\r\n")));
// This is only a suggestion from the protocol.
// We always indicate the entire frame at once. Ignore this.
break;
case OID_GEN_PROTOCOL_OPTIONS:
DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_GEN_PROTOCOL_OPTIONS\r\n")));
// Flags to help out the miniport. Ignore.
break;
//
// IrDA OIDs.
//
case OID_IRDA_LINK_SPEED:
DEBUGMSG(ZONE_SETINFO, (TEXT("Set: OID_IRDA_LINK_SPEED\r\n")));
{
PIRSIR_REQUEST pRequest;
HANDLE hRequestThread;
DWORD dwRequestThreadId;
pRequest = IrsirAlloc(MT_NOT_SPECIFIED, sizeof(IRSIR_REQUEST));
if (pRequest == NULL)
{
status = NDIS_STATUS_RESOURCES;
goto done;
}
pRequest->pIrDevice = pIrDevice;
pRequest->NdisRequest.RequestType = NdisRequestSetInformation;
pRequest->NdisRequest.DATA.SET_INFORMATION.Oid = Oid;
pRequest->NdisRequest.DATA.SET_INFORMATION.InformationBuffer = lpvBuf;
pRequest->NdisRequest.DATA.SET_INFORMATION.InformationBufferLength = cbBuf;
// Worker thread frees the request object.
hRequestThread = CreateThread(NULL, 0, IrsirpNdisRequest,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -