Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175/* * scsi.h * * SCSI port and class interface. * * This file is part of the w32api package. * * Contributors: * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */
#ifndef _NTSCSI_#define _NTSCSI_
#ifdef __cplusplusextern "C" {#endif
#ifndef _NTSCSI_USER_MODE_#include "srb.h"#endif
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_MASK 0x02#define NOTIFICATION_POWER_MANAGEMENT_CLASS_MASK 0x04#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK 0x08#define NOTIFICATION_MEDIA_STATUS_CLASS_MASK 0x10#define NOTIFICATION_MULTI_HOST_CLASS_MASK 0x20#define NOTIFICATION_DEVICE_BUSY_CLASS_MASK 0x40
#define NOTIFICATION_NO_CLASS_EVENTS 0x0#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS 0x1#define NOTIFICATION_POWER_MANAGEMENT_CLASS_EVENTS 0x2#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS 0x3#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS 0x4#define NOTIFICATION_MULTI_HOST_CLASS_EVENTS 0x5#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS 0x6
#define NOTIFICATION_OPERATIONAL_EVENT_NO_CHANGE 0x0#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED 0x1#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_OCCURRED 0x2
#define NOTIFICATION_OPERATIONAL_STATUS_AVAILABLE 0x0#define NOTIFICATION_OPERATIONAL_STATUS_TEMPORARY_BUSY 0x1#define NOTIFICATION_OPERATIONAL_STATUS_EXTENDED_BUSY 0x2
#define NOTIFICATION_OPERATIONAL_OPCODE_NONE 0x0#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE 0x1#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED 0x2#define NOTIFICATION_OPERATIONAL_OPCODE_UNIT_RESET 0x3#define NOTIFICATION_OPERATIONAL_OPCODE_FIRMWARE_CHANGED 0x4#define NOTIFICATION_OPERATIONAL_OPCODE_INQUIRY_CHANGED 0x5
#define NOTIFICATION_POWER_EVENT_NO_CHANGE 0x0#define NOTIFICATION_POWER_EVENT_CHANGE_SUCCEEDED 0x1#define NOTIFICATION_POWER_EVENT_CHANGE_FAILED 0x2
#define NOTIFICATION_POWER_STATUS_ACTIVE 0x1#define NOTIFICATION_POWER_STATUS_IDLE 0x2#define NOTIFICATION_POWER_STATUS_STANDBY 0x3#define NOTIFICATION_POWER_STATUS_SLEEP 0x4
#define NOTIFICATION_MEDIA_EVENT_NO_EVENT 0x0#define NOTIFICATION_EXTERNAL_EVENT_NO_CHANGE 0x0#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN 0x1#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_UP 0x2#define NOTIFICATION_EXTERNAL_EVENT_EXTERNAL 0x3
#define NOTIFICATION_EXTERNAL_STATUS_READY 0x0#define NOTIFICATION_EXTERNAL_STATUS_PREVENT 0x1
#define NOTIFICATION_EXTERNAL_REQUEST_NONE 0x0000#define NOTIFICATION_EXTERNAL_REQUEST_QUEUE_OVERRUN 0x0001#define NOTIFICATION_EXTERNAL_REQUEST_PLAY 0x0101#define NOTIFICATION_EXTERNAL_REQUEST_REWIND_BACK 0x0102#define NOTIFICATION_EXTERNAL_REQUEST_FAST_FORWARD 0x0103#define NOTIFICATION_EXTERNAL_REQUEST_PAUSE 0x0104#define NOTIFICATION_EXTERNAL_REQUEST_STOP 0x0106#define NOTIFICATION_EXTERNAL_REQUEST_ASCII_LOW 0x0200#define NOTIFICATION_EXTERNAL_REQUEST_ASCII_HIGH 0x02ff
#define NOTIFICATION_MEDIA_EVENT_NO_CHANGE 0x0#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST 0x1#define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA 0x2#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL 0x3#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE 0x4
#define NOTIFICATION_BUSY_EVENT_NO_EVENT 0x0#define NOTIFICATION_MULTI_HOST_EVENT_NO_CHANGE 0x0#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_REQUEST 0x1#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_GRANT 0x2#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_RELEASE 0x3
#define NOTIFICATION_MULTI_HOST_STATUS_READY 0x0#define NOTIFICATION_MULTI_HOST_STATUS_PREVENT 0x1
#define NOTIFICATION_MULTI_HOST_PRIORITY_NO_REQUESTS 0x0#define NOTIFICATION_MULTI_HOST_PRIORITY_LOW 0x1#define NOTIFICATION_MULTI_HOST_PRIORITY_MEDIUM 0x2#define NOTIFICATION_MULTI_HOST_PRIORITY_HIGH 0x3
#define NOTIFICATION_BUSY_EVENT_NO_EVENT 0x0#define NOTIFICATION_BUSY_EVENT_NO_CHANGE 0x0#define NOTIFICATION_BUSY_EVENT_BUSY 0x1#define NOTIFICATION_BUSY_EVENT_LO_CHANGE 0x2
#define NOTIFICATION_BUSY_STATUS_NO_EVENT 0x0#define NOTIFICATION_BUSY_STATUS_POWER 0x1#define NOTIFICATION_BUSY_STATUS_IMMEDIATE 0x2#define NOTIFICATION_BUSY_STATUS_DEFERRED 0x3
#define DVD_FORMAT_LEAD_IN 0x00#define DVD_FORMAT_COPYRIGHT 0x01#define DVD_FORMAT_DISK_KEY 0x02#define DVD_FORMAT_BCA 0x03#define DVD_FORMAT_MANUFACTURING 0x04
#define DVD_REPORT_AGID 0x00#define DVD_CHALLENGE_KEY 0x01#define DVD_KEY_1 0x02#define DVD_KEY_2 0x03#define DVD_TITLE_KEY 0x04#define DVD_REPORT_ASF 0x05#define DVD_INVALIDATE_AGID 0x3F
#define BLANK_FULL 0x0#define BLANK_MINIMAL 0x1#define BLANK_TRACK 0x2#define BLANK_UNRESERVE_TRACK 0x3#define BLANK_TAIL 0x4#define BLANK_UNCLOSE_SESSION 0x5#define BLANK_SESSION 0x6
#define CD_EXPECTED_SECTOR_ANY 0x0#define CD_EXPECTED_SECTOR_CDDA 0x1#define CD_EXPECTED_SECTOR_MODE1 0x2#define CD_EXPECTED_SECTOR_MODE2 0x3#define CD_EXPECTED_SECTOR_MODE2_FORM1 0x4#define CD_EXPECTED_SECTOR_MODE2_FORM2 0x5
#define DISK_STATUS_EMPTY 0x00#define DISK_STATUS_INCOMPLETE 0x01#define DISK_STATUS_COMPLETE 0x02#define DISK_STATUS_OTHERS 0x03
#define LAST_SESSION_EMPTY 0x00#define LAST_SESSION_INCOMPLETE 0x01#define LAST_SESSION_RESERVED_DAMAGED 0x02#define LAST_SESSION_COMPLETE 0x03
#define DISK_TYPE_CDDA 0x00#define DISK_TYPE_CDI 0x10#define DISK_TYPE_XA 0x20#define DISK_TYPE_UNDEFINED 0xFF
#define DISC_BGFORMAT_STATE_NONE 0x0#define DISC_BGFORMAT_STATE_INCOMPLETE 0x1#define DISC_BGFORMAT_STATE_RUNNING 0x2#define DISC_BGFORMAT_STATE_COMPLETE 0x3
#define DATA_BLOCK_MODE0 0x0#define DATA_BLOCK_MODE1 0x1#define DATA_BLOCK_MODE2 0x2
/* READ_TOC formats */#define READ_TOC_FORMAT_TOC 0x00#define READ_TOC_FORMAT_SESSION 0x01#define READ_TOC_FORMAT_FULL_TOC 0x02#define READ_TOC_FORMAT_PMA 0x03#define READ_TOC_FORMAT_ATIP 0x04
#define CDB6GENERIC_LENGTH 6#define CDB10GENERIC_LENGTH 10#define CDB12GENERIC_LENGTH 12
#define SETBITON 1#define SETBITOFF 0
/* Mode Sense/Select page constants */#define MODE_PAGE_VENDOR_SPECIFIC 0x00#define MODE_PAGE_ERROR_RECOVERY 0x01#define MODE_PAGE_DISCONNECT 0x02#define MODE_PAGE_FORMAT_DEVICE 0x03#define MODE_PAGE_MRW 0x03#define MODE_PAGE_RIGID_GEOMETRY 0x04#define MODE_PAGE_FLEXIBILE 0x05#define MODE_PAGE_WRITE_PARAMETERS 0x05#define MODE_PAGE_VERIFY_ERROR 0x07#define MODE_PAGE_CACHING 0x08#define MODE_PAGE_PERIPHERAL 0x09#define MODE_PAGE_CONTROL 0x0A#define MODE_PAGE_MEDIUM_TYPES 0x0B#define MODE_PAGE_NOTCH_PARTITION 0x0C#define MODE_PAGE_CD_AUDIO_CONTROL 0x0E#define MODE_PAGE_DATA_COMPRESS 0x0F#define MODE_PAGE_DEVICE_CONFIG 0x10#define MODE_PAGE_XOR_CONTROL 0x10#define MODE_PAGE_MEDIUM_PARTITION 0x11#define MODE_PAGE_ENCLOSURE_SERVICES_MANAGEMENT 0x14#define MODE_PAGE_EXTENDED 0x15#define MODE_PAGE_EXTENDED_DEVICE_SPECIFIC 0x16#define MODE_PAGE_CDVD_FEATURE_SET 0x18#define MODE_PAGE_PROTOCOL_SPECIFIC_LUN 0x18#define MODE_PAGE_PROTOCOL_SPECIFIC_PORT 0x19#define MODE_PAGE_POWER_CONDITION 0x1A#define MODE_PAGE_LUN_MAPPING 0x1B#define MODE_PAGE_FAULT_REPORTING 0x1C#define MODE_PAGE_CDVD_INACTIVITY 0x1D#define MODE_PAGE_ELEMENT_ADDRESS 0x1D#define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E#define MODE_PAGE_DEVICE_CAPABILITIES 0x1F#define MODE_PAGE_CAPABILITIES 0x2A
#define MODE_SENSE_RETURN_ALL 0x3f
#define MODE_SENSE_CURRENT_VALUES 0x00#define MODE_SENSE_CHANGEABLE_VALUES 0x40#define MODE_SENSE_DEFAULT_VAULES 0x80#define MODE_SENSE_SAVED_VALUES 0xc0
/* SCSI CDB operation codes */#define SCSIOP_TEST_UNIT_READY 0x00#define SCSIOP_REZERO_UNIT 0x01#define SCSIOP_REWIND 0x01#define SCSIOP_REQUEST_BLOCK_ADDR 0x02#define SCSIOP_REQUEST_SENSE 0x03#define SCSIOP_FORMAT_UNIT 0x04#define SCSIOP_READ_BLOCK_LIMITS 0x05#define SCSIOP_REASSIGN_BLOCKS 0x07#define SCSIOP_INIT_ELEMENT_STATUS 0x07#define SCSIOP_READ6 0x08#define SCSIOP_RECEIVE 0x08#define SCSIOP_WRITE6 0x0A#define SCSIOP_PRINT 0x0A#define SCSIOP_SEND 0x0A#define SCSIOP_SEEK6 0x0B#define SCSIOP_TRACK_SELECT 0x0B#define SCSIOP_SLEW_PRINT 0x0B#define SCSIOP_SET_CAPACITY 0x0B#define SCSIOP_SEEK_BLOCK 0x0C#define SCSIOP_PARTITION 0x0D#define SCSIOP_READ_REVERSE 0x0F#define SCSIOP_WRITE_FILEMARKS 0x10#define SCSIOP_FLUSH_BUFFER 0x10#define SCSIOP_SPACE 0x11#define SCSIOP_INQUIRY 0x12#define SCSIOP_VERIFY6 0x13#define SCSIOP_RECOVER_BUF_DATA 0x14#define SCSIOP_MODE_SELECT 0x15#define SCSIOP_RESERVE_UNIT 0x16#define SCSIOP_RELEASE_UNIT 0x17#define SCSIOP_COPY 0x18#define SCSIOP_ERASE 0x19#define SCSIOP_MODE_SENSE 0x1A#define SCSIOP_START_STOP_UNIT 0x1B#define SCSIOP_STOP_PRINT 0x1B#define SCSIOP_LOAD_UNLOAD 0x1B#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C#define SCSIOP_SEND_DIAGNOSTIC 0x1D#define SCSIOP_MEDIUM_REMOVAL 0x1E
#define SCSIOP_READ_FORMATTED_CAPACITY 0x23#define SCSIOP_READ_CAPACITY 0x25#define SCSIOP_READ 0x28#define SCSIOP_WRITE 0x2A#define SCSIOP_SEEK 0x2B#define SCSIOP_LOCATE 0x2B#define SCSIOP_POSITION_TO_ELEMENT 0x2B#define SCSIOP_WRITE_VERIFY 0x2E#define SCSIOP_VERIFY 0x2F#define SCSIOP_SEARCH_DATA_HIGH 0x30#define SCSIOP_SEARCH_DATA_EQUAL 0x31#define SCSIOP_SEARCH_DATA_LOW 0x32#define SCSIOP_SET_LIMITS 0x33#define SCSIOP_READ_POSITION 0x34#define SCSIOP_SYNCHRONIZE_CACHE 0x35#define SCSIOP_COMPARE 0x39#define SCSIOP_COPY_COMPARE 0x3A#define SCSIOP_WRITE_DATA_BUFF 0x3B#define SCSIOP_READ_DATA_BUFF 0x3C#define SCSIOP_WRITE_LONG 0x3F#define SCSIOP_CHANGE_DEFINITION 0x40#define SCSIOP_WRITE_SAME 0x41#define SCSIOP_READ_SUB_CHANNEL 0x42#define SCSIOP_UNMAP 0x42#define SCSIOP_READ_TOC 0x43#define SCSIOP_READ_HEADER 0x44#define SCSIOP_REPORT_DENSITY_SUPPORT 0x44#define SCSIOP_PLAY_AUDIO 0x45#define SCSIOP_GET_CONFIGURATION 0x46#define SCSIOP_PLAY_AUDIO_MSF 0x47#define SCSIOP_PLAY_TRACK_INDEX 0x48#define SCSIOP_SANITIZE 0x48#define SCSIOP_PLAY_TRACK_RELATIVE 0x49#define SCSIOP_GET_EVENT_STATUS 0x4A#define SCSIOP_PAUSE_RESUME 0x4B#define SCSIOP_LOG_SELECT 0x4C#define SCSIOP_LOG_SENSE 0x4D#define SCSIOP_STOP_PLAY_SCAN 0x4E#define SCSIOP_XDWRITE 0x50#define SCSIOP_XPWRITE 0x51#define SCSIOP_READ_DISK_INFORMATION 0x51#define SCSIOP_READ_DISC_INFORMATION 0x51#define SCSIOP_READ_TRACK_INFORMATION 0x52#define SCSIOP_XDWRITE_READ 0x53#define SCSIOP_RESERVE_TRACK_RZONE 0x53#define SCSIOP_SEND_OPC_INFORMATION 0x54#define SCSIOP_MODE_SELECT10 0x55#define SCSIOP_RESERVE_UNIT10 0x56#define SCSIOP_RESERVE_ELEMENT 0x56#define SCSIOP_RELEASE_UNIT10 0x57#define SCSIOP_RELEASE_ELEMENT 0x57#define SCSIOP_REPAIR_TRACK 0x58#define SCSIOP_MODE_SENSE10 0x5A#define SCSIOP_CLOSE_TRACK_SESSION 0x5B#define SCSIOP_READ_BUFFER_CAPACITY 0x5C#define SCSIOP_SEND_CUE_SHEET 0x5D#define SCSIOP_PERSISTENT_RESERVE_IN 0x5E#define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F
#define SCSIOP_OPERATION32 0x7F
#define SCSIOP_XDWRITE_EXTENDED16 0x80#define SCSIOP_WRITE_FILEMARKS16 0x80#define SCSIOP_REBUILD16 0x81#define SCSIOP_READ_REVERSE16 0x81#define SCSIOP_REGENERATE16 0x82#define SCSIOP_EXTENDED_COPY 0x83#define SCSIOP_POPULATE_TOKEN 0x83#define SCSIOP_WRITE_USING_TOKEN 0x83#define SCSIOP_RECEIVE_COPY_RESULTS 0x84#define SCSIOP_RECEIVE_ROD_TOKEN_INFORMATION 0x84#define SCSIOP_ATA_PASSTHROUGH16 0x85#define SCSIOP_ACCESS_CONTROL_IN 0x86#define SCSIOP_ACCESS_CONTROL_OUT 0x87#define SCSIOP_READ16 0x88#define SCSIOP_COMPARE_AND_WRITE 0x89#define SCSIOP_WRITE16 0x8A#define SCSIOP_READ_ATTRIBUTES 0x8C#define SCSIOP_WRITE_ATTRIBUTES 0x8D#define SCSIOP_WRITE_VERIFY16 0x8E#define SCSIOP_VERIFY16 0x8F#define SCSIOP_PREFETCH16 0x90#define SCSIOP_SYNCHRONIZE_CACHE16 0x91#define SCSIOP_SPACE16 0x91#define SCSIOP_LOCK_UNLOCK_CACHE16 0x92#define SCSIOP_LOCATE16 0x92#define SCSIOP_WRITE_SAME16 0x93#define SCSIOP_ERASE16 0x93#define SCSIOP_ZBC_OUT 0x94#define SCSIOP_ZBC_IN 0x95#define SCSIOP_READ_DATA_BUFF16 0x9B#define SCSIOP_READ_CAPACITY16 0x9E#define SCSIOP_GET_LBA_STATUS 0x9E#define SCSIOP_GET_PHYSICAL_ELEMENT_STATUS 0x9E#define SCSIOP_REMOVE_ELEMENT_AND_TRUNCATE 0x9E#define SCSIOP_SERVICE_ACTION_IN16 0x9E#define SCSIOP_SERVICE_ACTION_OUT16 0x9F
#define SCSIOP_REPORT_LUNS 0xA0#define SCSIOP_BLANK 0xA1#define SCSIOP_ATA_PASSTHROUGH12 0xA1#define SCSIOP_SEND_EVENT 0xA2#define SCSIOP_SECURITY_PROTOCOL_IN 0xA2#define SCSIOP_SEND_KEY 0xA3#define SCSIOP_MAINTENANCE_IN 0xA3#define SCSIOP_REPORT_KEY 0xA4#define SCSIOP_MAINTENANCE_OUT 0xA4#define SCSIOP_MOVE_MEDIUM 0xA5#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6#define SCSIOP_EXCHANGE_MEDIUM 0xA6#define SCSIOP_SET_READ_AHEAD 0xA7#define SCSIOP_MOVE_MEDIUM_ATTACHED 0xA7#define SCSIOP_READ12 0xA8#define SCSIOP_GET_MESSAGE 0xA8#define SCSIOP_SERVICE_ACTION_OUT12 0xA9#define SCSIOP_WRITE12 0xAA#define SCSIOP_SEND_MESSAGE 0xAB#define SCSIOP_SERVICE_ACTION_IN12 0xAB#define SCSIOP_GET_PERFORMANCE 0xAC#define SCSIOP_READ_DVD_STRUCTURE 0xAD#define SCSIOP_WRITE_VERIFY12 0xAE#define SCSIOP_VERIFY12 0xAF#define SCSIOP_SEARCH_DATA_HIGH12 0xB0#define SCSIOP_SEARCH_DATA_EQUAL12 0xB1#define SCSIOP_SEARCH_DATA_LOW12 0xB2#define SCSIOP_SET_LIMITS12 0xB3#define SCSIOP_READ_ELEMENT_STATUS_ATTACHED 0xB4#define SCSIOP_REQUEST_VOL_ELEMENT 0xB5#define SCSIOP_SECURITY_PROTOCOL_OUT 0xB5#define SCSIOP_SEND_VOLUME_TAG 0xB6#define SCSIOP_SET_STREAMING 0xB6#define SCSIOP_READ_DEFECT_DATA 0xB7#define SCSIOP_READ_ELEMENT_STATUS 0xB8#define SCSIOP_READ_CD_MSF 0xB9#define SCSIOP_SCAN_CD 0xBA#define SCSIOP_REDUNDANCY_GROUP_IN 0xBA#define SCSIOP_SET_CD_SPEED 0xBB#define SCSIOP_REDUNDANCY_GROUP_OUT 0xBB#define SCSIOP_PLAY_CD 0xBC#define SCSIOP_SPARE_IN 0xBC#define SCSIOP_MECHANISM_STATUS 0xBD#define SCSIOP_SPARE_OUT 0xBD#define SCSIOP_READ_CD 0xBE#define SCSIOP_VOLUME_SET_IN 0xBE#define SCSIOP_SEND_DVD_STRUCTURE 0xBF#define SCSIOP_VOLUME_SET_OUT 0xBF#define SCSIOP_INIT_ELEMENT_RANGE 0xE7
// SCSI operation parameters
// SCSIOP_SANITIZE (0x48)
#define SERVICE_ACTION_OVERWRITE 0x01#define SERVICE_ACTION_BLOCK_ERASE 0x02#define SERVICE_ACTION_CRYPTO_ERASE 0x03#define SERVICE_ACTION_EXIT_FAILURE 0x1f
// SCSIOP_OPERATION32 (0x7F)
#define SERVICE_ACTION_XDWRITE 0x0004#define SERVICE_ACTION_XPWRITE 0x0006#define SERVICE_ACTION_XDWRITEREAD 0x0007#define SERVICE_ACTION_WRITE 0x000B#define SERVICE_ACTION_WRITE_VERIFY 0x000C#define SERVICE_ACTION_WRITE_SAME 0x000D#define SERVICE_ACTION_ORWRITE 0x000E
// SCSIOP_POPULATE_TOKEN, SCSIOP_WRITE_USING_TOKEN (0x83)
#define SERVICE_ACTION_POPULATE_TOKEN 0x10#define SERVICE_ACTION_WRITE_USING_TOKEN 0x11
// SCSIOP_RECEIVE_ROD_TOKEN_INFORMATION (0x84)
#define SERVICE_ACTION_RECEIVE_TOKEN_INFORMATION 0x07
// SCSIOP_ZBC_OUT (0x94)
#define SERVICE_ACTION_CLOSE_ZONE 0x01#define SERVICE_ACTION_FINISH_ZONE 0x02#define SERVICE_ACTION_OPEN_ZONE 0x03#define SERVICE_ACTION_RESET_WRITE_POINTER 0x04
// SCSIOP_ZBC_IN (0x95)
#define SERVICE_ACTION_REPORT_ZONES 0x00
#define REPORT_ZONES_OPTION_LIST_ALL_ZONES 0x00#define REPORT_ZONES_OPTION_LIST_EMPTY_ZONES 0x01#define REPORT_ZONES_OPTION_LIST_IMPLICITLY_OPENED_ZONES 0x02#define REPORT_ZONES_OPTION_LIST_EXPLICITLY_OPENED_ZONES 0x03#define REPORT_ZONES_OPTION_LIST_CLOSED_ZONES 0x04#define REPORT_ZONES_OPTION_LIST_FULL_ZONES 0x05#define REPORT_ZONES_OPTION_LIST_READ_ONLY_ZONES 0x06#define REPORT_ZONES_OPTION_LIST_OFFLINE_ZONES 0x07#define REPORT_ZONES_OPTION_LIST_RWP_ZONES 0x10#define REPORT_ZONES_OPTION_LIST_NON_SEQUENTIAL_WRITE_RESOURCES_ACTIVE_ZONES 0x11#define REPORT_ZONES_OPTION_LIST_NOT_WRITE_POINTER_ZONES 0x3F
// SCSIOP_SERVICE_ACTION_IN16 (0x9E)
#define SERVICE_ACTION_READ_CAPACITY16 0x10#define SERVICE_ACTION_GET_LBA_STATUS 0x12#define SERVICE_ACTION_GET_PHYSICAL_ELEMENT_STATUS 0x17#define SERVICE_ACTION_REMOVE_ELEMENT_AND_TRUNCATE 0x18
// SCSIOP_MAINTENANCE_IN (0xA3)
#define SERVICE_ACTION_REPORT_TIMESTAMP 0x0F
// SCSIOP_MAINTENANCE_OUT (0xA4)
#define SERVICE_ACTION_SET_TIMESTAMP 0x0F
#define CDB_RETURN_ON_COMPLETION 0#define CDB_RETURN_IMMEDIATE 1
#define CDB_FORCE_MEDIA_ACCESS 0x08
#define SCSIOP_DENON_EJECT_DISC 0xE6#define SCSIOP_DENON_STOP_AUDIO 0xE7#define SCSIOP_DENON_PLAY_AUDIO 0xE8#define SCSIOP_DENON_READ_TOC 0xE9#define SCSIOP_DENON_READ_SUBCODE 0xEB
#define SCSIMESS_ABORT 0x06#define SCSIMESS_ABORT_WITH_TAG 0x0D#define SCSIMESS_BUS_DEVICE_RESET 0X0C#define SCSIMESS_CLEAR_QUEUE 0X0E#define SCSIMESS_COMMAND_COMPLETE 0X00#define SCSIMESS_DISCONNECT 0X04#define SCSIMESS_EXTENDED_MESSAGE 0X01#define SCSIMESS_IDENTIFY 0X80#define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0#define SCSIMESS_IGNORE_WIDE_RESIDUE 0X23#define SCSIMESS_INITIATE_RECOVERY 0X0F#define SCSIMESS_INIT_DETECTED_ERROR 0X05#define SCSIMESS_LINK_CMD_COMP 0X0A#define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B#define SCSIMESS_MESS_PARITY_ERROR 0X09#define SCSIMESS_MESSAGE_REJECT 0X07#define SCSIMESS_NO_OPERATION 0X08#define SCSIMESS_HEAD_OF_QUEUE_TAG 0X21#define SCSIMESS_ORDERED_QUEUE_TAG 0X22#define SCSIMESS_SIMPLE_QUEUE_TAG 0X20#define SCSIMESS_RELEASE_RECOVERY 0X10#define SCSIMESS_RESTORE_POINTERS 0X03#define SCSIMESS_SAVE_DATA_POINTER 0X02#define SCSIMESS_TERMINATE_IO_PROCESS 0X11
#define SCSIMESS_MODIFY_DATA_POINTER 0X00#define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01#define SCSIMESS_WIDE_DATA_REQUEST 0X03
#define SCSIMESS_MODIFY_DATA_LENGTH 5#define SCSIMESS_SYNCH_DATA_LENGTH 3#define SCSIMESS_WIDE_DATA_LENGTH 2
#define CDB_INQUIRY_EVPD 0x01
#define LUN0_FORMAT_SAVING_DEFECT_LIST 0#define USE_DEFAULTMSB 0#define USE_DEFAULTLSB 0
#define START_UNIT_CODE 0x01#define STOP_UNIT_CODE 0x00
/* INQUIRYDATA.DeviceType constants */#define DIRECT_ACCESS_DEVICE 0x00#define SEQUENTIAL_ACCESS_DEVICE 0x01#define PRINTER_DEVICE 0x02#define PROCESSOR_DEVICE 0x03#define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04#define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05#define SCANNER_DEVICE 0x06#define OPTICAL_DEVICE 0x07#define MEDIUM_CHANGER 0x08#define COMMUNICATION_DEVICE 0x09#define ARRAY_CONTROLLER_DEVICE 0x0C#define SCSI_ENCLOSURE_DEVICE 0x0D#define REDUCED_BLOCK_DEVICE 0x0E#define OPTICAL_CARD_READER_WRITER_DEVICE 0x0F#define BRIDGE_CONTROLLER_DEVICE 0x10#define OBJECT_BASED_STORAGE_DEVICE 0x11#define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
#define DEVICE_QUALIFIER_ACTIVE 0x00#define DEVICE_QUALIFIER_NOT_ACTIVE 0x01#define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
/* INQUIRYDATA.DeviceTypeQualifier constants */#define DEVICE_CONNECTED 0x00
#define SCSISTAT_GOOD 0x00#define SCSISTAT_CHECK_CONDITION 0x02#define SCSISTAT_CONDITION_MET 0x04#define SCSISTAT_BUSY 0x08#define SCSISTAT_INTERMEDIATE 0x10#define SCSISTAT_INTERMEDIATE_COND_MET 0x14#define SCSISTAT_RESERVATION_CONFLICT 0x18#define SCSISTAT_COMMAND_TERMINATED 0x22#define SCSISTAT_QUEUE_FULL 0x28
#define RESERVATION_ACTION_READ_KEYS 0x00#define RESERVATION_ACTION_READ_RESERVATIONS 0x01
#define RESERVATION_ACTION_REGISTER 0x00#define RESERVATION_ACTION_RESERVE 0x01#define RESERVATION_ACTION_RELEASE 0x02#define RESERVATION_ACTION_CLEAR 0x03#define RESERVATION_ACTION_PREEMPT 0x04#define RESERVATION_ACTION_PREEMPT_ABORT 0x05#define RESERVATION_ACTION_REGISTER_IGNORE_EXISTING 0x06
#define RESERVATION_SCOPE_LU 0x00#define RESERVATION_SCOPE_ELEMENT 0x02
#define RESERVATION_TYPE_WRITE_EXCLUSIVE 0x01#define RESERVATION_TYPE_EXCLUSIVE 0x03#define RESERVATION_TYPE_WRITE_EXCLUSIVE_REGISTRANTS 0x05#define RESERVATION_TYPE_EXCLUSIVE_REGISTRANTS 0x06
#define SENSE_BUFFER_SIZE sizeof(SENSE_DATA)#define SENSE_BUFFER_SIZE_EX sizeof(SENSE_DATA_EX)
#define MAX_SENSE_BUFFER_SIZE 255
#define MAX_ADDITIONAL_SENSE_BYTES (MAX_SENSE_BUFFER_SIZE - SENSE_BUFFER_SIZE)#define MAX_ADDITIONAL_SENSE_BYTES_EX (MAX_SENSE_BUFFER_SIZE - SENSE_BUFFER_SIZE_EX)
/* Sense codes */#define SCSI_SENSE_NO_SENSE 0x00#define SCSI_SENSE_RECOVERED_ERROR 0x01#define SCSI_SENSE_NOT_READY 0x02#define SCSI_SENSE_MEDIUM_ERROR 0x03#define SCSI_SENSE_HARDWARE_ERROR 0x04#define SCSI_SENSE_ILLEGAL_REQUEST 0x05#define SCSI_SENSE_UNIT_ATTENTION 0x06#define SCSI_SENSE_DATA_PROTECT 0x07#define SCSI_SENSE_BLANK_CHECK 0x08#define SCSI_SENSE_UNIQUE 0x09#define SCSI_SENSE_COPY_ABORTED 0x0A#define SCSI_SENSE_ABORTED_COMMAND 0x0B#define SCSI_SENSE_EQUAL 0x0C#define SCSI_SENSE_VOL_OVERFLOW 0x0D#define SCSI_SENSE_MISCOMPARE 0x0E#define SCSI_SENSE_RESERVED 0x0F
// Sense Error Codes
#define SCSI_SENSE_ERRORCODE_FIXED_CURRENT 0x70#define SCSI_SENSE_ERRORCODE_FIXED_DEFERRED 0x71#define SCSI_SENSE_ERRORCODE_DESCRIPTOR_CURRENT 0x72#define SCSI_SENSE_ERRORCODE_DESCRIPTOR_DEFERRED 0x73
// Sense Descriptor Types
#define SCSI_SENSE_DESCRIPTOR_TYPE_INFORMATION 0x00#define SCSI_SENSE_DESCRIPTOR_TYPE_COMMAND_SPECIFIC 0x01#define SCSI_SENSE_DESCRIPTOR_TYPE_SENSE_KEY_SPECIFIC 0x02#define SCSI_SENSE_DESCRIPTOR_TYPE_FIELD_REPLACEABLE_UNIT 0x03#define SCSI_SENSE_DESCRIPTOR_TYPE_STREAM_COMMAND 0x04#define SCSI_SENSE_DESCRIPTOR_TYPE_BLOCK_COMMAND 0x05#define SCSI_SENSE_DESCRIPTOR_TYPE_OSD_OBJECT_IDENTIFICATION 0x06#define SCSI_SENSE_DESCRIPTOR_TYPE_OSD_RESPONSE_INTEGRITY_CHECK 0x07#define SCSI_SENSE_DESCRIPTOR_TYPE_OSD_ATTRIBUTE_IDENTIFICATION 0x08#define SCSI_SENSE_DESCRIPTOR_TYPE_ATA_STATUS_RETURN 0x09#define SCSI_SENSE_DESCRIPTOR_TYPE_PROGRESS_INDICATION 0x0A#define SCSI_SENSE_DESCRIPTOR_TYPE_USER_DATA_SEGMENT_REFERRAL 0x0B
/* Additional tape bit */#define SCSI_ILLEGAL_LENGTH 0x20#define SCSI_EOM 0x40#define SCSI_FILE_MARK 0x80
/* Additional Sense codes */#define SCSI_ADSENSE_NO_SENSE 0x00#define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02#define SCSI_ADSENSE_WRITE 0x03#define SCSI_ADSENSE_LUN_NOT_READY 0x04#define SCSI_ADSENSE_LUN_COMMUNICATION 0x08#define SCSI_ADSENSE_SERVO_ERROR 0x09#define SCSI_ADSENSE_WARNING 0x0B#define SCSI_ADSENSE_WRITE_ERROR 0x0C#define SCSI_ADSENSE_COPY_TARGET_DEVICE_ERROR 0x0D#define SCSI_ADSENSE_UNRECOVERED_ERROR 0x11#define SCSI_ADSENSE_TRACK_ERROR 0x14#define SCSI_ADSENSE_SEEK_ERROR 0x15#define SCSI_ADSENSE_REC_DATA_NOECC 0x17#define SCSI_ADSENSE_REC_DATA_ECC 0x18#define SCSI_ADSENSE_DEFECT_LIST_ERROR 0x19#define SCSI_ADSENSE_PARAMETER_LIST_LENGTH 0x1A#define SCSI_ADSENSE_MISCOMPARE_DURING_VERIFY_OPERATION 0x1D#define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20#define SCSI_ADSENSE_ACCESS_DENIED 0x20#define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21#define SCSI_ADSENSE_INVALID_TOKEN 0x23#define SCSI_ADSENSE_INVALID_CDB 0x24#define SCSI_ADSENSE_INVALID_LUN 0x25#define SCSI_ADSENSE_INVALID_FIELD_PARAMETER_LIST 0x26#define SCSI_ADSENSE_WRITE_PROTECT 0x27#define SCSI_ADSENSE_MEDIUM_CHANGED 0x28#define SCSI_ADSENSE_BUS_RESET 0x29#define SCSI_ADSENSE_PARAMETERS_CHANGED 0x2A#define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E#define SCSI_ADSENSE_INVALID_MEDIA 0x30#define SCSI_ADSENSE_DEFECT_LIST 0x32#define SCSI_ADSENSE_LB_PROVISIONING 0x38#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a#define SCSI_ADSENSE_POSITION_ERROR 0x3b#define SCSI_ADSENSE_LOGICAL_UNIT_ERROR 0x3e#define SCSI_ADSENSE_OPERATING_CONDITIONS_CHANGED 0x3f#define SCSI_ADSENSE_DATA_PATH_FAILURE 0x41#define SCSI_ADSENSE_POWER_ON_SELF_TEST_FAILURE 0x42#define SCSI_ADSENSE_INTERNAL_TARGET_FAILURE 0x44#define SCSI_ADSENSE_DATA_TRANSFER_ERROR 0x4b#define SCSI_ADSENSE_LUN_FAILED_SELF_CONFIGURATION 0x4c#define SCSI_ADSENSE_RESOURCE_FAILURE 0x55#define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a#define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d#define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64#define SCSI_ADSENSE_COPY_PROTECTION_FAILURE 0x6f#define SCSI_ADSENSE_POWER_CALIBRATION_ERROR 0x73#define SCSI_ADSENSE_VENDOR_UNIQUE 0x80#define SCSI_ADSENSE_MUSIC_AREA 0xA0#define SCSI_ADSENSE_DATA_AREA 0xA1#define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
#define SCSI_ADWRITE_PROTECT SCSI_ADSENSE_WRITE_PROTECT#define SCSI_FAILURE_PREDICTION_THRESHOLD_EXCEEDED SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED
// ADSENSE additional qualifiers
// SCSI_ADSENSE_NO_SENSE (0x00)
#define SCSI_SENSEQ_FILEMARK_DETECTED 0x01#define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02#define SCSI_SENSEQ_SETMARK_DETECTED 0x03#define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04#define SCSI_SENSEQ_OPERATION_IS_IN_PROGRESS 0x16
// SCSI_ADSENSE_WRITE (0x03)
#define SCSI_SENSEQ_PERIPHERAL_DEVICE_WRITE_FAULT 0x00#define SCSI_SENSEQ_NO_WRITE_CURRENT 0x01#define SCSI_SENSEQ_EXCESSIVE_WRITE_ERRORS 0x02
// SCSI_ADSENSE_LUN_NOT_READY (0x04)
#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00#define SCSI_SENSEQ_BECOMING_READY 0x01#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03#define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04#define SCSI_SENSEQ_REBUILD_IN_PROGRESS 0x05#define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS 0x06#define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07#define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08#define SCSI_SENSEQ_SPACE_ALLOC_IN_PROGRESS 0x14
// SCSI_ADSENSE_LUN_COMMUNICATION (0x08)
#define SCSI_SENSEQ_COMM_FAILURE 0x00#define SCSI_SENSEQ_COMM_TIMEOUT 0x01#define SCSI_SENSEQ_COMM_PARITY_ERROR 0x02#define SCSI_SESNEQ_COMM_CRC_ERROR 0x03#define SCSI_SENSEQ_UNREACHABLE_TARGET 0x04
// SCSI_ADSENSE_SERVO_ERROR (0x09)
#define SCSI_SENSEQ_TRACK_FOLLOWING_ERROR 0x00#define SCSI_SENSEQ_TRACKING_SERVO_FAILURE 0x01#define SCSI_SENSEQ_FOCUS_SERVO_FAILURE 0x02#define SCSI_SENSEQ_SPINDLE_SERVO_FAILURE 0x03#define SCSI_SENSEQ_HEAD_SELECT_FAULT 0x04
// SCSI_ADSENSE_WARNING (0x0B)
#define SCSI_SENSEQ_POWER_LOSS_EXPECTED 0x08
// SCSI_ADSENSE_WRITE_ERROR (0x0C)
#define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09#define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A
// SCSI_ADSENSE_COPY_TARGET_DEVICE_ERROR (0x0D)
#define SCSI_SENSEQ_NOT_REACHABLE 0x02#define SCSI_SENSEQ_DATA_UNDERRUN 0x04
// SCSI_ADSENSE_UNRECOVERED_ERROR (0x11)
#define SCSI_SENSEQ_UNRECOVERED_READ_ERROR 0x00
// SCSI_ADSENSE_SEEK_ERROR (0x15)
#define SCSI_SENSEQ_RANDOM_POSITIONING_ERROR 0x00#define SCSI_SENSEQ_MECHANICAL_POSITIONING_ERROR 0x01#define SCSI_SENSEQ_POSITIONING_ERROR_DETECTED_BY_READ_OF_MEDIUM 0x02
// SCSI_ADSENSE_DEFECT_LIST_ERROR (0x19)
#define SCSI_SENSEQ_DEFECT_LIST_ERROR 0x00#define SCSI_SENSEQ_DEFECT_LIST_NOT_AVAILABLE 0x01#define SCSI_SENSEQ_DEFECT_LIST_ERROR_IN_PRIMARY_LIST 0x02#define SCSI_SENSEQ_DEFECT_LIST_ERROR_IN_GROWN_LIST 0x03
// SCSI_ADSENSE_ACCESS_DENIED (0x20)
#define SCSI_SENSEQ_NO_ACCESS_RIGHTS 0x02
// SCSI_ADSENSE_ILLEGAL_BLOCK (0x21)
#define SCSI_SENSEQ_LOGICAL_ADDRESS_OUT_OF_RANGE 0x00#define SCSI_SENSEQ_ILLEGAL_ELEMENT_ADDR 0x01#define SCSI_SENSEQ_INVALID_WRITE_ADDRESS 0x02#define SCSI_SENSEQ_INVALID_WRITE_CROSSING_LAYER_JUMP 0x03#define SCSI_SENSEQ_UNALIGNED_WRITE 0x04#define SCSI_SENSEQ_WRITE_BOUNDARY_VIOLATION 0x05#define SCSI_SENSEQ_READ_INVALID_DATA 0x06#define SCSI_SENSEQ_READ_BOUNDARY_VIOLATION 0x07#define SCSI_SENSEQ_MISALIGNED_WRITE 0x08
// SCSI_ADSENSE_INVALID_FIELD_PARAMETER_LIST (0x26)
#define SCSI_SENSEQ_INVALID_RELEASE_OF_PERSISTENT_RESERVATION 0x04#define SCSI_SENSEQ_TOO_MANY_SEGMENT_DESCRIPTORS 0x08
// SCSI_ADSENSE_WRITE_PROTECT (0x27)
#define SCSI_SENSEQ_SPACE_ALLOC_FAILED_WRITE_PROTECT 0x07
// SCSI_ADSENSE_PARAMETERS_CHANGED (0x2A)
#define SCSI_SENSEQ_CAPACITY_DATA_CHANGED 0x09
// SCSI_ADSENSE_POSITION_ERROR (0x3b)
#define SCSI_SENSEQ_DESTINATION_FULL 0x0d#define SCSI_SENSEQ_SOURCE_EMPTY 0x0e
// SCSI_ADSENSE_INVALID_MEDIA (0x30)
#define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00#define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01#define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02#define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
// SCSI_ADSENSE_DEFECT_LIST (0x32)
#define SCSI_SENSEQ_NO_DEFECT_SPARE_LOCATION_AVAILABLE 0x00#define SCSI_SENSEQ_DEFECT_LIST_UPDATE_FAILURE 0x01
// SCSI_ADSENSE_LB_PROVISIONING (0x38)
#define SCSI_SENSEQ_SOFT_THRESHOLD_REACHED 0x07
// SCSI_ADSENSE_LOGICAL_UNIT_ERROR (0x3e)
#define SCSI_SENSEQ_LOGICAL_UNIT_HAS_NOT_SELF_CONFIGURED_YET 0x00#define SCSI_SENSEQ_LOGICAL_UNIT_FAILURE 0x01#define SCSI_SENSEQ_TIMEOUT_ON_LOGICAL_UNIT 0x02#define SCSI_SENSEQ_LOGICAL_UNIT_FAILED_SELF_TEST 0x03#define SCSI_SENSEQ_LOGICAL_UNIT_FAILED_TO_UPDATE_SELF_TEST_LOG 0x04
// SCSI_ADSENSE_OPERATING_CONDITIONS_CHANGED (0x3f)
#define SCSI_SENSEQ_TARGET_OPERATING_CONDITIONS_CHANGED 0x00#define SCSI_SENSEQ_MICROCODE_CHANGED 0x01#define SCSI_SENSEQ_OPERATING_DEFINITION_CHANGED 0x02#define SCSI_SENSEQ_INQUIRY_DATA_CHANGED 0x03#define SCSI_SENSEQ_COMPONENT_DEVICE_ATTACHED 0x04#define SCSI_SENSEQ_DEVICE_IDENTIFIER_CHANGED 0x05#define SCSI_SENSEQ_REDUNDANCY_GROUP_MODIFIED 0x06#define SCSI_SENSEQ_REDUNDANCY_GROUP_DELETED 0x07#define SCSI_SENSEQ_SPARE_MODIFIED 0x08#define SCSI_SENSEQ_SPARE_DELETED 0x09#define SCSI_SENSEQ_VOLUME_SET_MODIFIED 0x0A#define SCSI_SENSEQ_VOLUME_SET_DELETED 0x0B#define SCSI_SENSEQ_VOLUME_SET_DEASSIGNED 0x0C#define SCSI_SENSEQ_VOLUME_SET_REASSIGNED 0x0D#define SCSI_SENSEQ_REPORTED_LUNS_DATA_CHANGED 0x0E#define SCSI_SENSEQ_ECHO_BUFFER_OVERWRITTEN 0x0F#define SCSI_SENSEQ_MEDIUM_LOADABLE 0x10#define SCSI_SENSEQ_MEDIUM_AUXILIARY_MEMORY_ACCESSIBLE 0x11
// SCSI_ADSENSE_INTERNAL_TARGET_FAILURE (0x44)
#define SCSI_SENSEQ_INTERNAL_TARGET_FAILURE 0x00#define SCSI_SENSEQ_PRESISTENT_RESERVATION_INFORMATION_LOST 0x01#define SCSI_SENSEQ_ATA_DEVICE_FAILED_SET_FEATURES 0x71
// SCSI_ADSENSE_DATA_TRANSFER_ERROR (0x4b)
#define SCSI_SENSEQ_INITIATOR_RESPONSE_TIMEOUT 0x06
// SCSI_ADSENSE_RESOURCE_FAILURE (0x55)
#define SCSI_SENSEQ_SYSTEM_RESOURCE_FAILURE 0x00#define SCSI_SENSEQ_SYSTEM_BUFFER_FULL 0x01#define SCSI_SENSEQ_INSUFFICIENT_RESERVATION_RESOURCES 0x02#define SCSI_SENSEQ_INSUFFICIENT_RESOURCES 0x03
// SCSI_ADSENSE_OPERATOR_REQUEST (0x5a)
#define SCSI_SENSEQ_STATE_CHANGE_INPUT 0x00#define SCSI_SENSEQ_MEDIUM_REMOVAL 0x01#define SCSI_SENSEQ_WRITE_PROTECT_ENABLE 0x02#define SCSI_SENSEQ_WRITE_PROTECT_DISABLE 0x03
// SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED (0x5d)
#define SCSI_SENSEQ_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x00#define SCSI_SENSEQ_MEDIA_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x01#define SCSI_SENSEQ_LUN_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x02#define SCSI_SENSEQ_SPARE_AREA_EXHAUSTION_PREDICTION_THRESHOLD_EXCEEDED 0x03#define SCSI_SENSEQ_GENERAL_HARD_DRIVE_FAILURE 0x10#define SCSI_SENSEQ_DRIVE_ERROR_RATE_TOO_HIGH 0x11#define SCSI_SENSEQ_DATA_ERROR_RATE_TOO_HIGH 0x12#define SCSI_SENSEQ_SEEK_ERROR_RATE_TOO_HIGH 0x13#define SCSI_SENSEQ_TOO_MANY_BLOCK_REASSIGNS 0x14#define SCSI_SENSEQ_ACCESS_TIMES_TOO_HIGH 0x15#define SCSI_SENSEQ_START_UNIT_TIMES_TOO_HIGH 0x16#define SCSI_SENSEQ_CHANNEL_PARAMETRICS 0x17#define SCSI_SENSEQ_CONTROLLER_DETECTED 0x18#define SCSI_SENSEQ_THROUGHPUT_PERFORMANCE 0x19#define SCSI_SENSEQ_SEEK_TIME_PERFORMANCE 0x1A#define SCSI_SENSEQ_SPIN_UP_RETRY_COUNT 0x1B#define SCSI_SENSEQ_DRIVE_CALIBRATION_RETRY_COUNT 0x1C#define SCSI_SENSEQ_DATA_CHANNEL_DATA_ERROR_RATE_TOO_HIGH 0x32#define SCSI_SENSEQ_SERVO_DATA_ERROR_RATE_TOO_HIGH 0x42#define SCSI_SENSEQ_SERVER_SEEK_ERROR_RATE_TOO_HIGH 0x43#define SCSI_SENSEQ_FAILURE_PREDICTION_THRESHOLD_EXCEEDED_FALSE 0xFF
// SCSI_ADSENSE_COPY_PROTECTION_FAILURE (0x6f)
#define SCSI_SENSEQ_AUTHENTICATION_FAILURE 0x00#define SCSI_SENSEQ_KEY_NOT_PRESENT 0x01#define SCSI_SENSEQ_KEY_NOT_ESTABLISHED 0x02#define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03#define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT 0x04#define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR 0x05
// SCSI_ADSENSE_POWER_CALIBRATION_ERROR (0x73)
#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ALMOST_FULL 0x01#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_FULL 0x02#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ERROR 0x03#define SCSI_SENSEQ_PMA_RMA_UPDATE_FAILURE 0x04#define SCSI_SENSEQ_PMA_RMA_IS_FULL 0x05#define SCSI_SENSEQ_PMA_RMA_ALMOST_FULL 0x06
#define FILE_DEVICE_SCSI 0x0000001b
#define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)#define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)#define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
/* SMART support in ATAPI */#define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)#define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)#define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505)#define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)#define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508)#define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509)#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a)#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b)#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c)
/* CLUSTER support */#define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520)#define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
#define MODE_FD_SINGLE_SIDE 0x01#define MODE_FD_DOUBLE_SIDE 0x02#define MODE_FD_MAXIMUM_TYPE 0x1E#define MODE_DSP_FUA_SUPPORTED 0x10#define MODE_DSP_WRITE_PROTECT 0x80
#define CDDA_CHANNEL_MUTED 0x0#define CDDA_CHANNEL_ZERO 0x1#define CDDA_CHANNEL_ONE 0x2#define CDDA_CHANNEL_TWO 0x4#define CDDA_CHANNEL_THREE 0x8
#define CDVD_LMT_CADDY 0#define CDVD_LMT_TRAY 1#define CDVD_LMT_POPUP 2#define CDVD_LMT_RESERVED1 3#define CDVD_LMT_CHANGER_INDIVIDUAL 4#define CDVD_LMT_CHANGER_CARTRIDGE 5#define CDVD_LMT_RESERVED2 6#define CDVD_LMT_RESERVED3 7
#define LOADING_MECHANISM_CADDY 0x00#define LOADING_MECHANISM_TRAY 0x01#define LOADING_MECHANISM_POPUP 0x02#define LOADING_MECHANISM_INDIVIDUAL_CHANGER 0x04#define LOADING_MECHANISM_CARTRIDGE_CHANGER 0x05
#define MODE_BLOCK_DESC_LENGTH 8#define MODE_HEADER_LENGTH 4#define MODE_HEADER_LENGTH10 8
/* CDROM audio control */#define CDB_AUDIO_PAUSE 0x00#define CDB_AUDIO_RESUME 0x01#define CDB_DEVICE_START 0x11#define CDB_DEVICE_STOP 0x10#define CDB_EJECT_MEDIA 0x10#define CDB_LOAD_MEDIA 0x01#define CDB_SUBCHANNEL_HEADER 0x00#define CDB_SUBCHANNEL_BLOCK 0x01
#define CDROM_AUDIO_CONTROL_PAGE 0x0E#define MODE_SELECT_IMMEDIATE 0x04#define MODE_SELECT_PFBIT 0x10
#define CDB_USE_MSF 0x01
/* Multisession CDROMs */#define GET_LAST_SESSION 0x01#define GET_SESSION_DATA 0x02
typedef union _CDB { struct _CDB6GENERIC { UCHAR OperationCode; UCHAR Immediate:1; UCHAR CommandUniqueBits:4; UCHAR LogicalUnitNumber:3; UCHAR CommandUniqueBytes[3]; UCHAR Link:1; UCHAR Flag:1; UCHAR Reserved:4; UCHAR VendorUnique:2; } CDB6GENERIC, *PCDB6GENERIC; struct _CDB6READWRITE { UCHAR OperationCode; UCHAR LogicalBlockMsb1:5; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlockMsb0; UCHAR LogicalBlockLsb; UCHAR TransferBlocks; UCHAR Control; } CDB6READWRITE, *PCDB6READWRITE; struct _CDB6INQUIRY { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR PageCode; UCHAR IReserved; UCHAR AllocationLength; UCHAR Control; } CDB6INQUIRY, *PCDB6INQUIRY; struct _CDB6INQUIRY3 { UCHAR OperationCode; UCHAR EnableVitalProductData:1; UCHAR CommandSupportData:1; UCHAR Reserved1:6; UCHAR PageCode; UCHAR Reserved2; UCHAR AllocationLength; UCHAR Control; } CDB6INQUIRY3, *PCDB6INQUIRY3; struct _CDB6VERIFY { UCHAR OperationCode; UCHAR Fixed:1; UCHAR ByteCompare:1; UCHAR Immediate:1; UCHAR Reserved:2; UCHAR LogicalUnitNumber:3; UCHAR VerificationLength[3]; UCHAR Control; } CDB6VERIFY, *PCDB6VERIFY; struct _CDB6FORMAT { UCHAR OperationCode; UCHAR FormatControl:5; UCHAR LogicalUnitNumber:3; UCHAR FReserved1; UCHAR InterleaveMsb; UCHAR InterleaveLsb; UCHAR FReserved2; } CDB6FORMAT, *PCDB6FORMAT; struct _CDB10 { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved1:2; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlockByte0; UCHAR LogicalBlockByte1; UCHAR LogicalBlockByte2; UCHAR LogicalBlockByte3; UCHAR Reserved2; UCHAR TransferBlocksMsb; UCHAR TransferBlocksLsb; UCHAR Control; } CDB10, *PCDB10; struct _CDB12 { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved1:2; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlock[4]; UCHAR TransferLength[4]; UCHAR Reserved2; UCHAR Control; } CDB12, *PCDB12; struct _CDB16 { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR Protection:3; UCHAR LogicalBlock[8]; UCHAR TransferLength[4]; UCHAR Reserved2; UCHAR Control; } CDB16, *PCDB16; struct _PAUSE_RESUME { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR Reserved2[6]; UCHAR Action; UCHAR Control; } PAUSE_RESUME, *PPAUSE_RESUME; struct _READ_TOC { UCHAR OperationCode; UCHAR Reserved0:1; UCHAR Msf:1; UCHAR Reserved1:3; UCHAR LogicalUnitNumber:3; UCHAR Format2:4; UCHAR Reserved2:4; UCHAR Reserved3[3]; UCHAR StartingTrack; UCHAR AllocationLength[2]; UCHAR Control:6; UCHAR Format:2; } READ_TOC, *PREAD_TOC; struct _READ_DISK_INFORMATION { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR Reserved2[5]; UCHAR AllocationLength[2]; UCHAR Control; } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION; struct _READ_TRACK_INFORMATION { UCHAR OperationCode; UCHAR Track:1; UCHAR Reserved1:3; UCHAR Reserved2:1; UCHAR Lun:3; UCHAR BlockAddress[4]; UCHAR Reserved3; UCHAR AllocationLength[2]; UCHAR Control; } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION; struct _RESERVE_TRACK_RZONE { UCHAR OperationCode; UCHAR Reserved1[4]; UCHAR ReservationSize[4]; UCHAR Control; } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE; struct _SEND_OPC_INFORMATION { UCHAR OperationCode; UCHAR DoOpc:1; UCHAR Reserved1:7; UCHAR Exclude0:1; UCHAR Exclude1:1; UCHAR Reserved2:6; UCHAR Reserved3[4]; UCHAR ParameterListLength[2]; UCHAR Reserved4; } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION; struct _REPAIR_TRACK { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Reserved1:7; UCHAR Reserved2[2]; UCHAR TrackNumber[2]; UCHAR Reserved3[3]; UCHAR Control; } REPAIR_TRACK, *PREPAIR_TRACK; struct _CLOSE_TRACK { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Reserved1:7; UCHAR Track:1; UCHAR Session:1; UCHAR Reserved2:6; UCHAR Reserved3; UCHAR TrackNumber[2]; UCHAR Reserved4[3]; UCHAR Control; } CLOSE_TRACK, *PCLOSE_TRACK; struct _READ_BUFFER_CAPACITY { UCHAR OperationCode; UCHAR BlockInfo:1; UCHAR Reserved1:7; UCHAR Reserved2[5]; UCHAR AllocationLength[2]; UCHAR Control; } READ_BUFFER_CAPACITY, *PREAD_BUFFER_CAPACITY; struct _SEND_CUE_SHEET { UCHAR OperationCode; UCHAR Reserved[5]; UCHAR CueSheetSize[3]; UCHAR Control; } SEND_CUE_SHEET, *PSEND_CUE_SHEET; struct _READ_HEADER { UCHAR OperationCode; UCHAR Reserved1:1; UCHAR Msf:1; UCHAR Reserved2:3; UCHAR Lun:3; UCHAR LogicalBlockAddress[4]; UCHAR Reserved3; UCHAR AllocationLength[2]; UCHAR Control; } READ_HEADER, *PREAD_HEADER; struct _PLAY_AUDIO { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR StartingBlockAddress[4]; UCHAR Reserved2; UCHAR PlayLength[2]; UCHAR Control; } PLAY_AUDIO, *PPLAY_AUDIO; struct _PLAY_AUDIO_MSF { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR Reserved2; UCHAR StartingM; UCHAR StartingS; UCHAR StartingF; UCHAR EndingM; UCHAR EndingS; UCHAR EndingF; UCHAR Control; } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF; struct _BLANK_MEDIA { UCHAR OperationCode; UCHAR BlankType:3; UCHAR Reserved1:1; UCHAR Immediate:1; UCHAR Reserved2:3; UCHAR AddressOrTrack[4]; UCHAR Reserved3[5]; UCHAR Control; } BLANK_MEDIA, *PBLANK_MEDIA; struct _PLAY_CD { UCHAR OperationCode; UCHAR Reserved1:1; UCHAR CMSF:1; UCHAR ExpectedSectorType:3; UCHAR Lun:3; _ANONYMOUS_UNION union { struct _LBA { UCHAR StartingBlockAddress[4]; UCHAR PlayLength[4]; } LBA; struct _MSF { UCHAR Reserved1; UCHAR StartingM; UCHAR StartingS; UCHAR StartingF; UCHAR EndingM; UCHAR EndingS; UCHAR EndingF; UCHAR Reserved2; } MSF; } DUMMYUNIONNAME; UCHAR Audio:1; UCHAR Composite:1; UCHAR Port1:1; UCHAR Port2:1; UCHAR Reserved2:3; UCHAR Speed:1; UCHAR Control; } PLAY_CD, *PPLAY_CD; struct _SCAN_CD { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved1:3; UCHAR Direct:1; UCHAR Lun:3; UCHAR StartingAddress[4]; UCHAR Reserved2[3]; UCHAR Reserved3:6; UCHAR Type:2; UCHAR Reserved4; UCHAR Control; } SCAN_CD, *PSCAN_CD; struct _STOP_PLAY_SCAN { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR Reserved2[7]; UCHAR Control; } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN; struct _SUBCHANNEL { UCHAR OperationCode; UCHAR Reserved0:1; UCHAR Msf:1; UCHAR Reserved1:3; UCHAR LogicalUnitNumber:3; UCHAR Reserved2:6; UCHAR SubQ:1; UCHAR Reserved3:1; UCHAR Format; UCHAR Reserved4[2]; UCHAR TrackNumber; UCHAR AllocationLength[2]; UCHAR Control; } SUBCHANNEL, *PSUBCHANNEL; struct _READ_CD { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved0:1; UCHAR ExpectedSectorType:3; UCHAR Lun:3; UCHAR StartingLBA[4]; UCHAR TransferBlocks[3]; UCHAR Reserved2:1; UCHAR ErrorFlags:2; UCHAR IncludeEDC:1; UCHAR IncludeUserData:1; UCHAR HeaderCode:2; UCHAR IncludeSyncData:1; UCHAR SubChannelSelection:3; UCHAR Reserved3:5; UCHAR Control; } READ_CD, *PREAD_CD; struct _READ_CD_MSF { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved1:1; UCHAR ExpectedSectorType:3; UCHAR Lun:3; UCHAR Reserved2; UCHAR StartingM; UCHAR StartingS; UCHAR StartingF; UCHAR EndingM; UCHAR EndingS; UCHAR EndingF; UCHAR Reserved3; UCHAR Reserved4:1; UCHAR ErrorFlags:2; UCHAR IncludeEDC:1; UCHAR IncludeUserData:1; UCHAR HeaderCode:2; UCHAR IncludeSyncData:1; UCHAR SubChannelSelection:3; UCHAR Reserved5:5; UCHAR Control; } READ_CD_MSF, *PREAD_CD_MSF; struct _PLXTR_READ_CDDA { UCHAR OperationCode; UCHAR Reserved0:5; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlockByte0; UCHAR LogicalBlockByte1; UCHAR LogicalBlockByte2; UCHAR LogicalBlockByte3; UCHAR TransferBlockByte0; UCHAR TransferBlockByte1; UCHAR TransferBlockByte2; UCHAR TransferBlockByte3; UCHAR SubCode; UCHAR Control; } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA; struct _NEC_READ_CDDA { UCHAR OperationCode; UCHAR Reserved0; UCHAR LogicalBlockByte0; UCHAR LogicalBlockByte1; UCHAR LogicalBlockByte2; UCHAR LogicalBlockByte3; UCHAR Reserved1; UCHAR TransferBlockByte0; UCHAR TransferBlockByte1; UCHAR Control; } NEC_READ_CDDA, *PNEC_READ_CDDA;#if (NTDDI_VERSION >= NTDDI_WIN8) struct _MODE_SENSE { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR Dbd:1; UCHAR Reserved2:4; UCHAR PageCode:6; UCHAR Pc:2; UCHAR SubPageCode; UCHAR AllocationLength; UCHAR Control; } MODE_SENSE; struct _MODE_SENSE10 { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR Dbd:1; UCHAR LongLBAAccepted:1; UCHAR Reserved2:3; UCHAR PageCode:6; UCHAR Pc:2; UCHAR SubPageCode; UCHAR Reserved3[3]; UCHAR AllocationLength[2]; UCHAR Control; } MODE_SENSE10;#else struct _MODE_SENSE { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR Dbd:1; UCHAR Reserved2:1; UCHAR LogicalUnitNumber:3; UCHAR PageCode:6; UCHAR Pc:2; UCHAR Reserved3; UCHAR AllocationLength; UCHAR Control; } MODE_SENSE, *PMODE_SENSE; struct _MODE_SENSE10 { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR Dbd:1; UCHAR Reserved2:1; UCHAR LogicalUnitNumber:3; UCHAR PageCode:6; UCHAR Pc:2; UCHAR Reserved3[4]; UCHAR AllocationLength[2]; UCHAR Control; } MODE_SENSE10, *PMODE_SENSE10;#endif struct _MODE_SELECT { UCHAR OperationCode; UCHAR SPBit:1; UCHAR Reserved1:3; UCHAR PFBit:1; UCHAR LogicalUnitNumber:3; UCHAR Reserved2[2]; UCHAR ParameterListLength; UCHAR Control; } MODE_SELECT, *PMODE_SELECT; struct _MODE_SELECT10 { UCHAR OperationCode; UCHAR SPBit:1; UCHAR Reserved1:3; UCHAR PFBit:1; UCHAR LogicalUnitNumber:3; UCHAR Reserved2[5]; UCHAR ParameterListLength[2]; UCHAR Control; } MODE_SELECT10, *PMODE_SELECT10; struct _LOCATE { UCHAR OperationCode; UCHAR Immediate:1; UCHAR CPBit:1; UCHAR BTBit:1; UCHAR Reserved1:2; UCHAR LogicalUnitNumber:3; UCHAR Reserved3; UCHAR LogicalBlockAddress[4]; UCHAR Reserved4; UCHAR Partition; UCHAR Control; } LOCATE, *PLOCATE; struct _LOGSENSE { UCHAR OperationCode; UCHAR SPBit:1; UCHAR PPCBit:1; UCHAR Reserved1:3; UCHAR LogicalUnitNumber:3; UCHAR PageCode:6; UCHAR PCBit:2; UCHAR Reserved2; UCHAR Reserved3; UCHAR ParameterPointer[2]; UCHAR AllocationLength[2]; UCHAR Control; } LOGSENSE, *PLOGSENSE; struct _LOGSELECT { UCHAR OperationCode; UCHAR SPBit:1; UCHAR PCRBit:1; UCHAR Reserved1:3; UCHAR LogicalUnitNumber:3; UCHAR Reserved:6; UCHAR PCBit:2; UCHAR Reserved2[4]; UCHAR ParameterListLength[2]; UCHAR Control; } LOGSELECT, *PLOGSELECT; struct _PRINT { UCHAR OperationCode; UCHAR Reserved:5; UCHAR LogicalUnitNumber:3; UCHAR TransferLength[3]; UCHAR Control; } PRINT, *PPRINT; struct _SEEK { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlockAddress[4]; UCHAR Reserved2[3]; UCHAR Control; } SEEK, *PSEEK; struct _ERASE { UCHAR OperationCode; UCHAR Long:1; UCHAR Immediate:1; UCHAR Reserved1:3; UCHAR LogicalUnitNumber:3; UCHAR Reserved2[3]; UCHAR Control; } ERASE, *PERASE; struct _START_STOP { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Reserved1:4; UCHAR LogicalUnitNumber:3; UCHAR Reserved2[2]; UCHAR Start:1; UCHAR LoadEject:1; UCHAR Reserved3:6; UCHAR Control; } START_STOP, *PSTART_STOP; struct _MEDIA_REMOVAL { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR Reserved2[2]; UCHAR Prevent:1; UCHAR Persistant:1; UCHAR Reserved3:6; UCHAR Control; } MEDIA_REMOVAL, *PMEDIA_REMOVAL; struct _SEEK_BLOCK { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Reserved1:7; UCHAR BlockAddress[3]; UCHAR Link:1; UCHAR Flag:1; UCHAR Reserved2:4; UCHAR VendorUnique:2; } SEEK_BLOCK, *PSEEK_BLOCK; struct _REQUEST_BLOCK_ADDRESS { UCHAR OperationCode; UCHAR Reserved1[3]; UCHAR AllocationLength; UCHAR Link:1; UCHAR Flag:1; UCHAR Reserved2:4; UCHAR VendorUnique:2; } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS; struct _PARTITION { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Sel:1; UCHAR PartitionSelect:6; UCHAR Reserved1[3]; UCHAR Control; } PARTITION, *PPARTITION; struct _WRITE_TAPE_MARKS { UCHAR OperationCode; UCHAR Immediate:1; UCHAR WriteSetMarks:1; UCHAR Reserved:3; UCHAR LogicalUnitNumber:3; UCHAR TransferLength[3]; UCHAR Control; } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS; struct _SPACE_TAPE_MARKS { UCHAR OperationCode; UCHAR Code:3; UCHAR Reserved:2; UCHAR LogicalUnitNumber:3; UCHAR NumMarksMSB; UCHAR NumMarks; UCHAR NumMarksLSB; union { UCHAR value; struct { UCHAR Link:1; UCHAR Flag:1; UCHAR Reserved:4; UCHAR VendorUnique:2; } Fields; } Byte6; } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS; struct _READ_POSITION { UCHAR Operation; UCHAR BlockType:1; UCHAR Reserved1:4; UCHAR Lun:3; UCHAR Reserved2[7]; UCHAR Control; } READ_POSITION, *PREAD_POSITION; struct _CDB6READWRITETAPE { UCHAR OperationCode; UCHAR VendorSpecific:5; UCHAR Reserved:3; UCHAR TransferLenMSB; UCHAR TransferLen; UCHAR TransferLenLSB; UCHAR Link:1; UCHAR Flag:1; UCHAR Reserved1:4; UCHAR VendorUnique:2; } CDB6READWRITETAPE, *PCDB6READWRITETAPE; struct _INIT_ELEMENT_STATUS { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNubmer:3; UCHAR Reserved2[3]; UCHAR Reserved3:7; UCHAR NoBarCode:1; } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS; struct _INITIALIZE_ELEMENT_RANGE { UCHAR OperationCode; UCHAR Range:1; UCHAR Reserved1:4; UCHAR LogicalUnitNubmer:3; UCHAR FirstElementAddress[2]; UCHAR Reserved2[2]; UCHAR NumberOfElements[2]; UCHAR Reserved3; UCHAR Reserved4:7; UCHAR NoBarCode:1; } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE; struct _POSITION_TO_ELEMENT { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR TransportElementAddress[2]; UCHAR DestinationElementAddress[2]; UCHAR Reserved2[2]; UCHAR Flip:1; UCHAR Reserved3:7; UCHAR Control; } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT; struct _MOVE_MEDIUM { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR TransportElementAddress[2]; UCHAR SourceElementAddress[2]; UCHAR DestinationElementAddress[2]; UCHAR Reserved2[2]; UCHAR Flip:1; UCHAR Reserved3:7; UCHAR Control; } MOVE_MEDIUM, *PMOVE_MEDIUM; struct _EXCHANGE_MEDIUM { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR LogicalUnitNumber:3; UCHAR TransportElementAddress[2]; UCHAR SourceElementAddress[2]; UCHAR Destination1ElementAddress[2]; UCHAR Destination2ElementAddress[2]; UCHAR Flip1:1; UCHAR Flip2:1; UCHAR Reserved3:6; UCHAR Control; } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM; struct _READ_ELEMENT_STATUS { UCHAR OperationCode; UCHAR ElementType:4; UCHAR VolTag:1; UCHAR LogicalUnitNumber:3; UCHAR StartingElementAddress[2]; UCHAR NumberOfElements[2]; UCHAR Reserved1; UCHAR AllocationLength[3]; UCHAR Reserved2; UCHAR Control; } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS; struct _SEND_VOLUME_TAG { UCHAR OperationCode; UCHAR ElementType:4; UCHAR Reserved1:1; UCHAR LogicalUnitNumber:3; UCHAR StartingElementAddress[2]; UCHAR Reserved2; UCHAR ActionCode:5; UCHAR Reserved3:3; UCHAR Reserved4[2]; UCHAR ParameterListLength[2]; UCHAR Reserved5; UCHAR Control; } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG; struct _REQUEST_VOLUME_ELEMENT_ADDRESS { UCHAR OperationCode; UCHAR ElementType:4; UCHAR VolTag:1; UCHAR LogicalUnitNumber:3; UCHAR StartingElementAddress[2]; UCHAR NumberElements[2]; UCHAR Reserved1; UCHAR AllocationLength[3]; UCHAR Reserved2; UCHAR Control; } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS; struct _LOAD_UNLOAD { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Reserved1:4; UCHAR Lun:3; UCHAR Reserved2[2]; UCHAR Start:1; UCHAR LoadEject:1; UCHAR Reserved3:6; UCHAR Reserved4[3]; UCHAR Slot; UCHAR Reserved5[3]; } LOAD_UNLOAD, *PLOAD_UNLOAD; struct _MECH_STATUS { UCHAR OperationCode; UCHAR Reserved:5; UCHAR Lun:3; UCHAR Reserved1[6]; UCHAR AllocationLength[2]; UCHAR Reserved2[1]; UCHAR Control; } MECH_STATUS, *PMECH_STATUS; struct _SYNCHRONIZE_CACHE10 { UCHAR OperationCode; UCHAR RelAddr:1; UCHAR Immediate:1; UCHAR Reserved:3; UCHAR Lun:3; UCHAR LogicalBlockAddress[4]; UCHAR Reserved2; UCHAR BlockCount[2]; UCHAR Control; } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10; struct _GET_EVENT_STATUS_NOTIFICATION { UCHAR OperationCode; UCHAR Immediate:1; UCHAR Reserved:4; UCHAR Lun:3; UCHAR Reserved2[2]; UCHAR NotificationClassRequest; UCHAR Reserved3[2]; UCHAR EventListLength[2]; UCHAR Control; } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION; struct _GET_PERFORMANCE { UCHAR OperationCode; UCHAR Except:2; UCHAR Write:1; UCHAR Tolerance:2; UCHAR Reserved0:3; UCHAR StartingLBA[4]; UCHAR Reserved1[2]; UCHAR MaximumNumberOfDescriptors[2]; UCHAR Type; UCHAR Control; } GET_PERFORMANCE; struct _READ_DVD_STRUCTURE { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR RMDBlockNumber[4]; UCHAR LayerNumber; UCHAR Format; UCHAR AllocationLength[2]; UCHAR Reserved3:6; UCHAR AGID:2; UCHAR Control; } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE; struct _SET_STREAMING { UCHAR OperationCode; UCHAR Reserved[8]; UCHAR ParameterListLength[2]; UCHAR Control; } SET_STREAMING; struct _SEND_DVD_STRUCTURE { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR Reserved2[5]; UCHAR Format; UCHAR ParameterListLength[2]; UCHAR Reserved3; UCHAR Control; } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE; struct _SEND_KEY { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR Reserved2[6]; UCHAR ParameterListLength[2]; UCHAR KeyFormat:6; UCHAR AGID:2; UCHAR Control; } SEND_KEY, *PSEND_KEY; struct _REPORT_KEY { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR LogicalBlockAddress[4]; UCHAR Reserved2[2]; UCHAR AllocationLength[2]; UCHAR KeyFormat:6; UCHAR AGID:2; UCHAR Control; } REPORT_KEY, *PREPORT_KEY; struct _SET_READ_AHEAD { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR TriggerLBA[4]; UCHAR ReadAheadLBA[4]; UCHAR Reserved2; UCHAR Control; } SET_READ_AHEAD, *PSET_READ_AHEAD; struct _READ_FORMATTED_CAPACITIES { UCHAR OperationCode; UCHAR Reserved1:5; UCHAR Lun:3; UCHAR Reserved2[5]; UCHAR AllocationLength[2]; UCHAR Control; } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES; struct _REPORT_LUNS { UCHAR OperationCode; UCHAR Reserved1[5]; UCHAR AllocationLength[4]; UCHAR Reserved2[1]; UCHAR Control; } REPORT_LUNS, *PREPORT_LUNS; struct _PERSISTENT_RESERVE_IN { UCHAR OperationCode; UCHAR ServiceAction:5; UCHAR Reserved1:3; UCHAR Reserved2[5]; UCHAR AllocationLength[2]; UCHAR Control; } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN; struct _PERSISTENT_RESERVE_OUT { UCHAR OperationCode; UCHAR ServiceAction:5; UCHAR Reserved1:3; UCHAR Type:4; UCHAR Scope:4; UCHAR Reserved2[4]; UCHAR ParameterListLength[2]; UCHAR Control; } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT; struct _GET_CONFIGURATION { UCHAR OperationCode; UCHAR RequestType:1; UCHAR Reserved1:7; UCHAR StartingFeature[2]; UCHAR Reserved2[3]; UCHAR AllocationLength[2]; UCHAR Control; } GET_CONFIGURATION, *PGET_CONFIGURATION; struct _SET_CD_SPEED { UCHAR OperationCode; _ANONYMOUS_UNION union { UCHAR Reserved1; _ANONYMOUS_STRUCT struct { UCHAR RotationControl:2; UCHAR Reserved3:6; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; UCHAR ReadSpeed[2]; UCHAR WriteSpeed[2]; UCHAR Reserved2[5]; UCHAR Control; } SET_CD_SPEED, *PSET_CD_SPEED; struct _READ12 { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved1:2; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlock[4]; UCHAR TransferLength[4]; UCHAR Reserved2:7; UCHAR Streaming:1; UCHAR Control; } READ12; struct _WRITE12 { UCHAR OperationCode; UCHAR RelativeAddress:1; UCHAR Reserved1:1; UCHAR EBP:1; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR LogicalUnitNumber:3; UCHAR LogicalBlock[4]; UCHAR TransferLength[4]; UCHAR Reserved2:7; UCHAR Streaming:1; UCHAR Control; } WRITE12; struct _ATA_PASSTHROUGH12 { UCHAR OperationCode; UCHAR Reserved1:1; UCHAR Protocol:4; UCHAR MultipleCount:3; UCHAR TLength:2; UCHAR ByteBlock:1; UCHAR TDir:1; UCHAR Reserved2:1; UCHAR CkCond:1; UCHAR Offline:2; UCHAR Features; UCHAR SectorCount; UCHAR LbaLow; UCHAR LbaMid; UCHAR LbaHigh; UCHAR Device; UCHAR Command; UCHAR Reserved3; UCHAR Control; } ATA_PASSTHROUGH12; struct _READ16 { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR ReadProtect:3; UCHAR LogicalBlock[8]; UCHAR TransferLength[4]; UCHAR Reserved2:7; UCHAR Streaming:1; UCHAR Control; } READ16; struct _WRITE16 { UCHAR OperationCode; UCHAR Reserved1:3; UCHAR ForceUnitAccess:1; UCHAR DisablePageOut:1; UCHAR WriteProtect:3; UCHAR LogicalBlock[8]; UCHAR TransferLength[4]; UCHAR Reserved2:7; UCHAR Streaming:1; UCHAR Control; } WRITE16; struct _VERIFY16 { UCHAR OperationCode; UCHAR Reserved1:1; UCHAR ByteCheck:1; UCHAR BlockVerify:1; UCHAR Reserved2: 1; UCHAR DisablePageOut:1; UCHAR VerifyProtect:3; UCHAR LogicalBlock[8]; UCHAR VerificationLength[4]; UCHAR Reserved3:7; UCHAR Streaming:1; UCHAR Control; } VERIFY16; struct _SYNCHRONIZE_CACHE16 { UCHAR OperationCode; UCHAR Reserved1:1; UCHAR Immediate:1; UCHAR Reserved2:6; UCHAR LogicalBlock[8]; UCHAR BlockCount[4]; UCHAR Reserved3; UCHAR Control; } SYNCHRONIZE_CACHE16; struct _READ_CAPACITY16 { UCHAR OperationCode; UCHAR ServiceAction:5; UCHAR Reserved1:3; UCHAR LogicalBlock[8]; UCHAR AllocationLength[4]; UCHAR PMI:1; UCHAR Reserved2:7; UCHAR Control; } READ_CAPACITY16; struct _ATA_PASSTHROUGH16 { UCHAR OperationCode; UCHAR Extend:1; UCHAR Protocol:4; UCHAR MultipleCount:3; UCHAR TLength:2; UCHAR ByteBlock:1; UCHAR TDir:1; UCHAR Reserved1:1; UCHAR CkCond:1; UCHAR Offline:2; UCHAR Features15_8; UCHAR Features7_0; UCHAR SectorCount15_8; UCHAR SectorCount7_0; UCHAR LbaLow15_8; UCHAR LbaLow7_0; UCHAR LbaMid15_8; UCHAR LbaMid7_0; UCHAR LbaHigh15_8; UCHAR LbaHigh7_0; UCHAR Device; UCHAR Command; UCHAR Control; } ATA_PASSTHROUGH16; struct _TOKEN_OPERATION { UCHAR OperationCode; UCHAR ServiceAction:5; UCHAR Reserved1:3; UCHAR Reserved2[4]; UCHAR ListIdentifier[4]; UCHAR ParameterListLength[4]; UCHAR GroupNumber:5; UCHAR Reserved3:3; UCHAR Control; } TOKEN_OPERATION; struct _RECEIVE_TOKEN_INFORMATION { UCHAR OperationCode; UCHAR ServiceAction:5; UCHAR Reserved1:3; UCHAR ListIdentifier[4]; UCHAR Reserved2[4]; UCHAR AllocationLength[4]; UCHAR Reserved3; UCHAR Control; } RECEIVE_TOKEN_INFORMATION; struct _UNMAP { UCHAR OperationCode; UCHAR Anchor:1; UCHAR Reserved1:7; UCHAR Reserved2[4]; UCHAR GroupNumber:5; UCHAR Reserved3:3; UCHAR AllocationLength[2]; UCHAR Control; } UNMAP; struct _GET_LBA_STATUS { UCHAR OperationCode; UCHAR ServiceAction:5; UCHAR Reserved1:3; UCHAR StartingLBA[8]; UCHAR AllocationLength[4]; UCHAR Reserved2; UCHAR Control; } GET_LBA_STATUS; ULONG AsUlong[4]; UCHAR AsByte[16];} CDB, *PCDB;
typedef struct _NOTIFICATION_EVENT_STATUS_HEADER { UCHAR EventDataLength[2]; UCHAR NotificationClass:3; UCHAR Reserved:4; UCHAR NEA:1; UCHAR SupportedEventClasses; UCHAR ClassEventData[0];} NOTIFICATION_EVENT_STATUS_HEADER, *PNOTIFICATION_EVENT_STATUS_HEADER;
typedef struct _NOTIFICATION_OPERATIONAL_STATUS { UCHAR OperationalEvent:4; UCHAR Reserved1:4; UCHAR OperationalStatus:4; UCHAR Reserved2:3; UCHAR PersistentPrevented:1; UCHAR Operation[2];} NOTIFICATION_OPERATIONAL_STATUS, *PNOTIFICATION_OPERATIONAL_STATUS;
typedef struct _NOTIFICATION_POWER_STATUS { UCHAR PowerEvent:4; UCHAR Reserved:4; UCHAR PowerStatus; UCHAR Reserved2[2];} NOTIFICATION_POWER_STATUS, *PNOTIFICATION_POWER_STATUS;
typedef struct _NOTIFICATION_EXTERNAL_STATUS { UCHAR ExternalEvent:4; UCHAR Reserved1:4; UCHAR ExternalStatus:4; UCHAR Reserved2:3; UCHAR PersistentPrevented:1; UCHAR Request[2];} NOTIFICATION_EXTERNAL_STATUS, *PNOTIFICATION_EXTERNAL_STATUS;
typedef struct _NOTIFICATION_MEDIA_STATUS { UCHAR MediaEvent:4; UCHAR Reserved:4; _ANONYMOUS_UNION union { UCHAR PowerStatus; UCHAR MediaStatus; _ANONYMOUS_STRUCT struct { UCHAR DoorTrayOpen:1; UCHAR MediaPresent:1; UCHAR ReservedX:6; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; UCHAR StartSlot; UCHAR EndSlot;} NOTIFICATION_MEDIA_STATUS, *PNOTIFICATION_MEDIA_STATUS;
typedef struct _NOTIFICATION_MULTI_HOST_STATUS { UCHAR MultiHostEvent:4; UCHAR Reserved1:4; UCHAR MultiHostStatus:4; UCHAR Reserved2:3; UCHAR PersistentPrevented:1; UCHAR Priority[2];} NOTIFICATION_MULTI_HOST_STATUS, *PNOTIFICATION_MULTI_HOST_STATUS;
typedef struct _NOTIFICATION_BUSY_STATUS { UCHAR DeviceBusyEvent:4; UCHAR Reserved:4; UCHAR DeviceBusyStatus; UCHAR Time[2];} NOTIFICATION_BUSY_STATUS, *PNOTIFICATION_BUSY_STATUS;
typedef struct _READ_DVD_STRUCTURES_HEADER { UCHAR Length[2]; UCHAR Reserved[2]; UCHAR Data[0];} READ_DVD_STRUCTURES_HEADER, *PREAD_DVD_STRUCTURES_HEADER;
typedef struct _CDVD_KEY_HEADER { UCHAR DataLength[2]; UCHAR Reserved[2]; UCHAR Data[0];} CDVD_KEY_HEADER, *PCDVD_KEY_HEADER;
typedef struct _CDVD_REPORT_AGID_DATA { UCHAR Reserved1[3]; UCHAR Reserved2:6; UCHAR AGID:2;} CDVD_REPORT_AGID_DATA, *PCDVD_REPORT_AGID_DATA;
typedef struct _CDVD_CHALLENGE_KEY_DATA { UCHAR ChallengeKeyValue[10]; UCHAR Reserved[2];} CDVD_CHALLENGE_KEY_DATA, *PCDVD_CHALLENGE_KEY_DATA;
typedef struct _CDVD_KEY_DATA { UCHAR Key[5]; UCHAR Reserved[3];} CDVD_KEY_DATA, *PCDVD_KEY_DATA;
typedef struct _CDVD_REPORT_ASF_DATA { UCHAR Reserved1[3]; UCHAR Success:1; UCHAR Reserved2:7;} CDVD_REPORT_ASF_DATA, *PCDVD_REPORT_ASF_DATA;
typedef struct _CDVD_TITLE_KEY_HEADER { UCHAR DataLength[2]; UCHAR Reserved1[1]; UCHAR Reserved2:3; UCHAR CGMS:2; UCHAR CP_SEC:1; UCHAR CPM:1; UCHAR Zero:1; CDVD_KEY_DATA TitleKey;} CDVD_TITLE_KEY_HEADER, *PCDVD_TITLE_KEY_HEADER;
typedef struct _FORMAT_DESCRIPTOR { UCHAR NumberOfBlocks[4]; UCHAR FormatSubType:2; UCHAR FormatType:6; UCHAR BlockLength[3];} FORMAT_DESCRIPTOR, *PFORMAT_DESCRIPTOR;
typedef struct _FORMAT_LIST_HEADER { UCHAR Reserved; UCHAR VendorSpecific:1; UCHAR Immediate:1; UCHAR TryOut:1; UCHAR IP:1; UCHAR STPF:1; UCHAR DCRT:1; UCHAR DPRY:1; UCHAR FOV:1; UCHAR FormatDescriptorLength[2]; FORMAT_DESCRIPTOR Descriptors[0];} FORMAT_LIST_HEADER, *PFORMAT_LIST_HEADER;
typedef struct _FORMATTED_CAPACITY_DESCRIPTOR { UCHAR NumberOfBlocks[4]; UCHAR Maximum:1; UCHAR Valid:1; UCHAR FormatType:6; UCHAR BlockLength[3];} FORMATTED_CAPACITY_DESCRIPTOR, *PFORMATTED_CAPACITY_DESCRIPTOR;
typedef struct _FORMATTED_CAPACITY_LIST { UCHAR Reserved[3]; UCHAR CapacityListLength; FORMATTED_CAPACITY_DESCRIPTOR Descriptors[0];} FORMATTED_CAPACITY_LIST, *PFORMATTED_CAPACITY_LIST;
typedef struct _OPC_TABLE_ENTRY { UCHAR Speed[2]; UCHAR OPCValue[6];} OPC_TABLE_ENTRY, *POPC_TABLE_ENTRY;
typedef struct _DISC_INFORMATION { UCHAR Length[2]; UCHAR DiscStatus:2; UCHAR LastSessionStatus:2; UCHAR Erasable:1; UCHAR Reserved1:3; UCHAR FirstTrackNumber; UCHAR NumberOfSessionsLsb; UCHAR LastSessionFirstTrackLsb; UCHAR LastSessionLastTrackLsb; UCHAR MrwStatus:2; UCHAR MrwDirtyBit:1; UCHAR Reserved2:2; UCHAR URU:1; UCHAR DBC_V:1; UCHAR DID_V:1; UCHAR DiscType; UCHAR NumberOfSessionsMsb; UCHAR LastSessionFirstTrackMsb; UCHAR LastSessionLastTrackMsb; UCHAR DiskIdentification[4]; UCHAR LastSessionLeadIn[4]; UCHAR LastPossibleLeadOutStartTime[4]; UCHAR DiskBarCode[8]; UCHAR Reserved4; UCHAR NumberOPCEntries; OPC_TABLE_ENTRY OPCTable[1];} DISC_INFORMATION, *PDISC_INFORMATION;
typedef struct _DISK_INFORMATION { UCHAR Length[2]; UCHAR DiskStatus:2; UCHAR LastSessionStatus:2; UCHAR Erasable:1; UCHAR Reserved1:3; UCHAR FirstTrackNumber; UCHAR NumberOfSessions; UCHAR LastSessionFirstTrack; UCHAR LastSessionLastTrack; UCHAR Reserved2:5; UCHAR GEN:1; UCHAR DBC_V:1; UCHAR DID_V:1; UCHAR DiskType; UCHAR Reserved3[3]; UCHAR DiskIdentification[4]; UCHAR LastSessionLeadIn[4]; UCHAR LastPossibleStartTime[4]; UCHAR DiskBarCode[8]; UCHAR Reserved4; UCHAR NumberOPCEntries; OPC_TABLE_ENTRY OPCTable[0];} DISK_INFORMATION, *PDISK_INFORMATION;
typedef struct _DATA_BLOCK_HEADER { UCHAR DataMode; UCHAR Reserved[4]; _ANONYMOUS_UNION union { UCHAR LogicalBlockAddress[4]; struct { UCHAR Reserved; UCHAR M; UCHAR S; UCHAR F; } MSF; } DUMMYUNIONNAME;} DATA_BLOCK_HEADER, *PDATA_BLOCK_HEADER;
typedef struct _TRACK_INFORMATION { UCHAR Length[2]; UCHAR TrackNumber; UCHAR SessionNumber; UCHAR Reserved1; UCHAR TrackMode:4; UCHAR Copy:1; UCHAR Damage:1; UCHAR Reserved2:2; UCHAR DataMode:4; UCHAR FP:1; UCHAR Packet:1; UCHAR Blank:1; UCHAR RT:1; UCHAR NWA_V:1; UCHAR Reserved3:7; UCHAR TrackStartAddress[4]; UCHAR NextWritableAddress[4]; UCHAR FreeBlocks[4]; UCHAR FixedPacketSize[4];} TRACK_INFORMATION, *PTRACK_INFORMATION;
typedef struct _TRACK_INFORMATION2 { UCHAR Length[2]; UCHAR TrackNumberLsb; UCHAR SessionNumberLsb; UCHAR Reserved4; UCHAR TrackMode:4; UCHAR Copy:1; UCHAR Damage:1; UCHAR Reserved5:2; UCHAR DataMode:4; UCHAR FixedPacket:1; UCHAR Packet:1; UCHAR Blank:1; UCHAR ReservedTrack:1; UCHAR NWA_V:1; UCHAR LRA_V:1; UCHAR Reserved6:6; UCHAR TrackStartAddress[4]; UCHAR NextWritableAddress[4]; UCHAR FreeBlocks[4]; UCHAR FixedPacketSize[4]; UCHAR TrackSize[4]; UCHAR LastRecordedAddress[4]; UCHAR TrackNumberMsb; UCHAR SessionNumberMsb; UCHAR Reserved7[2];} TRACK_INFORMATION2, *PTRACK_INFORMATION2;
typedef struct _TRACK_INFORMATION3 { UCHAR Length[2]; UCHAR TrackNumberLsb; UCHAR SessionNumberLsb; UCHAR Reserved4; UCHAR TrackMode:4; UCHAR Copy:1; UCHAR Damage:1; UCHAR Reserved5:2; UCHAR DataMode:4; UCHAR FixedPacket:1; UCHAR Packet:1; UCHAR Blank:1; UCHAR ReservedTrack:1; UCHAR NWA_V:1; UCHAR LRA_V:1; UCHAR Reserved6:6; UCHAR TrackStartAddress[4]; UCHAR NextWritableAddress[4]; UCHAR FreeBlocks[4]; UCHAR FixedPacketSize[4]; UCHAR TrackSize[4]; UCHAR LastRecordedAddress[4]; UCHAR TrackNumberMsb; UCHAR SessionNumberMsb; UCHAR Reserved7[2]; UCHAR ReadCompatibilityLba[4];} TRACK_INFORMATION3, *PTRACK_INFORMATION3;
typedef struct _PERFORMANCE_DESCRIPTOR { UCHAR RandomAccess:1; UCHAR Exact:1; UCHAR RestoreDefaults:1; UCHAR WriteRotationControl:2; UCHAR Reserved1:3; UCHAR Reserved[3]; UCHAR StartLba[4]; UCHAR EndLba[4]; UCHAR ReadSize[4]; UCHAR ReadTime[4]; UCHAR WriteSize[4]; UCHAR WriteTime[4];} PERFORMANCE_DESCRIPTOR, *PPERFORMANCE_DESCRIPTOR;
typedef struct _SCSI_EXTENDED_MESSAGE { UCHAR InitialMessageCode; UCHAR MessageLength; UCHAR MessageType; union _EXTENDED_ARGUMENTS { struct { UCHAR Modifier[4]; } Modify; struct { UCHAR TransferPeriod; UCHAR ReqAckOffset; } Synchronous; struct{ UCHAR Width; } Wide; } ExtendedArguments;}SCSI_EXTENDED_MESSAGE, *PSCSI_EXTENDED_MESSAGE;
#ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */#define _INQUIRYDATA_DEFINED
#define INQUIRYDATABUFFERSIZE 36
#if (NTDDI_VERSION < NTDDI_WINXP)typedef struct _INQUIRYDATA { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR DeviceTypeModifier:7; UCHAR RemovableMedia:1; UCHAR Versions; UCHAR ResponseDataFormat:4; UCHAR HiSupport:1; UCHAR NormACA:1; UCHAR ReservedBit:1; UCHAR AERC:1; UCHAR AdditionalLength; UCHAR Reserved[2]; UCHAR SoftReset:1; UCHAR CommandQueue:1; UCHAR Reserved2:1; UCHAR LinkedCommands:1; UCHAR Synchronous:1; UCHAR Wide16Bit:1; UCHAR Wide32Bit:1; UCHAR RelativeAddressing:1; UCHAR VendorId[8]; UCHAR ProductId[16]; UCHAR ProductRevisionLevel[4]; UCHAR VendorSpecific[20]; UCHAR Reserved3[40];} INQUIRYDATA, *PINQUIRYDATA;#elsetypedef struct _INQUIRYDATA { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR DeviceTypeModifier:7; UCHAR RemovableMedia:1; _ANONYMOUS_UNION union { UCHAR Versions; _ANONYMOUS_STRUCT struct { UCHAR ANSIVersion:3; UCHAR ECMAVersion:3; UCHAR ISOVersion:2; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; UCHAR ResponseDataFormat:4; UCHAR HiSupport:1; UCHAR NormACA:1; UCHAR TerminateTask:1; UCHAR AERC:1; UCHAR AdditionalLength; UCHAR Reserved; UCHAR Addr16:1; UCHAR Addr32:1; UCHAR AckReqQ:1; UCHAR MediumChanger:1; UCHAR MultiPort:1; UCHAR ReservedBit2:1; UCHAR EnclosureServices:1; UCHAR ReservedBit3:1; UCHAR SoftReset:1; UCHAR CommandQueue:1; UCHAR TransferDisable:1; UCHAR LinkedCommands:1; UCHAR Synchronous:1; UCHAR Wide16Bit:1; UCHAR Wide32Bit:1; UCHAR RelativeAddressing:1; UCHAR VendorId[8]; UCHAR ProductId[16]; UCHAR ProductRevisionLevel[4]; UCHAR VendorSpecific[20]; UCHAR Reserved3[40];} INQUIRYDATA, *PINQUIRYDATA;#endif /* (NTDDI_VERSION < NTDDI_WINXP) */
#endif /* _INQUIRYDATA_DEFINED */
#define VPD_MAX_BUFFER_SIZE 0xff
#define VPD_SUPPORTED_PAGES 0x00#define VPD_SERIAL_NUMBER 0x80#define VPD_DEVICE_IDENTIFIERS 0x83#define VPD_MEDIA_SERIAL_NUMBER 0x84#define VPD_SOFTWARE_INTERFACE_IDENTIFIERS 0x84#define VPD_NETWORK_MANAGEMENT_ADDRESSES 0x85#define VPD_EXTENDED_INQUIRY_DATA 0x86#define VPD_MODE_PAGE_POLICY 0x87#define VPD_SCSI_PORTS 0x88#define VPD_ATA_INFORMATION 0x89
#define VPD_THIRD_PARTY_COPY 0x8F#define VPD_BLOCK_LIMITS 0xB0#define VPD_BLOCK_DEVICE_CHARACTERISTICS 0xB1#define VPD_LOGICAL_BLOCK_PROVISIONING 0xB2#define VPD_ZONED_BLOCK_DEVICE_CHARACTERISTICS 0xB6
typedef struct _VPD_MEDIA_SERIAL_NUMBER_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR Reserved; UCHAR PageLength; UCHAR SerialNumber[0];} VPD_MEDIA_SERIAL_NUMBER_PAGE, *PVPD_MEDIA_SERIAL_NUMBER_PAGE;
typedef struct _VPD_SERIAL_NUMBER_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR Reserved; UCHAR PageLength; UCHAR SerialNumber[0];} VPD_SERIAL_NUMBER_PAGE, *PVPD_SERIAL_NUMBER_PAGE;
typedef enum _VPD_CODE_SET { VpdCodeSetReserved = 0, VpdCodeSetBinary = 1, VpdCodeSetAscii = 2, VpdCodeSetUTF8 = 3} VPD_CODE_SET, *PVPD_CODE_SET;
typedef enum _VPD_ASSOCIATION { VpdAssocDevice = 0, VpdAssocPort = 1, VpdAssocTarget = 2, VpdAssocReserved1 = 3, VpdAssocReserved2 = 4} VPD_ASSOCIATION, *PVPD_ASSOCIATION;
typedef enum _VPD_IDENTIFIER_TYPE { VpdIdentifierTypeVendorSpecific = 0, VpdIdentifierTypeVendorId = 1, VpdIdentifierTypeEUI64 = 2, VpdIdentifierTypeFCPHName = 3, VpdIdentifierTypePortRelative = 4, VpdIdentifierTypeTargetPortGroup = 5, VpdIdentifierTypeLogicalUnitGroup = 6, VpdIdentifierTypeMD5LogicalUnitId = 7, VpdIdentifierTypeSCSINameString = 8} VPD_IDENTIFIER_TYPE, *PVPD_IDENTIFIER_TYPE;
typedef struct _VPD_IDENTIFICATION_DESCRIPTOR { UCHAR CodeSet:4; UCHAR Reserved:4; UCHAR IdentifierType:4; UCHAR Association:2; UCHAR Reserved2:2; UCHAR Reserved3; UCHAR IdentifierLength; UCHAR Identifier[0];} VPD_IDENTIFICATION_DESCRIPTOR, *PVPD_IDENTIFICATION_DESCRIPTOR;
typedef struct _VPD_IDENTIFICATION_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR Reserved; UCHAR PageLength; UCHAR Descriptors[0];} VPD_IDENTIFICATION_PAGE, *PVPD_IDENTIFICATION_PAGE;
typedef struct _VPD_ATA_INFORMATION_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR PageLength[2]; UCHAR Reserved0[4]; UCHAR VendorId[8]; UCHAR ProductId[16]; UCHAR ProductRevisionLevel[4]; UCHAR DeviceSignature[20]; UCHAR CommandCode; UCHAR Reserved1[3]; UCHAR IdentifyDeviceData[512];} VPD_ATA_INFORMATION_PAGE, *PVPD_ATA_INFORMATION_PAGE;
#if (NTDDI_VERSION >= NTDDI_WIN8)typedef struct _VPD_THIRD_PARTY_COPY_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR PageLength[2];#if !defined(__midl) UCHAR ThirdPartyCopyDescriptors[ANYSIZE_ARRAY];#endif} VPD_THIRD_PARTY_COPY_PAGE, *PVPD_THIRD_PARTY_COPY_PAGE;
typedef struct _WINDOWS_BLOCK_DEVICE_TOKEN_LIMITS_DESCRIPTOR { UCHAR DescriptorType[2]; UCHAR DescriptorLength[2]; UCHAR VendorSpecific[6]; UCHAR MaximumRangeDescriptors[2]; UCHAR MaximumInactivityTimer[4]; UCHAR DefaultInactivityTimer[4]; UCHAR MaximumTokenTransferSize[8]; UCHAR OptimalTransferCount[8];} WINDOWS_BLOCK_DEVICE_TOKEN_LIMITS_DESCRIPTOR, *PWINDOWS_BLOCK_DEVICE_TOKEN_LIMITS_DESCRIPTOR;
#define BLOCK_DEVICE_TOKEN_LIMITS_DESCRIPTOR_TYPE_WINDOWS 0x00
#endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
typedef struct _VPD_BLOCK_LIMITS_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR PageLength[2]; union { struct { UCHAR Reserved0; UCHAR MaximumCompareAndWriteLength; UCHAR OptimalTransferLengthGranularity[2]; UCHAR MaximumTransferLength[4]; UCHAR OptimalTransferLength[4]; UCHAR MaxPrefetchXDReadXDWriteTransferLength[4]; UCHAR MaximumUnmapLBACount[4]; UCHAR MaximumUnmapBlockDescriptorCount[4]; UCHAR OptimalUnmapGranularity[4]; union { struct { UCHAR UnmapGranularityAlignmentByte3:7; UCHAR UGAValid:1; UCHAR UnmapGranularityAlignmentByte2; UCHAR UnmapGranularityAlignmentByte1; UCHAR UnmapGranularityAlignmentByte0; }; UCHAR UnmapGranularityAlignment[4]; }; UCHAR Reserved1[28]; };#if !defined(__midl) UCHAR Descriptors[0];#endif };} VPD_BLOCK_LIMITS_PAGE, *PVPD_BLOCK_LIMITS_PAGE;
#define ZONED_CAPABILITIES_NOT_REPORTED 0x0#define ZONED_CAPABILITIES_HOST_AWARE 0x1#define ZONED_CAPABILITIES_DEVICE_MANAGED 0x2
typedef struct _VPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR Reserved0; UCHAR PageLength; UCHAR MediumRotationRateMsb; UCHAR MediumRotationRateLsb; UCHAR MediumProductType; UCHAR NominalFormFactor:4; UCHAR WACEREQ:2; UCHAR WABEREQ:2; UCHAR VBULS:1; UCHAR FUAB:1; UCHAR BOCS:1; UCHAR Reserved1:1; UCHAR ZONED:2; UCHAR Reserved2:2; UCHAR Reserved3[3]; UCHAR DepopulationTime[4]; UCHAR Reserved4[48];} VPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE, *PVPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE;
#define PROVISIONING_TYPE_UNKNOWN 0x0#define PROVISIONING_TYPE_RESOURCE 0x1#define PROVISIONING_TYPE_THIN 0x2
typedef struct _VPD_LOGICAL_BLOCK_PROVISIONING_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR PageLength[2]; UCHAR ThresholdExponent; UCHAR DP:1; UCHAR ANC_SUP:1; UCHAR LBPRZ:1; UCHAR Reserved0:2; UCHAR LBPWS10:1; UCHAR LBPWS:1; UCHAR LBPU:1; UCHAR ProvisioningType:3; UCHAR Reserved1:5; UCHAR Reserved2;#if !defined(__midl) UCHAR ProvisioningGroupDescr[0];#endif} VPD_LOGICAL_BLOCK_PROVISIONING_PAGE, *PVPD_LOGICAL_BLOCK_PROVISIONING_PAGE;
typedef struct _VPD_ZONED_BLOCK_DEVICE_CHARACTERISTICS_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR PageLength[2]; UCHAR URSWRZ:1; UCHAR Reserved1:7; UCHAR Reserved2[3]; UCHAR OptimalNumberOfOpenSequentialWritePreferredZone[4]; UCHAR OptimalNumberOfNonSequentiallyWrittenSequentialWritePreferredZone[4]; UCHAR MaxNumberOfOpenSequentialWriteRequiredZone[4]; UCHAR Reserved3[44];} VPD_ZONED_BLOCK_DEVICE_CHARACTERISTICS_PAGE, *PVPD_ZONED_BLOCK_DEVICE_CHARACTERISTICS_PAGE;
typedef struct _VPD_SUPPORTED_PAGES_PAGE { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR PageCode; UCHAR Reserved; UCHAR PageLength; UCHAR SupportedPageList[0];} VPD_SUPPORTED_PAGES_PAGE, *PVPD_SUPPORTED_PAGES_PAGE;
typedef struct _PRI_REGISTRATION_LIST { UCHAR Generation[4]; UCHAR AdditionalLength[4]; UCHAR ReservationKeyList[0][8];} PRI_REGISTRATION_LIST, *PPRI_REGISTRATION_LIST;
typedef struct _PRI_RESERVATION_DESCRIPTOR { UCHAR ReservationKey[8]; UCHAR ScopeSpecificAddress[4]; UCHAR Reserved; UCHAR Type:4; UCHAR Scope:4; UCHAR Obsolete[2];} PRI_RESERVATION_DESCRIPTOR, *PPRI_RESERVATION_DESCRIPTOR;
typedef struct _PRI_RESERVATION_LIST { UCHAR Generation[4]; UCHAR AdditionalLength[4]; PRI_RESERVATION_DESCRIPTOR Reservations[0];} PRI_RESERVATION_LIST, *PPRI_RESERVATION_LIST;
typedef struct _PRO_PARAMETER_LIST { UCHAR ReservationKey[8]; UCHAR ServiceActionReservationKey[8]; UCHAR ScopeSpecificAddress[4]; UCHAR ActivatePersistThroughPowerLoss:1; UCHAR Reserved1:7; UCHAR Reserved2; UCHAR Obsolete[2];} PRO_PARAMETER_LIST, *PPRO_PARAMETER_LIST;
typedef struct _SENSE_DATA { UCHAR ErrorCode:7; UCHAR Valid:1; UCHAR SegmentNumber; UCHAR SenseKey:4; UCHAR Reserved:1; UCHAR IncorrectLength:1; UCHAR EndOfMedia:1; UCHAR FileMark:1; UCHAR Information[4]; UCHAR AdditionalSenseLength; UCHAR CommandSpecificInformation[4]; UCHAR AdditionalSenseCode; UCHAR AdditionalSenseCodeQualifier; UCHAR FieldReplaceableUnitCode; UCHAR SenseKeySpecific[3];} SENSE_DATA, *PSENSE_DATA;
typedef struct _SCSI_SENSE_DESCRIPTOR_HEADER { UCHAR DescriptorType; UCHAR AdditionalLength;} SCSI_SENSE_DESCRIPTOR_HEADER, *PSCSI_SENSE_DESCRIPTOR_HEADER;
typedef struct _SCSI_SENSE_DESCRIPTOR_INFORMATION { SCSI_SENSE_DESCRIPTOR_HEADER Header; UCHAR Valid:1; UCHAR Reserved1:7; UCHAR Reserved2; UCHAR Information[8];} SCSI_SENSE_DESCRIPTOR_INFORMATION, *PSCSI_SENSE_DESCRIPTOR_INFORMATION;
typedef struct _SCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND { SCSI_SENSE_DESCRIPTOR_HEADER Header; UCHAR Reserved1; UCHAR Reserved2:5; UCHAR IncorrectLength:1; UCHAR Reserved3:2;} SCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND, *PSCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND;
typedef struct _SCSI_SENSE_DESCRIPTOR_ATA_STATUS_RETURN { SCSI_SENSE_DESCRIPTOR_HEADER Header; UCHAR Extend:1; UCHAR Reserved1:7; UCHAR Error; UCHAR SectorCount15_8; UCHAR SectorCount7_0; UCHAR LbaLow15_8; UCHAR LbaLow7_0; UCHAR LbaMid15_8; UCHAR LbaMid7_0; UCHAR LbaHigh15_8; UCHAR LbaHigh7_0; UCHAR Device; UCHAR Status;} SCSI_SENSE_DESCRIPTOR_ATA_STATUS_RETURN, *PSCSI_SENSE_DESCRIPTOR_ATA_STATUS_RETURN;
typedef struct _SENSE_DATA FIXED_SENSE_DATA, *PFIXED_SENSE_DATA;
typedef struct _DESCRIPTOR_SENSE_DATA { UCHAR ErrorCode:7; UCHAR Reserved1:1; UCHAR SenseKey:4; UCHAR Reserved2:4; UCHAR AdditionalSenseCode; UCHAR AdditionalSenseCodeQualifier; UCHAR Reserved3[3]; UCHAR AdditionalSenseLength; UCHAR DescriptorBuffer[ANYSIZE_ARRAY];} DESCRIPTOR_SENSE_DATA, *PDESCRIPTOR_SENSE_DATA;
typedef union _SENSE_DATA_EX { FIXED_SENSE_DATA FixedData; DESCRIPTOR_SENSE_DATA DescriptorData;} SENSE_DATA_EX, *PSENSE_DATA_EX;
/* Read Capacity Data. Returned in Big Endian format */typedef struct _READ_CAPACITY_DATA { ULONG LogicalBlockAddress; ULONG BytesPerBlock;} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
typedef struct _READ_CAPACITY_DATA_EX { LARGE_INTEGER LogicalBlockAddress; ULONG BytesPerBlock;} READ_CAPACITY_DATA_EX, *PREAD_CAPACITY_DATA_EX;
#define RC_BASIS_LAST_LBA_NOT_SEQUENTIAL_WRITE_REQUIRED_ZONES 0x0#define RC_BASIS_LAST_LBA_ON_LOGICAL_UNIT 0x1
typedef struct _READ_CAPACITY16_DATA { LARGE_INTEGER LogicalBlockAddress; ULONG BytesPerBlock; UCHAR ProtectionEnable:1; UCHAR ProtectionType:3; UCHAR RcBasis:2; UCHAR Reserved:2; UCHAR LogicalPerPhysicalExponent:4; UCHAR ProtectionInfoExponent:4; UCHAR LowestAlignedBlock_MSB:6; UCHAR LBPRZ:1; UCHAR LBPME:1; UCHAR LowestAlignedBlock_LSB; UCHAR Reserved3[16];} READ_CAPACITY16_DATA, *PREAD_CAPACITY16_DATA;
typedef struct _LBA_STATUS_DESCRIPTOR { ULONGLONG StartingLBA; ULONG LogicalBlockCount; UCHAR ProvisioningStatus:4; UCHAR Reserved1:4; UCHAR Reserved2[3];} LBA_STATUS_DESCRIPTOR, *PLBA_STATUS_DESCRIPTOR;
typedef struct _LBA_STATUS_LIST_HEADER { ULONG ParameterLength; ULONG Reserved; LBA_STATUS_DESCRIPTOR Descriptors[0];} LBA_STATUS_LIST_HEADER, *PLBA_STATUS_LIST_HEADER;
#define LBA_STATUS_MAPPED 0x0#define LBA_STATUS_DEALLOCATED 0x1#define LBA_STATUS_ANCHORED 0x2
/* Read Block Limits Data. Returned in Big Endian format */typedef struct _READ_BLOCK_LIMITS { UCHAR Reserved; UCHAR BlockMaximumSize[3]; UCHAR BlockMinimumSize[2];} READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
typedef struct _READ_BUFFER_CAPACITY_DATA { UCHAR DataLength[2]; UCHAR Reserved1; UCHAR BlockDataReturned:1; UCHAR Reserved4:7; UCHAR TotalBufferSize[4]; UCHAR AvailableBufferSize[4];} READ_BUFFER_CAPACITY_DATA, *PREAD_BUFFER_CAPACITY_DATA;
typedef struct _MODE_PARAMETER_HEADER { UCHAR ModeDataLength; UCHAR MediumType; UCHAR DeviceSpecificParameter; UCHAR BlockDescriptorLength;} MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
typedef struct _MODE_PARAMETER_HEADER10 { UCHAR ModeDataLength[2]; UCHAR MediumType; UCHAR DeviceSpecificParameter; UCHAR Reserved[2]; UCHAR BlockDescriptorLength[2];} MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
typedef struct _MODE_PARAMETER_BLOCK { UCHAR DensityCode; UCHAR NumberOfBlocks[3]; UCHAR Reserved; UCHAR BlockLength[3];} MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
typedef struct _MODE_DISCONNECT_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR BufferFullRatio; UCHAR BufferEmptyRatio; UCHAR BusInactivityLimit[2]; UCHAR BusDisconnectTime[2]; UCHAR BusConnectTime[2]; UCHAR MaximumBurstSize[2]; UCHAR DataTransferDisconnect:2; UCHAR Reserved2[3];} MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
typedef struct _MODE_CACHING_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR ReadDisableCache:1; UCHAR MultiplicationFactor:1; UCHAR WriteCacheEnable:1; UCHAR Reserved2:5; UCHAR WriteRetensionPriority:4; UCHAR ReadRetensionPriority:4; UCHAR DisablePrefetchTransfer[2]; UCHAR MinimumPrefetch[2]; UCHAR MaximumPrefetch[2]; UCHAR MaximumPrefetchCeiling[2];} MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE2 { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR WriteType:4; UCHAR TestWrite:1; UCHAR LinkSizeValid:1; UCHAR BufferUnderrunFreeEnabled:1; UCHAR Reserved2:1; UCHAR TrackMode:4; UCHAR Copy:1; UCHAR FixedPacket:1; UCHAR MultiSession:2; UCHAR DataBlockType:4; UCHAR Reserved3:4; UCHAR LinkSize; UCHAR Reserved4; UCHAR HostApplicationCode:6; UCHAR Reserved5:2; UCHAR SessionFormat; UCHAR Reserved6; UCHAR PacketSize[4]; UCHAR AudioPauseLength[2]; UCHAR MediaCatalogNumber[16]; UCHAR ISRC[16]; UCHAR SubHeaderData[4];} MODE_CDROM_WRITE_PARAMETERS_PAGE2, *PMODE_CDROM_WRITE_PARAMETERS_PAGE2;
typedef struct _MODE_MRW_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR Reserved1; UCHAR LbaSpace:1; UCHAR Reserved2:7; UCHAR Reserved3[4];} MODE_MRW_PAGE, *PMODE_MRW_PAGE;
typedef struct _MODE_FLEXIBLE_DISK_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR TransferRate[2]; UCHAR NumberOfHeads; UCHAR SectorsPerTrack; UCHAR BytesPerSector[2]; UCHAR NumberOfCylinders[2]; UCHAR StartWritePrecom[2]; UCHAR StartReducedCurrent[2]; UCHAR StepRate[2]; UCHAR StepPluseWidth; UCHAR HeadSettleDelay[2]; UCHAR MotorOnDelay; UCHAR MotorOffDelay; UCHAR Reserved2:5; UCHAR MotorOnAsserted:1; UCHAR StartSectorNumber:1; UCHAR TrueReadySignal:1; UCHAR StepPlusePerCyclynder:4; UCHAR Reserved3:4; UCHAR WriteCompenstation; UCHAR HeadLoadDelay; UCHAR HeadUnloadDelay; UCHAR Pin2Usage:4; UCHAR Pin34Usage:4; UCHAR Pin1Usage:4; UCHAR Pin4Usage:4; UCHAR MediumRotationRate[2]; UCHAR Reserved4[2];} MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
typedef struct _MODE_FORMAT_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR TracksPerZone[2]; UCHAR AlternateSectorsPerZone[2]; UCHAR AlternateTracksPerZone[2]; UCHAR AlternateTracksPerLogicalUnit[2]; UCHAR SectorsPerTrack[2]; UCHAR BytesPerPhysicalSector[2]; UCHAR Interleave[2]; UCHAR TrackSkewFactor[2]; UCHAR CylinderSkewFactor[2]; UCHAR Reserved2:4; UCHAR SurfaceFirst:1; UCHAR RemovableMedia:1; UCHAR HardSectorFormating:1; UCHAR SoftSectorFormating:1; UCHAR Reserved3[3];} MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
typedef struct _MODE_RIGID_GEOMETRY_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR NumberOfCylinders[3]; UCHAR NumberOfHeads; UCHAR StartWritePrecom[3]; UCHAR StartReducedCurrent[3]; UCHAR DriveStepRate[2]; UCHAR LandZoneCyclinder[3]; UCHAR RotationalPositionLock:2; UCHAR Reserved2:6; UCHAR RotationOffset; UCHAR Reserved3; UCHAR RoataionRate[2]; UCHAR Reserved4[2];} MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
typedef struct _MODE_READ_WRITE_RECOVERY_PAGE { UCHAR PageCode:6; UCHAR Reserved1:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR DCRBit:1; UCHAR DTEBit:1; UCHAR PERBit:1; UCHAR EERBit:1; UCHAR RCBit:1; UCHAR TBBit:1; UCHAR ARRE:1; UCHAR AWRE:1; UCHAR ReadRetryCount; UCHAR Reserved4[4]; UCHAR WriteRetryCount; UCHAR Reserved5[3];} MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
typedef struct _MODE_READ_RECOVERY_PAGE { UCHAR PageCode:6; UCHAR Reserved1:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR DCRBit:1; UCHAR DTEBit:1; UCHAR PERBit:1; UCHAR Reserved2:1; UCHAR RCBit:1; UCHAR TBBit:1; UCHAR Reserved3:2; UCHAR ReadRetryCount; UCHAR Reserved4[4];} MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
typedef struct _MODE_INFO_EXCEPTIONS { UCHAR PageCode:6; UCHAR Reserved1:1; UCHAR PSBit:1; UCHAR PageLength; _ANONYMOUS_UNION union { UCHAR Flags; _ANONYMOUS_STRUCT struct { UCHAR LogErr:1; UCHAR Reserved2:1; UCHAR Test:1; UCHAR Dexcpt:1; UCHAR Reserved3:3; UCHAR Perf:1; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; UCHAR ReportMethod:4; UCHAR Reserved4:4; UCHAR IntervalTimer[4]; UCHAR ReportCount[4];} MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
typedef struct _POWER_CONDITION_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR Reserved2; UCHAR Standby:1; UCHAR Idle:1; UCHAR Reserved3:6; UCHAR IdleTimer[4]; UCHAR StandbyTimer[4];} POWER_CONDITION_PAGE, *PPOWER_CONDITION_PAGE;
typedef struct _CDDA_OUTPUT_PORT { UCHAR ChannelSelection:4; UCHAR Reserved:4; UCHAR Volume;} CDDA_OUTPUT_PORT, *PCDDA_OUTPUT_PORT;
typedef struct _CDAUDIO_CONTROL_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR Reserved2:1; UCHAR StopOnTrackCrossing:1; UCHAR Immediate:1; UCHAR Reserved3:5; UCHAR Reserved4[3]; UCHAR Obsolete[2]; CDDA_OUTPUT_PORT CDDAOutputPorts[4];} CDAUDIO_CONTROL_PAGE, *PCDAUDIO_CONTROL_PAGE;
typedef struct _CDVD_FEATURE_SET_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR CDAudio[2]; UCHAR EmbeddedChanger[2]; UCHAR PacketSMART[2]; UCHAR PersistantPrevent[2]; UCHAR EventStatusNotification[2]; UCHAR DigitalOutput[2]; UCHAR CDSequentialRecordable[2]; UCHAR DVDSequentialRecordable[2]; UCHAR RandomRecordable[2]; UCHAR KeyExchange[2]; UCHAR Reserved2[2];} CDVD_FEATURE_SET_PAGE, *PCDVD_FEATURE_SET_PAGE;
typedef struct _CDVD_INACTIVITY_TIMEOUT_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR Reserved2[2]; UCHAR SWPP:1; UCHAR DISP:1; UCHAR Reserved3:6; UCHAR Reserved4; UCHAR GroupOneMinimumTimeout[2]; UCHAR GroupTwoMinimumTimeout[2];} CDVD_INACTIVITY_TIMEOUT_PAGE, *PCDVD_INACTIVITY_TIMEOUT_PAGE;
typedef struct _CDVD_CAPABILITIES_PAGE { UCHAR PageCode:6; UCHAR Reserved:1; UCHAR PSBit:1; UCHAR PageLength; UCHAR CDRRead:1; UCHAR CDERead:1; UCHAR Method2:1; UCHAR DVDROMRead:1; UCHAR DVDRRead:1; UCHAR DVDRAMRead:1; UCHAR Reserved2:2; UCHAR CDRWrite:1; UCHAR CDEWrite:1; UCHAR TestWrite:1; UCHAR Reserved3:1; UCHAR DVDRWrite:1; UCHAR DVDRAMWrite:1; UCHAR Reserved4:2; UCHAR AudioPlay:1; UCHAR Composite:1; UCHAR DigitalPortOne:1; UCHAR DigitalPortTwo:1; UCHAR Mode2Form1:1; UCHAR Mode2Form2:1; UCHAR MultiSession:1; UCHAR BufferUnderrunFree:1; UCHAR CDDA:1; UCHAR CDDAAccurate:1; UCHAR RWSupported:1; UCHAR RWDeinterleaved:1; UCHAR C2Pointers:1; UCHAR ISRC:1; UCHAR UPC:1; UCHAR ReadBarCodeCapable:1; UCHAR Lock:1; UCHAR LockState:1; UCHAR PreventJumper:1; UCHAR Eject:1; UCHAR Reserved6:1; UCHAR LoadingMechanismType:3; UCHAR SeparateVolume:1; UCHAR SeperateChannelMute:1; UCHAR SupportsDiskPresent:1; UCHAR SWSlotSelection:1; UCHAR SideChangeCapable:1; UCHAR RWInLeadInReadable:1; UCHAR Reserved7:2; _ANONYMOUS_UNION union { UCHAR ReadSpeedMaximum[2]; UCHAR ObsoleteReserved[2]; } DUMMYUNIONNAME; UCHAR NumberVolumeLevels[2]; UCHAR BufferSize[2]; _ANONYMOUS_UNION union { UCHAR ReadSpeedCurrent[2]; UCHAR ObsoleteReserved2[2]; } DUMMYUNIONNAME2; UCHAR ObsoleteReserved3; UCHAR Reserved8:1; UCHAR BCK:1; UCHAR RCK:1; UCHAR LSBF:1; UCHAR Length:2; UCHAR Reserved9:2; _ANONYMOUS_UNION union { UCHAR WriteSpeedMaximum[2]; UCHAR ObsoleteReserved4[2]; } DUMMYUNIONNAME3; _ANONYMOUS_UNION union { UCHAR WriteSpeedCurrent[2]; UCHAR ObsoleteReserved11[2]; } DUMMYUNIONNAME4; _ANONYMOUS_UNION union { UCHAR CopyManagementRevision[2]; UCHAR Reserved10[2]; } DUMMYUNIONNAME5;} CDVD_CAPABILITIES_PAGE, *PCDVD_CAPABILITIES_PAGE;
typedef struct _LUN_LIST { UCHAR LunListLength[4]; UCHAR Reserved[4]; UCHAR Lun[0][8];} LUN_LIST, *PLUN_LIST;
typedef struct _MODE_PARM_READ_WRITE { MODE_PARAMETER_HEADER ParameterListHeader; MODE_PARAMETER_BLOCK ParameterListBlock;} MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
typedef struct _PORT_OUTPUT { UCHAR ChannelSelection; UCHAR Volume;} PORT_OUTPUT, *PPORT_OUTPUT;
typedef struct _AUDIO_OUTPUT { UCHAR CodePage; UCHAR ParameterLength; UCHAR Immediate; UCHAR Reserved[2]; UCHAR LbaFormat; UCHAR LogicalBlocksPerSecond[2]; PORT_OUTPUT PortOutput[4];} AUDIO_OUTPUT, *PAUDIO_OUTPUT;
/* Atapi 2.5 changers */typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER { UCHAR CurrentSlot:5; UCHAR ChangerState:2; UCHAR Fault:1; UCHAR Reserved:5; UCHAR MechanismState:3; UCHAR CurrentLogicalBlockAddress[3]; UCHAR NumberAvailableSlots; UCHAR SlotTableLength[2];} MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
typedef struct _SLOT_TABLE_INFORMATION { UCHAR DiscChanged:1; UCHAR Reserved:6; UCHAR DiscPresent:1; UCHAR Reserved2[3];} SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
typedef struct _MECHANICAL_STATUS { MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader; SLOT_TABLE_INFORMATION SlotTableInfo[1];} MECHANICAL_STATUS, *PMECHANICAL_STATUS;
/* Tape definitions */typedef struct _TAPE_POSITION_DATA { UCHAR Reserved1:2; UCHAR BlockPositionUnsupported:1; UCHAR Reserved2:3; UCHAR EndOfPartition:1; UCHAR BeginningOfPartition:1; UCHAR PartitionNumber; USHORT Reserved3; UCHAR FirstBlock[4]; UCHAR LastBlock[4]; UCHAR Reserved4; UCHAR NumberOfBlocks[3]; UCHAR NumberOfBytes[4];} TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
#include <pshpack1.h>typedef struct _UNMAP_BLOCK_DESCRIPTOR { UCHAR StartingLba[8]; UCHAR LbaCount[4]; UCHAR Reserved[4];} UNMAP_BLOCK_DESCRIPTOR, *PUNMAP_BLOCK_DESCRIPTOR;
typedef struct _UNMAP_LIST_HEADER { UCHAR DataLength[2]; UCHAR BlockDescrDataLength[2]; UCHAR Reserved[4];#if !defined(__midl) UNMAP_BLOCK_DESCRIPTOR Descriptors[0];#endif} UNMAP_LIST_HEADER, *PUNMAP_LIST_HEADER;#include <poppack.h>
#define LOG_PAGE_CODE_SUPPORTED_LOG_PAGES 0x00#define LOG_PAGE_CODE_WRITE_ERROR_COUNTERS 0x02#define LOG_PAGE_CODE_READ_ERROR_COUNTERS 0x03#define LOG_PAGE_CODE_LOGICAL_BLOCK_PROVISIONING 0x0C#define LOG_PAGE_CODE_TEMPERATURE 0x0D#define LOG_PAGE_CODE_STARTSTOP_CYCLE_COUNTERS 0x0E#define LOG_PAGE_CODE_SELFTEST_RESULTS 0x10#define LOG_PAGE_CODE_SOLID_STATE_MEDIA 0x11#define LOG_PAGE_CODE_BACKGROUND_SCAN_RESULTS 0x15#define LOG_PAGE_CODE_INFORMATIONAL_EXCEPTIONS 0x2F
#include <pshpack1.h>typedef struct _LOG_PARAMETER_HEADER { UCHAR ParameterCode[2]; union { UCHAR ControlByte; struct { UCHAR FormatAndLinking:2; UCHAR TMC:2; UCHAR ETC:1; UCHAR TSD:1; UCHAR Obsolete:1; UCHAR DU:1; }; }; UCHAR ParameterLength;} LOG_PARAMETER_HEADER, *PLOG_PARAMETER_HEADER;
typedef struct _LOG_PARAMETER { LOG_PARAMETER_HEADER Header; union {#if !defined(__midl) UCHAR AsByte[0];#endif struct _THRESHOLD_RESOURCE_COUNT { UCHAR ResourceCount[4]; UCHAR Scope : 2; UCHAR Reserved1 : 6; UCHAR Reserved2[3]; } THRESHOLD_RESOURCE_COUNT; struct _TEMPERATURE { UCHAR Reserved; UCHAR Temperature; } TEMPERATURE; struct _DATE_OF_MANUFACTURE { UCHAR Year[4]; UCHAR Week[2]; } DATE_OF_MANUFACTURE; struct _SELF_TEST_RESULTS { UCHAR SelfTestResults : 4; UCHAR Reserved1 : 1; UCHAR SelfTestCode : 3; UCHAR SelfTestNumber; UCHAR PowerOnHours[2]; UCHAR AddressOfFirstFailure[8]; UCHAR SenseKey : 4; UCHAR Reserved2 : 4; UCHAR AdditionalSenseCode; UCHAR AdditionalSenseCodeQualifier; UCHAR VendorSpecific; } SELF_TEST_RESULTS;
struct _SOLID_STATE_MEDIA { UCHAR Reserved[3]; UCHAR PercentageUsed; } SOLID_STATE_MEDIA;
struct _BACKGROUND_SCAN_STATUS { UCHAR PowerOnMinutes[4]; UCHAR Reserved; UCHAR ScanStatus; UCHAR ScansPerformed[2]; UCHAR ScanProgress[2]; UCHAR MediumScansPerformed[2]; } BACKGROUND_SCAN_STATUS;
struct _INFORMATIONAL_EXCEPTIONS { UCHAR ASC; UCHAR ASCQ; UCHAR MostRecentTemperature; UCHAR VendorSpecific[ANYSIZE_ARRAY]; } INFORMATIONAL_EXCEPTIONS; };} LOG_PARAMETER, *PLOG_PARAMETER;
typedef struct _LOG_PAGE { UCHAR PageCode:6; UCHAR SPF:1; UCHAR DS:1; UCHAR SubPageCode; UCHAR PageLength[2];#if !defined(__midl) LOG_PARAMETER Parameters[0];#endif
} LOG_PAGE, *PLOG_PAGE;
#include <poppack.h>
#define LOG_PAGE_LBP_PARAMETER_CODE_AVAILABLE 0x1#define LOG_PAGE_LBP_PARAMETER_CODE_USED 0x2
#define LOG_PAGE_LBP_RESOURCE_SCOPE_NOT_REPORTED 0x0#define LOG_PAGE_LBP_RESOURCE_SCOPE_DEDICATED_TO_LUN 0x1#define LOG_PAGE_LBP_RESOURCE_SCOPE_NOT_DEDICATED_TO_LUN 0x2
typedef struct _LOG_PARAMETER_THRESHOLD_RESOURCE_COUNT { LOG_PARAMETER_HEADER Header; UCHAR ResourceCount[4]; UCHAR Scope:2; UCHAR Reserved0:6; UCHAR Reserved1[3];} LOG_PARAMETER_THRESHOLD_RESOURCE_COUNT, *PLOG_PARAMETER_THRESHOLD_RESOURCE_COUNT;
typedef struct _LOG_PAGE_LOGICAL_BLOCK_PROVISIONING { UCHAR PageCode:6; UCHAR SPF:1; UCHAR DS:1; UCHAR SubPageCode; UCHAR PageLength[2];#if !defined(__midl) LOG_PARAMETER_HEADER Parameters[0];#endif} LOG_PAGE_LOGICAL_BLOCK_PROVISIONING, *PLOG_PAGE_LOGICAL_BLOCK_PROVISIONING;
typedef struct _MODE_CONTROL_PAGE { UCHAR PageCode:6; UCHAR Reserved1:1; UCHAR PageSavable:1; UCHAR PageLength; UCHAR RLEC:1; UCHAR GLTSD:1; UCHAR D_SENSE:1; UCHAR DPICZ:1; UCHAR TMF_ONLY:1; UCHAR TST:3; UCHAR Obsolete1:1; UCHAR QERR:2; UCHAR NUAR:1; UCHAR QueueAlgorithmModifier:4; UCHAR Obsolete2:3; UCHAR SWP:1; UCHAR UA_INTLCK_CTRL:2; UCHAR RAC:1; UCHAR VS:1; UCHAR AutoloadMode:3; UCHAR Reserved2:1; UCHAR RWWP:1; UCHAR ATMPE:1; UCHAR TAS:1; UCHAR ATO:1; UCHAR Obsolete3[2]; UCHAR BusyTimeoutPeriod[2]; UCHAR ExtendeSelfTestCompletionTime[2];} MODE_CONTROL_PAGE, *PMODE_CONTROL_PAGE;
/* This structure is used to convert little endian ULONGs to SCSI CDB big endians values. */typedef union _EIGHT_BYTE { _ANONYMOUS_STRUCT struct { UCHAR Byte0; UCHAR Byte1; UCHAR Byte2; UCHAR Byte3; UCHAR Byte4; UCHAR Byte5; UCHAR Byte6; UCHAR Byte7; } DUMMYSTRUCTNAME; ULONGLONG AsULongLong;} EIGHT_BYTE, *PEIGHT_BYTE;
typedef union _FOUR_BYTE { _ANONYMOUS_STRUCT struct { UCHAR Byte0; UCHAR Byte1; UCHAR Byte2; UCHAR Byte3; } DUMMYSTRUCTNAME; ULONG AsULong;} FOUR_BYTE, *PFOUR_BYTE;
typedef union _TWO_BYTE { _ANONYMOUS_STRUCT struct { UCHAR Byte0; UCHAR Byte1; } DUMMYSTRUCTNAME; USHORT AsUShort;} TWO_BYTE, *PTWO_BYTE;
/* Byte reversing macro for converting between big- and little-endian formats */#define REVERSE_BYTES_QUAD(Destination, Source) { \ PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \ PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \ _val1->Byte7 = _val2->Byte0; \ _val1->Byte6 = _val2->Byte1; \ _val1->Byte5 = _val2->Byte2; \ _val1->Byte4 = _val2->Byte3; \ _val1->Byte3 = _val2->Byte4; \ _val1->Byte2 = _val2->Byte5; \ _val1->Byte1 = _val2->Byte6; \ _val1->Byte0 = _val2->Byte7; \}
#define REVERSE_BYTES(Destination, Source) { \ PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \ PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \ _val1->Byte3 = _val2->Byte0; \ _val1->Byte2 = _val2->Byte1; \ _val1->Byte1 = _val2->Byte2; \ _val1->Byte0 = _val2->Byte3; \}
#define REVERSE_BYTES_SHORT(Destination, Source) { \ PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \ PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \ _val1->Byte1 = _val2->Byte0; \ _val1->Byte0 = _val2->Byte1; \}
#define REVERSE_SHORT(Short) { \ UCHAR _val; \ PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \ _val = _val2->Byte0; \ _val2->Byte0 = _val2->Byte1; \ _val2->Byte1 = _val; \}
#define REVERSE_LONG(Long) { \ UCHAR _val; \ PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \ _val = _val2->Byte3; \ _val2->Byte3 = _val2->Byte0; \ _val2->Byte0 = _val; \ _val = _val2->Byte2; \ _val2->Byte2 = _val2->Byte1; \ _val2->Byte1 = _val; \}
#define WHICH_BIT(Data, Bit) { \ UCHAR _val; \ for (_val = 0; _val < 32; _val++) { \ if (((Data) >> _val) == 1) { \ break; \ } \ } \ ASSERT(_val != 32); \ (Bit) = _val; \}
#if defined(_WIN64)#define STOR_ADDRESS_ALIGN DECLSPEC_ALIGN(8)#else#define STOR_ADDRESS_ALIGN#endif
typedef struct STOR_ADDRESS_ALIGN _STOR_ADDRESS { USHORT Type; USHORT Port; ULONG AddressLength; _Field_size_bytes_(AddressLength) UCHAR AddressData[ANYSIZE_ARRAY];} STOR_ADDRESS, *PSTOR_ADDRESS;
#define STOR_ADDRESS_TYPE_UNKNOWN 0x0#define STOR_ADDRESS_TYPE_BTL8 0x1#define STOR_ADDRESS_TYPE_MAX 0xffff
#define STOR_ADDR_BTL8_ADDRESS_LENGTH 4
typedef struct STOR_ADDRESS_ALIGN _STOR_ADDR_BTL8 { _Field_range_(STOR_ADDRESS_TYPE_BTL8, STOR_ADDRESS_TYPE_BTL8) USHORT Type; USHORT Port; _Field_range_(STOR_ADDR_BTL8_ADDRESS_LENGTH, STOR_ADDR_BTL8_ADDRESS_LENGTH) ULONG AddressLength; UCHAR Path; UCHAR Target; UCHAR Lun; UCHAR Reserved;} STOR_ADDR_BTL8, *PSTOR_ADDR_BTL8;
/* FIXME : This structure doesn't exist in the official header */typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE { UCHAR PageLength; UCHAR WriteType:4; UCHAR TestWrite:1; UCHAR LinkSizeValid:1; UCHAR BufferUnderrunFreeEnabled:1; UCHAR Reserved2:1; UCHAR TrackMode:4; UCHAR Copy:1; UCHAR FixedPacket:1; UCHAR MultiSession:2; UCHAR DataBlockType:4; UCHAR Reserved3:4; UCHAR LinkSize; UCHAR Reserved4; UCHAR HostApplicationCode:6; UCHAR Reserved5:2; UCHAR SessionFormat; UCHAR Reserved6; UCHAR PacketSize[4]; UCHAR AudioPauseLength[2]; UCHAR Reserved7:7; UCHAR MediaCatalogNumberValid:1; UCHAR MediaCatalogNumber[13]; UCHAR MediaCatalogNumberZero; UCHAR MediaCatalogNumberAFrame; UCHAR Reserved8:7; UCHAR ISRCValid:1; UCHAR ISRCCountry[2]; UCHAR ISRCOwner[3]; UCHAR ISRCRecordingYear[2]; UCHAR ISRCSerialNumber[5]; UCHAR ISRCZero; UCHAR ISRCAFrame; UCHAR ISRCReserved; UCHAR SubHeaderData[4];} MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
#if (NTDDI_VERSION >= NTDDI_WIN8)#include <pshpack1.h>
#define BLOCK_DEVICE_TOKEN_SIZE 512
typedef struct { UCHAR LogicalBlockAddress[8]; UCHAR TransferLength[4]; UCHAR Reserved[4];} BLOCK_DEVICE_RANGE_DESCRIPTOR, *PBLOCK_DEVICE_RANGE_DESCRIPTOR;
typedef struct { UCHAR PopulateTokenDataLength[2]; UCHAR Immediate:1; UCHAR Reserved1:7; UCHAR Reserved2; UCHAR InactivityTimeout[4]; UCHAR Reserved3[6]; UCHAR BlockDeviceRangeDescriptorListLength[2];#if !defined(__midl) UCHAR BlockDeviceRangeDescriptor[ANYSIZE_ARRAY];#endif} POPULATE_TOKEN_HEADER, *PPOPULATE_TOKEN_HEADER;
typedef struct { UCHAR WriteUsingTokenDataLength[2]; UCHAR Immediate:1; UCHAR Reserved1:7; UCHAR Reserved2[5]; UCHAR BlockOffsetIntoToken[8]; UCHAR Token[BLOCK_DEVICE_TOKEN_SIZE]; UCHAR Reserved3[6]; UCHAR BlockDeviceRangeDescriptorListLength[2];#if !defined(__midl) UCHAR BlockDeviceRangeDescriptor[ANYSIZE_ARRAY];#endif} WRITE_USING_TOKEN_HEADER, *PWRITE_USING_TOKEN_HEADER;
typedef struct { UCHAR AvailableData[4]; UCHAR ResponseToServiceAction:5; UCHAR Reserved1:3; UCHAR OperationStatus:7; UCHAR Reserved2:1; UCHAR OperationCounter[2]; UCHAR EstimatedStatusUpdateDelay[4]; UCHAR CompletionStatus; UCHAR SenseDataFieldLength; UCHAR SenseDataLength; UCHAR TransferCountUnits; UCHAR TransferCount[8]; UCHAR SegmentsProcessed[2]; UCHAR Reserved3[6];#if !defined(__midl) UCHAR SenseData[ANYSIZE_ARRAY];#endif} RECEIVE_TOKEN_INFORMATION_HEADER, *PRECEIVE_TOKEN_INFORMATION_HEADER;
typedef struct { UCHAR TokenDescriptorsLength[4];#if !defined(__midl) UCHAR TokenDescriptor[ANYSIZE_ARRAY];#endif} RECEIVE_TOKEN_INFORMATION_RESPONSE_HEADER, *PRECEIVE_TOKEN_INFORMATION_RESPONSE_HEADER;
typedef struct { UCHAR TokenIdentifier[2]; UCHAR Token[BLOCK_DEVICE_TOKEN_SIZE];} BLOCK_DEVICE_TOKEN_DESCRIPTOR, *PBLOCK_DEVICE_TOKEN_DESCRIPTOR;
typedef enum _OPERATION_STATUS { OPERATION_COMPLETED_WITH_SUCCESS = 0x01, OPERATION_COMPLETED_WITH_ERROR = 0x02, OPERATION_COMPLETED_WITH_RESIDUAL_DATA = 0x03, OPERATION_IN_PROGRESS_IN_FOREGROUND = 0x11, OPERATION_IN_PROGRESS_IN_BACKGROUND = 0x12, OPERATION_TERMINATED = 0x60} OPERATION_STATUS, *POPERATION_STATUS;
typedef enum _TRANSFER_COUNT_UNITS { TRANSFER_COUNT_UNITS_BYTES = 0, TRANSFER_COUNT_UNITS_KIBIBYTES = 1, TRANSFER_COUNT_UNITS_MEBIBYTES = 2, TRANSFER_COUNT_UNITS_GIBIBYTES = 3, TRANSFER_COUNT_UNITS_TEBIBYTES = 4, TRANSFER_COUNT_UNITS_PEBIBYTES = 5, TRANSFER_COUNT_UNITS_EXBIBYTES = 6, TRANSFER_COUNT_UNITS_NUMBER_BLOCKS = 0xF1} TRANSFER_COUNT_UNITS, *PTRANSFER_COUNT_UNITS;
#include <poppack.h>#endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
// SCSI utility functions
#define ScsiGetSenseErrorCode(SenseInfoBuffer) (((PUCHAR)(SenseInfoBuffer))[0] & 0x7f)
#define ScsiGetSenseDescriptorLength(DescriptorBuffer) \ (sizeof(SCSI_SENSE_DESCRIPTOR_HEADER) + ((PSCSI_SENSE_DESCRIPTOR_HEADER)(DescriptorBuffer))->AdditionalLength)
#define IsFixedSenseDataFormat(SenseInfoBuffer) \ ((ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_FIXED_CURRENT || \ (ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_FIXED_DEFERRED)
#define IsDescriptorSenseDataFormat(SenseInfoBuffer) \ ((ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_DESCRIPTOR_CURRENT || \ (ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_DESCRIPTOR_DEFERRED)
#define IsSenseDataCurrentError(SenseInfoBuffer) \ ((ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_FIXED_CURRENT || \ (ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_DESCRIPTOR_CURRENT)
#define IsSenseDataDeferredError(SenseInfoBuffer) \ ((ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_FIXED_DEFERRED || \ (ScsiGetSenseErrorCode(SenseInfoBuffer)) == SCSI_SENSE_ERRORCODE_DESCRIPTOR_DEFERRED)
#define IsSenseDataFormatValueValid(SenseInfoBuffer) \ (IsFixedSenseDataFormat(SenseInfoBuffer) || IsDescriptorSenseDataFormat(SenseInfoBuffer))
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiGetTotalSenseByteCountIndicated( _In_reads_bytes_(SenseInfoBufferLength) PVOID SenseInfoBuffer, _In_ UCHAR SenseInfoBufferLength, _Out_ UCHAR *TotalByteCountIndicated){ BOOLEAN succeed = FALSE; UCHAR byteCount = 0; PFIXED_SENSE_DATA senseInfoBuffer = NULL;
if (SenseInfoBuffer == NULL || SenseInfoBufferLength == 0 || TotalByteCountIndicated == NULL) {
return FALSE; }
senseInfoBuffer = (PFIXED_SENSE_DATA)SenseInfoBuffer;
if (RTL_CONTAINS_FIELD(senseInfoBuffer, SenseInfoBufferLength, AdditionalSenseLength)) {
if (senseInfoBuffer->AdditionalSenseLength <= (MAX_SENSE_BUFFER_SIZE - RTL_SIZEOF_THROUGH_FIELD(FIXED_SENSE_DATA, AdditionalSenseLength))) {
byteCount = senseInfoBuffer->AdditionalSenseLength + RTL_SIZEOF_THROUGH_FIELD(FIXED_SENSE_DATA, AdditionalSenseLength);
*TotalByteCountIndicated = byteCount;
succeed = TRUE; } }
return succeed;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiGetFixedSenseKeyAndCodes( _In_reads_bytes_(SenseInfoBufferLength) PVOID SenseInfoBuffer, _In_ UCHAR SenseInfoBufferLength, _Out_opt_ PUCHAR SenseKey, _Out_opt_ PUCHAR AdditionalSenseCode, _Out_opt_ PUCHAR AdditionalSenseCodeQualifier){ PFIXED_SENSE_DATA fixedSenseData = (PFIXED_SENSE_DATA)SenseInfoBuffer; BOOLEAN succeed = FALSE; ULONG dataLength = 0;
if (SenseInfoBuffer == NULL || SenseInfoBufferLength == 0) { return FALSE; }
if (RTL_CONTAINS_FIELD(fixedSenseData, SenseInfoBufferLength, AdditionalSenseLength)) {
dataLength = fixedSenseData->AdditionalSenseLength + RTL_SIZEOF_THROUGH_FIELD(FIXED_SENSE_DATA, AdditionalSenseLength);
if (dataLength > SenseInfoBufferLength) { dataLength = SenseInfoBufferLength; }
if (SenseKey != NULL) { *SenseKey = fixedSenseData->SenseKey; }
if (AdditionalSenseCode != NULL) { *AdditionalSenseCode = RTL_CONTAINS_FIELD(fixedSenseData, dataLength, AdditionalSenseCode) ? fixedSenseData->AdditionalSenseCode : 0; }
if (AdditionalSenseCodeQualifier != NULL) { *AdditionalSenseCodeQualifier = RTL_CONTAINS_FIELD(fixedSenseData, dataLength, AdditionalSenseCodeQualifier) ? fixedSenseData->AdditionalSenseCodeQualifier : 0; }
succeed = TRUE; }
return succeed;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiGetDescriptorSenseKeyAndCodes( _In_reads_bytes_(SenseInfoBufferLength) PVOID SenseInfoBuffer, _In_ UCHAR SenseInfoBufferLength, _Out_opt_ PUCHAR SenseKey, _Out_opt_ PUCHAR AdditionalSenseCode, _Out_opt_ PUCHAR AdditionalSenseCodeQualifier){ PDESCRIPTOR_SENSE_DATA descriptorSenseData = (PDESCRIPTOR_SENSE_DATA)SenseInfoBuffer; BOOLEAN succeed = FALSE;
if (SenseInfoBuffer == NULL || SenseInfoBufferLength == 0) { return FALSE; } if (RTL_CONTAINS_FIELD(descriptorSenseData, SenseInfoBufferLength, AdditionalSenseLength)) {
if (SenseKey) { *SenseKey = descriptorSenseData->SenseKey; }
if (AdditionalSenseCode != NULL) { *AdditionalSenseCode = descriptorSenseData->AdditionalSenseCode; }
if (AdditionalSenseCodeQualifier != NULL) { *AdditionalSenseCodeQualifier = descriptorSenseData->AdditionalSenseCodeQualifier; }
succeed = TRUE; }
return succeed;}
typedef ULONG SCSI_SENSE_OPTIONS;
#define SCSI_SENSE_OPTIONS_NONE ((SCSI_SENSE_OPTIONS)0x00000000)#define SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED ((SCSI_SENSE_OPTIONS)0x00000001)
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiGetSenseKeyAndCodes( _In_reads_bytes_(SenseInfoBufferLength) PVOID SenseInfoBuffer, _In_ UCHAR SenseInfoBufferLength, _In_ SCSI_SENSE_OPTIONS Options, _Out_opt_ PUCHAR SenseKey, _Out_opt_ PUCHAR AdditionalSenseCode, _Out_opt_ PUCHAR AdditionalSenseCodeQualifier){ BOOLEAN succeed = FALSE;
if (SenseInfoBuffer == NULL || SenseInfoBufferLength == 0) { return FALSE; }
if (IsDescriptorSenseDataFormat(SenseInfoBuffer)) { succeed = ScsiGetDescriptorSenseKeyAndCodes(SenseInfoBuffer, SenseInfoBufferLength, SenseKey, AdditionalSenseCode, AdditionalSenseCodeQualifier); } else { if ((Options & SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED) || IsFixedSenseDataFormat(SenseInfoBuffer)) {
succeed = ScsiGetFixedSenseKeyAndCodes(SenseInfoBuffer, SenseInfoBufferLength, SenseKey, AdditionalSenseCode, AdditionalSenseCodeQualifier); } }
return succeed;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiGetSenseDescriptor( _In_reads_bytes_(SenseInfoBufferLength) PVOID SenseInfoBuffer, _In_ UCHAR SenseInfoBufferLength, _Outptr_result_bytebuffer_(*DescriptorBufferLength) PVOID *DescriptorBuffer, _Out_ UCHAR *DescriptorBufferLength){ PDESCRIPTOR_SENSE_DATA descriptorSenseData; BOOLEAN succeed = FALSE; UCHAR dataLength = 0;
if (SenseInfoBuffer == NULL || SenseInfoBufferLength == 0 || DescriptorBuffer == NULL || DescriptorBufferLength == NULL) { return FALSE; }
*DescriptorBuffer = NULL; *DescriptorBufferLength = 0;
if (!IsDescriptorSenseDataFormat(SenseInfoBuffer)) { return FALSE; }
descriptorSenseData = (PDESCRIPTOR_SENSE_DATA)SenseInfoBuffer;
if (RTL_CONTAINS_FIELD(descriptorSenseData, SenseInfoBufferLength, AdditionalSenseLength)) { if (descriptorSenseData->AdditionalSenseLength <= (MAX_SENSE_BUFFER_SIZE - RTL_SIZEOF_THROUGH_FIELD(DESCRIPTOR_SENSE_DATA, AdditionalSenseLength))) { dataLength = descriptorSenseData->AdditionalSenseLength + RTL_SIZEOF_THROUGH_FIELD(DESCRIPTOR_SENSE_DATA, AdditionalSenseLength);
if (dataLength > SenseInfoBufferLength) { dataLength = SenseInfoBufferLength; }
*DescriptorBufferLength = dataLength - RTL_SIZEOF_THROUGH_FIELD(DESCRIPTOR_SENSE_DATA, AdditionalSenseLength);
if (*DescriptorBufferLength > 0) { *DescriptorBuffer = (PVOID)(descriptorSenseData->DescriptorBuffer); succeed = TRUE; } } }
return succeed;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiValidateInformationSenseDescriptor( _In_reads_bytes_(DescriptorBufferLength) PVOID DescriptorBuffer, _In_ UCHAR DescriptorBufferLength){ PSCSI_SENSE_DESCRIPTOR_INFORMATION descriptor; UCHAR additionalLength;
if (DescriptorBuffer == NULL || DescriptorBufferLength < sizeof(SCSI_SENSE_DESCRIPTOR_INFORMATION)) { return FALSE; }
descriptor = (PSCSI_SENSE_DESCRIPTOR_INFORMATION)DescriptorBuffer;
if (descriptor->Header.DescriptorType != SCSI_SENSE_DESCRIPTOR_TYPE_INFORMATION) { return FALSE; }
additionalLength = sizeof(SCSI_SENSE_DESCRIPTOR_INFORMATION) - RTL_SIZEOF_THROUGH_FIELD(SCSI_SENSE_DESCRIPTOR_INFORMATION, Header);
if (descriptor->Header.AdditionalLength != additionalLength) { return FALSE; }
if (descriptor->Valid == 0) { return FALSE; }
return TRUE;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiValidateBlockCommandSenseDescriptor( _In_reads_bytes_(DescriptorBufferLength) PVOID DescriptorBuffer, _In_ UCHAR DescriptorBufferLength){ PSCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND descriptor; UCHAR additionalLength;
if (DescriptorBuffer == NULL || DescriptorBufferLength < sizeof(SCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND)) { return FALSE; }
descriptor = (PSCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND)DescriptorBuffer;
if (descriptor->Header.DescriptorType != SCSI_SENSE_DESCRIPTOR_TYPE_BLOCK_COMMAND) { return FALSE; }
additionalLength = sizeof(SCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND) - RTL_SIZEOF_THROUGH_FIELD(SCSI_SENSE_DESCRIPTOR_BLOCK_COMMAND, Header);
if (descriptor->Header.AdditionalLength != additionalLength) { return FALSE; }
return TRUE;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiConvertToFixedSenseFormat( _In_reads_bytes_(SenseInfoBufferLength) PVOID SenseInfoBuffer, _In_ UCHAR SenseInfoBufferLength, _Out_writes_bytes_(OutBufferLength) PVOID OutBuffer, _In_ UCHAR OutBufferLength){ BOOLEAN succeed = FALSE; BOOLEAN validSense = FALSE; UCHAR senseKey = 0; UCHAR additionalSenseCode = 0; UCHAR additionalSenseCodeQualifier = 0; PFIXED_SENSE_DATA outBuffer = (PFIXED_SENSE_DATA)OutBuffer;
if (SenseInfoBuffer == NULL || SenseInfoBufferLength == 0 || OutBuffer == NULL || OutBufferLength < sizeof(FIXED_SENSE_DATA)) { return FALSE; }
if (IsDescriptorSenseDataFormat(SenseInfoBuffer)) { RtlZeroMemory(OutBuffer, OutBufferLength);
validSense = ScsiGetSenseKeyAndCodes(SenseInfoBuffer, SenseInfoBufferLength, SCSI_SENSE_OPTIONS_NONE, &senseKey, &additionalSenseCode, &additionalSenseCodeQualifier); if (validSense) {
if (IsSenseDataCurrentError(SenseInfoBuffer)) { outBuffer->ErrorCode = SCSI_SENSE_ERRORCODE_FIXED_CURRENT; } else { outBuffer->ErrorCode = SCSI_SENSE_ERRORCODE_FIXED_DEFERRED; } outBuffer->AdditionalSenseLength = sizeof(FIXED_SENSE_DATA) - RTL_SIZEOF_THROUGH_FIELD(FIXED_SENSE_DATA, AdditionalSenseLength); outBuffer->SenseKey = senseKey; outBuffer->AdditionalSenseCode = additionalSenseCode; outBuffer->AdditionalSenseCodeQualifier = additionalSenseCodeQualifier;
succeed = TRUE; } }
return succeed;}
_Success_(return != FALSE)FORCEINLINEBOOLEANScsiGetNextSenseDescriptorByType( _In_reads_bytes_(BufferLength) PVOID Buffer, _In_ UCHAR BufferLength, _In_reads_(TypeListCount) PUCHAR TypeList, _In_ ULONG TypeListCount, _Out_ PUCHAR OutType, _Outptr_result_bytebuffer_(*OutBufferLength) PVOID *OutBuffer, _Out_ UCHAR *OutBufferLength){ PUCHAR remainingBuffer; UCHAR remainingBufferLength; UCHAR type; ULONG i; UCHAR descriptorLength;
if (Buffer == NULL || BufferLength == 0 || TypeList == NULL || TypeListCount == 0 || OutType == NULL || OutBuffer == NULL || OutBufferLength == NULL) { return FALSE; }
*OutBuffer = NULL; *OutBufferLength = 0; *OutType = 0;
remainingBuffer = (PUCHAR)Buffer; remainingBufferLength = BufferLength;
while (remainingBufferLength >= sizeof(SCSI_SENSE_DESCRIPTOR_HEADER)) { for (i = 0; i < TypeListCount; i++) { type = TypeList[i];
if (((PSCSI_SENSE_DESCRIPTOR_HEADER)remainingBuffer)->DescriptorType == type) { *OutBuffer = (PVOID)remainingBuffer; *OutBufferLength = remainingBufferLength; *OutType = type; return TRUE; } }
descriptorLength = ScsiGetSenseDescriptorLength(remainingBuffer);
if (remainingBufferLength > descriptorLength) { remainingBuffer += descriptorLength; remainingBufferLength -= descriptorLength; } else { break; } }
return FALSE;}
#ifdef __cplusplus}#endif
#endif /* _NTSCSI_ */