WinCE的WiFi开关要依赖于WiFi模块的休眠功能还有模块厂商提供的驱动里面有支持电源管理功能。这里面用的是SDIO86861模块,WinCE5的系统,S3C2416的CPU。
头文件要包括:
#include <winioctl.h>
#include <ntddndis.h>
#include <nuiouser.h>
#include <pm.h>
关键部分代码:
BOOL CDevCtrlDlg::OpenWiFiDriver(BOOL b_OpenDriver) { if(b_OpenDriver) { //Delete Register reg.Create(HKEY_LOCAL_MACHINE, _T("Comm\\NdisPower")); reg.DeleteValue(_T("SDIO86861")); Sleep(); //Power Up SDIO86861 DevicePowerNotify(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), D0, POWER_NAME); SetDevicePower(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), POWER_NAME, D0); #if 0 //这里面因为电源开启之后驱动会自动把网卡开启,所以下面的操作可以不用。// Open NetworkCard WCHAR Name[]=_T("SDIO86861\0"); HANDLE m_hFileHandle = CreateFile(_T(, , NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) INVALID_HANDLE_VALUE); if( m_hFileHandle == INVALID_HANDLE_VALUE ) { RETAILMSG(, (TEXT("Failed To CreateFile NDS0!\r\n"))); return FALSE; } else { RETAILMSG(, (TEXT("Succeed To CreateFile NDS0!\r\n"))); //return TRUE; } BOOL SDIO86861Control=DeviceIoControl( m_hFileHandle, IOCTL_NDIS_BIND_ADAPTER, Name, , NULL, NULL ); if(SDIO86861Control==TRUE) { RETAILMSG(, (TEXT("Succeed To Control SDIO86861!\r\n"))); CloseHandle( m_hFileHandle ); return TRUE; } else { RETAILMSG(, (TEXT("Failed To Control SDIO86861!\r\n"))); CloseHandle( m_hFileHandle ); return FALSE; } #endif return TRUE; } else { //Power Down SDIO86861 DevicePowerNotify(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), D4, POWER_NAME); SetDevicePower(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), POWER_NAME, D4); //Close NetworkCard WCHAR Name[]=_T("SDIO86861\0"); HANDLE m_hFileHandle = CreateFile(_T(, , NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) INVALID_HANDLE_VALUE); if( m_hFileHandle == INVALID_HANDLE_VALUE ) { RETAILMSG(, (TEXT("Failed To CreateFile NDS0!\r\n"))); return FALSE; } else { RETAILMSG(, (TEXT("Succeed To CreateFile NDS0!\r\n"))); } BOOL SDIO86861Control=DeviceIoControl( m_hFileHandle, IOCTL_NDIS_UNBIND_ADAPTER, Name, , NULL, NULL ); if(SDIO86861Control==TRUE) { RETAILMSG(, (TEXT("Succeed To Control SDIO86861!\r\n"))); CloseHandle( m_hFileHandle ); } else { RETAILMSG(, (TEXT("Failed To Control SDIO86861!\r\n"))); CloseHandle( m_hFileHandle ); return FALSE; } //写注册表,此注册表用于WiFi休眠唤醒之后是否启动WiFi //[HKEY_LOCAL_MACHINE\Comm\NdisPower] //"SDIO86861"=dword:00000004 reg.Create(HKEY_LOCAL_MACHINE, _T("Comm\\NdisPower")); reg.SetDW(TEXT(); return TRUE; } return FALSE; }