WlanScan

WlanScanで、WiFiアクセスポイントをスキャンする。

WlanScan function (wlanapi.h) - Win32 apps | Microsoft Docs
Native Wifiを使ってみた その1 - GraveDollの備忘録ブログ

これで通知が来るかどうか。

WlanScanした後に、ちょっと間を空けてから、WlanGetAvailableNetworkListを呼ぶ。

コールバックでは、通知元がACMの場合、"WLAN_NOTIFICATION_SOURCE_ACM"と出力。

通知が来る前に終えてしまった・・・。
通知が来る前に終えてしまった・・・。

通知が来る前に終えてしまう場合もあれば、

通知が来た時もある。
通知が来た時もある。

通知が来た時もある。

Sample/winapi/WlanScan/WlanScan/src/WlanScan at master · bg1bgst333/Sample · GitHub

WlanRegisterNotification

WlanRegisterNotificationは、WiFiスキャンの結果などの通知を受け取るコールバックを登録する。

WlanRegisterNotification function (wlanapi.h) - Win32 apps | Microsoft Docs
Native Wifiを使ってみた その1 - GraveDollの備忘録ブログ

インターフェースごとに登録する形になる。0が返ってくれば、登録成功。

WlanNotificationCallbackがコールバック関数でこれを指定する。
最後にWlanRegisterNotificationでNULLを指定して、コールバックの解除もしている。

C:\Project\Cloud\github.com\Sample\winapi\WlanRegisterNotification\WlanRegisterNotification\src\WlanRegisterNotification\release>WlanRegisterNotification.exe
pwiiList->InterfaceInfo[0].strInterfaceDescription = Marvell AVASTAR Wireless-AC Network Controller
dwResult = 0, dwPrevNotifSource = 0
dwResult = 0, dwPrevNotifSource = 8

C:\Project\Cloud\github.com\Sample\winapi\WlanRegisterNotification\WlanRegisterNotification\src\WlanRegisterNotification\release>

登録する時は、以前の通知元はないので、dwPrevNotifSourceが0。
解除する時は、直前の通知元があるので、その値8。
ただ、登録しただけでは通知は来ない。

Sample/winapi/WlanRegisterNotification/WlanRegisterNotification/src/WlanRegisterNotification at master · bg1bgst333/Sample · GitHub

WlanOpenHandle

WlanOpenHandleは、Native Wifi(WLAN)のハンドルを開く。

WlanOpenHandle function (wlanapi.h) - Win32 apps | Microsoft Docs

今回はバージョン2(1はXP用、2はVista以降などらしい。)のハンドルを取得する。

バージョンとクライアントのハンドルが返ってくる。

C:\Project\Cloud\github.com\Sample\winapi\WlanOpenHandle\WlanOpenHandle\src\WlanOpenHandle\release>WlanOpenHandle.exe
dwVer = 2, hClient = 0x00000001

C:\Project\Cloud\github.com\Sample\winapi\WlanOpenHandle\WlanOpenHandle\src\WlanOpenHandle\release>

Windows10だと、こんな感じで出力された・・・。

Sample/winapi/WlanOpenHandle/WlanOpenHandle/src/WlanOpenHandle at master · bg1bgst333/Sample · GitHub

PeekNamedPipe

PeekNamedPipeは、パイプからデータを削除せずに取得したり、パイプの情報などを取得できる。

PeekNamedPipe function (namedpipeapi.h) - Win32 apps | Microsoft Docs
パイプにより標準出力をエディットボックスに取り込む

前回、ファイルに子プロセス出力を書きだしたが、今回は、パイプに書き出す。
そうすることで、ファイルに出力せずに、標準出力をプログラム内部で扱える。

パイプに書き溜められている出力をどれくらい読み出せばいいかという情報をPeekNamedPipeで取得して、プロセスが終了しても、その分読み出せるまで待つという形になっている。
実行して、しばらく待つと、

子プロセスのpingコマンドの出力内容をパイプから取得できる
子プロセスのpingコマンドの出力内容をパイプから取得できる

子プロセスのpingコマンドの出力内容をパイプから取得できる。

Sample/winapi/PeekNamedPipe/PeekNamedPipe/src/PeekNamedPipe at master · bg1bgst333/Sample · GitHub

DuplicateHandle

DuplicateHandleは、ハンドルを複製する。

DuplicateHandle function (handleapi.h) - Win32 apps | Microsoft Docs

同じ入出力先のハンドルを複製して、子プロセスに使ってもらう。
今回は、pingコマンドを子プロセスで実行してもらうのだが、ping.logへの出力を複製して、そこに出力を書いてもらう。

ping.logのハンドルhFile、複製した出力ハンドルhStdOutを表示。
"ping yahoo.co.jp"というコマンドを子プロセス実行してもらい、出力をping.logに残す。

ping.logのもともとのハンドル
ping.logのもともとのハンドル

ping.logのもともとのハンドル。

複製したハンドル
複製したハンドル

複製したハンドル。

WaitForSingleObjectで待っていて終わるとこれを出す。
WaitForSingleObjectで待っていて終わるとこれを出す。

WaitForSingleObjectで待っていて終わるとこれを出す。

確かにping.logが出力されている。
確かにping.logが出力されている。

確かにping.logが出力されている。

pingコマンドの出力が書かれている。
pingコマンドの出力が書かれている。

pingコマンドの出力が書かれている。

Sample/winapi/DuplicateHandle/DuplicateHandle/src/DuplicateHandle at master · bg1bgst333/Sample · GitHub

GetCurrentProcess

GetCurrentProcessは、現在のプロセスの擬似ハンドルを取得する。

GetCurrentProcess function (processthreadsapi.h) - Win32 apps | Microsoft Docs

実際には常に-1が返ってくる。
なぜ疑似ハンドルなのかっていうところについては、プロセスやスレッドの詳細についてもっと深く調べないといけなさそうなので、とりあえずはそういうものということで。
これをいろんなところで使うのだが、ソースコードの互換性のためにこれで常にハンドルを取るようにしたほうがいいらしい。

あえてWin32プロジェクト
あえてWin32プロジェクト

あえてWin32プロジェクト。

で、

確かに-1が返ってくる
確かに-1が返ってくる

確かに-1が返ってくる。

Sample/winapi/GetCurrentProcess/GetCurrentProcess/src/GetCurrentProcess at master · bg1bgst333/Sample · GitHub

WlanGetAvailableNetworkList

WlanGetAvailableNetworkListは、利用可能なネットワーク一覧を取得する。

WlanGetAvailableNetworkList function (wlanapi.h) - Win32 apps | Microsoft Docs

これでSSID一覧を取得する。

WlanEnumInterfacesで無線インターフェース一覧を取得した後に、さらにそれごとにネットワークリストを取得。

これぐらいしか出ない。しかも2つ出る。
これぐらいしか出ない。しかも2つ出る。

これぐらいしか出ない。しかも2つ出る。

WiFi一覧
WiFi一覧

しかし、右のWiFi一覧を出してから、再び実行すると、

凄い増える
凄い増える

凄い増える。

Native Wifiを使ってみた その1 - GraveDollの備忘録ブログ

どうも、その場で出たものというより、キャッシュを返してるだけらしい・・・。

Sample/winapi/WlanGetAvailableNetworkList/WGANL/src/WlanGetAvailableNetworkList at master · bg1bgst333/Sample · GitHub