驱动接口封装,提供给做wince 流驱动的弟兄们

驱动接口封装,提供给做wince 流驱动的弟兄们
wince 流驱动编写非常繁琐,往往容易编写接口的时候犯错
采用宏和虚函数的特性编写简洁的类来封装这些操作

使用方式:
 1 
 2  class  test_drv: public  StreamDriver{
 3  public :
 4      DWORD Init(LPCTSTR pContext,LPCVOID lpvBusContext){
 5          DBGMSG( (TEXT( " Init::test driver %d " ), 1 ));
 6          ::MessageBox(NULL,L " Init() Test " ,L "" ,MB_OK);
 7           return  NULL;
 8      }
 9      BOOL Deinit(DWORD hDeviceContext ){
10          DBGMSG( (TEXT( " DeInit::test driver %d " ), 2 ));
11          ::MessageBox(NULL,L " DeInit() Test " ,L "" ,MB_OK);
12           return  TRUE;
13      }
14  };
15 
16  test_drv driver;
17 
18  NEW_DRIVER_ENTRIES(TST, & driver);
19 
20  /*
21  [HKEY_LOCAL_MACHINE\Drivers\BuiltIn_\test]
22     "Order"=dword:0
23     "Prefix"="TST"
24     "Dll"="test.dll"
25     
26     
27  test.dll    $(_FLATRELEASEDIR)\test.dll        NK    SH
28 
29  */
30 

类代码:
  1 
  2 
  3 
  4 
  5  /*
  6      driverbase.h
  7      scott     2008.1.1
  8      simplified wince driver
  9  */
 10 
 11  #ifndef _DRIVERBASE_H
 12  #define  _DRIVERBASE_H
 13 
 14  #include  < windows.h >
 15  #include  < types.h >
 16  #include  < excpt.h >
 17  #include  < tchar.h >
 18  #include  < cardserv.h >
 19  #include  < cardapi.h >
 20  #include  < tuple.h >
 21  #include  < devload.h >
 22  #include  < diskio.h >
 23  #include  < nkintr.h >
 24  #include  < windev.h >
 25 
 26  /* *
 27  class SimpleInterruptHandler
 28  example:
 29      New_InterruptHandler(irq12)
 30      New_InterruptHandler(irq13)
 31      class MyDriver:public InterruptHandlerClassName(irq12),public InterruptHandlerClassName(irq13){
 32          public:
 33              void run_irq12(){
 34                  while( !broken_irq12() ){
 35                       //repeate doing interrupt
 36                  }
 37              }
 38              void run_irq13(){
 39                  
 40              }
 41      }
 42      MyDriver    driver;
 43      driver.set_irq_irq12(IRQ_ADC);
 44      driver.start_irq12();
 45      driver.start_irq13();
 46      driver.stop_irq12();
 47  ========    
 48      driver 能处理多种中断,但是每个中断处理必须消耗一个线程资源
 49  * */
 50 
 51  #define  INVALID_IRQ_VALUE 0xffff
 52  #define  InterruptHandlerClassName(cls) SimpleInterruptHandler_##cls
 53  #define  New_InterruptHandler(cls)    \
 54  class  SimpleInterruptHandler_##cls{\
 55  public :\
 56      SimpleInterruptHandler_##cls(){\
 57          set_irq_##cls(INVALID_IRQ_VALUE);    \
 58          _irq_sys  =  INVALID_IRQ_VALUE;\
 59          _ev_exit  =  CreateEvent(NULL, TRUE, FALSE, NULL);\
 60          _broken  =   false ;\
 61      }\
 62       ~ SimpleInterruptHandler_##cls(){\
 63          CloseHandle(_ev_exit);\
 64      }\
 65       void      set_irq_##cls(DWORD irqhw){\
 66          _irq_hw  =  irqhw;\
 67      }\
 68       bool      start_##cls(){\
 69           if  ( ! KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,  & _irq_hw,  sizeof (DWORD),  & _irq_sys,  sizeof (DWORD), NULL)){\
 70                 return   false ;\
 71            }\
 72            _evInterrupt  =  CreateEvent(NULL, FALSE, FALSE, NULL);\
 73             if ! _evInterrupt ){\
 74                KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,  & _irq_sys,  sizeof (DWORD),  0 0 , NULL);\
 75                 return   false ;\
 76            }\
 77             if ( ! InterruptInitialize(_irq_sys,_evInterrupt,NULL,NULL)){\
 78                 return   false ;\
 79            }\
 80            DWORD threadID;\
 81            CreateThread( 0 0 , (LPTHREAD_START_ROUTINE) SimpleInterruptHandler_##cls::entry, (LPVOID) this 0 & threadID);\
 82           return   true ;\
 83      }\
 84       void      stop_##cls(){\
 85          _broken  =   true ;\
 86          WaitForSingleObject(_ev_exit,INFINITE);\
 87          CloseHandle(_evInterrupt);\
 88          KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,  & _irq_sys,  sizeof (DWORD),  0 0 , NULL);\
 89      }\
 90  protected :\
 91       bool     broken_##cls(){\
 92           return  _broken;\
 93      }\
 94       virtual   void  run_##cls(){}\
 95  private :\
 96       static   void  entry( void   *  user){\
 97          SimpleInterruptHandler_##cls *  h  =  (SimpleInterruptHandler_##cls * ) user;\
 98          ResetEvent(h -> _ev_exit);\
 99          h -> _broken  =   false ;\
100          h -> run_##cls();\
101          SetEvent(h -> _ev_exit);\
102      }\
103  private :\
104      DWORD     _irq_hw;\
105      DWORD    _irq_sys;\
106      HANDLE    _evInterrupt;\
107      HANDLE    _ev_exit;\
108       bool     _broken;\
109  };
110 
111 
112  //  second method, binding function of class
113  //  base template interrupt handle
114  class  InterruptHandler{
115  public :
116      InterruptHandler( void   *  user){
117          _irq_sys  =  INVALID_IRQ_VALUE;
118          _ev_exit  =  CreateEvent(NULL, TRUE, FALSE, NULL);
119          _broken  =   false ;
120      }
121       ~ InterruptHandler(){
122          CloseHandle(_ev_exit);
123      }
124       void   *   get_user(){     return  _user;}
125       bool     broken(){
126           return  _broken;
127      }
128 
129  public :
130      DWORD     _irq_hw;
131      DWORD    _irq_sys;
132      HANDLE    _evInterrupt;
133      HANDLE    _ev_exit;
134       bool     _broken;
135       void   *     _user;
136  };
137 
138  template  < typename T >
139  class  SimpleInterruptHandler: public  InterruptHandler{
140  public :
141      SimpleInterruptHandler(T *  user):InterruptHandler(( void * )user){
142          _entry  =  NULL;
143      }
144       ~ SimpleInterruptHandler(){
145      }
146       void  bind_entry(  void  (T:: * entry)(InterruptHandler * ) ){
147          _entry  =  entry;
148      }
149       void  set_irq(DWORD irq){      // 设置硬件中断编号
150          _irq_hw  =  irq;
151      }
152       bool      start(){
153           if  ( ! KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,  & _irq_hw,  sizeof (DWORD),  & _irq_sys,  sizeof (DWORD), NULL)){
154                 return   false ;
155            }
156            _evInterrupt  =  CreateEvent(NULL, FALSE, FALSE, NULL);
157             if ! _evInterrupt ){
158                KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,  & _irq_sys,  sizeof (DWORD),  0 0 , NULL);
159                 return   false ;
160            }
161             if ( ! InterruptInitialize(_irq_sys,_evInterrupt,NULL,NULL)){
162                 return   false ;
163            }
164            DWORD threadID;
165            CreateThread( 0 0 , (LPTHREAD_START_ROUTINE) SimpleInterruptHandler < T > ::entry, (LPVOID) this 0 & threadID);
166           return   true ;
167      }
168       void      stop(){
169          _broken  =   true ;
170          WaitForSingleObject(_ev_exit,INFINITE);
171          CloseHandle(_evInterrupt);
172          KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,  & _irq_sys,  sizeof (DWORD),  0 0 , NULL);
173      }
174  private :
175       static   void  entry( void   *  user){
176          SimpleInterruptHandler < T >*  h  =  (SimpleInterruptHandler < T >* ) user;
177          ResetEvent(h -> _ev_exit);
178          
179          h -> _broken  =   false ;
180           if ( h -> _entry ){
181              (((T * )h -> _user) ->* h -> _entry)( h);
182          }
183          SetEvent(h -> _ev_exit);    
184      }
185  private :
186       void  (T:: * _entry)(InterruptHandler * );
187  };
188 
189 
190   
191 
192      
193 
194  // class  StreamDriver
195  //  流接口设备驱动基础类
196 
197  class  StreamDriver{
198  public :
199      StreamDriver(){}
200       virtual   ~ StreamDriver(){};
201       virtual  BOOL Close(DWORD hOpenContext ){
202           return  TRUE;
203      }
204       virtual  BOOL Deinit(DWORD hDeviceContext ){
205           return  TRUE;
206      }
207       virtual  DWORD Init(LPCTSTR pContext,LPCVOID lpvBusContext){
208           return  DWORD( this );
209      }
210       virtual  BOOL IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut ){
211           return  TRUE;
212      }
213       virtual  DWORD Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode ){
214           return  NULL;
215      }
216       virtual   void  PowerDown(DWORD hDeviceContext ){}
217       virtual   void  PowerUp(DWORD hDeviceContext ){}
218       virtual  BOOL PreClose(DWORD hOpenContext ){
219           return  TRUE;
220      }
221       virtual  BOOL PreDeinit(DWORD hDeviceContext ){
222           return  TRUE;
223      }
224       virtual  DWORD Read(DWORD hOpenContext,LPVOID pBuffer,DWORD Count ){
225           return   0 ;
226      }
227       virtual  DWORD Seek(DWORD hOpenContext, long  Amount,WORD Type ){
228           return   0 ;
229      }
230       virtual  DWORD Write(DWORD hOpenContext,LPCVOID pBuffer,DWORD Count ){
231           return   0 ;
232      }
233  private :
234      
235  };
236 
237  #define  DRIVER_ENTRY_CLOSE(prefix,pcls)    \
238              BOOL prefix##_Close(DWORD hOpenContext ){\
239                   return  pcls -> Close(hOpenContext);    \
240              }
241  #define  DRIVER_ENTRY_DEINIT(prefix,pcls)    \
242              BOOL prefix##_Deinit(DWORD hDeviceContext ){\
243                   return  pcls -> Deinit(hDeviceContext);    \
244              }
245  #define  DRIVER_ENTRY_INIT(prefix,pcls)    \
246              BOOL prefix##_Init(LPCTSTR pContext,LPCVOID lpvBusContext ){\
247                   return  pcls -> Init( pContext,lpvBusContext );    \
248              }
249  #define  DRIVER_ENTRY_IOCONTROL(prefix,pcls)    \
250              BOOL prefix##_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut  ){\
251                   return  pcls -> IOControl( hOpenContext, dwCode, pBufIn, dwLenIn, pBufOut, dwLenOut, pdwActualOut );    \
252              }
253  #define  DRIVER_ENTRY_OPEN(prefix,pcls)    \
254              BOOL prefix##_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode ){\
255                   return  pcls -> Open(hDeviceContext,AccessCode,ShareMode);    \
256              }
257  #define  DRIVER_ENTRY_POWERDOWN(prefix,pcls)    \
258               void  prefix##_PowerDown(DWORD hOpenContext ){\
259                  pcls -> PowerDown(hOpenContext);    \
260              }
261  #define  DRIVER_ENTRY_POWERUP(prefix,pcls)    \
262               void  prefix##_PowerUp(DWORD hOpenContext ){\
263                   pcls -> PowerUp(hOpenContext);    \
264              }
265  #define  DRIVER_ENTRY_PRECLOSE(prefix,pcls)    \
266              BOOL prefix##_PreClose(DWORD hOpenContext ){\
267                   return  pcls -> PreClose(hOpenContext);    \
268              }
269  #define  DRIVER_ENTRY_PREDEINIT(prefix,pcls)    \
270              BOOL prefix##_PreDeinit(DWORD hOpenContext ){\
271                   return  pcls -> PreDeinit(hOpenContext);    \
272              }
273 
274  #define  DRIVER_ENTRY_READ(prefix,pcls)    \
275              BOOL prefix##_Read(DWORD hOpenContext,LPVOID pBuffer,DWORD Count ){\
276                   return  pcls -> Read( hOpenContext, pBuffer, Count);    \
277              }
278  #define  DRIVER_ENTRY_SEEK(prefix,pcls)    \
279              BOOL prefix##_Seek(DWORD hOpenContext, long  Amount,WORD Type){\
280                   return  pcls -> Seek( hOpenContext, Amount, Type);    \
281              }
282  #define  DRIVER_ENTRY_WRITE(prefix,pcls)    \
283              BOOL prefix##_Write(DWORD hOpenContext,LPCVOID pBuffer,DWORD Count ){\
284                   return  pcls -> Write( hOpenContext, pBuffer, Count);    \
285              }    
286 
287  #define  DRIVER_DLLENTRY    \
288  BOOL DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved){\
289       switch  ( dwReason ) {\
290       case  DLL_PROCESS_ATTACH:\
291          DisableThreadLibraryCalls((HMODULE) hInstDll);\
292           break ;\
293      }\
294       return  (TRUE);\
295  }
296                  
297  /* *
298      定义流式驱动入口接口函数
299      NEW_DRIVER_ENTRIES(prefix,pcls)
300      prefix     驱动类别前缀
301      pcls    必须是StreamDriver的 子类实现对象地址
302      
303  example:
304      class PowerKeyDriver:public StreamDriver{}s
305      PowerKeyDriver pkdrv;
306      NEW_DRIVER_ENTRIES("PWK",&pkdrv);
307    */             
308                                              
309  #define  NEW_DRIVER_ENTRIES(prefix,pcls) \
310      DRIVER_ENTRY_CLOSE(prefix,(pcls))\
311      DRIVER_ENTRY_DEINIT(prefix,(pcls))\
312      DRIVER_ENTRY_INIT(prefix,(pcls))\
313      DRIVER_ENTRY_IOCONTROL(prefix,(pcls))\
314      DRIVER_ENTRY_OPEN(prefix,(pcls))\
315      DRIVER_ENTRY_POWERDOWN(prefix,(pcls))\
316      DRIVER_ENTRY_POWERUP(prefix,(pcls))\
317      DRIVER_ENTRY_PRECLOSE(prefix,(pcls))\
318      DRIVER_ENTRY_PREDEINIT(prefix,(pcls))\
319      DRIVER_ENTRY_READ(prefix,(pcls))\
320      DRIVER_ENTRY_SEEK(prefix,(pcls))\
321      DRIVER_ENTRY_WRITE(prefix,(pcls))\
322      DRIVER_DLLENTRY
323 
324  #define  DBGMSG(m) RETAILMSG(1,m)
325 
326  #endif
327 
328 

你可能感兴趣的:(驱动接口封装,提供给做wince 流驱动的弟兄们)