La estructura IP_ADAPTER_ADDRESSES sostienen un miembro de OperStatus. Ver MSDN documentation
creo que puede ser utilizado para detectar NIC discapacitados. No lo intenté.
Aquí hay un código de prueba:
ULONG nFlags= 0;
if (WINVER>=0x0600) // flag supported in Vista and later
nFlags= 0x0100; // GAA_FLAG_INCLUDE_ALL_INTERFACES
// during system initialization, GetAdaptersAddresses may return ERROR_BUFFER_OVERFLOW and supply nLen,
// but in a subsequent call it may return ERROR_BUFFER_OVERFLOW and supply greater nLen !
ULONG nLen= sizeof (IP_ADAPTER_ADDRESSES);
BYTE* pBuf= NULL;
DWORD nErr= 0 ;
do
{
delete[] pBuf;
pBuf= new BYTE[nLen];
nErr= ::GetAdaptersAddresses(AF_INET, nFlags, NULL, (IP_ADAPTER_ADDRESSES*&)pBuf, &nLen);
}
while (ERROR_BUFFER_OVERFLOW == nErr);
if (NO_ERROR != nErr)
{
delete[] pBuf;
TCHAR czErr[300]= _T("GetAdaptersAddresses failed. ");
REPORT(REP_ERROR, _T("GetAdapterInfo"), GetSysErrStr(nErr, czErr, 300));
return false;
}
const IP_ADAPTER_ADDRESSES* pAdaptersAddresses= (IP_ADAPTER_ADDRESSES*&)pBuf;
while (pAdaptersAddresses) // for each adapter
{
TCHAR czAdapterName [500]; str_cpy(czAdapterName , 500, pAdaptersAddresses->AdapterName);
TCHAR czDesc [500]; str_cpy(czDesc , 500, pAdaptersAddresses->Description);
TCHAR czFriendlyName[500]; str_cpy(czFriendlyName, 500, pAdaptersAddresses->FriendlyName);
const IF_OPER_STATUS& Stat= pAdaptersAddresses->OperStatus; // 1:up, 2:down...
...
pAdaptersAddresses= pAdaptersAddresses->Next;
}
¿Qué campo aquí es el estado dis/enabled? –
No lo sé de memoria, y no estoy cerca de ninguna PC con Windows. Espero que puedas encontrar más información sobre este puntero ... sry sobre eso por ahora – sehe
Creo que en base a la información de PnpInstanceId debes encontrar la información del controlador en HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ PCI y allí deberías ver ConfigFlags llave. Si está configurado en 0, la tarjeta NIC está habilitada si está desactivada 1. – Zuljin