⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver_ndis.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * 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 + -