wince的定时关机驱动

以前平台的定时关机是利用wince自带的定时休眠部分代码实现的,同事老是说定时关机时间不准确,所以花了点时间,写了个简单的驱动。

 

具体看下面的代码:

  1. #include <windows.h>
  2. #include "s2410.h"
  3. //#include <excpt.h> //try 
  4. #define MAXACTIVITYTIMEOUT              (0xFFFFFFFF / 1000)  // in seconds
  5. static HANDLE gThread;
  6. void ExitWince()
  7. {
  8.     //关机
  9.     static volatile IOPreg * v_pIOPregs;
  10.     v_pIOPregs = (volatile IOPreg *)IOP_BASE;
  11.     v_pIOPregs->rGPBCON &= ~(3 << 4);
  12.     v_pIOPregs->rGPBCON |= (1 << 4);
  13.     v_pIOPregs->rGPBDAT &= ~(1 << 2); 
  14.     Sleep(15);
  15.     v_pIOPregs->rGPBDAT |= (1 << 2); 
  16. }
  17. BOOL GetAutoPowerOffTime(BYTE *Buffer)
  18. {
  19.     HKEY  hResult;
  20.     LONG  lRet;
  21.     LPWSTR lpSubKey = _T("//System//CurrentControlSet//Control//Power//Timeouts");
  22.     DWORD size = sizeof(Buffer);
  23.     lRet =RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpSubKey,0,KEY_ALL_ACCESS,&hResult); 
  24.     if (lRet != ERROR_SUCCESS)
  25.     {
  26.         return FALSE;
  27.     }
  28.     lRet = RegQueryValueEx(hResult,_T("ACUserIdle"), NULL, NULL, (LPBYTE)Buffer, &size);
  29.     if(lRet != ERROR_SUCCESS)
  30.     {   
  31.         return FALSE;
  32.     }
  33.     RegCloseKey(hResult);
  34.     return TRUE;
  35. }
  36. DWORD GetPowerOffTime()
  37. {
  38.     DWORD ACUserIdleTimeout;
  39.         if(GetAutoPowerOffTime((byte *)&ACUserIdleTimeout))
  40.     {
  41.         if(ACUserIdleTimeout == 0) 
  42.         {
  43.             ACUserIdleTimeout = INFINITE;
  44.         } 
  45.         else 
  46.         {
  47.             if(ACUserIdleTimeout > MAXACTIVITYTIMEOUT) 
  48.             {
  49.                 ACUserIdleTimeout = MAXACTIVITYTIMEOUT;
  50.             }
  51.         }
  52.         //转成毫秒
  53.         if(ACUserIdleTimeout != INFINITE) 
  54.         {
  55.             ACUserIdleTimeout *= 1000;
  56.         }
  57.     }
  58.     else
  59.     {
  60.         ACUserIdleTimeout=INFINITE;
  61.     }
  62.     return ACUserIdleTimeout;
  63. }
  64. DWORD EventThread(PVOID pArg)
  65. {
  66.     DWORD   dwResult;
  67.     DWORD   dwTimeout=INFINITE;
  68.     HANDLE  gEvent[2];
  69.     
  70.     //创建事件
  71.     gEvent[0] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffTimeOutChange");
  72.     gEvent[1] = CreateEvent(NULL, FALSE, FALSE, L"UserInputEvent");
  73.         //读自动关机时间
  74.     dwTimeout = GetPowerOffTime(); 
  75.     while (1) 
  76.     {
  77.         dwResult = WaitForMultipleObjects(2,gEvent,FALSE, dwTimeout );
  78.         if (dwResult == WAIT_TIMEOUT) 
  79.         {
  80.             ExitWince();
  81.         }
  82.         else
  83.         {
  84.             if (dwResult ==WAIT_OBJECT_0)
  85.             {
  86.                 //时间修改,需要重读
  87.                 dwTimeout = GetPowerOffTime(); 
  88.             }
  89.         }
  90.     } 
  91.     return 0;           
  92. }
  93. DWORD APO_Init(DWORD dwContext)
  94. {
  95.     DWORD   IDThread;
  96.     do 
  97.     {
  98.         gThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)EventThread , 0, 0, &IDThread);
  99.         if (gThread == 0) 
  100.         {
  101.             break;
  102.         }
  103.     } while (0);
  104.     return (TRUE);
  105. }
  106. BOOL WINAPI  DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
  107. {
  108.     switch ( dwReason ) 
  109.     {
  110.     case DLL_PROCESS_ATTACH:
  111.         DisableThreadLibraryCalls((HMODULE) hInstDll);
  112.         break;
  113.     }
  114.     return (TRUE);
  115. }
  116. BOOL APO_Close( DWORD Handle )
  117. {
  118.     return TRUE;
  119. }   
  120. BOOL  APO_Deinit( DWORD dwContext )
  121. {
  122.     return TRUE;
  123. }   
  124. DWORD  APO_Open(
  125.          DWORD dwData,
  126.          DWORD dwAccess,
  127.          DWORD dwShareMode
  128.          )
  129. {
  130.     return 0;
  131. }    
  132. BOOL  APO_IOControl(
  133.               DWORD Handle,
  134.               DWORD dwIoControlCode,
  135.               PBYTE pInBuf,
  136.               DWORD nInBufSize,
  137.               PBYTE pOutBuf,
  138.               DWORD nOutBufSize,
  139.               PDWORD pBytesReturned
  140.               )
  141. {
  142.     return FALSE;
  143. }    
  144. DWORD APO_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
  145. {
  146.     return 0;
  147. }
  148. DWORD APO_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
  149. {
  150.     return 0;
  151. }
  152. DWORD APO_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
  153. {
  154.     return 0;
  155. }
  156. void APO_PowerUp(void)
  157. {
  158.     return;
  159. }
  160. void APO_PowerDown(void)
  161. {
  162.     return;
  163. }

 

 

 

发布了38 篇原创文章 · 获赞 1 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览