source: trunk/src/wnaspi32/odinaspi.cpp@ 987

Last change on this file since 987 was 987, checked in by phaller, 26 years ago

Add: WinASPI32 support via ASPIROUT$-device driver

File size: 4.7 KB
Line 
1#define INCL_DOSSEMAPHORES
2#define INCL_DOSDEVICES
3#define INCL_DOSDEVIOCTL
4#define INCL_DOSERRORS
5
6#include <os2wrap.h>
7#include "srbos2.h"
8#include <odinaspi.h>
9#include "aspi.h"
10
11BYTE bOpenASPI(PODINASPIDATA pData)
12{
13 BOOL success;
14 ULONG rc;
15 ULONG ulParam, ulReturn; // return value
16 USHORT usDrvReturn; // return value
17
18 rc = DosAllocMem( &pData->pvBuffer,
19 65536,
20 OBJ_TILE | PAG_READ | PAG_WRITE | PAG_COMMIT);
21 if(rc)
22 return FALSE;
23 rc = DosOpen( (PSZ) "aspirou$", // open driver
24 (HFILE*)&pData->hfDriver,
25 &ulReturn,
26 0,
27 0,
28 FILE_OPEN,
29 OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE,
30 NULL);
31 if(rc)
32 {
33 DosFreeMem( pData->pvBuffer);
34 return SS_NO_ASPI; // opening failed -> return false
35 }
36
37 rc = DosCreateEventSem( NULL,
38 (HEV*)&pData->hevPost, // create event semaphore
39 DC_SEM_SHARED,
40 0);
41 if(rc)
42 {
43 DosFreeMem( pData->pvBuffer); // Free Mem
44 DosClose((HFILE)pData->hfDriver); // Close the driver
45 return SS_ERR; // DosCreateEventSem failed
46 }
47 rc = DosDevIOCtl( (HFILE) pData->hfDriver,
48 0x92,
49 0x03, // pass semaphore handle
50 (void*) &pData->hevPost,
51 sizeof(HEV), // to driver
52 &ulParam,
53 (void*) &usDrvReturn,
54 sizeof(USHORT),
55 &ulReturn);
56
57 if(rc)
58 {
59 DosFreeMem( pData->pvBuffer); // Free Mem
60 DosCloseEventSem((HEV)pData->hevPost); // close event semaphore
61 DosClose((HFILE)pData->hfDriver); // Close the driver
62
63 return SS_ERR; // Error passing Sem to driver
64 }
65
66 rc = DosDevIOCtl( (HFILE)pData->hfDriver,
67 0x92,
68 0x04, // pass buffer pointer
69 (void*) pData->pvBuffer,
70 sizeof(PVOID), // to driver
71 &ulParam,
72 (void*) &usDrvReturn,
73 sizeof(USHORT),
74 &ulReturn);
75
76 if(rc)
77 {
78 DosFreeMem( pData->pvBuffer); // Free Mem
79 DosCloseEventSem((HEV)pData->hevPost); // close event semaphore
80 DosClose((HFILE)pData->hfDriver); // Close the driver
81
82 return SS_ERR; // Error passing Sem to driver
83 }
84
85 return SS_COMP;
86}
87
88BOOL fCloseASPI( PODINASPIDATA pData)
89{
90 ULONG rc;
91 BOOL frc = TRUE;
92
93 rc = DosCloseEventSem((HEV)pData->hevPost); // close event semaphore
94 if(NO_ERROR!=rc)
95 frc=FALSE;
96
97 rc = DosClose((HFILE)pData->hfDriver); // Close the driver
98 if(NO_ERROR!=rc)
99 frc=FALSE;
100
101 rc = DosFreeMem( pData->pvBuffer); // Free Mem
102 if(NO_ERROR!=rc)
103 frc=FALSE;
104
105 return frc;
106}
107
108BOOL fWaitPost(ULONG postSema)
109{
110 ULONG count=0;
111 ULONG rc; // return value
112
113 rc = DosWaitEventSem( (HEV)postSema,
114 SEM_INDEFINITE_WAIT); // wait forever
115 if(rc)
116 return FALSE; // DosWaitEventSem failed
117
118 rc = DosResetEventSem( (HEV)postSema,
119 &count); // reset semaphore
120 if(rc)
121 return FALSE; // DosResetEventSem failed
122
123 return TRUE;
124}
125
126BOOL fGainDrvAccess( BOOL fWait,
127 ULONG *phSem)
128{
129 ULONG rc;
130 rc = DosCreateMutexSem ( "\\SEM32\\ODIN\\ASPIROUT",
131 (HMTX*)phSem,
132 0,
133 TRUE);
134 if(NO_ERROR==rc)
135 return TRUE;
136 if((ERROR_DUPLICATE_NAME!=rc)||(!fWait))
137 return FALSE;
138 rc = DosOpenMutexSem ( "\\SEM32\\ODIN\\ASPIROUT",
139 (HMTX*)phSem);
140 if(NO_ERROR!=rc)
141 return FALSE;
142
143 rc = DosRequestMutexSem( (HMTX)(*phSem),
144 SEM_INDEFINITE_WAIT);
145
146 if(NO_ERROR!=rc)
147 return FALSE;
148
149 return TRUE;
150}
151
152BOOL fReleaseDrvAccess(ULONG hSem)
153{
154 ULONG rc;
155 BOOL frc = TRUE;
156
157 rc = DosReleaseMutexSem((HMTX)hSem);
158 if(NO_ERROR!=rc)
159 frc=FALSE;
160
161 rc = DosCloseMutexSem((HMTX)hSem);
162 if(NO_ERROR!=rc)
163 frc=FALSE;
164
165 return frc;
166}
167
168LONG lSendSRBlock( ULONG ulFile,
169 SRBOS2 *pSRBIn,
170 SRBOS2 *pSRBOut)
171{
172 ULONG ulParam, ulReturn;
173 return DosDevIOCtl( (HFILE) ulFile,
174 0x92,
175 0x02,
176 (void*) &pSRBIn,
177 sizeof(SRBOS2),
178 &ulParam,
179 (void*) pSRBOut,
180 sizeof(SRBOS2),
181 &ulReturn);
182
183}
184
Note: See TracBrowser for help on using the repository browser.