1 /** 2 * @file scsi.h 3 * Copyright 2012, 2013 MinGW.org project 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */ 25 #ifndef __SCSI_H 26 #define __SCSI_H 27 #pragma GCC system_header 28 #include <_mingw.h> 29 30 /* 31 * SCSI port and class interface. 32 */ 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 #include "ntddk.h" 39 40 typedef union _CDB { 41 struct _CDB6GENERIC { 42 UCHAR OperationCode; 43 UCHAR Immediate : 1; 44 UCHAR CommandUniqueBits : 4; 45 UCHAR LogicalUnitNumber : 3; 46 UCHAR CommandUniqueBytes[3]; 47 UCHAR Link : 1; 48 UCHAR Flag : 1; 49 UCHAR Reserved : 4; 50 UCHAR VendorUnique : 2; 51 } CDB6GENERIC, *PCDB6GENERIC; 52 53 struct _CDB6READWRITE { 54 UCHAR OperationCode; 55 UCHAR LogicalBlockMsb1 : 5; 56 UCHAR LogicalUnitNumber : 3; 57 UCHAR LogicalBlockMsb0; 58 UCHAR LogicalBlockLsb; 59 UCHAR TransferBlocks; 60 UCHAR Control; 61 } CDB6READWRITE, *PCDB6READWRITE; 62 63 struct _CDB6INQUIRY { 64 UCHAR OperationCode; 65 UCHAR Reserved1 : 5; 66 UCHAR LogicalUnitNumber : 3; 67 UCHAR PageCode; 68 UCHAR IReserved; 69 UCHAR AllocationLength; 70 UCHAR Control; 71 } CDB6INQUIRY, *PCDB6INQUIRY; 72 73 struct _CDB6INQUIRY3 { 74 UCHAR OperationCode; 75 UCHAR EnableVitalProductData : 1; 76 UCHAR CommandSupportData : 1; 77 UCHAR Reserved1 : 6; 78 UCHAR PageCode; 79 UCHAR Reserved2; 80 UCHAR AllocationLength; 81 UCHAR Control; 82 } CDB6INQUIRY3, *PCDB6INQUIRY3; 83 84 struct _CDB6VERIFY { 85 UCHAR OperationCode; 86 UCHAR Fixed : 1; 87 UCHAR ByteCompare : 1; 88 UCHAR Immediate : 1; 89 UCHAR Reserved : 2; 90 UCHAR LogicalUnitNumber : 3; 91 UCHAR VerificationLength[3]; 92 UCHAR Control; 93 } CDB6VERIFY, *PCDB6VERIFY; 94 95 struct _CDB6FORMAT { 96 UCHAR OperationCode; 97 UCHAR FormatControl : 5; 98 UCHAR LogicalUnitNumber : 3; 99 UCHAR FReserved1; 100 UCHAR InterleaveMsb; 101 UCHAR InterleaveLsb; 102 UCHAR FReserved2; 103 } CDB6FORMAT, *PCDB6FORMAT; 104 105 struct _CDB10 { 106 UCHAR OperationCode; 107 UCHAR RelativeAddress : 1; 108 UCHAR Reserved1 : 2; 109 UCHAR ForceUnitAccess : 1; 110 UCHAR DisablePageOut : 1; 111 UCHAR LogicalUnitNumber : 3; 112 UCHAR LogicalBlockByte0; 113 UCHAR LogicalBlockByte1; 114 UCHAR LogicalBlockByte2; 115 UCHAR LogicalBlockByte3; 116 UCHAR Reserved2; 117 UCHAR TransferBlocksMsb; 118 UCHAR TransferBlocksLsb; 119 UCHAR Control; 120 } CDB10, *PCDB10; 121 122 struct _CDB12 { 123 UCHAR OperationCode; 124 UCHAR RelativeAddress : 1; 125 UCHAR Reserved1 : 2; 126 UCHAR ForceUnitAccess : 1; 127 UCHAR DisablePageOut : 1; 128 UCHAR LogicalUnitNumber : 3; 129 UCHAR LogicalBlock[4]; 130 UCHAR TransferLength[4]; 131 UCHAR Reserved2; 132 UCHAR Control; 133 } CDB12, *PCDB12; 134 135 struct _PAUSE_RESUME { 136 UCHAR OperationCode; 137 UCHAR Reserved1 : 5; 138 UCHAR LogicalUnitNumber : 3; 139 UCHAR Reserved2[6]; 140 UCHAR Action; 141 UCHAR Control; 142 } PAUSE_RESUME, *PPAUSE_RESUME; 143 144 struct _READ_TOC { 145 UCHAR OperationCode; 146 UCHAR Reserved0 : 1; 147 UCHAR Msf : 1; 148 UCHAR Reserved1 : 3; 149 UCHAR LogicalUnitNumber : 3; 150 UCHAR Format2 : 4; 151 UCHAR Reserved2 : 4; 152 UCHAR Reserved3[3]; 153 UCHAR StartingTrack; 154 UCHAR AllocationLength[2]; 155 UCHAR Control : 6; 156 UCHAR Format : 2; 157 } READ_TOC, *PREAD_TOC; 158 159 struct _READ_DISK_INFORMATION { 160 UCHAR OperationCode; 161 UCHAR Reserved1 : 5; 162 UCHAR Lun : 3; 163 UCHAR Reserved2[5]; 164 UCHAR AllocationLength[2]; 165 UCHAR Control; 166 } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION; 167 168 struct _READ_TRACK_INFORMATION { 169 UCHAR OperationCode; 170 UCHAR Track : 1; 171 UCHAR Reserved1 : 3; 172 UCHAR Reserved2 : 1; 173 UCHAR Lun : 3; 174 UCHAR BlockAddress[4]; 175 UCHAR Reserved3; 176 UCHAR AllocationLength[2]; 177 UCHAR Control; 178 } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION; 179 180 struct _RESERVE_TRACK_RZONE { 181 UCHAR OperationCode; 182 UCHAR Reserved1[4]; 183 UCHAR ReservationSize[4]; 184 UCHAR Control; 185 } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE; 186 187 struct _SEND_OPC_INFORMATION { 188 UCHAR OperationCode; 189 UCHAR DoOpc : 1; 190 UCHAR Reserved : 7; 191 UCHAR Reserved1[5]; 192 UCHAR ParameterListLength[2]; 193 UCHAR Reserved2; 194 } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION; 195 196 struct _CLOSE_TRACK { 197 UCHAR OperationCode; 198 UCHAR Immediate : 1; 199 UCHAR Reserved1 : 7; 200 UCHAR Track : 1; 201 UCHAR Session : 1; 202 UCHAR Reserved2 : 6; 203 UCHAR Reserved3; 204 UCHAR TrackNumber[2]; 205 UCHAR Reserved4[3]; 206 UCHAR Control; 207 } CLOSE_TRACK, *PCLOSE_TRACK; 208 209 struct _SEND_CUE_SHEET { 210 UCHAR OperationCode; 211 UCHAR Reserved[5]; 212 UCHAR CueSheetSize[3]; 213 UCHAR Control; 214 } SEND_CUE_SHEET, *PSEND_CUE_SHEET; 215 216 struct _READ_HEADER { 217 UCHAR OperationCode; 218 UCHAR Reserved1 : 1; 219 UCHAR Msf : 1; 220 UCHAR Reserved2 : 3; 221 UCHAR Lun : 3; 222 UCHAR LogicalBlockAddress[4]; 223 UCHAR Reserved3; 224 UCHAR AllocationLength[2]; 225 UCHAR Control; 226 } READ_HEADER, *PREAD_HEADER; 227 228 struct _PLAY_AUDIO { 229 UCHAR OperationCode; 230 UCHAR Reserved1 : 5; 231 UCHAR LogicalUnitNumber : 3; 232 UCHAR StartingBlockAddress[4]; 233 UCHAR Reserved2; 234 UCHAR PlayLength[2]; 235 UCHAR Control; 236 } PLAY_AUDIO, *PPLAY_AUDIO; 237 238 struct _PLAY_AUDIO_MSF { 239 UCHAR OperationCode; 240 UCHAR Reserved1 : 5; 241 UCHAR LogicalUnitNumber : 3; 242 UCHAR Reserved2; 243 UCHAR StartingM; 244 UCHAR StartingS; 245 UCHAR StartingF; 246 UCHAR EndingM; 247 UCHAR EndingS; 248 UCHAR EndingF; 249 UCHAR Control; 250 } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF; 251 252 /* FIXME: Should the union be anonymous in C++ too? If so, 253 can't define named types _LBA and _MSF within anonymous union 254 for C++. */ 255 struct _PLAY_CD { 256 UCHAR OperationCode; 257 UCHAR Reserved1 : 1; 258 UCHAR CMSF : 1; 259 UCHAR ExpectedSectorType : 3; 260 UCHAR Lun : 3; 261 #ifndef __cplusplus 262 _ANONYMOUS_UNION 263 #endif 264 union { 265 struct _LBA { 266 UCHAR StartingBlockAddress[4]; 267 UCHAR PlayLength[4]; 268 } LBA; 269 270 struct _MSF { 271 UCHAR Reserved1; 272 UCHAR StartingM; 273 UCHAR StartingS; 274 UCHAR StartingF; 275 UCHAR EndingM; 276 UCHAR EndingS; 277 UCHAR EndingF; 278 UCHAR Reserved2; 279 } MSF; 280 #ifndef __cplusplus 281 }DUMMYUNIONNAME; 282 #else 283 }u; 284 #endif 285 286 UCHAR Audio : 1; 287 UCHAR Composite : 1; 288 UCHAR Port1 : 1; 289 UCHAR Port2 : 1; 290 UCHAR Reserved2 : 3; 291 UCHAR Speed : 1; 292 UCHAR Control; 293 } PLAY_CD, *PPLAY_CD; 294 295 struct _SCAN_CD { 296 UCHAR OperationCode; 297 UCHAR RelativeAddress : 1; 298 UCHAR Reserved1 : 3; 299 UCHAR Direct : 1; 300 UCHAR Lun : 3; 301 UCHAR StartingAddress[4]; 302 UCHAR Reserved2[3]; 303 UCHAR Reserved3 : 6; 304 UCHAR Type : 2; 305 UCHAR Reserved4; 306 UCHAR Control; 307 } SCAN_CD, *PSCAN_CD; 308 309 struct _STOP_PLAY_SCAN { 310 UCHAR OperationCode; 311 UCHAR Reserved1 : 5; 312 UCHAR Lun : 3; 313 UCHAR Reserved2[7]; 314 UCHAR Control; 315 } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN; 316 317 struct _SUBCHANNEL { 318 UCHAR OperationCode; 319 UCHAR Reserved0 : 1; 320 UCHAR Msf : 1; 321 UCHAR Reserved1 : 3; 322 UCHAR LogicalUnitNumber : 3; 323 UCHAR Reserved2 : 6; 324 UCHAR SubQ : 1; 325 UCHAR Reserved3 : 1; 326 UCHAR Format; 327 UCHAR Reserved4[2]; 328 UCHAR TrackNumber; 329 UCHAR AllocationLength[2]; 330 UCHAR Control; 331 } SUBCHANNEL, *PSUBCHANNEL; 332 333 struct _READ_CD { 334 UCHAR OperationCode; 335 UCHAR RelativeAddress : 1; 336 UCHAR Reserved0 : 1; 337 UCHAR ExpectedSectorType : 3; 338 UCHAR Lun : 3; 339 UCHAR StartingLBA[4]; 340 UCHAR TransferBlocks[3]; 341 UCHAR Reserved2 : 1; 342 UCHAR ErrorFlags : 2; 343 UCHAR IncludeEDC : 1; 344 UCHAR IncludeUserData : 1; 345 UCHAR HeaderCode : 2; 346 UCHAR IncludeSyncData : 1; 347 UCHAR SubChannelSelection : 3; 348 UCHAR Reserved3 : 5; 349 UCHAR Control; 350 } READ_CD, *PREAD_CD; 351 352 struct _READ_CD_MSF { 353 UCHAR OperationCode; 354 UCHAR RelativeAddress : 1; 355 UCHAR Reserved1 : 1; 356 UCHAR ExpectedSectorType : 3; 357 UCHAR Lun : 3; 358 UCHAR Reserved2; 359 UCHAR StartingM; 360 UCHAR StartingS; 361 UCHAR StartingF; 362 UCHAR EndingM; 363 UCHAR EndingS; 364 UCHAR EndingF; 365 UCHAR Reserved3; 366 UCHAR Reserved4 : 1; 367 UCHAR ErrorFlags : 2; 368 UCHAR IncludeEDC : 1; 369 UCHAR IncludeUserData : 1; 370 UCHAR HeaderCode : 2; 371 UCHAR IncludeSyncData : 1; 372 UCHAR SubChannelSelection : 3; 373 UCHAR Reserved5 : 5; 374 UCHAR Control; 375 } READ_CD_MSF, *PREAD_CD_MSF; 376 377 struct _PLXTR_READ_CDDA { 378 UCHAR OperationCode; 379 UCHAR Reserved0 : 5; 380 UCHAR LogicalUnitNumber : 3; 381 UCHAR LogicalBlockByte0; 382 UCHAR LogicalBlockByte1; 383 UCHAR LogicalBlockByte2; 384 UCHAR LogicalBlockByte3; 385 UCHAR TransferBlockByte0; 386 UCHAR TransferBlockByte1; 387 UCHAR TransferBlockByte2; 388 UCHAR TransferBlockByte3; 389 UCHAR SubCode; 390 UCHAR Control; 391 } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA; 392 393 struct _NEC_READ_CDDA { 394 UCHAR OperationCode; 395 UCHAR Reserved0; 396 UCHAR LogicalBlockByte0; 397 UCHAR LogicalBlockByte1; 398 UCHAR LogicalBlockByte2; 399 UCHAR LogicalBlockByte3; 400 UCHAR Reserved1; 401 UCHAR TransferBlockByte0; 402 UCHAR TransferBlockByte1; 403 UCHAR Control; 404 } NEC_READ_CDDA, *PNEC_READ_CDDA; 405 406 struct _MODE_SENSE { 407 UCHAR OperationCode; 408 UCHAR Reserved1 : 3; 409 UCHAR Dbd : 1; 410 UCHAR Reserved2 : 1; 411 UCHAR LogicalUnitNumber : 3; 412 UCHAR PageCode : 6; 413 UCHAR Pc : 2; 414 UCHAR Reserved3; 415 UCHAR AllocationLength; 416 UCHAR Control; 417 } MODE_SENSE, *PMODE_SENSE; 418 419 struct _MODE_SENSE10 { 420 UCHAR OperationCode; 421 UCHAR Reserved1 : 3; 422 UCHAR Dbd : 1; 423 UCHAR Reserved2 : 1; 424 UCHAR LogicalUnitNumber : 3; 425 UCHAR PageCode : 6; 426 UCHAR Pc : 2; 427 UCHAR Reserved3[4]; 428 UCHAR AllocationLength[2]; 429 UCHAR Control; 430 } MODE_SENSE10, *PMODE_SENSE10; 431 432 struct _MODE_SELECT { 433 UCHAR OperationCode; 434 UCHAR SPBit : 1; 435 UCHAR Reserved1 : 3; 436 UCHAR PFBit : 1; 437 UCHAR LogicalUnitNumber : 3; 438 UCHAR Reserved2[2]; 439 UCHAR ParameterListLength; 440 UCHAR Control; 441 } MODE_SELECT, *PMODE_SELECT; 442 443 struct _MODE_SELECT10 { 444 UCHAR OperationCode; 445 UCHAR SPBit : 1; 446 UCHAR Reserved1 : 3; 447 UCHAR PFBit : 1; 448 UCHAR LogicalUnitNumber : 3; 449 UCHAR Reserved2[5]; 450 UCHAR ParameterListLength[2]; 451 UCHAR Control; 452 } MODE_SELECT10, *PMODE_SELECT10; 453 454 struct _LOCATE { 455 UCHAR OperationCode; 456 UCHAR Immediate : 1; 457 UCHAR CPBit : 1; 458 UCHAR BTBit : 1; 459 UCHAR Reserved1 : 2; 460 UCHAR LogicalUnitNumber : 3; 461 UCHAR Reserved3; 462 UCHAR LogicalBlockAddress[4]; 463 UCHAR Reserved4; 464 UCHAR Partition; 465 UCHAR Control; 466 } LOCATE, *PLOCATE; 467 468 struct _LOGSENSE { 469 UCHAR OperationCode; 470 UCHAR SPBit : 1; 471 UCHAR PPCBit : 1; 472 UCHAR Reserved1 : 3; 473 UCHAR LogicalUnitNumber : 3; 474 UCHAR PageCode : 6; 475 UCHAR PCBit : 2; 476 UCHAR Reserved2; 477 UCHAR Reserved3; 478 UCHAR ParameterPointer[2]; 479 UCHAR AllocationLength[2]; 480 UCHAR Control; 481 } LOGSENSE, *PLOGSENSE; 482 483 struct _LOGSELECT { 484 UCHAR OperationCode; 485 UCHAR SPBit : 1; 486 UCHAR PCRBit : 1; 487 UCHAR Reserved1 : 3; 488 UCHAR LogicalUnitNumber : 3; 489 UCHAR Reserved : 6; 490 UCHAR PCBit : 2; 491 UCHAR Reserved2[4]; 492 UCHAR ParameterListLength[2]; 493 UCHAR Control; 494 } LOGSELECT, *PLOGSELECT; 495 496 struct _PRINT { 497 UCHAR OperationCode; 498 UCHAR Reserved : 5; 499 UCHAR LogicalUnitNumber : 3; 500 UCHAR TransferLength[3]; 501 UCHAR Control; 502 } PRINT, *PPRINT; 503 504 struct _SEEK { 505 UCHAR OperationCode; 506 UCHAR Reserved1 : 5; 507 UCHAR LogicalUnitNumber : 3; 508 UCHAR LogicalBlockAddress[4]; 509 UCHAR Reserved2[3]; 510 UCHAR Control; 511 } SEEK, *PSEEK; 512 513 struct _ERASE { 514 UCHAR OperationCode; 515 UCHAR Long : 1; 516 UCHAR Immediate : 1; 517 UCHAR Reserved1 : 3; 518 UCHAR LogicalUnitNumber : 3; 519 UCHAR Reserved2[3]; 520 UCHAR Control; 521 } ERASE, *PERASE; 522 523 struct _START_STOP { 524 UCHAR OperationCode; 525 UCHAR Immediate: 1; 526 UCHAR Reserved1 : 4; 527 UCHAR LogicalUnitNumber : 3; 528 UCHAR Reserved2[2]; 529 UCHAR Start : 1; 530 UCHAR LoadEject : 1; 531 UCHAR Reserved3 : 6; 532 UCHAR Control; 533 } START_STOP, *PSTART_STOP; 534 535 struct _MEDIA_REMOVAL { 536 UCHAR OperationCode; 537 UCHAR Reserved1 : 5; 538 UCHAR LogicalUnitNumber : 3; 539 UCHAR Reserved2[2]; 540 541 UCHAR Prevent : 1; 542 UCHAR Persistant : 1; 543 UCHAR Reserved3 : 6; 544 545 UCHAR Control; 546 } MEDIA_REMOVAL, *PMEDIA_REMOVAL; 547 548 struct _SEEK_BLOCK { 549 UCHAR OperationCode; 550 UCHAR Immediate : 1; 551 UCHAR Reserved1 : 7; 552 UCHAR BlockAddress[3]; 553 UCHAR Link : 1; 554 UCHAR Flag : 1; 555 UCHAR Reserved2 : 4; 556 UCHAR VendorUnique : 2; 557 } SEEK_BLOCK, *PSEEK_BLOCK; 558 559 struct _REQUEST_BLOCK_ADDRESS { 560 UCHAR OperationCode; 561 UCHAR Reserved1[3]; 562 UCHAR AllocationLength; 563 UCHAR Link : 1; 564 UCHAR Flag : 1; 565 UCHAR Reserved2 : 4; 566 UCHAR VendorUnique : 2; 567 } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS; 568 569 struct _PARTITION { 570 UCHAR OperationCode; 571 UCHAR Immediate : 1; 572 UCHAR Sel: 1; 573 UCHAR PartitionSelect : 6; 574 UCHAR Reserved1[3]; 575 UCHAR Control; 576 } PARTITION, *PPARTITION; 577 578 struct _WRITE_TAPE_MARKS { 579 UCHAR OperationCode; 580 UCHAR Immediate : 1; 581 UCHAR WriteSetMarks: 1; 582 UCHAR Reserved : 3; 583 UCHAR LogicalUnitNumber : 3; 584 UCHAR TransferLength[3]; 585 UCHAR Control; 586 } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS; 587 588 struct _SPACE_TAPE_MARKS { 589 UCHAR OperationCode; 590 UCHAR Code : 3; 591 UCHAR Reserved : 2; 592 UCHAR LogicalUnitNumber : 3; 593 UCHAR NumMarksMSB ; 594 UCHAR NumMarks; 595 UCHAR NumMarksLSB; 596 union { 597 UCHAR value; 598 struct { 599 UCHAR Link : 1; 600 UCHAR Flag : 1; 601 UCHAR Reserved : 4; 602 UCHAR VendorUnique : 2; 603 } Fields; 604 } Byte6; 605 } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS; 606 607 struct _READ_POSITION { 608 UCHAR Operation; 609 UCHAR BlockType : 1; 610 UCHAR Reserved1 : 4; 611 UCHAR Lun : 3; 612 UCHAR Reserved2[7]; 613 UCHAR Control; 614 } READ_POSITION, *PREAD_POSITION; 615 616 struct _CDB6READWRITETAPE { 617 UCHAR OperationCode; 618 UCHAR VendorSpecific : 5; 619 UCHAR Reserved : 3; 620 UCHAR TransferLenMSB; 621 UCHAR TransferLen; 622 UCHAR TransferLenLSB; 623 UCHAR Link : 1; 624 UCHAR Flag : 1; 625 UCHAR Reserved1 : 4; 626 UCHAR VendorUnique : 2; 627 } CDB6READWRITETAPE, *PCDB6READWRITETAPE; 628 629 struct _INIT_ELEMENT_STATUS { 630 UCHAR OperationCode; 631 UCHAR Reserved1 : 5; 632 UCHAR LogicalUnitNubmer : 3; 633 UCHAR Reserved2[3]; 634 UCHAR Reserved3 : 7; 635 UCHAR NoBarCode : 1; 636 } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS; 637 638 struct _INITIALIZE_ELEMENT_RANGE { 639 UCHAR OperationCode; 640 UCHAR Range : 1; 641 UCHAR Reserved1 : 4; 642 UCHAR LogicalUnitNubmer : 3; 643 UCHAR FirstElementAddress[2]; 644 UCHAR Reserved2[2]; 645 UCHAR NumberOfElements[2]; 646 UCHAR Reserved3; 647 UCHAR Reserved4 : 7; 648 UCHAR NoBarCode : 1; 649 } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE; 650 651 struct _POSITION_TO_ELEMENT { 652 UCHAR OperationCode; 653 UCHAR Reserved1 : 5; 654 UCHAR LogicalUnitNumber : 3; 655 UCHAR TransportElementAddress[2]; 656 UCHAR DestinationElementAddress[2]; 657 UCHAR Reserved2[2]; 658 UCHAR Flip : 1; 659 UCHAR Reserved3 : 7; 660 UCHAR Control; 661 } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT; 662 663 struct _MOVE_MEDIUM { 664 UCHAR OperationCode; 665 UCHAR Reserved1 : 5; 666 UCHAR LogicalUnitNumber : 3; 667 UCHAR TransportElementAddress[2]; 668 UCHAR SourceElementAddress[2]; 669 UCHAR DestinationElementAddress[2]; 670 UCHAR Reserved2[2]; 671 UCHAR Flip : 1; 672 UCHAR Reserved3 : 7; 673 UCHAR Control; 674 } MOVE_MEDIUM, *PMOVE_MEDIUM; 675 676 struct _EXCHANGE_MEDIUM { 677 UCHAR OperationCode; 678 UCHAR Reserved1 : 5; 679 UCHAR LogicalUnitNumber : 3; 680 UCHAR TransportElementAddress[2]; 681 UCHAR SourceElementAddress[2]; 682 UCHAR Destination1ElementAddress[2]; 683 UCHAR Destination2ElementAddress[2]; 684 UCHAR Flip1 : 1; 685 UCHAR Flip2 : 1; 686 UCHAR Reserved3 : 6; 687 UCHAR Control; 688 } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM; 689 690 struct _READ_ELEMENT_STATUS { 691 UCHAR OperationCode; 692 UCHAR ElementType : 4; 693 UCHAR VolTag : 1; 694 UCHAR LogicalUnitNumber : 3; 695 UCHAR StartingElementAddress[2]; 696 UCHAR NumberOfElements[2]; 697 UCHAR Reserved1; 698 UCHAR AllocationLength[3]; 699 UCHAR Reserved2; 700 UCHAR Control; 701 } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS; 702 703 struct _SEND_VOLUME_TAG { 704 UCHAR OperationCode; 705 UCHAR ElementType : 4; 706 UCHAR Reserved1 : 1; 707 UCHAR LogicalUnitNumber : 3; 708 UCHAR StartingElementAddress[2]; 709 UCHAR Reserved2; 710 UCHAR ActionCode : 5; 711 UCHAR Reserved3 : 3; 712 UCHAR Reserved4[2]; 713 UCHAR ParameterListLength[2]; 714 UCHAR Reserved5; 715 UCHAR Control; 716 } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG; 717 718 struct _REQUEST_VOLUME_ELEMENT_ADDRESS { 719 UCHAR OperationCode; 720 UCHAR ElementType : 4; 721 UCHAR VolTag : 1; 722 UCHAR LogicalUnitNumber : 3; 723 UCHAR StartingElementAddress[2]; 724 UCHAR NumberElements[2]; 725 UCHAR Reserved1; 726 UCHAR AllocationLength[3]; 727 UCHAR Reserved2; 728 UCHAR Control; 729 } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS; 730 731 struct _LOAD_UNLOAD { 732 UCHAR OperationCode; 733 UCHAR Immediate : 1; 734 UCHAR Reserved1 : 4; 735 UCHAR Lun : 3; 736 UCHAR Reserved2[2]; 737 UCHAR Start : 1; 738 UCHAR LoadEject : 1; 739 UCHAR Reserved3: 6; 740 UCHAR Reserved4[3]; 741 UCHAR Slot; 742 UCHAR Reserved5[3]; 743 } LOAD_UNLOAD, *PLOAD_UNLOAD; 744 745 struct _MECH_STATUS { 746 UCHAR OperationCode; 747 UCHAR Reserved : 5; 748 UCHAR Lun : 3; 749 UCHAR Reserved1[6]; 750 UCHAR AllocationLength[2]; 751 UCHAR Reserved2[1]; 752 UCHAR Control; 753 } MECH_STATUS, *PMECH_STATUS; 754 755 struct _SYNCHRONIZE_CACHE10 { 756 757 UCHAR OperationCode; 758 759 UCHAR RelAddr : 1; 760 UCHAR Immediate : 1; 761 UCHAR Reserved : 3; 762 UCHAR Lun : 3; 763 764 UCHAR LogicalBlockAddress[4]; 765 UCHAR Reserved2; 766 UCHAR BlockCount[2]; 767 UCHAR Control; 768 } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10; 769 770 struct _GET_EVENT_STATUS_NOTIFICATION { 771 UCHAR OperationCode; 772 773 UCHAR Immediate : 1; 774 UCHAR Reserved : 4; 775 UCHAR Lun : 3; 776 777 UCHAR Reserved2[2]; 778 UCHAR NotificationClassRequest; 779 UCHAR Reserved3[2]; 780 UCHAR EventListLength[2]; 781 782 UCHAR Control; 783 } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION; 784 785 struct _READ_DVD_STRUCTURE { 786 UCHAR OperationCode; 787 UCHAR Reserved1 : 5; 788 UCHAR Lun : 3; 789 UCHAR RMDBlockNumber[4]; 790 UCHAR LayerNumber; 791 UCHAR Format; 792 UCHAR AllocationLength[2]; 793 UCHAR Reserved3 : 6; 794 UCHAR AGID : 2; 795 UCHAR Control; 796 } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE; 797 798 struct _SEND_DVD_STRUCTURE { 799 UCHAR OperationCode; 800 UCHAR Reserved1 : 5; 801 UCHAR Lun : 3; 802 UCHAR Reserved2[5]; 803 UCHAR Format; 804 UCHAR ParameterListLength[2]; 805 UCHAR Reserved3; 806 UCHAR Control; 807 } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE; 808 809 struct _SEND_KEY { 810 UCHAR OperationCode; 811 UCHAR Reserved1 : 5; 812 UCHAR Lun : 3; 813 UCHAR Reserved2[6]; 814 UCHAR ParameterListLength[2]; 815 UCHAR KeyFormat : 6; 816 UCHAR AGID : 2; 817 UCHAR Control; 818 } SEND_KEY, *PSEND_KEY; 819 820 struct _REPORT_KEY { 821 UCHAR OperationCode; 822 UCHAR Reserved1 : 5; 823 UCHAR Lun : 3; 824 UCHAR LogicalBlockAddress[4]; 825 UCHAR Reserved2[2]; 826 UCHAR AllocationLength[2]; 827 UCHAR KeyFormat : 6; 828 UCHAR AGID : 2; 829 UCHAR Control; 830 } REPORT_KEY, *PREPORT_KEY; 831 832 struct _SET_READ_AHEAD { 833 UCHAR OperationCode; 834 UCHAR Reserved1 : 5; 835 UCHAR Lun : 3; 836 UCHAR TriggerLBA[4]; 837 UCHAR ReadAheadLBA[4]; 838 UCHAR Reserved2; 839 UCHAR Control; 840 } SET_READ_AHEAD, *PSET_READ_AHEAD; 841 842 struct _READ_FORMATTED_CAPACITIES { 843 UCHAR OperationCode; 844 UCHAR Reserved1 : 5; 845 UCHAR Lun : 3; 846 UCHAR Reserved2[5]; 847 UCHAR AllocationLength[2]; 848 UCHAR Control; 849 } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES; 850 851 struct _REPORT_LUNS { 852 UCHAR OperationCode; 853 UCHAR Reserved1[5]; 854 UCHAR AllocationLength[4]; 855 UCHAR Reserved2[1]; 856 UCHAR Control; 857 } REPORT_LUNS, *PREPORT_LUNS; 858 859 struct _PERSISTENT_RESERVE_IN { 860 UCHAR OperationCode; 861 UCHAR ServiceAction : 5; 862 UCHAR Reserved1 : 3; 863 UCHAR Reserved2[5]; 864 UCHAR AllocationLength[2]; 865 UCHAR Control; 866 } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN; 867 868 struct _PERSISTENT_RESERVE_OUT { 869 UCHAR OperationCode; 870 UCHAR ServiceAction : 5; 871 UCHAR Reserved1 : 3; 872 UCHAR Type : 4; 873 UCHAR Scope : 4; 874 UCHAR Reserved2[4]; 875 UCHAR ParameterListLength[2]; 876 UCHAR Control; 877 } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT; 878 879 struct _GET_CONFIGURATION { 880 UCHAR OperationCode; 881 UCHAR RequestType : 1; 882 UCHAR Reserved1 : 7; 883 UCHAR StartingFeature[2]; 884 UCHAR Reserved2[3]; 885 UCHAR AllocationLength[2]; 886 UCHAR Control; 887 } GET_CONFIGURATION, *PGET_CONFIGURATION; 888 889 struct _SET_CD_SPEED { 890 UCHAR OperationCode; 891 UCHAR Reserved1; 892 UCHAR ReadSpeed[2]; 893 UCHAR WriteSpeed[2]; 894 UCHAR Reserved2[5]; 895 UCHAR Control; 896 } SET_CD_SPEED, *PSET_CD_SPEED; 897 898 ULONG AsUlong[4]; 899 UCHAR AsByte[16]; 900 } CDB, *PCDB; 901 902 #ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */ 903 #define _INQUIRYDATA_DEFINED 904 905 #define INQUIRYDATABUFFERSIZE 36 906 907 typedef struct _INQUIRYDATA { 908 UCHAR DeviceType : 5; 909 UCHAR DeviceTypeQualifier : 3; 910 UCHAR DeviceTypeModifier : 7; 911 UCHAR RemovableMedia : 1; 912 _ANONYMOUS_UNION union { 913 UCHAR Versions; 914 _ANONYMOUS_STRUCT struct { 915 UCHAR ANSIVersion : 3; 916 UCHAR ECMAVersion : 3; 917 UCHAR ISOVersion : 2; 918 } DUMMYSTRUCTNAME; 919 } DUMMYUNIONNAME; 920 UCHAR ResponseDataFormat : 4; 921 UCHAR HiSupport : 1; 922 UCHAR NormACA : 1; 923 UCHAR TerminateTask : 1; 924 UCHAR AERC : 1; 925 UCHAR AdditionalLength; 926 UCHAR Reserved; 927 UCHAR Addr16 : 1; 928 UCHAR Addr32 : 1; 929 UCHAR AckReqQ: 1; 930 UCHAR MediumChanger : 1; 931 UCHAR MultiPort : 1; 932 UCHAR ReservedBit2 : 1; 933 UCHAR EnclosureServices : 1; 934 UCHAR ReservedBit3 : 1; 935 UCHAR SoftReset : 1; 936 UCHAR CommandQueue : 1; 937 UCHAR TransferDisable : 1; 938 UCHAR LinkedCommands : 1; 939 UCHAR Synchronous : 1; 940 UCHAR Wide16Bit : 1; 941 UCHAR Wide32Bit : 1; 942 UCHAR RelativeAddressing : 1; 943 UCHAR VendorId[8]; 944 UCHAR ProductId[16]; 945 UCHAR ProductRevisionLevel[4]; 946 UCHAR VendorSpecific[20]; 947 UCHAR Reserved3[40]; 948 } INQUIRYDATA, *PINQUIRYDATA; 949 #endif 950 951 /* INQUIRYDATA.DeviceType constants */ 952 #define DIRECT_ACCESS_DEVICE 0x00 953 #define SEQUENTIAL_ACCESS_DEVICE 0x01 954 #define PRINTER_DEVICE 0x02 955 #define PROCESSOR_DEVICE 0x03 956 #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04 957 #define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05 958 #define SCANNER_DEVICE 0x06 959 #define OPTICAL_DEVICE 0x07 960 #define MEDIUM_CHANGER 0x08 961 #define COMMUNICATION_DEVICE 0x09 962 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F 963 #define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03 964 965 /* INQUIRYDATA.DeviceTypeQualifier constants */ 966 #define DEVICE_CONNECTED 0x00 967 968 #define SCSISTAT_GOOD 0x00 969 #define SCSISTAT_CHECK_CONDITION 0x02 970 #define SCSISTAT_CONDITION_MET 0x04 971 #define SCSISTAT_BUSY 0x08 972 #define SCSISTAT_INTERMEDIATE 0x10 973 #define SCSISTAT_INTERMEDIATE_COND_MET 0x14 974 #define SCSISTAT_RESERVATION_CONFLICT 0x18 975 #define SCSISTAT_COMMAND_TERMINATED 0x22 976 #define SCSISTAT_QUEUE_FULL 0x28 977 978 /* Mode Sense/Select page constants */ 979 #define MODE_PAGE_ERROR_RECOVERY 0x01 980 #define MODE_PAGE_DISCONNECT 0x02 981 #define MODE_PAGE_FORMAT_DEVICE 0x03 982 #define MODE_PAGE_RIGID_GEOMETRY 0x04 983 #define MODE_PAGE_FLEXIBILE 0x05 984 #define MODE_PAGE_WRITE_PARAMETERS 0x05 985 #define MODE_PAGE_VERIFY_ERROR 0x07 986 #define MODE_PAGE_CACHING 0x08 987 #define MODE_PAGE_PERIPHERAL 0x09 988 #define MODE_PAGE_CONTROL 0x0A 989 #define MODE_PAGE_MEDIUM_TYPES 0x0B 990 #define MODE_PAGE_NOTCH_PARTITION 0x0C 991 #define MODE_PAGE_CD_AUDIO_CONTROL 0x0E 992 #define MODE_PAGE_DATA_COMPRESS 0x0F 993 #define MODE_PAGE_DEVICE_CONFIG 0x10 994 #define MODE_PAGE_MEDIUM_PARTITION 0x11 995 #define MODE_PAGE_CDVD_FEATURE_SET 0x18 996 #define MODE_PAGE_POWER_CONDITION 0x1A 997 #define MODE_PAGE_FAULT_REPORTING 0x1C 998 #define MODE_PAGE_CDVD_INACTIVITY 0x1D 999 #define MODE_PAGE_ELEMENT_ADDRESS 0x1D 1000 #define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E 1001 #define MODE_PAGE_DEVICE_CAPABILITIES 0x1F 1002 #define MODE_PAGE_CAPABILITIES 0x2A 1003 #define MODE_SENSE_RETURN_ALL 0x3f 1004 #define MODE_SENSE_CURRENT_VALUES 0x00 1005 #define MODE_SENSE_CHANGEABLE_VALUES 0x40 1006 #define MODE_SENSE_DEFAULT_VAULES 0x80 1007 #define MODE_SENSE_SAVED_VALUES 0xc0 1008 1009 /* SCSI CDB operation codes */ 1010 #define SCSIOP_TEST_UNIT_READY 0x00 1011 #define SCSIOP_REZERO_UNIT 0x01 1012 #define SCSIOP_REWIND 0x01 1013 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02 1014 #define SCSIOP_REQUEST_SENSE 0x03 1015 #define SCSIOP_FORMAT_UNIT 0x04 1016 #define SCSIOP_READ_BLOCK_LIMITS 0x05 1017 #define SCSIOP_REASSIGN_BLOCKS 0x07 1018 #define SCSIOP_INIT_ELEMENT_STATUS 0x07 1019 #define SCSIOP_READ6 0x08 1020 #define SCSIOP_RECEIVE 0x08 1021 #define SCSIOP_WRITE6 0x0A 1022 #define SCSIOP_PRINT 0x0A 1023 #define SCSIOP_SEND 0x0A 1024 #define SCSIOP_SEEK6 0x0B 1025 #define SCSIOP_TRACK_SELECT 0x0B 1026 #define SCSIOP_SLEW_PRINT 0x0B 1027 #define SCSIOP_SEEK_BLOCK 0x0C 1028 #define SCSIOP_PARTITION 0x0D 1029 #define SCSIOP_READ_REVERSE 0x0F 1030 #define SCSIOP_WRITE_FILEMARKS 0x10 1031 #define SCSIOP_FLUSH_BUFFER 0x10 1032 #define SCSIOP_SPACE 0x11 1033 #define SCSIOP_INQUIRY 0x12 1034 #define SCSIOP_VERIFY6 0x13 1035 #define SCSIOP_RECOVER_BUF_DATA 0x14 1036 #define SCSIOP_MODE_SELECT 0x15 1037 #define SCSIOP_RESERVE_UNIT 0x16 1038 #define SCSIOP_RELEASE_UNIT 0x17 1039 #define SCSIOP_COPY 0x18 1040 #define SCSIOP_ERASE 0x19 1041 #define SCSIOP_MODE_SENSE 0x1A 1042 #define SCSIOP_START_STOP_UNIT 0x1B 1043 #define SCSIOP_STOP_PRINT 0x1B 1044 #define SCSIOP_LOAD_UNLOAD 0x1B 1045 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C 1046 #define SCSIOP_SEND_DIAGNOSTIC 0x1D 1047 #define SCSIOP_MEDIUM_REMOVAL 0x1E 1048 1049 #define SCSIOP_READ_FORMATTED_CAPACITY 0x23 1050 #define SCSIOP_READ_CAPACITY 0x25 1051 #define SCSIOP_READ 0x28 1052 #define SCSIOP_WRITE 0x2A 1053 #define SCSIOP_SEEK 0x2B 1054 #define SCSIOP_LOCATE 0x2B 1055 #define SCSIOP_POSITION_TO_ELEMENT 0x2B 1056 #define SCSIOP_WRITE_VERIFY 0x2E 1057 #define SCSIOP_VERIFY 0x2F 1058 #define SCSIOP_SEARCH_DATA_HIGH 0x30 1059 #define SCSIOP_SEARCH_DATA_EQUAL 0x31 1060 #define SCSIOP_SEARCH_DATA_LOW 0x32 1061 #define SCSIOP_SET_LIMITS 0x33 1062 #define SCSIOP_READ_POSITION 0x34 1063 #define SCSIOP_SYNCHRONIZE_CACHE 0x35 1064 #define SCSIOP_COMPARE 0x39 1065 #define SCSIOP_COPY_COMPARE 0x3A 1066 #define SCSIOP_WRITE_DATA_BUFF 0x3B 1067 #define SCSIOP_READ_DATA_BUFF 0x3C 1068 #define SCSIOP_CHANGE_DEFINITION 0x40 1069 #define SCSIOP_READ_SUB_CHANNEL 0x42 1070 #define SCSIOP_READ_TOC 0x43 1071 #define SCSIOP_READ_HEADER 0x44 1072 #define SCSIOP_PLAY_AUDIO 0x45 1073 #define SCSIOP_GET_CONFIGURATION 0x46 1074 #define SCSIOP_PLAY_AUDIO_MSF 0x47 1075 #define SCSIOP_PLAY_TRACK_INDEX 0x48 1076 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49 1077 #define SCSIOP_GET_EVENT_STATUS 0x4A 1078 #define SCSIOP_PAUSE_RESUME 0x4B 1079 #define SCSIOP_LOG_SELECT 0x4C 1080 #define SCSIOP_LOG_SENSE 0x4D 1081 #define SCSIOP_STOP_PLAY_SCAN 0x4E 1082 #define SCSIOP_READ_DISK_INFORMATION 0x51 1083 #define SCSIOP_READ_TRACK_INFORMATION 0x52 1084 #define SCSIOP_RESERVE_TRACK_RZONE 0x53 1085 #define SCSIOP_SEND_OPC_INFORMATION 0x54 1086 #define SCSIOP_MODE_SELECT10 0x55 1087 #define SCSIOP_MODE_SENSE10 0x5A 1088 #define SCSIOP_CLOSE_TRACK_SESSION 0x5B 1089 #define SCSIOP_READ_BUFFER_CAPACITY 0x5C 1090 #define SCSIOP_SEND_CUE_SHEET 0x5D 1091 #define SCSIOP_PERSISTENT_RESERVE_IN 0x5E 1092 #define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F 1093 1094 #define SCSIOP_REPORT_LUNS 0xA0 1095 #define SCSIOP_BLANK 0xA1 1096 #define SCSIOP_SEND_KEY 0xA3 1097 #define SCSIOP_REPORT_KEY 0xA4 1098 #define SCSIOP_MOVE_MEDIUM 0xA5 1099 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6 1100 #define SCSIOP_EXCHANGE_MEDIUM 0xA6 1101 #define SCSIOP_SET_READ_AHEAD 0xA7 1102 #define SCSIOP_READ_DVD_STRUCTURE 0xAD 1103 #define SCSIOP_REQUEST_VOL_ELEMENT 0xB5 1104 #define SCSIOP_SEND_VOLUME_TAG 0xB6 1105 #define SCSIOP_READ_ELEMENT_STATUS 0xB8 1106 #define SCSIOP_READ_CD_MSF 0xB9 1107 #define SCSIOP_SCAN_CD 0xBA 1108 #define SCSIOP_SET_CD_SPEED 0xBB 1109 #define SCSIOP_PLAY_CD 0xBC 1110 #define SCSIOP_MECHANISM_STATUS 0xBD 1111 #define SCSIOP_READ_CD 0xBE 1112 #define SCSIOP_SEND_DVD_STRUCTURE 0xBF 1113 #define SCSIOP_INIT_ELEMENT_RANGE 0xE7 1114 1115 #define SCSIOP_DENON_EJECT_DISC 0xE6 1116 #define SCSIOP_DENON_STOP_AUDIO 0xE7 1117 #define SCSIOP_DENON_PLAY_AUDIO 0xE8 1118 #define SCSIOP_DENON_READ_TOC 0xE9 1119 #define SCSIOP_DENON_READ_SUBCODE 0xEB 1120 1121 #define SCSIMESS_MODIFY_DATA_POINTER 0x00 1122 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0x01 1123 #define SCSIMESS_WIDE_DATA_REQUEST 0x03 1124 1125 #define SCSIMESS_MODIFY_DATA_LENGTH 5 1126 #define SCSIMESS_SYNCH_DATA_LENGTH 3 1127 #define SCSIMESS_WIDE_DATA_LENGTH 2 1128 1129 #define SCSIMESS_ABORT 0x06 1130 #define SCSIMESS_ABORT_WITH_TAG 0x0D 1131 #define SCSIMESS_BUS_DEVICE_RESET 0x0C 1132 #define SCSIMESS_CLEAR_QUEUE 0x0E 1133 #define SCSIMESS_COMMAND_COMPLETE 0x00 1134 #define SCSIMESS_DISCONNECT 0x04 1135 #define SCSIMESS_EXTENDED_MESSAGE 0x01 1136 #define SCSIMESS_IDENTIFY 0x80 1137 #define SCSIMESS_IDENTIFY_WITH_DISCON 0xC0 1138 #define SCSIMESS_IGNORE_WIDE_RESIDUE 0x23 1139 #define SCSIMESS_INITIATE_RECOVERY 0x0F 1140 #define SCSIMESS_INIT_DETECTED_ERROR 0x05 1141 #define SCSIMESS_LINK_CMD_COMP 0x0A 1142 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0x0B 1143 #define SCSIMESS_MESS_PARITY_ERROR 0x09 1144 #define SCSIMESS_MESSAGE_REJECT 0x07 1145 #define SCSIMESS_NO_OPERATION 0x08 1146 #define SCSIMESS_HEAD_OF_QUEUE_TAG 0x21 1147 #define SCSIMESS_ORDERED_QUEUE_TAG 0x22 1148 #define SCSIMESS_SIMPLE_QUEUE_TAG 0x20 1149 #define SCSIMESS_RELEASE_RECOVERY 0x10 1150 #define SCSIMESS_RESTORE_POINTERS 0x03 1151 #define SCSIMESS_SAVE_DATA_POINTER 0x02 1152 #define SCSIMESS_TERMINATE_IO_PROCESS 0x11 1153 1154 #define CDB_FORCE_MEDIA_ACCESS 0x08 1155 1156 #define CDB_RETURN_ON_COMPLETION 0 1157 #define CDB_RETURN_IMMEDIATE 1 1158 1159 #define CDB_INQUIRY_EVPD 0x01 1160 1161 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0 1162 #define USE_DEFAULTMSB 0 1163 #define USE_DEFAULTLSB 0 1164 1165 #define START_UNIT_CODE 0x01 1166 #define STOP_UNIT_CODE 0x00 1167 1168 typedef struct _SENSE_DATA { 1169 UCHAR ErrorCode : 7; 1170 UCHAR Valid : 1; 1171 UCHAR SegmentNumber; 1172 UCHAR SenseKey : 4; 1173 UCHAR Reserved : 1; 1174 UCHAR IncorrectLength : 1; 1175 UCHAR EndOfMedia : 1; 1176 UCHAR FileMark : 1; 1177 UCHAR Information[4]; 1178 UCHAR AdditionalSenseLength; 1179 UCHAR CommandSpecificInformation[4]; 1180 UCHAR AdditionalSenseCode; 1181 UCHAR AdditionalSenseCodeQualifier; 1182 UCHAR FieldReplaceableUnitCode; 1183 UCHAR SenseKeySpecific[3]; 1184 } SENSE_DATA, *PSENSE_DATA; 1185 1186 #define SENSE_BUFFER_SIZE 18 1187 1188 /* Sense codes */ 1189 #define SCSI_SENSE_NO_SENSE 0x00 1190 #define SCSI_SENSE_RECOVERED_ERROR 0x01 1191 #define SCSI_SENSE_NOT_READY 0x02 1192 #define SCSI_SENSE_MEDIUM_ERROR 0x03 1193 #define SCSI_SENSE_HARDWARE_ERROR 0x04 1194 #define SCSI_SENSE_ILLEGAL_REQUEST 0x05 1195 #define SCSI_SENSE_UNIT_ATTENTION 0x06 1196 #define SCSI_SENSE_DATA_PROTECT 0x07 1197 #define SCSI_SENSE_BLANK_CHECK 0x08 1198 #define SCSI_SENSE_UNIQUE 0x09 1199 #define SCSI_SENSE_COPY_ABORTED 0x0A 1200 #define SCSI_SENSE_ABORTED_COMMAND 0x0B 1201 #define SCSI_SENSE_EQUAL 0x0C 1202 #define SCSI_SENSE_VOL_OVERFLOW 0x0D 1203 #define SCSI_SENSE_MISCOMPARE 0x0E 1204 #define SCSI_SENSE_RESERVED 0x0F 1205 1206 /* Additional tape bit */ 1207 #define SCSI_ILLEGAL_LENGTH 0x20 1208 #define SCSI_EOM 0x40 1209 #define SCSI_FILE_MARK 0x80 1210 1211 /* Additional Sense codes */ 1212 #define SCSI_ADSENSE_NO_SENSE 0x00 1213 #define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02 1214 #define SCSI_ADSENSE_LUN_NOT_READY 0x04 1215 #define SCSI_ADSENSE_WRITE_ERROR 0x0C 1216 #define SCSI_ADSENSE_TRACK_ERROR 0x14 1217 #define SCSI_ADSENSE_SEEK_ERROR 0x15 1218 #define SCSI_ADSENSE_REC_DATA_NOECC 0x17 1219 #define SCSI_ADSENSE_REC_DATA_ECC 0x18 1220 #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20 1221 #define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21 1222 #define SCSI_ADSENSE_INVALID_CDB 0x24 1223 #define SCSI_ADSENSE_INVALID_LUN 0x25 1224 #define SCSI_ADSENSE_WRITE_PROTECT 0x27 1225 #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28 1226 #define SCSI_ADSENSE_BUS_RESET 0x29 1227 #define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E 1228 #define SCSI_ADSENSE_INVALID_MEDIA 0x30 1229 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a 1230 #define SCSI_ADSENSE_POSITION_ERROR 0x3b 1231 #define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a 1232 #define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d 1233 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64 1234 #define SCSI_ADSENSE_COPY_PROTECTION_FAILURE 0x6f 1235 #define SCSI_ADSENSE_POWER_CALIBRATION_ERROR 0x73 1236 #define SCSI_ADSENSE_VENDOR_UNIQUE 0x80 1237 #define SCSI_ADSENSE_MUSIC_AREA 0xA0 1238 #define SCSI_ADSENSE_DATA_AREA 0xA1 1239 #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7 1240 1241 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00 1242 #define SCSI_SENSEQ_BECOMING_READY 0x01 1243 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02 1244 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03 1245 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04 1246 #define SCSI_SENSEQ_REBUILD_IN_PROGRESS 0x05 1247 #define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS 0x06 1248 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07 1249 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08 1250 #define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09 1251 #define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A 1252 1253 1254 #define FILE_DEVICE_SCSI 0x0000001b 1255 1256 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011) 1257 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012) 1258 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013) 1259 1260 /* SMART support in ATAPI */ 1261 #define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500) 1262 #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501) 1263 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502) 1264 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503) 1265 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504) 1266 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505) 1267 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506) 1268 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507) 1269 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508) 1270 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509) 1271 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a) 1272 #define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b) 1273 #define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c) 1274 1275 /* CLUSTER support */ 1276 #define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520) 1277 #define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521) 1278 1279 /* READ_TOC formats */ 1280 #define READ_TOC_FORMAT_TOC 0x00 1281 #define READ_TOC_FORMAT_SESSION 0x01 1282 #define READ_TOC_FORMAT_FULL_TOC 0x02 1283 #define READ_TOC_FORMAT_PMA 0x03 1284 #define READ_TOC_FORMAT_ATIP 0x04 1285 1286 /* Read Capacity Data. Returned in Big Endian format */ 1287 typedef struct _READ_CAPACITY_DATA { 1288 ULONG LogicalBlockAddress; 1289 ULONG BytesPerBlock; 1290 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA; 1291 1292 /* Read Block Limits Data. Returned in Big Endian format */ 1293 typedef struct _READ_BLOCK_LIMITS { 1294 UCHAR Reserved; 1295 UCHAR BlockMaximumSize[3]; 1296 UCHAR BlockMinimumSize[2]; 1297 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA; 1298 1299 1300 typedef struct _MODE_PARAMETER_HEADER { 1301 UCHAR ModeDataLength; 1302 UCHAR MediumType; 1303 UCHAR DeviceSpecificParameter; 1304 UCHAR BlockDescriptorLength; 1305 }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER; 1306 1307 typedef struct _MODE_PARAMETER_HEADER10 { 1308 UCHAR ModeDataLength[2]; 1309 UCHAR MediumType; 1310 UCHAR DeviceSpecificParameter; 1311 UCHAR Reserved[2]; 1312 UCHAR BlockDescriptorLength[2]; 1313 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10; 1314 1315 #define MODE_FD_SINGLE_SIDE 0x01 1316 #define MODE_FD_DOUBLE_SIDE 0x02 1317 #define MODE_FD_MAXIMUM_TYPE 0x1E 1318 #define MODE_DSP_FUA_SUPPORTED 0x10 1319 #define MODE_DSP_WRITE_PROTECT 0x80 1320 1321 typedef struct _MODE_PARAMETER_BLOCK { 1322 UCHAR DensityCode; 1323 UCHAR NumberOfBlocks[3]; 1324 UCHAR Reserved; 1325 UCHAR BlockLength[3]; 1326 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK; 1327 1328 typedef struct _MODE_DISCONNECT_PAGE { 1329 UCHAR PageCode : 6; 1330 UCHAR Reserved : 1; 1331 UCHAR PageSavable : 1; 1332 UCHAR PageLength; 1333 UCHAR BufferFullRatio; 1334 UCHAR BufferEmptyRatio; 1335 UCHAR BusInactivityLimit[2]; 1336 UCHAR BusDisconnectTime[2]; 1337 UCHAR BusConnectTime[2]; 1338 UCHAR MaximumBurstSize[2]; 1339 UCHAR DataTransferDisconnect : 2; 1340 UCHAR Reserved2[3]; 1341 }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE; 1342 1343 typedef struct _MODE_CACHING_PAGE { 1344 UCHAR PageCode : 6; 1345 UCHAR Reserved : 1; 1346 UCHAR PageSavable : 1; 1347 UCHAR PageLength; 1348 UCHAR ReadDisableCache : 1; 1349 UCHAR MultiplicationFactor : 1; 1350 UCHAR WriteCacheEnable : 1; 1351 UCHAR Reserved2 : 5; 1352 UCHAR WriteRetensionPriority : 4; 1353 UCHAR ReadRetensionPriority : 4; 1354 UCHAR DisablePrefetchTransfer[2]; 1355 UCHAR MinimumPrefetch[2]; 1356 UCHAR MaximumPrefetch[2]; 1357 UCHAR MaximumPrefetchCeiling[2]; 1358 }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE; 1359 1360 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE { 1361 UCHAR PageLength; 1362 UCHAR WriteType : 4; 1363 UCHAR TestWrite : 1; 1364 UCHAR LinkSizeValid : 1; 1365 UCHAR BufferUnderrunFreeEnabled : 1; 1366 UCHAR Reserved2 : 1; 1367 UCHAR TrackMode : 4; 1368 UCHAR Copy : 1; 1369 UCHAR FixedPacket : 1; 1370 UCHAR MultiSession : 2; 1371 UCHAR DataBlockType : 4; 1372 UCHAR Reserved3 : 4; 1373 UCHAR LinkSize; 1374 UCHAR Reserved4; 1375 UCHAR HostApplicationCode : 6; 1376 UCHAR Reserved5 : 2; 1377 UCHAR SessionFormat; 1378 UCHAR Reserved6; 1379 UCHAR PacketSize[4]; 1380 UCHAR AudioPauseLength[2]; 1381 UCHAR Reserved7 : 7; 1382 UCHAR MediaCatalogNumberValid : 1; 1383 UCHAR MediaCatalogNumber[13]; 1384 UCHAR MediaCatalogNumberZero; 1385 UCHAR MediaCatalogNumberAFrame; 1386 UCHAR Reserved8 : 7; 1387 UCHAR ISRCValid : 1; 1388 UCHAR ISRCCountry[2]; 1389 UCHAR ISRCOwner[3]; 1390 UCHAR ISRCRecordingYear[2]; 1391 UCHAR ISRCSerialNumber[5]; 1392 UCHAR ISRCZero; 1393 UCHAR ISRCAFrame; 1394 UCHAR ISRCReserved; 1395 UCHAR SubHeaderData[4]; 1396 } MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE; 1397 1398 typedef struct _MODE_FLEXIBLE_DISK_PAGE { 1399 UCHAR PageCode : 6; 1400 UCHAR Reserved : 1; 1401 UCHAR PageSavable : 1; 1402 UCHAR PageLength; 1403 UCHAR TransferRate[2]; 1404 UCHAR NumberOfHeads; 1405 UCHAR SectorsPerTrack; 1406 UCHAR BytesPerSector[2]; 1407 UCHAR NumberOfCylinders[2]; 1408 UCHAR StartWritePrecom[2]; 1409 UCHAR StartReducedCurrent[2]; 1410 UCHAR StepRate[2]; 1411 UCHAR StepPluseWidth; 1412 UCHAR HeadSettleDelay[2]; 1413 UCHAR MotorOnDelay; 1414 UCHAR MotorOffDelay; 1415 UCHAR Reserved2 : 5; 1416 UCHAR MotorOnAsserted : 1; 1417 UCHAR StartSectorNumber : 1; 1418 UCHAR TrueReadySignal : 1; 1419 UCHAR StepPlusePerCyclynder : 4; 1420 UCHAR Reserved3 : 4; 1421 UCHAR WriteCompenstation; 1422 UCHAR HeadLoadDelay; 1423 UCHAR HeadUnloadDelay; 1424 UCHAR Pin2Usage : 4; 1425 UCHAR Pin34Usage : 4; 1426 UCHAR Pin1Usage : 4; 1427 UCHAR Pin4Usage : 4; 1428 UCHAR MediumRotationRate[2]; 1429 UCHAR Reserved4[2]; 1430 } MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE; 1431 1432 typedef struct _MODE_FORMAT_PAGE { 1433 UCHAR PageCode : 6; 1434 UCHAR Reserved : 1; 1435 UCHAR PageSavable : 1; 1436 UCHAR PageLength; 1437 UCHAR TracksPerZone[2]; 1438 UCHAR AlternateSectorsPerZone[2]; 1439 UCHAR AlternateTracksPerZone[2]; 1440 UCHAR AlternateTracksPerLogicalUnit[2]; 1441 UCHAR SectorsPerTrack[2]; 1442 UCHAR BytesPerPhysicalSector[2]; 1443 UCHAR Interleave[2]; 1444 UCHAR TrackSkewFactor[2]; 1445 UCHAR CylinderSkewFactor[2]; 1446 UCHAR Reserved2 : 4; 1447 UCHAR SurfaceFirst : 1; 1448 UCHAR RemovableMedia : 1; 1449 UCHAR HardSectorFormating : 1; 1450 UCHAR SoftSectorFormating : 1; 1451 UCHAR Reserved3[3]; 1452 } MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE; 1453 1454 typedef struct _MODE_RIGID_GEOMETRY_PAGE { 1455 UCHAR PageCode : 6; 1456 UCHAR Reserved : 1; 1457 UCHAR PageSavable : 1; 1458 UCHAR PageLength; 1459 UCHAR NumberOfCylinders[3]; 1460 UCHAR NumberOfHeads; 1461 UCHAR StartWritePrecom[3]; 1462 UCHAR StartReducedCurrent[3]; 1463 UCHAR DriveStepRate[2]; 1464 UCHAR LandZoneCyclinder[3]; 1465 UCHAR RotationalPositionLock : 2; 1466 UCHAR Reserved2 : 6; 1467 UCHAR RotationOffset; 1468 UCHAR Reserved3; 1469 UCHAR RoataionRate[2]; 1470 UCHAR Reserved4[2]; 1471 } MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE; 1472 1473 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE { 1474 UCHAR PageCode : 6; 1475 UCHAR Reserved1 : 1; 1476 UCHAR PSBit : 1; 1477 UCHAR PageLength; 1478 UCHAR DCRBit : 1; 1479 UCHAR DTEBit : 1; 1480 UCHAR PERBit : 1; 1481 UCHAR EERBit : 1; 1482 UCHAR RCBit : 1; 1483 UCHAR TBBit : 1; 1484 UCHAR ARRE : 1; 1485 UCHAR AWRE : 1; 1486 UCHAR ReadRetryCount; 1487 UCHAR Reserved4[4]; 1488 UCHAR WriteRetryCount; 1489 UCHAR Reserved5[3]; 1490 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE; 1491 1492 typedef struct _MODE_READ_RECOVERY_PAGE { 1493 UCHAR PageCode : 6; 1494 UCHAR Reserved1 : 1; 1495 UCHAR PSBit : 1; 1496 UCHAR PageLength; 1497 UCHAR DCRBit : 1; 1498 UCHAR DTEBit : 1; 1499 UCHAR PERBit : 1; 1500 UCHAR Reserved2 : 1; 1501 UCHAR RCBit : 1; 1502 UCHAR TBBit : 1; 1503 UCHAR Reserved3 : 2; 1504 UCHAR ReadRetryCount; 1505 UCHAR Reserved4[4]; 1506 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE; 1507 1508 typedef struct _MODE_INFO_EXCEPTIONS { 1509 UCHAR PageCode : 6; 1510 UCHAR Reserved1 : 1; 1511 UCHAR PSBit : 1; 1512 UCHAR PageLength; 1513 _ANONYMOUS_UNION union { 1514 UCHAR Flags; 1515 _ANONYMOUS_STRUCT struct { 1516 UCHAR LogErr : 1; 1517 UCHAR Reserved2 : 1; 1518 UCHAR Test : 1; 1519 UCHAR Dexcpt : 1; 1520 UCHAR Reserved3 : 3; 1521 UCHAR Perf : 1; 1522 } DUMMYSTRUCTNAME; 1523 } DUMMYUNIONNAME; 1524 UCHAR ReportMethod : 4; 1525 UCHAR Reserved4 : 4; 1526 UCHAR IntervalTimer[4]; 1527 UCHAR ReportCount[4]; 1528 } MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS; 1529 1530 /* CDROM audio control */ 1531 #define CDB_AUDIO_PAUSE 0x00 1532 #define CDB_AUDIO_RESUME 0x01 1533 #define CDB_DEVICE_START 0x11 1534 #define CDB_DEVICE_STOP 0x10 1535 #define CDB_EJECT_MEDIA 0x10 1536 #define CDB_LOAD_MEDIA 0x01 1537 #define CDB_SUBCHANNEL_HEADER 0x00 1538 #define CDB_SUBCHANNEL_BLOCK 0x01 1539 1540 #define CDROM_AUDIO_CONTROL_PAGE 0x0E 1541 #define MODE_SELECT_IMMEDIATE 0x04 1542 #define MODE_SELECT_PFBIT 0x10 1543 1544 #define CDB_USE_MSF 0x01 1545 1546 typedef struct _PORT_OUTPUT { 1547 UCHAR ChannelSelection; 1548 UCHAR Volume; 1549 } PORT_OUTPUT, *PPORT_OUTPUT; 1550 1551 typedef struct _AUDIO_OUTPUT { 1552 UCHAR CodePage; 1553 UCHAR ParameterLength; 1554 UCHAR Immediate; 1555 UCHAR Reserved[2]; 1556 UCHAR LbaFormat; 1557 UCHAR LogicalBlocksPerSecond[2]; 1558 PORT_OUTPUT PortOutput[4]; 1559 } AUDIO_OUTPUT, *PAUDIO_OUTPUT; 1560 1561 /* Multisession CDROMs */ 1562 #define GET_LAST_SESSION 0x01 1563 #define GET_SESSION_DATA 0x02; 1564 1565 /* Atapi 2.5 changers */ 1566 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER { 1567 UCHAR CurrentSlot : 5; 1568 UCHAR ChangerState : 2; 1569 UCHAR Fault : 1; 1570 UCHAR Reserved : 5; 1571 UCHAR MechanismState : 3; 1572 UCHAR CurrentLogicalBlockAddress[3]; 1573 UCHAR NumberAvailableSlots; 1574 UCHAR SlotTableLength[2]; 1575 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER; 1576 1577 typedef struct _SLOT_TABLE_INFORMATION { 1578 UCHAR DiscChanged : 1; 1579 UCHAR Reserved : 6; 1580 UCHAR DiscPresent : 1; 1581 UCHAR Reserved2[3]; 1582 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION; 1583 1584 typedef struct _MECHANICAL_STATUS { 1585 MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader; 1586 SLOT_TABLE_INFORMATION SlotTableInfo[1]; 1587 } MECHANICAL_STATUS, *PMECHANICAL_STATUS; 1588 1589 1590 /* Tape definitions */ 1591 typedef struct _TAPE_POSITION_DATA { 1592 UCHAR Reserved1 : 2; 1593 UCHAR BlockPositionUnsupported : 1; 1594 UCHAR Reserved2 : 3; 1595 UCHAR EndOfPartition : 1; 1596 UCHAR BeginningOfPartition : 1; 1597 UCHAR PartitionNumber; 1598 USHORT Reserved3; 1599 UCHAR FirstBlock[4]; 1600 UCHAR LastBlock[4]; 1601 UCHAR Reserved4; 1602 UCHAR NumberOfBlocks[3]; 1603 UCHAR NumberOfBytes[4]; 1604 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA; 1605 1606 /* This structure is used to convert little endian ULONGs 1607 to SCSI CDB big endians values. */ 1608 typedef union _EIGHT_BYTE { 1609 _ANONYMOUS_STRUCT struct { 1610 UCHAR Byte0; 1611 UCHAR Byte1; 1612 UCHAR Byte2; 1613 UCHAR Byte3; 1614 UCHAR Byte4; 1615 UCHAR Byte5; 1616 UCHAR Byte6; 1617 UCHAR Byte7; 1618 } DUMMYSTRUCTNAME; 1619 ULONGLONG AsULongLong; 1620 } EIGHT_BYTE, *PEIGHT_BYTE; 1621 1622 typedef union _FOUR_BYTE { 1623 _ANONYMOUS_STRUCT struct { 1624 UCHAR Byte0; 1625 UCHAR Byte1; 1626 UCHAR Byte2; 1627 UCHAR Byte3; 1628 } DUMMYSTRUCTNAME; 1629 ULONG AsULong; 1630 } FOUR_BYTE, *PFOUR_BYTE; 1631 1632 typedef union _TWO_BYTE { 1633 _ANONYMOUS_STRUCT struct { 1634 UCHAR Byte0; 1635 UCHAR Byte1; 1636 } DUMMYSTRUCTNAME; 1637 USHORT AsUShort; 1638 } TWO_BYTE, *PTWO_BYTE; 1639 1640 /* Byte reversing macro for converting between 1641 big- and little-endian formats */ 1642 #define REVERSE_BYTES_QUAD(Destination, Source) { \ 1643 PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \ 1644 PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \ 1645 _val1->Byte7 = _val2->Byte0; \ 1646 _val1->Byte6 = _val2->Byte1; \ 1647 _val1->Byte5 = _val2->Byte2; \ 1648 _val1->Byte4 = _val2->Byte3; \ 1649 _val1->Byte3 = _val2->Byte4; \ 1650 _val1->Byte2 = _val2->Byte5; \ 1651 _val1->Byte1 = _val2->Byte6; \ 1652 _val1->Byte0 = _val2->Byte7; \ 1653 } 1654 1655 #define REVERSE_BYTES(Destination, Source) { \ 1656 PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \ 1657 PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \ 1658 _val1->Byte3 = _val2->Byte0; \ 1659 _val1->Byte2 = _val2->Byte1; \ 1660 _val1->Byte1 = _val2->Byte2; \ 1661 _val1->Byte0 = _val2->Byte3; \ 1662 } 1663 1664 #define REVERSE_BYTES_SHORT(Destination, Source) { \ 1665 PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \ 1666 PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \ 1667 _val1->Byte1 = _val2->Byte0; \ 1668 _val1->Byte0 = _val2->Byte1; \ 1669 } 1670 1671 #define REVERSE_SHORT(Short) { \ 1672 UCHAR _val; \ 1673 PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \ 1674 _val = _val2->Byte0; \ 1675 _val2->Byte0 = _val2->Byte1; \ 1676 _val2->Byte1 = _val; \ 1677 } 1678 1679 #define REVERSE_LONG(Long) { \ 1680 UCHAR _val; \ 1681 PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \ 1682 _val = _val2->Byte3; \ 1683 _val2->Byte3 = _val2->Byte0; \ 1684 _val2->Byte0 = _val; \ 1685 _val = _val2->Byte2; \ 1686 _val2->Byte2 = _val2->Byte1; \ 1687 _val2->Byte1 = _val; \ 1688 } 1689 1690 #define WHICH_BIT(Data, Bit) { \ 1691 UCHAR _val; \ 1692 for (_val = 0; _val < 32; _val++) { \ 1693 if (((Data) >> _val) == 1) { \ 1694 break; \ 1695 } \ 1696 } \ 1697 ASSERT(_val != 32); \ 1698 (Bit) = _val; \ 1699 } 1700 1701 #ifdef __cplusplus 1702 } 1703 #endif 1704 1705 #endif /* __SCSI_H */ 1706