Как извлечь MAC-адрес из реестра во время NDIS?

Я пытаюсь пройти тест 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 и выше.

0

Решение

Я не вижу ничего явно неправильного в коде — у вас правильная идея. Один красный флаг в том, что это выглядит 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 являются мертвым кодом; Вы можете удалить их.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]