• <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>

            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 放屁阿狗 閱讀(1585) 評論(0)  編輯 收藏 引用
            国产成人精品久久一区二区三区av | 精品熟女少妇AV免费久久| 久久久久亚洲爆乳少妇无| 久久无码中文字幕东京热| 久久国产精品成人片免费| 久久精品国产亚洲AV不卡| 国内精品久久久久影院薰衣草| 精品一区二区久久久久久久网站| 天天做夜夜做久久做狠狠| 久久人人爽人人爽人人AV| 久久国产高清一区二区三区| 少妇久久久久久被弄高潮| 四虎久久影院| 99国内精品久久久久久久| 波多野结衣AV无码久久一区| 国产成人无码精品久久久久免费 | 无码人妻少妇久久中文字幕蜜桃 | 久久久精品人妻无码专区不卡 | 久久精品国产影库免费看| 久久久久久久久久久久久久 | 一本久久综合亚洲鲁鲁五月天| 久久国产乱子精品免费女| 久久久久人妻一区二区三区 | 香蕉久久夜色精品升级完成| 欧美与黑人午夜性猛交久久久 | 久久婷婷五月综合97色直播| 老司机国内精品久久久久| 久久综合国产乱子伦精品免费| 久久人人爽人人爽人人片AV东京热 | 美女久久久久久| 久久国产免费| 久久国产精品视频| 国产精品久久久久久搜索| 嫩草伊人久久精品少妇AV| 国产亚洲精品久久久久秋霞| 国产精品99久久久久久宅男小说| 日韩va亚洲va欧美va久久| 理论片午午伦夜理片久久| 日本精品久久久久影院日本| 久久人妻少妇嫩草AV蜜桃| 四虎影视久久久免费观看|