soporte de controlador NDIS Cada acaba de encontrar que se trate. La información que se busca para proceder de controlador NDIS. WMI sólo le da un subconjunto de dicha información. Algunas solicitudes estándar que puede se enviará con respecto a la función DeviceIoControl
(consulte http://msdn.microsoft.com/en-us/library/aa363216%28v=VS.85%29.aspx). Como entrada (parámetro lpInBuffer) debe proporcionar un DWORD con un código OID, un código de control que identifique la solicitud, como resultado, recibirá una estructura con información archivada, o en su caso es un DWORD (valor enum).Por ejemplo, si se le pregunta controlador NDIS para
#define OID_802_11_WEP_STATUS 0x0D01011B
(como valor DWORD de parámetro lpInBuffer) Devuelve la espalda también DWORD con información como
// Also aliased typedef to new name
typedef enum _NDIS_802_11_WEP_STATUS
{
Ndis802_11WEPEnabled,
Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
Ndis802_11WEPDisabled,
Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
Ndis802_11WEPKeyAbsent,
Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
Ndis802_11WEPNotSupported,
Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
Ndis802_11Encryption2Enabled,
Ndis802_11Encryption2KeyAbsent,
Ndis802_11Encryption3Enabled,
Ndis802_11Encryption3KeyAbsent
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
solicitud de
#define OID_802_11_AUTHENTICATION_MODE 0x0D010118
vuelve
typedef enum _NDIS_802_11_AUTHENTICATION_MODE
{
Ndis802_11AuthModeOpen,
Ndis802_11AuthModeShared,
Ndis802_11AuthModeAutoSwitch,
Ndis802_11AuthModeWPA,
Ndis802_11AuthModeWPAPSK,
Ndis802_11AuthModeWPANone,
Ndis802_11AuthModeWPA2,
Ndis802_11AuthModeWPA2PSK,
Ndis802_11AuthModeMax // Not a real mode, defined as upper bound
} NDIS_802_11_AUTHENTICATION_MODE;
solicitud de
#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
vuelve
typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
{
Ndis802_11IBSS,
Ndis802_11Infrastructure,
Ndis802_11AutoUnknown,
Ndis802_11InfrastructureMax // Not a real value, defined as upper bound
} NDIS_802_11_NETWORK_INFRASTRUCTURE;
y así sucesivamente. Puede encontrar todas las constantes diferentes que necesita en ntddndis.h
después de instalar Windows DDK.
Para abrir un mango de dispositivo debe utilizar la función CreateFile
. En lugar del nombre del archivo, debe dar una cadena con el prefijo "\\.\"
y el nombre del adaptador (guías del adaptador). Nombres de adaptador que puede enumerar de manera diferente. Uno de los más fáciles es los nombres de subclaves de la clave de registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters
.
Todo lo que he explicado anteriormente funciona exactamente como http://msdn.microsoft.com/en-us/library/aa964902%28v=VS.85%29.aspx u otros ejemplos de uso DeviceIoControl
. La lista completa de las solicitudes de IoControl que deben admitir alguna clase de dispositivo se describe en DDK. Repito una vez más, que para el uso de eso solo necesito usar DeviceIoControl
y no escribir un controlador de dispositivo.
Hace más de 10 años que juego un poco con las solicitudes que describí aquí. Probé mi antiguo programa sin problemas ahora. Uno solo necesita usar los OID que necesita y no mucho más.
ACTUALIZADO: Encontré un buen enlace http://pages.infinit.net/codeguru/WiFiArticle.htm que explica en otras palabras lo mismo que acabo de escribir. Me parece que uno usa aquí parámetros incorrectos en CreateFile
. Uno tiene que usar FILE_SHARE_READ | FILE_SHARE_WRITE
para que todo funcione. Ejemplo http://code.google.com/p/haggle/source/browse/winmobile/Haggle/WindowsWiFiUtils.cpp (ver bool WindowsWiFiUtils:init()
, bool WindowsWiFiUtils::setEncryptionMode(unsigned long adapterIndex, const unsigned int mode)
etc.) parece mucho mejor y contiene muchos métodos que también pueden ser interesantes para usted. Es un ejemplo de C++, pero es muy fácil reescribir esto en C#.
Actualización 2: una forma más es el uso de "nativo API Wifi" http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx como WlanQueryInterface (por ejemplo, con wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs) o WZCQueryInterface, pero no parece compatible con Windows Server 2003, lo que necesita. En general, "Native Wifi API" es probablemente la manera más confiable de dar la máxima información (o modificarla), pero WMI también puede ser una buena alternativa pragmática.