青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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), 00, NULL);\
 75               return false;\
 76           }\
 77           if(!InterruptInitialize(_irq_sys,_evInterrupt,NULL,NULL)){\
 78               return false;\
 79           }\
 80           DWORD threadID;\
 81           CreateThread(00, (LPTHREAD_START_ROUTINE) SimpleInterruptHandler_##cls::entry, (LPVOID)this0&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), 00, 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), 00, NULL);
159               return false;
160           }
161           if(!InterruptInitialize(_irq_sys,_evInterrupt,NULL,NULL)){
162               return false;
163           }
164           DWORD threadID;
165           CreateThread(00, (LPTHREAD_START_ROUTINE) SimpleInterruptHandler<T>::entry, (LPVOID)this0&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), 00, 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 

posted on 2009-02-08 22:18 放屁阿狗 閱讀(1597) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区视频在线| 欧美欧美天天天天操| 欧美在线黄色| 中日韩美女免费视频网站在线观看| 午夜精品久久久久久久99樱桃| 亚洲日本免费| 开心色5月久久精品| 久久夜色撩人精品| 麻豆精品精华液| 欧美高清影院| 欧美激情一区二区三区四区| 欧美88av| 亚洲精品乱码| 亚洲欧洲免费视频| 一区二区三区视频免费在线观看| 日韩午夜视频在线观看| 亚洲午夜在线观看视频在线| 一区二区三区**美女毛片| 亚洲色图制服丝袜| 午夜久久久久久| 久久久五月天| 欧美激情精品久久久久久黑人 | aaa亚洲精品一二三区| 99re8这里有精品热视频免费| 99精品欧美一区二区蜜桃免费| 亚洲美女av网站| 欧美一二三区精品| 欧美激情第3页| 国产精品视频久久久| 国产综合色产| 中日韩美女免费视频网站在线观看| 欧美在线一区二区| 亚洲国产日韩在线| 亚洲免费视频观看| 欧美精品国产一区| 国产日韩专区在线| 9久re热视频在线精品| 久久久国产精品一区二区中文| 久久一区激情| 亚洲欧美不卡| 欧美在线播放高清精品| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩一区二区视频在线 | 亚洲欧美日韩精品久久| 久久先锋资源| 国产日韩欧美亚洲| 99精品视频免费全部在线| 久久久久五月天| 亚洲小说春色综合另类电影| 牛牛精品成人免费视频| 激情国产一区二区| 欧美有码视频| 亚洲一区二区在线免费观看视频| 欧美激情一区二区在线| 亚洲国产精品www| 久久一综合视频| 亚洲欧美日韩天堂一区二区| 国产精品久久一级| 亚洲一区二区成人| 99精品视频网| 国产精品福利网| 亚洲午夜伦理| 亚洲一区二区免费视频| 国产精品白丝jk黑袜喷水| 亚洲深夜激情| 亚洲一区二区三区涩| 国产精品入口| 老鸭窝毛片一区二区三区| 久久精品一区中文字幕| 激情成人av在线| 亚洲国产精品va在线看黑人| 免费观看日韩| 亚洲视频一区| 亚洲天堂视频在线观看| 欧美图区在线视频| 亚洲自拍偷拍麻豆| 亚洲小视频在线观看| 国产麻豆视频精品| 久久久亚洲人| 久久视频一区| 国产精品久久久久免费a∨| 亚洲深夜福利视频| 亚洲狼人精品一区二区三区| 亚洲欧美在线另类| 最新国产成人av网站网址麻豆| 亚洲欧美清纯在线制服| 亚洲美女av黄| 欧美精品在线观看一区二区| 一区在线观看视频| 亚洲人成在线免费观看| 国产精品视频精品| 亚洲欧美伊人| 一区二区三区日韩在线观看| 欧美日韩视频免费播放| 亚洲国产高清视频| 亚洲毛片av| 亚洲线精品一区二区三区八戒| 免费观看久久久4p| 一区二区国产精品| 伊人久久大香线| 亚洲制服av| 欧美成人一区二区三区片免费| 亚洲大片精品永久免费| 日韩视频一区| 欧美不卡视频| 国产一区在线看| 亚洲午夜av电影| 亚洲日本成人| 99re热这里只有精品免费视频| 国产精品影音先锋| 午夜国产精品视频| 亚洲影音一区| 国产日韩亚洲欧美综合| 亚洲一区二区三区在线看| 亚洲欧洲精品一区二区三区| 国产精品九色蝌蚪自拍| 亚洲欧洲偷拍精品| 久久亚洲影音av资源网| 亚洲欧美高清| 国产婷婷色一区二区三区四区| 亚洲女人小视频在线观看| 亚洲视频欧美在线| 国产精品青草久久| 99精品视频免费| 国产小视频国产精品| 久久精品中文字幕一区二区三区| 久久精品国产亚洲5555| 91久久久亚洲精品| 一本大道久久a久久精品综合| 国产精品久久999| 亚洲欧洲一区二区三区久久| 亚洲亚洲精品三区日韩精品在线视频| 久久精品国产成人| 国产啪精品视频| 国产一区二区中文字幕免费看| 99re热这里只有精品视频| 欧美日韩中文在线| 欧美一区深夜视频| 久久久久久国产精品mv| 亚洲福利视频一区| 日韩网站在线看片你懂的| 国产精品人人爽人人做我的可爱 | 亚洲成人在线视频网站| 欧美日韩国产精品一区| 亚洲国产成人精品视频| 欧美色图首页| 久久精品av麻豆的观看方式| 久久久五月婷婷| 亚洲一区二区三区四区五区黄| 国产精品成人免费精品自在线观看| 久久精品亚洲乱码伦伦中文| 蜜桃av一区二区| 久久国产天堂福利天堂| 欧美伦理视频网站| 美女露胸一区二区三区| 性做久久久久久久久| 亚洲美女黄色片| 久久只有精品| 欧美日韩精品久久久| 美女性感视频久久久| 国产精品二区在线| 亚洲欧洲中文日韩久久av乱码| 国产女人aaa级久久久级| 亚洲激情欧美激情| 欧美—级a级欧美特级ar全黄| 亚洲麻豆av| 亚洲日本久久| 久久尤物视频| 美女爽到呻吟久久久久| 国产一区二区三区视频在线观看 | 欧美成ee人免费视频| 久久成人18免费网站| 欧美亚韩一区| av成人激情| 在线成人国产| 蜜臀av性久久久久蜜臀aⅴ| 免费美女久久99| 亚洲第一伊人| 久久美女性网| 亚洲电影在线免费观看| 亚洲欧美日韩国产中文| 亚洲性感激情| 宅男精品视频| 欧美午夜精品久久久久久孕妇| 亚洲激情午夜| 99在线精品视频在线观看| 国产日韩欧美精品在线| 午夜激情一区| 久久精品二区| 精品成人在线| 欧美ed2k| 先锋影音网一区二区| 亚洲久久一区二区| 欧美激情视频一区二区三区不卡| 亚洲福利视频免费观看| 99这里只有精品| 国产精品日韩高清| 国产精品超碰97尤物18| 性感少妇一区| 欧美成人第一页|