近日在看M8开发资料的时候发现1个函数SetDVS, 给出资料的这哥们貌似也没搞清楚这个函数的具体意思,于是GOOGLE了很多资料终于找到这个函数的原理。
先看这个宏
#define IOCTL_HAL_SET_DVSONOFF CTL_CODE(FILE_DEVICE_UNKNOWN, 2103, METHOD_BUFFERED, FILE_ANY_ACCESS)
再看函数
BOOL SetDVS(BOOL bOn)
{
BOOL ret;
HANDLE hPWC = CreateFile(TEXT("PWC0:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hPWC != INVALID_HANDLE_VALUE)
{
ret = DeviceIoControl (hPWC, IOCTL_HAL_SET_DVSONOFF,&bOn,sizeof(bOn), NULL,0, NULL, NULL);
if(ret)
{
// 调用成功
}
else
{
// 调用失败
}
CloseHandle(hPWC);
}
return FALSE;
}
下面是DeviceIoControl 从MSDN载入的描述:这个函数是控制设备IO的
BOOL WINAPI DeviceIoControl(
__in HANDLE hDevice,
__in DWORD dwIoControlCode,
__in LPVOID lpInBuffer,
__in DWORD nInBufferSize,
__out LPVOID lpOutBuffer,
__in DWORD nOutBufferSize,
__out LPDWORD lpBytesReturned,
__in LPOVERLAPPED lpOverlapped
);
参考百度百科的说明 http://baike.baidu.com/view/1288761.htm?fr=ala0_1
CTL_CODE宏参数说明 http://hi.baidu.com/magical/blog ... 7ca92910df9bc6.html
DeviceIoControl (hPWC, IOCTL_HAL_SET_DVSONOFF,&bOn,sizeof(bOn), NULL,0, NULL, NULL);
CTL_CODE(FILE_DEVICE_UNKNOWN, 2103, METHOD_BUFFERED, FILE_ANY_ACCESS)解释
FILE_DEVICE_UNKNOWN 再winioctl.h中定义为 #define FILE_DEVICE_UNKNOWN 0x00000022 为微软自定义
关键是 2103 这个东西,Function主要用来区分DeviceIoControl的类型,0-2047是微软保留的 2048-4095是用户自定义的。所以2103这个东西代表的功能应该是MZ工程师自己定义的东西,和设备驱动有关。
所谓的节能不节能,应该是说CPU频率的高低吧、
据我猜想这个2013 实现的功能多半是通过&bOn的控制 实现极少量数据的IO转移,而且多半是数据的不停的转移,通过这样来保证CPU的频率提高。
或者2013 的功能是直接提高CPU频率,如果能直接提高CPU频率的话,那为什么前面要写这么多废话,写个公有函数不就得了,有点不太明白。
bOn = False时候关闭节能,这时候我猜测是不是通过加大通过高频率低数据调动IO,而使CPU频率提高。
bOn=True时候打开节能模式,这时候关闭了IO操作,CPU频率自然下降。
个人怀疑是调用了 OSTimeDlyHMSM()
或是其他什么提高时钟频率的办法,具体的不知道
以上是我的猜想。
欢迎没事来我的网站逛逛:www.j2megame.com