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