반응형
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
네트워크 드라이버 같은경우 거의 모든기능을 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); } } |
반응형