2007-09-18

機種依存せずに無線LANのデバイス名を取得する

WifiInfoでは無線LANの状態を取得するときにデバイスの名前を "GSPI86861"と直接指定しています。
ただ、機種依存のコードはあまりカッコよくないので修正する方法を考えてみました。
 
NSDNを眺めていると OID_GEN_PHYSICAL_MEDIUMを使うことで指定したデバイスの種類を取得できるようです。
 
IOCTL_NDISUIO_QUERY_BINDINGで デバイス名を列挙して、それぞれについて無線LANかどうかを調べるコードを書いてみます。
UCHAR                   cQueryBuffer1[1024],
                        cQueryBuffer2[1024];
PNDISUIO_QUERY_BINDING  pQueryBinding       = (PNDISUIO_QUERY_BINDING)&cQueryBuffer1[0];
PNDISUIO_QUERY_OID      pNdisQueryOid       = (PNDISUIO_QUERY_OID)&cQueryBuffer2[0];
NDIS_PHYSICAL_MEDIUM    ndisPhysicalMedium;
PTCHAR                  pcDeviceName;
DWORD                   dwBytesReturned     = 0;
BOOL                    bIsWlanFound        = FALSE;

// デバイス名列挙
pQueryBinding->BindingIndex = 0;
while (DeviceIoControl(
        g_hNdis                                 ,
        IOCTL_NDISUIO_QUERY_BINDING             ,
        (LPVOID)&cQueryBuffer1[0]               ,
        sizeof(cQueryBuffer1)                   ,
        (LPVOID)&cQueryBuffer1[0]               ,
        sizeof(cQueryBuffer1)                   ,
        &dwBytesReturned                        ,
        NULL
)) {
    // デバイスの種別を取得
    pcDeviceName = (PTCHAR)( cQueryBuffer1 + pQueryBinding->DeviceNameOffset );
    pNdisQueryOid->Oid                  = OID_GEN_PHYSICAL_MEDIUM;
    pNdisQueryOid->ptcDeviceName        = pcDeviceName;

    if (DeviceIoControl(
            g_hNdis                             ,
            IOCTL_NDISUIO_QUERY_OID_VALUE       ,
            (LPVOID)&cQueryBuffer2[0]           ,
            sizeof(cQueryBuffer2)               ,
            (LPVOID)&cQueryBuffer2[0]           ,
            sizeof(cQueryBuffer2)               ,
            &dwBytesReturned                    ,
            NULL
    )) {
        memcpy_s(&ndisPhysicalMedium, sizeof(NDIS_PHYSICAL_MEDIUM), &pNdisQueryOid->Data[0], sizeof(NDIS_PHYSICAL_MEDIUM));
        if (ndisPhysicalMedium == NdisPhysicalMediumWirelessLan ) {
            bIsWlanFound = TRUE;
            break;
        }
    }
    pQueryBinding->BindingIndex ++;
}

return bIsWlanFound;
 
このコードはうまく動くようですが、もうひとつ効率が良くないような気がしています。
できればアプリ起動時にデバイス名を取得してその後は取得したデバイス名を使いまわすようにしたいのですが、 無線LANがオフのときにはデバイス名を取得することができません。
 
まだまだ検討の余地がありますね。
 

2 件のコメント:

匿名 さんのコメント...

WifiInfo便利に使用させていただいております。
いろいろ研究されててさらなるバージョンバップが期待できそうですね。
ところで、TodayからBluetoothの状態を切り替えられるアプリケーションとか作られる気はありませんか?
ちまたにあるものはいまいちなものばかりでして・・・
WifiInfoと同様の使い勝手だといい感じだと思いますので。
ご検討くださいませ。

kazuaki さんのコメント...

ありがとうございます。

いろいろ調べてはいるのですが、なかなか前に進めていません。

Bluetoothはとても興味があるのですが、まだデバイスを持っていません。

やはりみなさん IBSJapan製を使用されているのでしょうか?