SW 개발

winCE,Mobile / 네트워크 / NDIS 인터페이스로 네트워크카드 파워 컨트롤

. . . 2011. 5. 18. 11:12
반응형
NDIS 를 통한 Power Control 
NDIS 인터페이스를 통해서 SetDevicePower()관련 API를 쓰지않고도 NDIS interface Device 를 Power컨트롤 할수있다!
네트워크 드라이버 같은경우 거의 모든기능을 NDIS 인터페이스로 제어할수있는데 기중 기초가 되는 Power control 소스이다.

NDIS는 IO Control 로 모든 제어를 할수있게 되어있다.

각 파워 스테이트는 소스 검색을 해보면 알수있게 되어있는데 D0~D3 까지 설정을 할수있다. 구조체를 검색해보면 알수있다.
NDIS_DEVICE_POWER_STATE 
구조체를 검색해보면 알수있다. 
관련 MDSN : 
http://msdn.microsoft.com/en-us/library/gg602135(v=vs.85).aspx

해당소스는 windows Mobile 과 windows CE에서 모두 테스트 완료되었다.
 
// for oid
#include <ntddndis.h>
#include <windows.h>
#include <commctrl.h>
#include <winioctl.h>
#include <stdlib.h>
#include <nuiouser.h>
 
void SetNdisPowerMode()
{
    NDIS_DEVICE_POWER_STATE ndis_power_state = NdisDeviceStateD3;
 
    HANDLE h = 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)
                       
    if (INVALID_HANDLE_VALUE != h) {
        DWORD dwWritten = 0;
           
        struct {
            NDISUIO_SET_OID SetOid;
            unsigned char   uca[64];
        } NdisUioSetOid;
    
        NdisUioSetOid.SetOid.Oid = OID_PNP_SET_POWER;
        NdisUioSetOid.SetOid.ptcDeviceName = L"AR6K_SD1";
        // 위의 부분에서 실제 device name 을 적어야 한다. 
        // 일단 hard coding 하지만, ndis enum device interface 로 device name 을 얻어올수있음.ㅋ
        memcpy(&NdisUioSetOid.SetOid.Data, &ndis_power_state, sizeof(NDIS_DEVICE_POWER_STATE));
    
        DeviceIoControl(h,
                        IOCTL_NDISUIO_SET_OID_VALUE,
                        &NdisUioSetOid,
                        sizeof(NdisUioSetOid),
                        NULL,
                        0,
                        &dwWritten,
                        NULL);
    
         CloseHandle(h);
    }
}
반응형