SW 개발

winCE / WM / NDIS 에 AP rescan 명령내리기 / 예제코드

. . . 2012. 3. 31. 10:36
반응형

wzc 에서 주변 AP의  정확한 정보를 얻어오기 위해 NDIS 인터페이스로 rescan 명령을 날려야 할때가 있다.


예를들면 wzc 로 주변 AP 정보(rssi등) 을 얻어야 할때 wzc에 있는 정보는 현재 데이터가 아닐 가능성이 있다.

(windosw mobile 의 경우 60초마다 주변 AP를 스캔하는것으로 알고있다,)

주변 AP정보 얻어오기 예제소스코드 : http://xenostudy.tistory.com/316 


이때 NDIS 인터페이스를 통해서 rescan 명령을 날려주면 wzc 에 새로운 데이터가 올라온다.



#include <windows.h>
#include <windef.h>
#include <stdio.h>
#include <stdarg.h>
#include <eapol.h>
#include <wzcsapi.h>
#include <ntddndis.h>

#include <commctrl.h>
#include <winioctl.h> 
#include <stdlib.h>
#include <nuiouser.h>

#pragma comment(lib, "wzcsapi.lib")

void 
GetWirelessDriverName(WCHAR* szBuff)
{
    INTFS_KEY_TABLE IntfsTable;
    IntfsTable.dwNumIntfs = 0;
    IntfsTable.pIntfs = NULL;

    DWORD dwStatus = WZCEnumInterfaces(NULL, &IntfsTable);

    if(dwStatus != ERROR_SUCCESS)
    {
        RETAILMSG(1,(L"WZCEnumInterfaces() error 0x%08X\r\n", dwStatus));
        return;        
    }

    if(!IntfsTable.dwNumIntfs)
    {
        RETAILMSG(1,(L"system has no wireless card.\r\n"));
        wcscpy(szBuff, (L"has no Wlan card.\r\n"));
        return;
    }

    wcscpy(szBuff, IntfsTable.pIntfs[0].wszGuid);

    // need to free memory allocated by WZC for us.
    LocalFree(IntfsTable.pIntfs);
}   // GetFirstWirelessNetworkCard

void ReScanAPCmdToNDIS()
{
    PNDISUIO_QUERY_OID pNQO;
    DWORD dwBytesRet;
    BYTE Buffer[8192];
    
    
    WCHAR szWiFiCard[128]={0,};
    GetWirelessDriverName(szWiFiCard);

    HANDLE hNdisDevice;
    hNdisDevice=CreateFile(   NDISUIO_DEVICE_NAME,                     //   Object name.
                       0x00,                                           //   Desired access.
                       0x00,                                           //   Share Mode.
                       NULL,                                           //   Security Attr
                       OPEN_EXISTING,                                  //   Creation Disposition.
                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,   //   Flag and Attributes..
                       (HANDLE)INVALID_HANDLE_VALUE);   
    
    
    //Scan List 
    pNQO=(PNDISUIO_QUERY_OID)Buffer;
    pNQO->ptcDeviceName = szWiFiCard;
    pNQO->Oid = OID_802_11_BSSID_LIST_SCAN; 
    
    if(! DeviceIoControl(hNdisDevice, 
                IOCTL_NDISUIO_SET_OID_VALUE, 
                (LPVOID) pNQO, 
                sizeof(NDISUIO_QUERY_OID) +sizeof(OID_802_11_BSSID_LIST_SCAN)*20
                (LPVOID) pNQO, 
                sizeof(NDISUIO_QUERY_OID) +sizeof(OID_802_11_BSSID_LIST_SCAN)*20
                &dwBytesRet, 
                NULL))
    {
        RETAILMSG(1,(TEXT("command fail... \r\n")));
    }

}
 


위에서 IO control 을 어떤것을 하느냐에 따라 다양한 기능을 수행할수있다.


해당 IO control 은 커널문서나 구글링하면될듯하다.

반응형