WlanApi Windows et Python Ctypes

Document Actions
Réponses: 0   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

WlanApi Windows et Python Ctypes

Posté par garthh le 08/11/2011 09:46
Bonjour,

J'essaie d'intégrer l'API NativeWifi (http://msdn.microsoft.com/en-us/library/windows/desktop/ms706873%28v=VS.85%29.aspx) dans un projet Python. J'essaie d'obtenir la liste et le nombre d'interface WiFi sur ma machine (1 seule) un peu comme dans l'exemple sur la page de MSDN. J'ai écris ça :

code:
from ctypes import wintypes
import ctypes

ole32 = ctypes.oledll.ole32
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)

class GUID(ctypes.Structure):
_fields_ =[("Data1", wintypes.DWORD),
                ("Data2", wintypes.USHORT),
                ("Data3", wintypes.USHORT),
                ("Data4", wintypes.BYTE * 8)]
_as_parameter_ = property(ctypes.byref)

def __init__(self, name=None):
if name is not None:
ole32.CLSIDFromString(unicode(name), ctypes.byref(self))

def __str__(self):
s = ctypes.create_string_buffer(39)
ole32.StringFromGUID2(ctypes.byref(self), s, 39)
return "<guid:%s>" % s.value

def __cmp__(self, other):
if isinstance(other, GUID):
result = ole32.IsEqualGUID(ctypes.byref(self), ctypes.byref(other))
return not result
return -1

class WLAN_INTERFACE_INFO (ctypes.Structure):
    _fields_ =[('InterfaceGuid', GUID),
                ('strInterfaceDescription', wintypes.WCHAR * 256),
('isState', wintypes.USHORT)]

class WLAN_INTERFACE_INFO_LIST(ctypes.Structure):
    _fields_ =[('dwNumberOfItems', wintypes.DWORD),
('dwIndex', wintypes.DWORD),
('InterfaceInfo', wintypes.POINTER(WLAN_INTERFACE_INFO) * 10)]

InterfaceList = WLAN_INTERFACE_INFO_LIST()
ppInterfaceList = ctypes.pointer(InterfaceList)
rc = WlanApi.WlanEnumInterfaces(hClientHandle, None, ppInterfaceList)
print rc

print "Number of Interfaces: %s" % InterfaceList.dwNumberOfItems


Je n'arrive pas à obtenir un nombre cohérent d'interfaces (je n'ai jamais le même).
Toutefois, en remplaçant le wintypes.DWORD du dwNumberOfItems par un Array de Byte, j'obtiens ça :

Num Entries: -32 76 80 00 00 00 00 00
Num Entries: -32 76 60 00 00 00 00 00

Le troisième élément change à chaque nouvelle exécution... Est-ce que quelqu'un arrive à situer le problème ?

Merci d'avance
Ce sujet ne contient aucune réponse

Python.org : Le site officiel du langage Python.
Zope.org : Le site web officiel de Zope.
Daily Python-URL : Actus de l'univers Python.
Tribute to Zyons : Zyons notre ami et membre fondateur de l'Afpy, nous quittait en 2005.