Драйвер сетевого устройства Windows: установите ссылку ВВЕРХ / ВНИЗ из драйвера.

Пишу сетевой драйвер для Windows. Я хочу сделать что-то вроде псевдокода ниже:

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)

Все это происходит внутри кода драйвера.

Я использую образцы драйверов Windows для справки. Я нашел кое-что многообещающее: https://github.com/microsoft/Windows-driver-samples/blob/master/network/ndis/netvmini/6x/adapter.c#L353 AdapterGeneral.MediaConnectState = HWGetMediaConnectStatus(Adapter);Я могу установить для этого MediaConnectSate значение MediaConnectStateDisconnectedздесь и драйвер инициализируется в отключенном состоянии, чего я хочу. Но я не могу найти способ изменить это состояние в другом месте после инициализации драйвера.

1 ответ

Решение

Нашел вдохновение в коде проприетарного сетевого драйвера. Эта функция включает / выключает интерфейс:


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);
}
Другие вопросы по тегам