Windows网络设备驱动程序:从驱动程序内部向上/向下设置链接

问题描述

我正在编写Windows的网络驱动程序。我想做类似下面的伪代码的事情:

/2

所有这些都在驱动程序代码内发生。

我正在使用Windows驱动程序示例作为参考。我发现了一些看起来很有前途的东西:https://github.com/microsoft/Windows-driver-samples/blob/master/network/ndis/netvmini/6x/adapter.c#L353 Init_interface_link_status = disconnected (Equivalent to DOWN in Linux) Repeat using delayed workitem: if (condition is true) interface_link_status = connected (UP) break else interface_link_status = disconnected (DOWN) 我可以在此处将此MediaConnectSate设置为 AdapterGeneral.MediaConnectState = HWGetMediaConnectStatus(Adapter);,驱动程序将在“断开”状态下初始化,这是我想要的。 但是在驱动程序初始化之后,我找不到在其他地方更改此状态的方法。

解决方法

从专有网络驱动程序代码中找到灵感。 此功能可打开/关闭界面:


VOID NSUChangeAdapterLinkState(
    _In_ PMP_ADAPTER Adapter,_In_ BOOLEAN TurnInterfaceUP)
/*++
Routine Description:
    Change Adapter Link's state. This is equivalent to doing ifup/ifdown on Linux.
Arguments:
    Adapter              - Pointer to our adapter
    TurnInterfaceUP      - Pass TRUE to turn interface UP,FALSE to turn DOWN
Return Value:
    None
--*/
{
    NDIS_LINK_STATE LinkState;
    NDIS_STATUS_INDICATION StatusIndication;

    RtlZeroMemory(&LinkState,sizeof(LinkState));
    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
    LinkState.Header.Size = NDIS_SIZEOF_LINK_STATE_REVISION_1;

    if (TurnInterfaceUP)
    {
        LinkState.MediaConnectState = MediaConnectStateConnected;
        MP_CLEAR_FLAG(Adapter,fMP_DISCONNECTED);
    } else
    {
        LinkState.MediaConnectState = MediaConnectStateDisconnected;
        MP_SET_FLAG(Adapter,fMP_DISCONNECTED);
    }

    LinkState.RcvLinkSpeed = Adapter->ulLinkRecvSpeed;
    LinkState.XmitLinkSpeed = Adapter->ulLinkSendSpeed; 
    LinkState.MediaDuplexState = MediaDuplexStateFull;

    RtlZeroMemory(&StatusIndication,sizeof(StatusIndication));
    StatusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
    StatusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
    StatusIndication.Header.Size = NDIS_SIZEOF_STATUS_INDICATION_REVISION_1;
    StatusIndication.SourceHandle = Adapter->AdapterHandle;
    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
    StatusIndication.StatusBuffer = &LinkState;
    StatusIndication.StatusBufferSize = sizeof(NDIS_LINK_STATE);

    NdisMIndicateStatusEx(Adapter->AdapterHandle,&StatusIndication);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...