#python #windows #wifi #ctypes
#python #Windows #wi-Fi #типы ctypes
Вопрос:
Я работаю над проектом портала для Windows. Я написал этот фрагмент кода (аналогичный этому) :
from ctypes import wintypes
import ctypes
WlanApi = ctypes.windll.wlanapi
hClientHandle = wintypes.HANDLE()
phClientHandle = ctypes.pointer(hClientHandle)
dwNegotiatedVersion = wintypes.DWORD()
pdwNegotiatedVersion = ctypes.pointer(dwNegotiatedVersion)
dwClientVersion = wintypes.DWORD()
dwClientVersion.value = 2L
rc = WlanApi.WlanOpenHandle(dwClientVersion, None, pdwNegotiatedVersion, phClientHandle)
print rc
class GUID(ctypes.Structure):
_fields_ = [("Data1", wintypes.DWORD),
("Data2", wintypes.WORD),
("Data3", wintypes.WORD),
("Data4", wintypes.BYTE * 8)]
class WLAN_INTERFACE_INFO (ctypes.Structure):
_fields_ = [('InterfaceGuid', GUID),
('strInterfaceDescription', wintypes.WCHAR * 256),
('isState', wintypes.????)]
class WLAN_INTERFACE_INFO_LIST(ctypes.Structure):
_fields_ = [('dwNumberOfItems', wintypes.DWORD),
('dwIndex', wintypes.DWORD),
('InterfaceInfo', WLAN_INTERFACE_INFO * 10)]
IfList = WLAN_INTERFACE_INFO_LIST()
pIfList = ctypes.pointer(IfList)
rc = WlanApi.WlanEnumInterfaces(hClientHandle, None, pIfList)
print rc
print "Num Entries: %s" % IfList.dwNumberOfItems
Я не могу найти, как структурировать «перечисление WLAN_INTERFACE_STATE«, и когда я пытаюсь с WCHAR
массивом или чем-либо еще, этот скрипт возвращает мои 6000000 беспроводных интерфейсов!!!
Кто-нибудь может мне помочь?
Комментарии:
1. Если я заменю dwNumberOfItems массивом байтов, мой скрипт вернет это: nNum записей: -32 76 80 00 00 00 00 00 Без второго запуска я получаю множество записей: -32 76 60 00 00 00 00 00 может быть, проблема в указателе дескриптора?
Ответ №1:
Это просто целое число, структуры нет 0 = Не готово, 1 = подключено и т.д.
Ответ №2:
Хм, это начинает иметь смысл, поскольку большинство этих структур имеют соответствующий указатель.
По словам парней из PInvoke
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WLAN_INTERFACE_INFO
{
/// GUID->_GUID
public Guid InterfaceGuid;
/// WCHAR[256]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string strInterfaceDescription;
/// WLAN_INTERFACE_STATE->_WLAN_INTERFACE_STATE
public WLAN_INTERFACE_STATE isState;
}
Где WLAN_INTERFACE_STATE — это
public enum WLAN_INTERFACE_STATE
{
wlan_interface_state_not_ready = 0,
...
// 1 to 6
...
wlan_interface_state_authenticating = 7,
}