Я пытаюсь пройти тест AddressChnage в тесте WHQL для моего виртуального драйвера минипорта. Во время теста я вижу журнал ошибок, например:
Check network addresses on the test adapter after modifying the registry with new network address
-------------------------------------------------------------------------------
Name: Test open for receiving
- RequestType: QueryInformation
- OID: OID_802_3_CURRENT_ADDRESS
- RequestId: 0
- BufferLength: 6
- Flags: 0x00000000
- PortNumber: 0
Results
- Status: NDIS_STATUS_SUCCESS (0x0)
- Bytes Written: 6
- Bytes Needed: 1737485104
Current address from test adapter is 0a-1b-3c-4d-5e-6f
New network address under test is 02-02-04-06-08-02
50009 **Current network address did not change after driver was reloaded. The driver should have picked up a new network address from the registry**.
Для пустышки Mac я все еще устанавливаю MAC-адрес. 0a-1b-3c-4d-5e-6f
PermenentAddress[0] = 0x0a
PermenentAddress[1] = 0x1b
PermenentAddress[2] = 0x3c
PermenentAddress[3] = 0x4d
PermenentAddress[4] = 0x5e
PermenentAddress[5] = 0x6f
Но я обрабатываю все необходимые звонки во время инициализации минипорта.
NDIS_STATUS InitializeEx(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_HANDLE MiniportDriverContext ,
__in PNDIS_MINIPORT_INIT_PARAMETERS MiniportInitParameters
) {
NDIS_CONFIGURATION_OBJECT ndisConfigurationObject;
NdisZeroMemory(&ndisConfigurationObject, sizeof(NDIS_CONFIGURATION_OBJECT));
C_ASSERT(sizeof(NDIS_CONFIGURATION_OBJECT) >= NDIS_SIZEOF_CONFIGURATION_OBJECT_REVISION_1);
ndisConfigurationObject.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
ndisConfigurationObject.Header.Size = NDIS_SIZEOF_CONFIGURATION_OBJECT_REVISION_1;
ndisConfigurationObject.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
ndisConfigurationObject.NdisHandle = MiniportAdapterHandle;
ndisConfigurationObject.Flags = 0;
NDIS_HANDLE Configuration = NULL;
status = NdisOpenConfigurationEx(&ndisConfigurationObject, &Configuration);
if (status != NDIS_STATUS_SUCCESS) {
return NDIS_STATUS_FAILURE;
}
//getting mac address from registry
UCHAR* MacAddress = NULL;
UINT MacAddressLength = 0;
NdisReadNetworkAddress(&status, (PVOID*) &MacAddress, &MacAddressLength, Configuration);
if ((status == NDIS_STATUS_SUCCESS) && (MacAddressLength == 6)) {
NdisMoveMemory(CurrentAddress, MacAddress, 6);
}
NdisCloseConfiguration(Configuration);
}
и добавление в адаптер miniort:
NdisMoveMemory(ndisMiniportAdapterGeneralAttributes.PermanentMacAddress, PermenentAddress, 6);
NdisMoveMemory(ndisMiniportAdapterGeneralAttributes.CurrentMacAddress, CurrentAddress, 6);
Наконец, во время запроса запроса OID я передаю значения CurrentAddress и PermenentAddress.
case OID_802_3_PERMANENT_ADDRESS:
Information = &PermenentAddress ;
InformationLength = sizeof(PermenentAddress);
break;
case OID_802_3_CURRENT_ADDRESS:
Information = &CurrentAddress ;
InformationLength = sizeof(CurrentAddress );
break;
Это именно та проблема, с которой я сталкиваюсь во время теста. Я не знаю, почему я сталкиваюсь с проблемой. Я справляюсь NdisReadNetworkAddress
обработчик для получения значений реестра конфигурации. miniport initialize будет вызывать после перезапуска драйвера и устанавливать значения реестра для текущего адреса. нет?
Тогда почему это не удается? Любой другой альтернативный метод для вызова и получения Mac-адрес адаптера? Я использую минипорт NDIS 6.2 с ОС Windows 7 и выше.
Я не вижу ничего явно неправильного в коде — у вас правильная идея. Один красный флаг в том, что это выглядит PermanentAddress
а также CurrentAddress
глобальные переменные в вашем драйвере. Если это так, их следует переместить, чтобы отключить контекст для каждого адаптера.
Вы можете увидеть, что NDIS считает вашим MAC-адресом с! Ndiskd.miniport. (Если тест проходит слишком быстро, чтобы перехватить его в отладчике, вы можете установить точку останова на вашем MiniportRestartHandler. К тому времени, когда NDIS вызовет ваш обработчик перезапуска datapath, MAC-адреса, которые вы поместили в Общие атрибуты, будут установлены во всей системе. .) В любом случае, проверьте с помощью! Ndiskd.miniport, правильно ли указан ваш MAC-адрес. Если нет, проверьте именно так что входит в ndisMiniportAdapterGeneralAttributes
прежде чем дать его NDIS.
Несвязанные заметки:
Не забудьте проверить правильность MAC-адреса — если вы реализуете интерфейс IEEE 802, вы никогда не должны позволять кому-либо устанавливать для локального MAC-адреса многоадресный или широковещательный адрес. Ссылаться на NICSetMacAddress
в образце драйвера netvmini.
Драйверы минипорта NDIS 6.x не должны отвечать OID_802_3_PERMANENT_ADDRESS
или же OID_802_3_CURRENT_ADDRESS
, NDIS отвечает на запросы от имени минипорта. Эти обработчики OID являются мертвым кодом; Вы можете удалить их.
Других решений пока нет …