⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miniport.cpp

📁 Ep93XX TionProV2 BSP
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    {
        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 + -