📄 driver_ndis.c
字号:
/* * WPA Supplicant - Windows/NDIS driver interface * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. */#ifdef __CYGWIN__/* Avoid some header file conflicts by not including standard headers for * cygwin builds when Packet32.h is included. */#include "build_config.h"int close(int fd);#else /* __CYGWIN__ */#include "includes.h"#endif /* __CYGWIN__ */#ifdef CONFIG_USE_NDISUIO#include <winsock2.h>#else /* CONFIG_USE_NDISUIO */#include <Packet32.h>#endif /* CONFIG_USE_NDISUIO */#ifdef __MINGW32_VERSION#include <ddk/ntddndis.h>#else /* __MINGW32_VERSION */#include <ntddndis.h>#endif /* __MINGW32_VERSION */#ifdef _WIN32_WCE#include <winioctl.h>#include <nuiouser.h>#include <devload.h>#endif /* _WIN32_WCE */#include "common.h"#include "driver.h"#include "eloop.h"#include "ieee802_11_defs.h"#include "driver_ndis.h"int wpa_driver_register_event_cb(struct wpa_driver_ndis_data *drv);#ifdef CONFIG_NDIS_EVENTS_INTEGRATEDvoid wpa_driver_ndis_event_pipe_cb(void *eloop_data, void *user_data);#endif /* CONFIG_NDIS_EVENTS_INTEGRATED */static void wpa_driver_ndis_deinit(void *priv);static void wpa_driver_ndis_poll(void *drv);static void wpa_driver_ndis_poll_timeout(void *eloop_ctx, void *timeout_ctx);static int wpa_driver_ndis_adapter_init(struct wpa_driver_ndis_data *drv);static int wpa_driver_ndis_adapter_open(struct wpa_driver_ndis_data *drv);static void wpa_driver_ndis_adapter_close(struct wpa_driver_ndis_data *drv);static const u8 pae_group_addr[ETH_ALEN] ={ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x03 };/* FIX: to be removed once this can be compiled with the complete NDIS * header files */#ifndef OID_802_11_BSSID#define OID_802_11_BSSID 0x0d010101#define OID_802_11_SSID 0x0d010102#define OID_802_11_INFRASTRUCTURE_MODE 0x0d010108#define OID_802_11_ADD_WEP 0x0D010113#define OID_802_11_REMOVE_WEP 0x0D010114#define OID_802_11_DISASSOCIATE 0x0D010115#define OID_802_11_BSSID_LIST 0x0d010217#define OID_802_11_AUTHENTICATION_MODE 0x0d010118#define OID_802_11_PRIVACY_FILTER 0x0d010119#define OID_802_11_BSSID_LIST_SCAN 0x0d01011A#define OID_802_11_WEP_STATUS 0x0d01011B#define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS#define OID_802_11_ADD_KEY 0x0d01011D#define OID_802_11_REMOVE_KEY 0x0d01011E#define OID_802_11_ASSOCIATION_INFORMATION 0x0d01011F#define OID_802_11_TEST 0x0d010120#define OID_802_11_CAPABILITY 0x0d010122#define OID_802_11_PMKID 0x0d010123#define NDIS_802_11_LENGTH_SSID 32#define NDIS_802_11_LENGTH_RATES 8#define NDIS_802_11_LENGTH_RATES_EX 16typedef UCHAR NDIS_802_11_MAC_ADDRESS[6];typedef struct NDIS_802_11_SSID { ULONG SsidLength; UCHAR Ssid[NDIS_802_11_LENGTH_SSID];} NDIS_802_11_SSID;typedef LONG NDIS_802_11_RSSI;typedef enum NDIS_802_11_NETWORK_TYPE { Ndis802_11FH, Ndis802_11DS, Ndis802_11OFDM5, Ndis802_11OFDM24, Ndis802_11NetworkTypeMax} NDIS_802_11_NETWORK_TYPE;typedef struct NDIS_802_11_CONFIGURATION_FH { ULONG Length; ULONG HopPattern; ULONG HopSet; ULONG DwellTime;} NDIS_802_11_CONFIGURATION_FH;typedef struct NDIS_802_11_CONFIGURATION { ULONG Length; ULONG BeaconPeriod; ULONG ATIMWindow; ULONG DSConfig; NDIS_802_11_CONFIGURATION_FH FHConfig;} NDIS_802_11_CONFIGURATION;typedef enum NDIS_802_11_NETWORK_INFRASTRUCTURE { Ndis802_11IBSS, Ndis802_11Infrastructure, Ndis802_11AutoUnknown, Ndis802_11InfrastructureMax} NDIS_802_11_NETWORK_INFRASTRUCTURE;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} NDIS_802_11_AUTHENTICATION_MODE;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, NDIS_802_11_ENCRYPTION_STATUS;typedef enum NDIS_802_11_PRIVACY_FILTER { Ndis802_11PrivFilterAcceptAll, Ndis802_11PrivFilter8021xWEP} NDIS_802_11_PRIVACY_FILTER;typedef UCHAR NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES];typedef UCHAR NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX];typedef struct NDIS_WLAN_BSSID_EX { ULONG Length; NDIS_802_11_MAC_ADDRESS MacAddress; /* BSSID */ UCHAR Reserved[2]; NDIS_802_11_SSID Ssid; ULONG Privacy; NDIS_802_11_RSSI Rssi; NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; NDIS_802_11_CONFIGURATION Configuration; NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; NDIS_802_11_RATES_EX SupportedRates; ULONG IELength; UCHAR IEs[1];} NDIS_WLAN_BSSID_EX;typedef struct NDIS_802_11_BSSID_LIST_EX { ULONG NumberOfItems; NDIS_WLAN_BSSID_EX Bssid[1];} NDIS_802_11_BSSID_LIST_EX;typedef struct NDIS_802_11_FIXED_IEs { UCHAR Timestamp[8]; USHORT BeaconInterval; USHORT Capabilities;} NDIS_802_11_FIXED_IEs;typedef struct NDIS_802_11_WEP { ULONG Length; ULONG KeyIndex; ULONG KeyLength; UCHAR KeyMaterial[1];} NDIS_802_11_WEP;typedef ULONG NDIS_802_11_KEY_INDEX;typedef ULONGLONG NDIS_802_11_KEY_RSC;typedef struct NDIS_802_11_KEY { ULONG Length; ULONG KeyIndex; ULONG KeyLength; NDIS_802_11_MAC_ADDRESS BSSID; NDIS_802_11_KEY_RSC KeyRSC; UCHAR KeyMaterial[1];} NDIS_802_11_KEY;typedef struct NDIS_802_11_REMOVE_KEY { ULONG Length; ULONG KeyIndex; NDIS_802_11_MAC_ADDRESS BSSID;} NDIS_802_11_REMOVE_KEY;typedef struct NDIS_802_11_AI_REQFI { USHORT Capabilities; USHORT ListenInterval; NDIS_802_11_MAC_ADDRESS CurrentAPAddress;} NDIS_802_11_AI_REQFI;typedef struct NDIS_802_11_AI_RESFI { USHORT Capabilities; USHORT StatusCode; USHORT AssociationId;} NDIS_802_11_AI_RESFI;typedef struct NDIS_802_11_ASSOCIATION_INFORMATION { ULONG Length; USHORT AvailableRequestFixedIEs; NDIS_802_11_AI_REQFI RequestFixedIEs; ULONG RequestIELength; ULONG OffsetRequestIEs; USHORT AvailableResponseFixedIEs; NDIS_802_11_AI_RESFI ResponseFixedIEs; ULONG ResponseIELength; ULONG OffsetResponseIEs;} NDIS_802_11_ASSOCIATION_INFORMATION;typedef struct NDIS_802_11_AUTHENTICATION_ENCRYPTION { NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported;} NDIS_802_11_AUTHENTICATION_ENCRYPTION;typedef struct NDIS_802_11_CAPABILITY { ULONG Length; ULONG Version; ULONG NoOfPMKIDs; ULONG NoOfAuthEncryptPairsSupported; NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];} NDIS_802_11_CAPABILITY;typedef UCHAR NDIS_802_11_PMKID_VALUE[16];typedef struct BSSID_INFO { NDIS_802_11_MAC_ADDRESS BSSID; NDIS_802_11_PMKID_VALUE PMKID;} BSSID_INFO;typedef struct NDIS_802_11_PMKID { ULONG Length; ULONG BSSIDInfoCount; BSSID_INFO BSSIDInfo[1];} NDIS_802_11_PMKID;typedef enum NDIS_802_11_STATUS_TYPE { Ndis802_11StatusType_Authentication, Ndis802_11StatusType_PMKID_CandidateList = 2, Ndis802_11StatusTypeMax} NDIS_802_11_STATUS_TYPE;typedef struct NDIS_802_11_STATUS_INDICATION { NDIS_802_11_STATUS_TYPE StatusType;} NDIS_802_11_STATUS_INDICATION;typedef struct PMKID_CANDIDATE { NDIS_802_11_MAC_ADDRESS BSSID; ULONG Flags;} PMKID_CANDIDATE;#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED 0x01typedef struct NDIS_802_11_PMKID_CANDIDATE_LIST { ULONG Version; ULONG NumCandidates; PMKID_CANDIDATE CandidateList[1];} NDIS_802_11_PMKID_CANDIDATE_LIST;typedef struct NDIS_802_11_AUTHENTICATION_REQUEST { ULONG Length; NDIS_802_11_MAC_ADDRESS Bssid; ULONG Flags;} NDIS_802_11_AUTHENTICATION_REQUEST;#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E#endif /* OID_802_11_BSSID */#ifndef OID_802_11_PMKID/* Platform SDK for XP did not include WPA2, so add needed definitions */#define OID_802_11_CAPABILITY 0x0d010122#define OID_802_11_PMKID 0x0d010123#define Ndis802_11AuthModeWPA2 6#define Ndis802_11AuthModeWPA2PSK 7#define Ndis802_11StatusType_PMKID_CandidateList 2typedef struct NDIS_802_11_AUTHENTICATION_ENCRYPTION { NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported;} NDIS_802_11_AUTHENTICATION_ENCRYPTION;typedef struct NDIS_802_11_CAPABILITY { ULONG Length; ULONG Version; ULONG NoOfPMKIDs; ULONG NoOfAuthEncryptPairsSupported; NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];} NDIS_802_11_CAPABILITY;typedef UCHAR NDIS_802_11_PMKID_VALUE[16];typedef struct BSSID_INFO { NDIS_802_11_MAC_ADDRESS BSSID; NDIS_802_11_PMKID_VALUE PMKID;} BSSID_INFO;typedef struct NDIS_802_11_PMKID { ULONG Length; ULONG BSSIDInfoCount; BSSID_INFO BSSIDInfo[1];} NDIS_802_11_PMKID;typedef struct PMKID_CANDIDATE { NDIS_802_11_MAC_ADDRESS BSSID; ULONG Flags;} PMKID_CANDIDATE;#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED 0x01typedef struct NDIS_802_11_PMKID_CANDIDATE_LIST { ULONG Version; ULONG NumCandidates; PMKID_CANDIDATE CandidateList[1];} NDIS_802_11_PMKID_CANDIDATE_LIST;#endif /* OID_802_11_CAPABILITY */#ifdef CONFIG_USE_NDISUIO#ifndef _WIN32_WCE#ifdef __MINGW32_VERSIONtypedef ULONG NDIS_OID;#endif /* __MINGW32_VERSION *//* from nuiouser.h */#define FSCTL_NDISUIO_BASE FILE_DEVICE_NETWORK#define _NDISUIO_CTL_CODE(_Function, _Method, _Access) \ CTL_CODE(FSCTL_NDISUIO_BASE, _Function, _Method, _Access)#define IOCTL_NDISUIO_OPEN_DEVICE \ _NDISUIO_CTL_CODE(0x200, METHOD_BUFFERED, \ FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_NDISUIO_QUERY_OID_VALUE \ _NDISUIO_CTL_CODE(0x201, METHOD_BUFFERED, \ FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_NDISUIO_SET_OID_VALUE \ _NDISUIO_CTL_CODE(0x205, METHOD_BUFFERED, \ FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_NDISUIO_SET_ETHER_TYPE \ _NDISUIO_CTL_CODE(0x202, METHOD_BUFFERED, \ FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_NDISUIO_QUERY_BINDING \ _NDISUIO_CTL_CODE(0x203, METHOD_BUFFERED, \ FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_NDISUIO_BIND_WAIT \ _NDISUIO_CTL_CODE(0x204, METHOD_BUFFERED, \ FILE_READ_ACCESS | FILE_WRITE_ACCESS)typedef struct _NDISUIO_QUERY_OID{ NDIS_OID Oid; UCHAR Data[sizeof(ULONG)];} NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID;typedef struct _NDISUIO_SET_OID{ NDIS_OID Oid; UCHAR Data[sizeof(ULONG)];} NDISUIO_SET_OID, *PNDISUIO_SET_OID;typedef struct _NDISUIO_QUERY_BINDING{ ULONG BindingIndex; ULONG DeviceNameOffset; ULONG DeviceNameLength; ULONG DeviceDescrOffset; ULONG DeviceDescrLength;} NDISUIO_QUERY_BINDING, *PNDISUIO_QUERY_BINDING;#endif /* _WIN32_WCE */#endif /* CONFIG_USE_NDISUIO */static int ndis_get_oid(struct wpa_driver_ndis_data *drv, unsigned int oid, char *data, size_t len){#ifdef CONFIG_USE_NDISUIO NDISUIO_QUERY_OID *o; size_t buflen = sizeof(*o) + len; DWORD written; int ret; size_t hdrlen; o = os_zalloc(buflen); if (o == NULL) return -1; o->Oid = oid;#ifdef _WIN32_WCE o->ptcDeviceName = drv->adapter_name;#endif /* _WIN32_WCE */ if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_QUERY_OID_VALUE, o, sizeof(NDISUIO_QUERY_OID), o, buflen, &written, NULL)) { wpa_printf(MSG_DEBUG, "NDIS: IOCTL_NDISUIO_QUERY_OID_VALUE " "failed (oid=%08x): %d", oid, (int) GetLastError()); os_free(o); return -1; } hdrlen = sizeof(NDISUIO_QUERY_OID) - sizeof(o->Data); if (written < hdrlen) { wpa_printf(MSG_DEBUG, "NDIS: query oid=%08x written (%d); " "too short", oid, (unsigned int) written); os_free(o); return -1; } written -= hdrlen; if (written > len) { wpa_printf(MSG_DEBUG, "NDIS: query oid=%08x written (%d) > " "len (%d)",oid, (unsigned int) written, len); os_free(o); return -1; } os_memcpy(data, o->Data, written); ret = written; os_free(o); return ret;#else /* CONFIG_USE_NDISUIO */ char *buf; PACKET_OID_DATA *o; int ret; buf = os_zalloc(sizeof(*o) + len); if (buf == NULL) return -1; o = (PACKET_OID_DATA *) buf; o->Oid = oid; o->Length = len; if (!PacketRequest(drv->adapter, FALSE, o)) { wpa_printf(MSG_DEBUG, "%s: oid=0x%x len (%d) failed", __func__, oid, len); os_free(buf); return -1; } if (o->Length > len) { wpa_printf(MSG_DEBUG, "%s: oid=0x%x Length (%d) > len (%d)", __func__, oid, (unsigned int) o->Length, len); os_free(buf); return -1; } os_memcpy(data, o->Data, o->Length); ret = o->Length; os_free(buf); return ret;#endif /* CONFIG_USE_NDISUIO */}static int ndis_set_oid(struct wpa_driver_ndis_data *drv, unsigned int oid,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -