관리 메뉴

kisoo

IoctlNdisQueryGlobalStats (무선랜 SSID 값 쿼리 함수에서) 본문

01.About Programming /1.Network Lab

IoctlNdisQueryGlobalStats (무선랜 SSID 값 쿼리 함수에서)

JamesK78 2009. 2. 24. 18:02

오늘은 무선랜 네트워크 정보에서 SSID 값을 가져 오는 부분에 대해서 설명 한다.

개발 하게 된 동기는 사이트에서 우리 솔루션을 도입 한 후에 무선랜 차단 정책을 설정 하였는데
3/1 가량이 무선랜을 사용 하고 있었다. 무선랜 을 허용 하자니 안전하지가 않고 차단을 해 놓으니
사용 할 수가 없어서 SSID 를 얻어 와서 설정한 허용 정책 (SSID 값) 과 비교 하여 동일 하다면
무선랜 허용을 해 줘야 한다는 사이트 담당자 요구 사항이 있었기 때문이다.

어쨋든 개발 후에 테스트를 하는데 자꾸 SSID 값 뒤에 쓰레기 값이 붙었다.

예)KSKANG_SSID *&()$DF34   과 같은 쓰레기 값들.... 실제로는 KSKANG_SSID  이값만 나와야 정확히 정책과
                                                                            비교 된다.

그래서 버퍼 셋팅을 잘못 한 것 같아 버퍼를 모두 MEMSET 을 했는데도 특정 pc 에서는  쓰레기 값이 출력 되는 요 이상한 값들.....머리를 써야 한다.... 리턴 되는 사이즈에 널값 채워주면 될것을....ㅜㅜ 머리가 나빠진다...점점..

/* 함수 부분*/

DWORD CWlanInfo::IoctlNdisQueryTest( LPCTSTR lpAdapterName, PNDIS_802_11_SSID pNdisSsid )
{
   UCHAR       OidData[4096]={0,};
   DWORD       nResult, ReturnedCount = 0;
   ULONG       nConnectedState;

   memset(OidData, 0x00, 4096);
   nResult = IoctlNdisQueryGlobalStats(
               lpAdapterName,
               OID_802_11_SSID,
               OidData/*pNdisSsid*/, ==> 1.주석 처리 한 이유는 ??
               sizeof( OidData )/*sizeof(NDIS_802_11_SSID)*/, ==>2.주석 처리 한 이유는??
               &ReturnedCount
               );

    if( nResult != ERROR_SUCCESS )
    {
        //RETURN ERROR
    }
    else
    {
       OidData[ReturnedCount] = NULL;    ==> 이 부분을 추가 해주니 쓰레기 값이 나오질 않았다.

       *pNdisSsid = *((PNDIS_802_11_SSID)OidData);

     }
     return( nResult );
}

1.주석 처리 한 이유는?
-> PNDIS_802_11_SSID  TYPE 의 pNdisSsid  의 구조체 포인터를 넘기면 각 os 환경 마다 구조체 사이즈가 달라  질 수 있기 때문에 위험 하다고 판단 했다.
2.마찬 가지로 사이즈가 OS 마다 다르기 때문에 잘못 된 값을 가져 올 수 있으므로 넉넉하게 4096의 버퍼 사이즈를 보내 준다.

드라이버에 구조체 값을 담아 쿼리 할 때 주의 해야 할 것은 os 마다 구조체 사이즈가 다를 수 있다는 것이다.
그래서 UCHAR 형으로 버퍼를 넉넉히 설정 하고 담아 오는 것이 안전하고 정확한 값을 구할 수 있다.

Comments