ただ、機種依存のコードはあまりカッコよくないので修正する方法を考えてみました。
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と同様の使い勝手だといい感じだと思いますので。
ご検討くださいませ。
ありがとうございます。
いろいろ調べてはいるのですが、なかなか前に進めていません。
Bluetoothはとても興味があるのですが、まだデバイスを持っていません。
やはりみなさん IBSJapan製を使用されているのでしょうか?
コメントを投稿