Changeset 588 for GPL/branches/uniaud32-2.1.x/drv32/dispatch.c
- Timestamp:
- Feb 10, 2017, 2:50:49 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-2.1.x/drv32/dispatch.c
r543 r588 30 30 #include <devhelp.h> 31 31 #include <devtype.h> 32 #include < devrp.h>32 #include <strategy.h> 33 33 #include "devown.h" 34 34 #include <ossidc.h> … … 36 36 #include <version.h> 37 37 38 extern "C"int cdecl printk(const char * fmt, ...);38 extern int cdecl printk(const char * fmt, ...); 39 39 //****************************************************************************** 40 40 // Dispatch IOCtl requests received from the Strategy routine 41 41 //****************************************************************************** 42 extern "C"int GetUniaudCardInfo(ULONG deviceid, void *info);43 extern "C"int GetUniaudControlNum(ULONG deviceid);44 extern "C"int GetUniaudControls(ULONG deviceid, void *pids);45 extern "C"int GetUniaudControlInfo(ULONG deviceid, ULONG id, void *info);46 extern "C"int GetUniaudControlValueGet(ULONG deviceid, ULONG id, void *value);47 extern "C"int GetUniaudControlValuePut(ULONG deviceid, ULONG id, void *value);48 extern "C"int GetNumberOfPcm(int card_id);49 extern "C"int GetUniaudPcmCaps(ULONG deviceid, void *caps);50 extern "C"int SetPCMInstance(int card_id, int pcm);51 extern "C"int WaitForControlChange(int card_id, int timeout);52 extern "C"int GetNumberOfCards(void);53 extern "C"OSSRET OSS32_WaveOpen(ULONG deviceid, ULONG streamtype, OSSSTREAMID *pStreamId, int pcm, USHORT fileid);54 extern "C"OSSRET OSS32_WaveClose(OSSSTREAMID streamid);55 extern "C"int UniaudIoctlHWRefine(OSSSTREAMID streamid, void *pHwParams);56 extern "C"int UniaudIoctlHWParamSet(OSSSTREAMID streamid, void *pHwParams);57 extern "C"int UniaudIoctlSWParamSet(OSSSTREAMID streamid, void *pSwParams);58 extern "C"int UniaudIoctlPCMStatus(OSSSTREAMID streamid, void *pstatus);59 extern "C"int UniaudIoctlPCMWrite(OSSSTREAMID streamid, char *buf, int size);60 extern "C"int UniaudIoctlPCMRead(OSSSTREAMID streamid, char *buf, int size);61 extern "C"int UniaudIoctlPCMPrepare(OSSSTREAMID streamid);62 extern "C"int UniaudIoctlPCMStart(OSSSTREAMID streamid);63 extern "C"int UniaudIoctlPCMDrop(OSSSTREAMID streamid);64 extern "C"int UniaudIoctlPCMResume(OSSSTREAMID streamid, int pause);65 extern "C"void UniaudCloseAll(USHORT fileid);66 extern "C"int WaitForPCMInterrupt(void *file, int timeout);67 extern "C"int unlock_all;68 extern "C"int OSS32_CloseUNI16(void);69 extern "C"int UniaudCtlGetPowerState(ULONG deviceid, void *state);70 extern "C"int UniaudCtlSetPowerState(ULONG deviceid, void *state);42 extern int GetUniaudCardInfo(ULONG deviceid, void *info); 43 extern int GetUniaudControlNum(ULONG deviceid); 44 extern int GetUniaudControls(ULONG deviceid, void *pids); 45 extern int GetUniaudControlInfo(ULONG deviceid, ULONG id, void *info); 46 extern int GetUniaudControlValueGet(ULONG deviceid, ULONG id, void *value); 47 extern int GetUniaudControlValuePut(ULONG deviceid, ULONG id, void *value); 48 extern int GetNumberOfPcm(int card_id); 49 extern int GetUniaudPcmCaps(ULONG deviceid, void *caps); 50 extern int SetPCMInstance(int card_id, int pcm); 51 extern int WaitForControlChange(int card_id, int timeout); 52 extern int GetNumberOfCards(void); 53 extern OSSRET OSS32_WaveOpen(ULONG deviceid, ULONG streamtype, OSSSTREAMID *pStreamId, int pcm, USHORT fileid); 54 extern OSSRET OSS32_WaveClose(OSSSTREAMID streamid); 55 extern int UniaudIoctlHWRefine(OSSSTREAMID streamid, void *pHwParams); 56 extern int UniaudIoctlHWParamSet(OSSSTREAMID streamid, void *pHwParams); 57 extern int UniaudIoctlSWParamSet(OSSSTREAMID streamid, void *pSwParams); 58 extern int UniaudIoctlPCMStatus(OSSSTREAMID streamid, void *pstatus); 59 extern int UniaudIoctlPCMWrite(OSSSTREAMID streamid, char *buf, int size); 60 extern int UniaudIoctlPCMRead(OSSSTREAMID streamid, char *buf, int size); 61 extern int UniaudIoctlPCMPrepare(OSSSTREAMID streamid); 62 extern int UniaudIoctlPCMStart(OSSSTREAMID streamid); 63 extern int UniaudIoctlPCMDrop(OSSSTREAMID streamid); 64 extern int UniaudIoctlPCMResume(OSSSTREAMID streamid, int pause); 65 extern void UniaudCloseAll(USHORT fileid); 66 extern int WaitForPCMInterrupt(void *file, int timeout); 67 extern int unlock_all; 68 extern int OSS32_CloseUNI16(void); 69 extern int UniaudCtlGetPowerState(ULONG deviceid, void *state); 70 extern int UniaudCtlSetPowerState(ULONG deviceid, void *state); 71 71 72 72 typedef UCHAR LOCKHANDLE[12]; … … 85 85 #pragma pack() 86 86 87 ULONG StratIOCtl(R P __far* _rp)87 ULONG StratIOCtl(REQPACKET __far* rp) 88 88 { 89 RPIOCtl __far* rp = (RPIOCtl __far*)_rp;90 89 USHORT rc = 0;; 91 90 LOCKHANDLE lhParm, lhData; … … 96 95 ULONG ctl_id; 97 96 98 if (rp-> Category != CAT_IOCTL_OSS32)99 { 100 //printk("not our cat %x. func %x\n", rp->Category, rp->Function);97 if (rp->ioctl.bCategory != CAT_IOCTL_OSS32) 98 { 99 //printk("not our cat %x. func %x\n", rp->Category, rp->Function); 101 100 // not our category, exit with error 102 return (RPERR_ COMMAND | RPDONE);101 return (RPERR_BADCOMMAND | RPDONE); 103 102 } 104 103 105 #ifdef DEBUG104 #ifdef DEBUG 106 105 //printk("StratIOCtl 0x%x\n", rp->Function); 107 #endif108 // printk("cmd: %x, len: %i, pack: %x\n",rp->Function, rp->ParmLength, rp->ParmPacket);106 #endif 107 // printk("cmd: %x, len: %i, pack: %x\n",rp->Function, rp->ioctl.usParmLen, rp->ParmPacket); 109 108 // work with Parm Packet 110 if ((rp-> ParmLength!= 0 ||111 rp-> Function == IOCTL_OSS32_ATTACH /*16 bit ioctl*/) &&112 ((rp-> ParmPacket& 0xfffcffff) != 0))109 if ((rp->ioctl.usParmLen != 0 || 110 rp->ioctl.bFunction == IOCTL_OSS32_ATTACH /*16 bit ioctl*/) && 111 ((rp->ioctl.pvParm & 0xfffcffff) != 0)) 113 112 { 114 113 // got Parm Packet 115 rc = DevVirtToLin((USHORT)((ULONG)(rp-> ParmPacket) >> 16),116 (ULONG)((USHORT)(rp-> ParmPacket)),114 rc = DevVirtToLin((USHORT)((ULONG)(rp->ioctl.pvParm) >> 16), 115 (ULONG)((USHORT)(rp->ioctl.pvParm)), 117 116 (UCHAR * __far *)&linParm); 118 117 119 118 if (rc == 0) 120 119 { 121 if (rp->Function == IOCTL_OSS32_ATTACH) 122 { 123 rc = DevVMLock(VMDHL_LONG, 124 (ULONG)linParm, 125 4, 126 (LINEAR)-1L, 127 lhParm, 128 (UCHAR*)&pages); 129 }else 130 { 131 rc = DevVMLock(VMDHL_LONG, 132 (ULONG)linParm, 133 rp->ParmLength, 134 (LINEAR)-1L, 135 lhParm, 136 (UCHAR*)&pages); 120 if (rp->ioctl.bFunction == IOCTL_OSS32_ATTACH) 121 { 122 rc = DevVMLock(VMDHL_LONG, (ULONG)linParm, 4, (LINEAR)-1L, lhParm, (UCHAR*)&pages); 123 } 124 else 125 { 126 rc = DevVMLock(VMDHL_LONG, (ULONG)linParm, rp->ioctl.usParmLen, (LINEAR)-1L, lhParm, (UCHAR*)&pages); 137 127 } 138 128 … … 154 144 155 145 // work with Data Packet 156 if ((rp-> DataLength!= 0) &&157 ((rp-> DataPacket& 0xfffcffff) != 0))146 if ((rp->ioctl.usDataLen != 0) && 147 ((rp->ioctl.pvData & 0xfffcffff) != 0)) 158 148 { 159 149 // got Data Packet 160 rc = DevVirtToLin((USHORT)((ULONG)(rp-> DataPacket) >> 16),161 (ULONG)((USHORT)(rp-> DataPacket)),150 rc = DevVirtToLin((USHORT)((ULONG)(rp->ioctl.pvData) >> 16), 151 (ULONG)((USHORT)(rp->ioctl.pvData)), 162 152 (UCHAR * __far *)&linData); 163 153 if (rc == 0) 164 154 { 165 rc = DevVMLock(VMDHL_LONG, 166 (ULONG)linData, 167 rp->DataLength, 168 (LINEAR)-1L, 169 lhData, 155 rc = DevVMLock(VMDHL_LONG, (ULONG)linData, rp->ioctl.usDataLen, (LINEAR)-1L, lhData, 170 156 (UCHAR*)&pages); 171 157 } else … … 193 179 rc = RPDONE; // ok by default 194 180 195 switch(rp-> Function)181 switch(rp->ioctl.bFunction) 196 182 { 197 183 case IOCTL_OSS32_ATTACH: … … 199 185 card_id = (ULONG) *linParm; 200 186 // Check if audio init was successful 201 if (OSS32_QueryNames(card_id, NULL, 0, 202 NULL, 0, FALSE) != OSSERR_SUCCESS) 187 if (OSS32_QueryNames(card_id, NULL, 0, NULL, 0, FALSE) != OSSERR_SUCCESS) 203 188 { 204 189 rc = RPERR_GENERAL | RPDONE; … … 208 193 case IOCTL_OSS32_VERSION: 209 194 { 210 if (rp-> DataLength< sizeof(ULONG))195 if (rp->ioctl.usDataLen < sizeof(ULONG)) 211 196 { 212 197 // invalid Data Pkt … … 221 206 case IOCTL_OSS32_GET_PCM_NUM: 222 207 { 223 if (rp-> DataLength< sizeof(ULONG))208 if (rp->ioctl.usDataLen < sizeof(ULONG)) 224 209 { 225 210 // invalid Data Pkt … … 234 219 235 220 case IOCTL_OSS32_CARDS_NUM: 236 if (rp-> DataLength< sizeof(ULONG))221 if (rp->ioctl.usDataLen < sizeof(ULONG)) 237 222 { 238 223 // invalid Data Pkt … … 246 231 case IOCTL_OSS32_PCM_CAPS: 247 232 { 248 if (rp-> DataLength< sizeof(ULONG))233 if (rp->ioctl.usDataLen < sizeof(ULONG)) 249 234 { 250 235 // invalid Data Pkt … … 259 244 case IOCTL_OSS32_CARD_INFO: 260 245 { 261 if (rp-> DataLength< sizeof(ULONG))246 if (rp->ioctl.usDataLen < sizeof(ULONG)) 262 247 { 263 248 // invalid Data Pkt … … 272 257 case IOCTL_OSS32_GET_POWER_STATE: 273 258 { 274 if (rp-> DataLength< sizeof(ULONG))259 if (rp->ioctl.usDataLen < sizeof(ULONG)) 275 260 { 276 261 // invalid Data Pkt … … 285 270 case IOCTL_OSS32_SET_POWER_STATE: 286 271 { 287 if (rp-> DataLength< sizeof(ULONG))272 if (rp->ioctl.usDataLen < sizeof(ULONG)) 288 273 { 289 274 // invalid Data Pkt … … 298 283 case IOCTL_OSS32_GET_CNTRLS_NUM: 299 284 { 300 if (rp-> DataLength< sizeof(ULONG))285 if (rp->ioctl.usDataLen < sizeof(ULONG)) 301 286 { 302 287 // invalid Data Pkt … … 313 298 case IOCTL_OSS32_GET_CNTRLS: 314 299 { 315 if (rp-> DataLength< sizeof(ULONG))300 if (rp->ioctl.usDataLen < sizeof(ULONG)) 316 301 { 317 302 // invalid Data Pkt … … 327 312 { 328 313 329 if (rp-> DataLength< sizeof(ULONG))330 { 331 // invalid Data Pkt 332 rc = RPERR_PARAMETER | RPDONE; 333 break; 334 } 335 336 if (rp-> ParmLength< sizeof(ULONG))314 if (rp->ioctl.usDataLen < sizeof(ULONG)) 315 { 316 // invalid Data Pkt 317 rc = RPERR_PARAMETER | RPDONE; 318 break; 319 } 320 321 if (rp->ioctl.usParmLen < sizeof(ULONG)) 337 322 { 338 323 // invalid Data Pkt … … 351 336 case IOCTL_OSS32_CNTRL_GET: 352 337 { 353 if (rp-> DataLength< sizeof(ULONG))354 { 355 // invalid Data Pkt 356 rc = RPERR_PARAMETER | RPDONE; 357 break; 358 } 359 360 if (rp-> ParmLength< sizeof(ULONG))338 if (rp->ioctl.usDataLen < sizeof(ULONG)) 339 { 340 // invalid Data Pkt 341 rc = RPERR_PARAMETER | RPDONE; 342 break; 343 } 344 345 if (rp->ioctl.usParmLen < sizeof(ULONG)) 361 346 { 362 347 // invalid Data Pkt … … 376 361 { 377 362 378 if (rp-> DataLength< sizeof(ULONG)) {379 // invalid Data Pkt 380 rc = RPERR_PARAMETER | RPDONE; 381 break; 382 } 383 384 if (rp-> ParmLength< sizeof(ULONG)) {363 if (rp->ioctl.usDataLen < sizeof(ULONG)) { 364 // invalid Data Pkt 365 rc = RPERR_PARAMETER | RPDONE; 366 break; 367 } 368 369 if (rp->ioctl.usParmLen < sizeof(ULONG)) { 385 370 // invalid Data Pkt 386 371 rc = RPERR_PARAMETER | RPDONE; … … 399 384 { 400 385 401 if (rp-> ParmLength< sizeof(ULONG))386 if (rp->ioctl.usParmLen < sizeof(ULONG)) 402 387 { 403 388 // invalid Data Pkt … … 414 399 case IOCTL_OSS32_CNTRL_WAIT: 415 400 { 416 if (rp-> DataLength< sizeof(ULONG))401 if (rp->ioctl.usDataLen < sizeof(ULONG)) 417 402 { 418 403 // invalid Data Pkt … … 430 415 ioctl_pcm *pcm = (ioctl_pcm *)linParm; 431 416 // close all pcms from uniaud16 first 432 pcm->ret = OSS32_WaveOpen(pcm->deviceid, pcm->streamtype, pData, pcm->pcm, rp-> FileID);417 pcm->ret = OSS32_WaveOpen(pcm->deviceid, pcm->streamtype, pData, pcm->pcm, rp->ioctl.usSysFileNum); 433 418 } 434 419 break; … … 536 521 default: 537 522 { 538 printk("invalid function code %i\n",rp-> Function);523 printk("invalid function code %i\n",rp->ioctl.bFunction); 539 524 // invalid function code 540 525 rc = RPERR_PARAMETER | RPDONE; … … 561 546 // Dispatch Close requests received from the strategy routine 562 547 //****************************************************************************** 563 ULONG StratClose(R P __far* _rp)548 ULONG StratClose(REQPACKET __far* rp) 564 549 { 565 RPOpenClose __far* rp = (RPOpenClose __far*)_rp;566 567 550 // only called if device successfully opened 568 // printk("strat close\n");551 // printk("strat close\n"); 569 552 numOS2Opens--; 570 553 571 UniaudCloseAll(rp-> FileID);554 UniaudCloseAll(rp->open_close.usSysFileNum); 572 555 573 556 if (numOS2Opens == 0) { 574 deviceOwner = DEV_NO_OWNER;557 deviceOwner = DEV_NO_OWNER; 575 558 } 576 559 return(RPDONE); 577 560 } 578 //****************************************************************************** 579 //****************************************************************************** 561
Note:
See TracChangeset
for help on using the changeset viewer.