hỗ trợ tài xế Mỗi NDIS chỉ tìm thấy bạn thắc mắc. Những thông tin mà bạn tìm kiếm nguồn gốc từ tài xế NDIS. WMI chỉ mang đến cho bạn một tập hợp con của thông tin đó. Một số yêu cầu tiêu chuẩn mà có thể Là một đầu vào (tham số lpInBuffer), bạn nên cung cấp một DWORD với mã OID, mã kiểm soát xác định yêu cầu, Là đầu ra bạn nhận được một cấu trúc có thông tin được đệ trình, hoặc trong trường hợp của bạn là DWORD (giá trị enum).Ví dụ, nếu bạn hỏi tài xế NDIS cho
#define OID_802_11_WEP_STATUS 0x0D01011B
(như giá trị DWORD của tham số lpInBuffer) nó trở lại cũng trả về DWORD với thông tin như
// 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;
yêu cầu
#define OID_802_11_AUTHENTICATION_MODE 0x0D010118
lợi nhuận
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;
yêu cầu
#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
lợi nhuận
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;
và vân vân. Bạn có thể tìm thấy tất cả các hằng số khác nhau mà bạn cần trong ntddndis.h
sau khi cài đặt Windows DDK.
Để mở thiết bị, bạn nên sử dụng chức năng CreateFile
. Thay vì tên tệp, bạn nên cung cấp một chuỗi có tiền tố "\\.\"
và tên bộ điều hợp (adapter guids). Tên bộ điều hợp bạn có thể liệt kê theo cách khác. Một trong những cách dễ nhất là các tên khóa con của khóa đăng ký HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters
.
Tất cả những gì tôi đã giải thích ở trên hoạt động chính xác như http://msdn.microsoft.com/en-us/library/aa964902%28v=VS.85%29.aspx hoặc các ví dụ khác về cách sử dụng DeviceIoControl
. Danh sách đầy đủ các yêu cầu IoControl mà phải hỗ trợ một số lớp thiết bị được mô tả trong DDK. Tôi lặp lại một lần nữa, để sử dụng cái đó chỉ cần sử dụng DeviceIoControl
và không viết trình điều khiển thiết bị.
Cách đây hơn 10 năm, tôi chơi một chút với các yêu cầu như vậy mà tôi đã mô tả ở đây. Tôi đã thử nghiệm chương trình cũ của tôi hoạt động mà không gặp bất kỳ sự cố nào. Người ta chỉ cần sử dụng OID mà bạn cần và không nhiều hơn nữa.
CẬP NHẬT: Tôi tìm thấy liên kết tốt http://pages.infinit.net/codeguru/WiFiArticle.htm giải thích cách khác giống với những gì tôi vừa viết. Dường như với tôi rằng một trong những sử dụng ở đây sai thông số trong CreateFile
. Người ta phải sử dụng FILE_SHARE_READ | FILE_SHARE_WRITE
để làm cho tất cả làm việc. Ví dụ http://code.google.com/p/haggle/source/browse/winmobile/Haggle/WindowsWiFiUtils.cpp (xem bool WindowsWiFiUtils:init()
, bool WindowsWiFiUtils::setEncryptionMode(unsigned long adapterIndex, const unsigned int mode)
vv) trông giống như tốt hơn nhiều và chứa rất nhiều phương pháp có thể cũng thú vị cho bạn. Nó là một ví dụ C++, nhưng nó rất dễ dàng để viết lại điều này trong C#.
CẬP NHẬT 2: Thêm một cách là sử dụng "Native Wifi API" http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx như WlanQueryInterface (ví dụ với wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs) hoặc WZCQueryInterface, nhưng có vẻ như không được hỗ trợ trên Windows Server 2003, những gì bạn cần. Nói chung "Native Wifi API" có lẽ là cách đáng tin cậy hơn để cung cấp thông tin tối đa (hoặc sửa đổi nó), nhưng WMI cũng có thể là một lựa chọn thực dụng tốt.