とりあえず NDIS経由で 情報取得できるんだろうなぁということは想像できるのですが、 意味がわからない上にドキュメントの分量も多いので ちょっと挫折気味です。
とりあえず斜め読みして理解できた範囲の事を書いておきます。
- NDISのハンドルは CreateFileに NDISUIO_DEVICE_NAMEを指定して開く。
NDISUIO_DEVICE_NAMEは uuiouser.hで "UIO1:"として定義されています。 - NDISに対する操作は DeviceIoControlに いろいろな制御コードを指定して行う。
試しに接続中のSSIDを取得するサンプルを作ってみました。
DeviceIoContorolに IOCTL_NDISUIO_QUERY_OID_VALUEを指定することで、 いろいろな情報を取得できるみたいです。 問い合わせたい内容は対象とするデバイス名と一緒に NDISUIO_QUERY_OIDに指定します。
サンプルはデバイス名に "GSPI86861"をハードコーディングしている時点でアドエス専用確定ですが...。
尚、取得した SSIDはそのままでは表示できないので、UNICODEに変換してやる必要があります。
static BOOL GetSsid_Test() { HANDLE hNdis; UCHAR cBuffer[1024]; PNDISUIO_QUERY_OID pNdisQueryOid = (PNDISUIO_QUERY_OID)&cBuffer[0]; NDIS_802_11_SSID ndisSsid = { 0 }; BOOL bRet = TRUE; DWORD dwBytesReturned = 0, dwError; CString strSsid; INT iLen; // NDISのハンドル取得 hNdis = CreateFile( NDISUIO_DEVICE_NAME , GENERIC_ALL , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, (HANDLE)INVALID_HANDLE_VALUE); if (hNdis == INVALID_HANDLE_VALUE) { return FALSE; } // SSID取得 pNdisQueryOid->Oid = OID_802_11_SSID; pNdisQueryOid->ptcDeviceName = _T("GSPI86861"); if (DeviceIoControl( hNdis , IOCTL_NDISUIO_QUERY_OID_VALUE , (LPVOID)&cBuffer[0] , sizeof(cBuffer) , (LPVOID)&cBuffer[0] , sizeof(cBuffer) , &dwBytesReturned , NULL)) { memcpy_s(&ndisSsid, sizeof(NDIS_802_11_SSID), &pNdisQueryOid->Data[0], sizeof(NDIS_802_11_SSID)); // UNICODEに変換してから表示 iLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)ndisSsid.Ssid, -1, NULL, 0); if (iLen > 0) { MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)ndisSsid.Ssid, -1, strSsid.GetBuffer(iLen), iLen); strSsid.ReleaseBuffer(); MessageBox(NULL, strSsid, _T("SSIDを取得してみるテスト"), MB_OK); } } else { dwError = GetLastError(); bRet = FALSE; } // CloseHandle(hNdis); hNdis = INVALID_HANDLE_VALUE; return bRet; }
この方法でSSID以外にもいろいろな情報を取得できそうです。
もう少し整理して WifiInfoに反映したいですね。
0 件のコメント:
コメントを投稿