📄 miniport.cpp
字号:
{
return NDIS_STATUS_INVALID_ADDRESS;
}
//
// First thing: Figure out required buffer size. Most OIDs require
// just a UINT, but there are exceptions.
//
switch (Oid)
{
case OID_GEN_SUPPORTED_LIST:
cbNeeded = sizeof(v_rgSupportedOids);
break;
case OID_GEN_DRIVER_VERSION:
case OID_GEN_VENDOR_DRIVER_VERSION:
cbNeeded = sizeof(USHORT);
break;
case OID_GEN_VENDOR_DESCRIPTION:
cbNeeded = sizeof(v_lpszVendorDesc);
break;
case OID_IRDA_SUPPORTED_SPEEDS:
cbNeeded = sizeof(ULONG) * NUM_BAUDRATES;
break;
default:
cbNeeded = sizeof(UINT);
break;
}
//
// Return if the buffer provided is not large enough.
//
if ((cbBuf < cbNeeded) || (lpvBuf == NULL))
{
*lpcbNeeded = cbNeeded - cbBuf;
*lpcbWritten = 0;
status = NDIS_STATUS_INVALID_LENGTH;
}
if(status== NDIS_STATUS_SUCCESS)
{
//
// Do real work.
//
*lpcbWritten = cbNeeded;
*lpcbNeeded = 0;
switch (Oid)
{
//
// General OIDs.
//
case OID_GEN_SUPPORTED_LIST:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_SUPPORTED_LIST\r\n")));
NdisMoveMemory(lpvBuf, (PVOID)v_rgSupportedOids, cbNeeded);
break;
case OID_GEN_HARDWARE_STATUS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_HARDWARE_STATUS\r\n")));
// If we can be called with a context, the we are ready.
*(UINT *)lpvBuf = NdisHardwareStatusReady;
break;
case OID_GEN_MEDIA_SUPPORTED:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_SUPPORTED\r\n")));
*(UINT *)lpvBuf = NdisMediumIrda;
break;
case OID_GEN_MEDIA_IN_USE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_IN_USE\r\n")));
*(UINT *)lpvBuf = NdisMediumIrda;
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_LOOKAHEAD\r\n")));
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_FRAME_SIZE\r\n")));
*(UINT *)lpvBuf = MAX_I_DATA_SIZE;
break;
case OID_GEN_LINK_SPEED:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_LINK_SPEED\r\n")));
// Link speed in 100 bps.
*(UINT *)lpvBuf = (UINT)(v_rgSupportedBaudRates[NUM_BAUDRATES - 1].dwBPS/100);
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BUFFER_SPACE\r\n")));
// We can buffer data, so make it one NDIS packet size.
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BUFFER_SPACE\r\n")));
// We can buffer data, so make it one NDIS packet size.
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BLOCK_SIZE\r\n")));
// We can buffer data, so make it one IR packet size.
*(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BLOCK_SIZE\r\n")));
// We can buffer data, so make it one IR packet size.
*(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;
break;
case OID_GEN_VENDOR_ID:
//
// (Todo) Generate a Cirrus Vendor ID.
//
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_ID\r\n")));
*(UINT *)lpvBuf = 0x00ffffff;
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DRIVER_VERSION\r\n")));
*(USHORT *)lpvBuf = MAKEWORD(IRSIR_MINOR_VERSION, IRSIR_MAJOR_VERSION);
break;
case OID_GEN_VENDOR_DESCRIPTION:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DESCRIPTION\r\n")));
NdisMoveMemory(lpvBuf, v_lpszVendorDesc, cbNeeded);
break;
case OID_GEN_CURRENT_PACKET_FILTER:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_PACKET_FILTER\r\n")));
*(UINT *)lpvBuf = NDIS_PACKET_TYPE_PROMISCUOUS;
break;
case OID_GEN_CURRENT_LOOKAHEAD:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_LOOKAHEAD\r\n")));
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_DRIVER_VERSION:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_DRIVER_VERSION\r\n")));
*(USHORT *)lpvBuf = MAKEWORD(NDIS_MINOR_VERSION, NDIS_MAJOR_VERSION);
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_TOTAL_SIZE\r\n")));
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
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 = pMiniport->TxPackets();
break;
case OID_GEN_RCV_OK:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_OK\r\n")));
*(UINT *)lpvBuf = pMiniport->RxPackets();
break;
case OID_GEN_XMIT_ERROR:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_XMIT_ERROR\r\n")));
*(UINT *)lpvBuf = pMiniport->TxPacketsDropped();
break;
case OID_GEN_RCV_ERROR:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_ERROR\r\n")));
*(UINT *)lpvBuf = pMiniport->RxPacketsDropped();
break;
case OID_GEN_RCV_NO_BUFFER:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RCV_NO_BUFFER\r\n")));
*(UINT *)lpvBuf = pMiniport->RxPacketsOverflowed();
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")));
//
// I don't know if this is right but it is good enough for now.
//
//*(UINT *)lpvBuf = MAX(pMiniport->capsDongle.dwTAT_usec, 5000);
*(UINT *)lpvBuf = 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++)
{
*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")));
//
// We want to make sure that the baud rate is protected by a
// critical section.l.
//
EnterCriticalSection( &pMiniport->m_ListCriticalSection);
ASSERT(pMiniport->GetCurrentBaudRate() != NULL);
*(UINT *)lpvBuf = (UINT)pMiniport->GetCurrentBaudRate();
LeaveCriticalSection( &pMiniport->m_ListCriticalSection);
break;
//
// This checks to see if the IRDA is currently busy sending packets.
//
case OID_IRDA_MEDIA_BUSY:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_MEDIA_BUSY\r\n")));
*(UINT *)lpvBuf = (UINT) pMiniport->m_fMediaBusy;
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;
//
// This is the extra begining of frame that occur at 1.152 Kbs.
// The other values are scaled from this value. I currently have no
// idea how many begining of frames are needed to let the systems
// sync up.
//
case OID_IRDA_EXTRA_RCV_BOFS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_IRDA_EXTRA_RCV_BOFS\r\n")));
*(UINT *)lpvBuf = (UINT)v_rgSupportedBaudRates[BAUDRATE_115200].dwExtraBOFs;
break;
//
// We really should release the Interrupt thread, Interrupt event and
// so that the serial port driver could use this function.
//
case OID_IRDA_RELEASE_HW_RESOURCES:
DEBUGMSG(ZONE_QUERYINFO | ZONE_WARN, (TEXT("Query: OID_IRDA_RELEASE_HW_RESOURCES\r\n")));
status = NDIS_STATUS_NOT_SUPPORTED;
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;
}
}
DEBUGMSG(ZONE_QUERYINFO,
(TEXT("-MiniportQueryInformation [status = 0x%.8X, %dL]"),
status, status));
return(status);
}
//****************************************************************************
// MiniportSetInformation
//****************************************************************************
// Allows the protocol to control the miniport by changing some of the
// information the miniport maintains.
//
// Arguments:
//
// hContext - Handle to miniport context. (IRMiniport *).
//
// 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.
//
NDIS_STATUS MiniportSetInformation
(
IN NDIS_HANDLE hContext,
IN NDIS_OID Oid,
IN PVOID lpvBuf,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -