2016-09-19 13 views
0

Windows에서 C# Desktop APP의 WlanGetNetworkBssList를 상호 연결하려는 im. WLAN_BSS_LIST를 올바르게 검색하는 데 몇 가지 문제가 있습니다. 문제가 어디에 있는지 나는 잘 모르겠다. 첫 번째 항목은 올바르지 만 다른 모든 항목은 arnt입니다. 누군가가 나를 도울 수 있기를 바랍니다.Windows에서 C#을 사용하는 WlanGetNetworkBssList

다음은 사용중인 구조입니다. 나는 문제가 잘못된 구조 정의라고 생각한다.

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
struct WLAN_BSS_LIST 
{ 
    internal Int32 dwTotalSize; 
    internal Int32 dwNumberOfItems; 
    internal WLAN_BSS_ENTRY[] wlanBssEntries; 
    internal WLAN_BSS_LIST(IntPtr ppWlanBssList) 
    { 
     dwTotalSize = (Int32)Marshal.ReadInt32(ppWlanBssList); 
     dwNumberOfItems = (Int32)Marshal.ReadInt32(ppWlanBssList + 4); 
     wlanBssEntries = new WLAN_BSS_ENTRY[dwNumberOfItems]; 
     int WLAN_BSS_ENTRY_SIZE = Marshal.SizeOf(typeof(WLAN_BSS_ENTRY)); 
     for (int i = 0; i < dwNumberOfItems; i++) 
     { 
      IntPtr pItemList = new IntPtr(ppWlanBssList.ToInt32() + i * Marshal.SizeOf(typeof(WLAN_BSS_ENTRY)) + 8); 
      wlanBssEntries[i] = (WLAN_BSS_ENTRY)Marshal.PtrToStructure(pItemList, typeof(WLAN_BSS_ENTRY)); 
     } 
    } 
} 
public struct WLAN_BSS_ENTRY 
{ 
    public DOT11_SSID dot11Ssid; 
    public ulong uPhyId; 
    public DOT11_MAC_ADDRESS dot11Bssid; 
    public DOT11_BSS_TYPE dot11BssType; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    public DOT11_PHY_TYPE[] dot11BssPhyType; 
    public long lRssi; 
    public ulong uLinkQuality; 
    public bool bInRegDomain; 
    public ushort usBeaconPeriod; 
    public ulong ullTimestamp; 
    public ulong ullHostTimestamp; 
    public ushort usCapabilityInformation; 
    public ulong ulChCenterFrequency; 
    public WLAN_RATE_SET wlanRateSet; 
    public ulong ulIeOffset; 
    public ulong ulIeSize; 
} 
public struct DOT11_SSID 
{ 
    public uint uSSIDLength; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
    public string ucSSID; 
} 
[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct DOT11_MAC_ADDRESS 
{ 
    public byte one; 
    public byte two; 
    public byte three; 
    public byte four; 
    public byte five; 
    public byte six; 
} 
public enum DOT11_BSS_TYPE 
{ 
    dot11_BSS_type_infrastructure = 1, 
    dot11_BSS_type_independent = 2, 
    dot11_BSS_type_any = 3, 
} 
public enum DOT11_PHY_TYPE 
{ 
    dot11_phy_type_unknown, 
    dot11_phy_type_any, 
    dot11_phy_type_fhss, 
    dot11_phy_type_dsss, 
    dot11_phy_type_irbaseband, 
    dot11_phy_type_ofdm, 
    dot11_phy_type_hrdsss, 
    dot11_phy_type_erp, 
    dot11_phy_type_ht, 
    dot11_phy_type_IHV_start, 
    dot11_phy_type_IHV_end, 
} 
public struct WLAN_RATE_SET 
{ 
    public ulong uRateSetLength; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 126)] 
    public ushort[] usRateSet; 
} 
+0

왜 'dot11BssPhyType' 필드 ('WLAN_BSS_ENTRY')의 유형을 배열로 설정합니까? 또한, i 번째 BSS 엔트리의 주소를 계산할 때 포인터에'ToInt32()'를 사용하기 때문에 응용 프로그램이 64 비트라면 약간의 (32) 비트가 풀릴 수 있습니다. –

답변

0

빠른 수정 일리아 콘스탄티노 프의 Managed Wifi API 라이브러리를 사용하도록 코드를 변경하는 것입니다. 그것은 MIT 라이센스하에 있습니다. 모든 리소스 관리에 SafeHandles를 사용하는 포크가 있지만 원래 코드는 견고합니다.