Changeset 6086 for trunk/src/kernel32/hmdisk.cpp
- Timestamp:
- Jun 23, 2001, 9:43:50 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r6053 r6086 1 /* $Id: hmdisk.cpp,v 1.1 1 2001-06-20 20:51:57sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.12 2001-06-23 19:43:50 sandervl Exp $ */ 2 2 3 3 /* … … 25 25 #include "dbglocal.h" 26 26 27 static HINSTANCE hInstAspi = 0; 28 static DWORD (WIN32API *GetASPI32SupportInfo)() = NULL; 29 static DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB) = NULL; 27 typedef struct 28 { 29 HINSTANCE hInstAspi; 30 DWORD (WIN32API *GetASPI32SupportInfo)(); 31 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB); 32 ULONG driveLetter; 33 CHAR signature[8]; 34 } DRIVE_INFO; 30 35 31 36 HMDeviceDiskClass::HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) … … 117 122 else pHMHandleData->hHMHandle = hFile; 118 123 119 pHMHandleData->dwUserData = *lpFileName; //save drive letter 120 if(pHMHandleData->dwUserData >= 'a') { 121 pHMHandleData->dwUserData = pHMHandleData->dwUserData - ((int)'a' - (int)'A'); 122 } 123 124 if(GetDriveTypeA(lpFileName) == DRIVE_CDROM && hInstAspi == NULL) { 125 hInstAspi = LoadLibraryA("WNASPI32.DLL"); 126 if(hInstAspi == NULL) { 124 DRIVE_INFO *drvInfo = (DRIVE_INFO *)malloc(sizeof(DRIVE_INFO)); 125 if(drvInfo == NULL) { 126 if(pHMHandleData->hHMHandle) OSLibDosClose(pHMHandleData->hHMHandle); 127 return ERROR_OUTOFMEMORY; 128 } 129 pHMHandleData->dwUserData = (DWORD)drvInfo; 130 131 memset(drvInfo, 0, sizeof(DRIVE_INFO)); 132 drvInfo->driveLetter = *lpFileName; //save drive letter 133 if(drvInfo->driveLetter >= 'a') { 134 drvInfo->driveLetter = drvInfo->driveLetter - ((int)'a' - (int)'A'); 135 } 136 137 if(GetDriveTypeA(lpFileName) == DRIVE_CDROM) { 138 drvInfo->hInstAspi = LoadLibraryA("WNASPI32.DLL"); 139 if(drvInfo->hInstAspi == NULL) { 140 if(pHMHandleData->hHMHandle) OSLibDosClose(pHMHandleData->hHMHandle); 141 free(drvInfo); 127 142 return ERROR_INVALID_PARAMETER; 128 143 } 129 *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo"); 130 *(FARPROC *)&SendASPI32Command = GetProcAddress(hInstAspi, "SendASPI32Command"); 144 *(FARPROC *)&drvInfo->GetASPI32SupportInfo = GetProcAddress(drvInfo->hInstAspi, "GetASPI32SupportInfo"); 145 *(FARPROC *)&drvInfo->SendASPI32Command = GetProcAddress(drvInfo->hInstAspi, "SendASPI32Command"); 146 147 //get cdrom signature (TODO: why doesn't this work???) 148 DWORD parsize = 4; 149 DWORD datasize = 4; 150 strcpy(drvInfo->signature, "CD01"); 151 OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, &drvInfo->signature[0], 4, &parsize, 152 &drvInfo->signature[0], 4, &datasize); 131 153 } 132 154 return (NO_ERROR); … … 141 163 BOOL HMDeviceDiskClass::CloseHandle(PHMHANDLEDATA pHMHandleData) 142 164 { 165 BOOL ret = TRUE; 166 143 167 if(pHMHandleData->hHMHandle) { 144 return OSLibDosClose(pHMHandleData->hHMHandle); 145 } 146 return TRUE; 168 ret = OSLibDosClose(pHMHandleData->hHMHandle); 169 } 170 if(pHMHandleData->dwUserData) { 171 DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData; 172 if(drvInfo->hInstAspi) FreeLibrary(drvInfo->hInstAspi); 173 free(drvInfo); 174 } 175 return ret; 147 176 } 148 177 //****************************************************************************** … … 349 378 } 350 379 if(msg) { 351 dprintf(("HMDeviceDiskClass::DeviceIoControl %s", msg)); 380 dprintf(("HMDeviceDiskClass::DeviceIoControl %s %x %d %x %d %x %x", msg, lpInBuffer, nInBufferSize, 381 lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped)); 352 382 } 353 383 #endif 354 384 385 DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData; 386 if(drvInfo == NULL) { 387 dprintf(("ERROR: DeviceIoControl: drvInfo == NULL!!!")); 388 DebugInt3(); 389 SetLastError(ERROR_INVALID_HANDLE); 390 return FALSE; 391 } 355 392 switch(dwIoControlCode) 356 393 { … … 385 422 *lpBytesReturned = 0; 386 423 } 387 if(OSLibDosGetDiskGeometry(pHMHandleData->hHMHandle, pHMHandleData->dwUserData, pGeom) == FALSE) {424 if(OSLibDosGetDiskGeometry(pHMHandleData->hHMHandle, drvInfo->driveLetter, pGeom) == FALSE) { 388 425 return FALSE; 389 426 } … … 414 451 case IOCTL_CDROM_PAUSE_AUDIO: 415 452 case IOCTL_CDROM_RESUME_AUDIO: 453 break; 454 416 455 case IOCTL_CDROM_GET_VOLUME: 456 { 457 PVOLUME_CONTROL pVol = (PVOLUME_CONTROL)lpOutBuffer; 458 char volbuf[8]; 459 DWORD parsize, datasize, ret; 460 461 if(nOutBufferSize < sizeof(VOLUME_CONTROL) || !pVol) { 462 SetLastError(ERROR_INSUFFICIENT_BUFFER); 463 return FALSE; 464 } 465 if(lpBytesReturned) { 466 *lpBytesReturned = 0; 467 } 468 parsize = 4; 469 datasize = 8; 470 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, "CD01", 4, &parsize, 471 volbuf, 8, &datasize); 472 473 if(ret) { 474 SetLastError(error2WinError(ret)); 475 return FALSE; 476 } 477 if(lpBytesReturned) { 478 *lpBytesReturned = sizeof(VOLUME_CONTROL); 479 } 480 pVol->PortVolume[0] = volbuf[1]; 481 pVol->PortVolume[1] = volbuf[3]; 482 pVol->PortVolume[2] = volbuf[5]; 483 pVol->PortVolume[3] = volbuf[7]; 484 SetLastError(ERROR_SUCCESS); 485 return TRUE; 486 } 487 417 488 case IOCTL_CDROM_SET_VOLUME: 489 { 490 PVOLUME_CONTROL pVol = (PVOLUME_CONTROL)lpInBuffer; 491 char volbuf[8]; 492 DWORD parsize, datasize, ret; 493 494 if(nInBufferSize < sizeof(VOLUME_CONTROL) || !pVol) { 495 SetLastError(ERROR_INSUFFICIENT_BUFFER); 496 return FALSE; 497 } 498 if(lpBytesReturned) { 499 *lpBytesReturned = 0; 500 } 501 parsize = 4; 502 datasize = 8; 503 volbuf[0] = 0; 504 volbuf[1] = pVol->PortVolume[0]; 505 volbuf[2] = 1; 506 volbuf[3] = pVol->PortVolume[1]; 507 volbuf[4] = 2; 508 volbuf[5] = pVol->PortVolume[2]; 509 volbuf[6] = 3; 510 volbuf[7] = pVol->PortVolume[3]; 511 dprintf(("Set CD volume (%d,%d)(%d,%d)", pVol->PortVolume[0], pVol->PortVolume[1], pVol->PortVolume[2], pVol->PortVolume[3])); 512 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x40, "CD01", 4, &parsize, 513 volbuf, 8, &datasize); 514 515 if(ret) { 516 SetLastError(error2WinError(ret)); 517 return FALSE; 518 } 519 SetLastError(ERROR_SUCCESS); 520 return TRUE; 521 } 418 522 case IOCTL_CDROM_READ_Q_CHANNEL: 419 523 case IOCTL_CDROM_GET_LAST_SESSION: … … 432 536 case IOCTL_STORAGE_CHECK_VERIFY: 433 537 if(lpBytesReturned) { 434 lpBytesReturned = 0;538 *lpBytesReturned = 0; 435 539 } 436 540 //TODO: check if disk has been inserted or removed … … 458 562 SRB_ExecSCSICmd *psrb; 459 563 460 if( hInstAspi == NULL) {564 if(drvInfo->hInstAspi == NULL) { 461 565 SetLastError(ERROR_ACCESS_DENIED); 462 566 return FALSE; … … 508 612 } 509 613 //TODO: pPacket->TimeOutValue ignored 510 int rc = SendASPI32Command((LPSRB)psrb);614 int rc = drvInfo->SendASPI32Command((LPSRB)psrb); 511 615 if(rc != SS_COMP) { 512 616 dprintf(("SendASPI32Command failed with error %d", rc)); … … 542 646 addr->PortNumber = 0; 543 647 addr->PathId = 0; 544 numAdapters = GetASPI32SupportInfo();648 numAdapters = drvInfo->GetASPI32SupportInfo(); 545 649 if(LOBYTE(numAdapters) == 0) goto failure; 546 650 547 651 memset(&srb, 0, sizeof(srb)); 548 652 srb.common.SRB_Cmd = SC_HA_INQUIRY; 549 rc = SendASPI32Command(&srb);653 rc = drvInfo->SendASPI32Command(&srb); 550 654 551 655 char drivename[3]; 552 drivename[0] = (char) pHMHandleData->dwUserData;656 drivename[0] = (char)drvInfo->driveLetter; 553 657 drivename[1] = ':'; 554 658 drivename[2] = 0; … … 562 666 srb.devtype.SRB_Target = j; 563 667 srb.devtype.SRB_Lun = k; 564 rc = SendASPI32Command(&srb);668 rc = drvInfo->SendASPI32Command(&srb); 565 669 if(rc == SS_COMP) { 566 670 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
Note:
See TracChangeset
for help on using the changeset viewer.