下面的代码实现如何在WINCE 6.0 下面禁用和启用WIFI,效果相当于在控制面板的网络连接手工禁用和启用,本人测试的WIFI是GH381,SDIO86881
禁用WIFI代码
int __stdcall DisableWifi()
{
HANDLE hNdisPwr;
NDISPWR_SAVEPOWERSTATE SavePowerState;
TCHAR multiSz[257];
DWORD cbBuffer = sizeof(multiSz);
StringCchCopy(multiSz, (cbBuffer / sizeof(TCHAR))-2, _T("SDIO86881"));
hNdisPwr = CreateFile(
(PTCHAR)NDISPWR_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 (hNdisPwr != INVALID_HANDLE_VALUE)
{
SavePowerState.pwcAdapterName = _T("SDIO86881");
//
// If it is currently enabled, set the power level to D4.
//
SavePowerState.CePowerState = D4;
BOOL result=DeviceIoControl(
hNdisPwr,
IOCTL_NPW_SAVE_POWER_STATE,
&SavePowerState,
sizeof(NDISPWR_SAVEPOWERSTATE),
NULL,
0x00,
NULL,
NULL);
CloseHandle(hNdisPwr);
if(result!=TRUE)
return -1;
}
else
{
RETAILMSG (1,
(TEXT("hNdisPwr is INVALID_HANDLE_VALUE\r\n")));
return -1;
}
SetDevicePower(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86881"), POWER_NAME, D4);
multiSz[::_tcslen(multiSz)+1] = _T('\0'); // Multi sz needs an extra null
BOOL result1=DoNdisIOControl(
IOCTL_NDIS_UNBIND_ADAPTER,
multiSz,
(_tcslen(multiSz)+2) * sizeof(TCHAR),
NULL,
NULL);
if(result1!=TRUE)
return -1;
return 0;
}
启用WIFI
int __stdcall EnableWifi()
{
HANDLE hNdisPwr;
NDISPWR_SAVEPOWERSTATE SavePowerState;
TCHAR multiSz[257];
DWORD cbBuffer = sizeof(multiSz);
StringCchCopy(multiSz, (cbBuffer / sizeof(TCHAR))-2, _T("SDIO86881"));
hNdisPwr = CreateFile(
(PTCHAR)NDISPWR_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 (hNdisPwr != INVALID_HANDLE_VALUE)
{
SavePowerState.pwcAdapterName = _T("SDIO86881");
//
// If it is currently enabled, set the power level to D4.
//
SavePowerState.CePowerState = PwrDeviceUnspecified;
BOOL result=DeviceIoControl(
hNdisPwr,
IOCTL_NPW_SAVE_POWER_STATE,
&SavePowerState,
sizeof(NDISPWR_SAVEPOWERSTATE),
NULL,
0x00,
NULL,
NULL);
CloseHandle(hNdisPwr);
if(result!=TRUE)
return -1;
}
else
{
return -1;
}
SetDevicePower(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86881"), POWER_NAME, PwrDeviceUnspecified);
multiSz[::_tcslen(multiSz)+1] = _T('\0'); // Multi sz needs an extra null
BOOL result1=DoNdisIOControl(
IOCTL_NDIS_BIND_ADAPTER,
multiSz,
(_tcslen(multiSz)+2) * sizeof(TCHAR),
NULL,
NULL);
if(result1!=TRUE)
return -1;
return 0;
}