wdm.h 438 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197
  1. /*
  2. * wdm.h
  3. *
  4. * Windows NT WDM Driver Developer Kit
  5. *
  6. * This file is part of the ReactOS DDK package.
  7. *
  8. * Contributors:
  9. * Amine Khaldi
  10. * Timo Kreuzer (timo.kreuzer@reactos.org)
  11. *
  12. * THIS SOFTWARE IS NOT COPYRIGHTED
  13. *
  14. * This source code is offered for use in the public domain. You may
  15. * use, modify or distribute it freely.
  16. *
  17. * This code is distributed in the hope that it will be useful but
  18. * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
  19. * DISCLAIMED. This includes but is not limited to warranties of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  21. *
  22. */
  23. #pragma once
  24. #ifndef _WDMDDK_
  25. #define _WDMDDK_
  26. #define WDM_MAJORVERSION 0x06
  27. #define WDM_MINORVERSION 0x00
  28. /* Included via ntddk.h? */
  29. #ifndef _NTDDK_
  30. #define _NTDDK_
  31. #define _WDM_INCLUDED_
  32. #define _DDK_DRIVER_
  33. #define NO_INTERLOCKED_INTRINSICS
  34. #endif /* _NTDDK_ */
  35. /* Dependencies */
  36. #define NT_INCLUDED
  37. #include <excpt.h>
  38. #include <ntdef.h>
  39. #include <ntstatus.h>
  40. #include <ntiologc.h>
  41. #ifndef GUID_DEFINED
  42. #include <guiddef.h>
  43. #endif
  44. #ifdef _MAC
  45. #ifndef _INC_STRING
  46. #include <string.h>
  47. #endif /* _INC_STRING */
  48. #else
  49. #include <string.h>
  50. #endif /* _MAC */
  51. #ifndef _KTMTYPES_
  52. typedef GUID UOW, *PUOW;
  53. #endif
  54. typedef GUID *PGUID;
  55. #if (NTDDI_VERSION >= NTDDI_WINXP)
  56. #include <dpfilter.h>
  57. #endif
  58. #include "intrin.h"
  59. #ifdef __cplusplus
  60. extern "C" {
  61. #endif
  62. #if !defined(_NTHALDLL_) && !defined(_BLDR_)
  63. #define NTHALAPI DECLSPEC_IMPORT
  64. #else
  65. #define NTHALAPI
  66. #endif
  67. /* For ReactOS */
  68. #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
  69. #define NTKERNELAPI DECLSPEC_IMPORT
  70. #else
  71. #define NTKERNELAPI
  72. #endif
  73. #if defined(_X86_) && !defined(_NTHAL_)
  74. #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
  75. #elif defined(_X86_)
  76. #define _DECL_HAL_KE_IMPORT
  77. #else
  78. #define _DECL_HAL_KE_IMPORT NTKERNELAPI
  79. #endif
  80. #if defined(_WIN64)
  81. #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
  82. #else
  83. #define POINTER_ALIGNMENT
  84. #endif
  85. #if defined(_MSC_VER)
  86. /* Disable some warnings */
  87. #pragma warning(disable:4115) /* Named type definition in parentheses */
  88. #pragma warning(disable:4201) /* Nameless unions and structs */
  89. #pragma warning(disable:4214) /* Bit fields of other types than int */
  90. #pragma warning(disable:4820) /* Padding added, due to alignemnet requirement */
  91. /* Indicate if #pragma alloc_text() is supported */
  92. #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
  93. #define ALLOC_PRAGMA 1
  94. #endif
  95. /* Indicate if #pragma data_seg() is supported */
  96. #if defined(_M_IX86) || defined(_M_AMD64)
  97. #define ALLOC_DATA_PRAGMA 1
  98. #endif
  99. #endif /* _MSC_VER */
  100. #if defined(_WIN64)
  101. #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
  102. #define USE_DMA_MACROS
  103. #endif
  104. #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
  105. #define NO_LEGACY_DRIVERS
  106. #endif
  107. #endif /* defined(_WIN64) */
  108. /* Forward declarations */
  109. struct _IRP;
  110. struct _MDL;
  111. struct _KAPC;
  112. struct _KDPC;
  113. struct _FILE_OBJECT;
  114. struct _DMA_ADAPTER;
  115. struct _DEVICE_OBJECT;
  116. struct _DRIVER_OBJECT;
  117. struct _IO_STATUS_BLOCK;
  118. struct _DEVICE_DESCRIPTION;
  119. struct _SCATTER_GATHER_LIST;
  120. struct _DRIVE_LAYOUT_INFORMATION;
  121. struct _COMPRESSED_DATA_INFO;
  122. struct _IO_RESOURCE_DESCRIPTOR;
  123. /* Structures not exposed to drivers */
  124. typedef struct _OBJECT_TYPE *POBJECT_TYPE;
  125. typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
  126. typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
  127. typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
  128. typedef struct _EPROCESS *PEPROCESS;
  129. typedef struct _ETHREAD *PETHREAD;
  130. typedef struct _IO_TIMER *PIO_TIMER;
  131. typedef struct _KINTERRUPT *PKINTERRUPT;
  132. typedef struct _KPROCESS *PKPROCESS;
  133. typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
  134. typedef struct _CONTEXT *PCONTEXT;
  135. #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
  136. typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
  137. #elif defined(_WDM_INCLUDED_)
  138. typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
  139. #else
  140. typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
  141. #endif
  142. #ifndef DEFINE_GUIDEX
  143. #ifdef _MSC_VER
  144. #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
  145. #else
  146. #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
  147. #endif
  148. #endif /* DEFINE_GUIDEX */
  149. #ifndef STATICGUIDOF
  150. #define STATICGUIDOF(guid) STATIC_##guid
  151. #endif
  152. /* GUID Comparison */
  153. #ifndef __IID_ALIGNED__
  154. #define __IID_ALIGNED__
  155. #ifdef __cplusplus
  156. inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
  157. {
  158. return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
  159. (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
  160. }
  161. #else
  162. #define IsEqualGUIDAligned(guid1, guid2) \
  163. ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
  164. (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
  165. #endif /* __cplusplus */
  166. #endif /* !__IID_ALIGNED__ */
  167. /******************************************************************************
  168. * INTERLOCKED Functions *
  169. ******************************************************************************/
  170. //
  171. // Intrinsics (note: taken from our winnt.h)
  172. // FIXME: 64-bit
  173. //
  174. #if defined(__GNUC__)
  175. static __inline__ BOOLEAN
  176. InterlockedBitTestAndSet(
  177. IN LONG volatile *Base,
  178. IN LONG Bit)
  179. {
  180. #if defined(_M_IX86)
  181. LONG OldBit;
  182. __asm__ __volatile__("lock "
  183. "btsl %2,%1\n\t"
  184. "sbbl %0,%0\n\t"
  185. :"=r" (OldBit),"+m" (*Base)
  186. :"Ir" (Bit)
  187. : "memory");
  188. return OldBit;
  189. #else
  190. return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
  191. #endif
  192. }
  193. static __inline__ BOOLEAN
  194. InterlockedBitTestAndReset(
  195. IN LONG volatile *Base,
  196. IN LONG Bit)
  197. {
  198. #if defined(_M_IX86)
  199. LONG OldBit;
  200. __asm__ __volatile__("lock "
  201. "btrl %2,%1\n\t"
  202. "sbbl %0,%0\n\t"
  203. :"=r" (OldBit),"+m" (*Base)
  204. :"Ir" (Bit)
  205. : "memory");
  206. return OldBit;
  207. #else
  208. return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
  209. #endif
  210. }
  211. #endif /* defined(__GNUC__) */
  212. #define BitScanForward _BitScanForward
  213. #define BitScanReverse _BitScanReverse
  214. #define BitTest _bittest
  215. #define BitTestAndComplement _bittestandcomplement
  216. #define BitTestAndSet _bittestandset
  217. #define BitTestAndReset _bittestandreset
  218. #define InterlockedBitTestAndSet _interlockedbittestandset
  219. #define InterlockedBitTestAndReset _interlockedbittestandreset
  220. #ifdef _M_AMD64
  221. #define BitTest64 _bittest64
  222. #define BitTestAndComplement64 _bittestandcomplement64
  223. #define BitTestAndSet64 _bittestandset64
  224. #define BitTestAndReset64 _bittestandreset64
  225. #define InterlockedBitTestAndSet64 _interlockedbittestandset64
  226. #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
  227. #endif
  228. #if !defined(__INTERLOCKED_DECLARED)
  229. #define __INTERLOCKED_DECLARED
  230. #if defined (_X86_)
  231. #if defined(NO_INTERLOCKED_INTRINSICS)
  232. NTKERNELAPI
  233. LONG
  234. FASTCALL
  235. InterlockedIncrement(
  236. IN OUT LONG volatile *Addend);
  237. NTKERNELAPI
  238. LONG
  239. FASTCALL
  240. InterlockedDecrement(
  241. IN OUT LONG volatile *Addend);
  242. NTKERNELAPI
  243. LONG
  244. FASTCALL
  245. InterlockedCompareExchange(
  246. IN OUT LONG volatile *Destination,
  247. IN LONG Exchange,
  248. IN LONG Comparand);
  249. NTKERNELAPI
  250. LONG
  251. FASTCALL
  252. InterlockedExchange(
  253. IN OUT LONG volatile *Destination,
  254. IN LONG Value);
  255. NTKERNELAPI
  256. LONG
  257. FASTCALL
  258. InterlockedExchangeAdd(
  259. IN OUT LONG volatile *Addend,
  260. IN LONG Value);
  261. #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
  262. #define InterlockedExchange _InterlockedExchange
  263. #define InterlockedIncrement _InterlockedIncrement
  264. #define InterlockedDecrement _InterlockedDecrement
  265. #define InterlockedExchangeAdd _InterlockedExchangeAdd
  266. #define InterlockedCompareExchange _InterlockedCompareExchange
  267. #define InterlockedOr _InterlockedOr
  268. #define InterlockedAnd _InterlockedAnd
  269. #define InterlockedXor _InterlockedXor
  270. #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
  271. #endif /* defined (_X86_) */
  272. #if !defined (_WIN64)
  273. /*
  274. * PVOID
  275. * InterlockedExchangePointer(
  276. * IN OUT PVOID volatile *Target,
  277. * IN PVOID Value)
  278. */
  279. #define InterlockedExchangePointer(Target, Value) \
  280. ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
  281. /*
  282. * PVOID
  283. * InterlockedCompareExchangePointer(
  284. * IN OUT PVOID *Destination,
  285. * IN PVOID Exchange,
  286. * IN PVOID Comparand)
  287. */
  288. #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
  289. ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
  290. #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
  291. #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
  292. #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
  293. #endif // !defined (_WIN64)
  294. #if defined (_M_AMD64)
  295. #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
  296. #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
  297. #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
  298. #define InterlockedAnd _InterlockedAnd
  299. #define InterlockedOr _InterlockedOr
  300. #define InterlockedXor _InterlockedXor
  301. #define InterlockedIncrement _InterlockedIncrement
  302. #define InterlockedDecrement _InterlockedDecrement
  303. #define InterlockedAdd _InterlockedAdd
  304. #define InterlockedExchange _InterlockedExchange
  305. #define InterlockedExchangeAdd _InterlockedExchangeAdd
  306. #define InterlockedCompareExchange _InterlockedCompareExchange
  307. #define InterlockedAnd64 _InterlockedAnd64
  308. #define InterlockedOr64 _InterlockedOr64
  309. #define InterlockedXor64 _InterlockedXor64
  310. #define InterlockedIncrement64 _InterlockedIncrement64
  311. #define InterlockedDecrement64 _InterlockedDecrement64
  312. #define InterlockedAdd64 _InterlockedAdd64
  313. #define InterlockedExchange64 _InterlockedExchange64
  314. #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
  315. #define InterlockedCompareExchange64 _InterlockedCompareExchange64
  316. #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
  317. #define InterlockedExchangePointer _InterlockedExchangePointer
  318. #define InterlockedBitTestAndSet64 _interlockedbittestandset64
  319. #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
  320. #endif // _M_AMD64
  321. #endif /* !__INTERLOCKED_DECLARED */
  322. /******************************************************************************
  323. * Runtime Library Types *
  324. ******************************************************************************/
  325. #define RTL_REGISTRY_ABSOLUTE 0
  326. #define RTL_REGISTRY_SERVICES 1
  327. #define RTL_REGISTRY_CONTROL 2
  328. #define RTL_REGISTRY_WINDOWS_NT 3
  329. #define RTL_REGISTRY_DEVICEMAP 4
  330. #define RTL_REGISTRY_USER 5
  331. #define RTL_REGISTRY_MAXIMUM 6
  332. #define RTL_REGISTRY_HANDLE 0x40000000
  333. #define RTL_REGISTRY_OPTIONAL 0x80000000
  334. /* RTL_QUERY_REGISTRY_TABLE.Flags */
  335. #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
  336. #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
  337. #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
  338. #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
  339. #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
  340. #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
  341. #define RTL_QUERY_REGISTRY_DELETE 0x00000040
  342. #define HASH_STRING_ALGORITHM_DEFAULT 0
  343. #define HASH_STRING_ALGORITHM_X65599 1
  344. #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
  345. typedef struct _RTL_BITMAP {
  346. ULONG SizeOfBitMap;
  347. PULONG Buffer;
  348. } RTL_BITMAP, *PRTL_BITMAP;
  349. typedef struct _RTL_BITMAP_RUN {
  350. ULONG StartingIndex;
  351. ULONG NumberOfBits;
  352. } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
  353. typedef NTSTATUS
  354. (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
  355. IN PWSTR ValueName,
  356. IN ULONG ValueType,
  357. IN PVOID ValueData,
  358. IN ULONG ValueLength,
  359. IN PVOID Context,
  360. IN PVOID EntryContext);
  361. typedef struct _RTL_QUERY_REGISTRY_TABLE {
  362. PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
  363. ULONG Flags;
  364. PCWSTR Name;
  365. PVOID EntryContext;
  366. ULONG DefaultType;
  367. PVOID DefaultData;
  368. ULONG DefaultLength;
  369. } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
  370. typedef struct _TIME_FIELDS {
  371. CSHORT Year;
  372. CSHORT Month;
  373. CSHORT Day;
  374. CSHORT Hour;
  375. CSHORT Minute;
  376. CSHORT Second;
  377. CSHORT Milliseconds;
  378. CSHORT Weekday;
  379. } TIME_FIELDS, *PTIME_FIELDS;
  380. /* Slist Header */
  381. #ifndef _SLIST_HEADER_
  382. #define _SLIST_HEADER_
  383. #if defined(_WIN64)
  384. typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
  385. struct _SLIST_ENTRY *Next;
  386. } SLIST_ENTRY, *PSLIST_ENTRY;
  387. typedef struct _SLIST_ENTRY32 {
  388. ULONG Next;
  389. } SLIST_ENTRY32, *PSLIST_ENTRY32;
  390. typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
  391. _ANONYMOUS_STRUCT struct {
  392. ULONGLONG Alignment;
  393. ULONGLONG Region;
  394. } DUMMYSTRUCTNAME;
  395. struct {
  396. ULONGLONG Depth:16;
  397. ULONGLONG Sequence:9;
  398. ULONGLONG NextEntry:39;
  399. ULONGLONG HeaderType:1;
  400. ULONGLONG Init:1;
  401. ULONGLONG Reserved:59;
  402. ULONGLONG Region:3;
  403. } Header8;
  404. struct {
  405. ULONGLONG Depth:16;
  406. ULONGLONG Sequence:48;
  407. ULONGLONG HeaderType:1;
  408. ULONGLONG Init:1;
  409. ULONGLONG Reserved:2;
  410. ULONGLONG NextEntry:60;
  411. } Header16;
  412. struct {
  413. ULONGLONG Depth:16;
  414. ULONGLONG Sequence:48;
  415. ULONGLONG HeaderType:1;
  416. ULONGLONG Reserved:3;
  417. ULONGLONG NextEntry:60;
  418. } HeaderX64;
  419. } SLIST_HEADER, *PSLIST_HEADER;
  420. typedef union _SLIST_HEADER32 {
  421. ULONGLONG Alignment;
  422. _ANONYMOUS_STRUCT struct {
  423. SLIST_ENTRY32 Next;
  424. USHORT Depth;
  425. USHORT Sequence;
  426. } DUMMYSTRUCTNAME;
  427. } SLIST_HEADER32, *PSLIST_HEADER32;
  428. #else
  429. #define SLIST_ENTRY SINGLE_LIST_ENTRY
  430. #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
  431. #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
  432. typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
  433. typedef union _SLIST_HEADER {
  434. ULONGLONG Alignment;
  435. _ANONYMOUS_STRUCT struct {
  436. SLIST_ENTRY Next;
  437. USHORT Depth;
  438. USHORT Sequence;
  439. } DUMMYSTRUCTNAME;
  440. } SLIST_HEADER, *PSLIST_HEADER;
  441. typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
  442. #endif /* defined(_WIN64) */
  443. #endif /* _SLIST_HEADER_ */
  444. /* MS definition is broken! */
  445. extern BOOLEAN NTSYSAPI NlsMbCodePageTag;
  446. extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag;
  447. #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
  448. #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
  449. #define SHORT_LEAST_SIGNIFICANT_BIT 0
  450. #define SHORT_MOST_SIGNIFICANT_BIT 1
  451. #define LONG_LEAST_SIGNIFICANT_BIT 0
  452. #define LONG_3RD_MOST_SIGNIFICANT_BIT 1
  453. #define LONG_2ND_MOST_SIGNIFICANT_BIT 2
  454. #define LONG_MOST_SIGNIFICANT_BIT 3
  455. #define RTLVERLIB_DDI(x) Wdmlib##x
  456. typedef BOOLEAN
  457. (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)(
  458. IN ULONG Version);
  459. typedef BOOLEAN
  460. (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
  461. IN ULONG Version);
  462. /******************************************************************************
  463. * Kernel Types *
  464. ******************************************************************************/
  465. typedef UCHAR KIRQL, *PKIRQL;
  466. typedef CCHAR KPROCESSOR_MODE;
  467. typedef LONG KPRIORITY;
  468. typedef enum _MODE {
  469. KernelMode,
  470. UserMode,
  471. MaximumMode
  472. } MODE;
  473. #define CACHE_FULLY_ASSOCIATIVE 0xFF
  474. #define MAXIMUM_SUSPEND_COUNT MAXCHAR
  475. #define EVENT_QUERY_STATE (0x0001)
  476. #define EVENT_MODIFY_STATE (0x0002)
  477. #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
  478. #define LTP_PC_SMT 0x1
  479. #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
  480. #define SINGLE_GROUP_LEGACY_API 1
  481. #endif
  482. #define SEMAPHORE_QUERY_STATE (0x0001)
  483. #define SEMAPHORE_MODIFY_STATE (0x0002)
  484. #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
  485. typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
  486. RelationProcessorCore,
  487. RelationNumaNode,
  488. RelationCache,
  489. RelationProcessorPackage,
  490. RelationGroup,
  491. RelationAll = 0xffff
  492. } LOGICAL_PROCESSOR_RELATIONSHIP;
  493. typedef enum _PROCESSOR_CACHE_TYPE {
  494. CacheUnified,
  495. CacheInstruction,
  496. CacheData,
  497. CacheTrace
  498. } PROCESSOR_CACHE_TYPE;
  499. typedef struct _CACHE_DESCRIPTOR {
  500. UCHAR Level;
  501. UCHAR Associativity;
  502. USHORT LineSize;
  503. ULONG Size;
  504. PROCESSOR_CACHE_TYPE Type;
  505. } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
  506. typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
  507. ULONG_PTR ProcessorMask;
  508. LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
  509. _ANONYMOUS_UNION union {
  510. struct {
  511. UCHAR Flags;
  512. } ProcessorCore;
  513. struct {
  514. ULONG NodeNumber;
  515. } NumaNode;
  516. CACHE_DESCRIPTOR Cache;
  517. ULONGLONG Reserved[2];
  518. } DUMMYUNIONNAME;
  519. } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
  520. typedef struct _PROCESSOR_RELATIONSHIP {
  521. UCHAR Flags;
  522. UCHAR Reserved[21];
  523. USHORT GroupCount;
  524. GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
  525. } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
  526. typedef struct _NUMA_NODE_RELATIONSHIP {
  527. ULONG NodeNumber;
  528. UCHAR Reserved[20];
  529. GROUP_AFFINITY GroupMask;
  530. } NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
  531. typedef struct _CACHE_RELATIONSHIP {
  532. UCHAR Level;
  533. UCHAR Associativity;
  534. USHORT LineSize;
  535. ULONG CacheSize;
  536. PROCESSOR_CACHE_TYPE Type;
  537. UCHAR Reserved[20];
  538. GROUP_AFFINITY GroupMask;
  539. } CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
  540. typedef struct _PROCESSOR_GROUP_INFO {
  541. UCHAR MaximumProcessorCount;
  542. UCHAR ActiveProcessorCount;
  543. UCHAR Reserved[38];
  544. KAFFINITY ActiveProcessorMask;
  545. } PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
  546. typedef struct _GROUP_RELATIONSHIP {
  547. USHORT MaximumGroupCount;
  548. USHORT ActiveGroupCount;
  549. UCHAR Reserved[20];
  550. PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
  551. } GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
  552. typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
  553. LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
  554. ULONG Size;
  555. _ANONYMOUS_UNION union {
  556. PROCESSOR_RELATIONSHIP Processor;
  557. NUMA_NODE_RELATIONSHIP NumaNode;
  558. CACHE_RELATIONSHIP Cache;
  559. GROUP_RELATIONSHIP Group;
  560. } DUMMYUNIONNAME;
  561. } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
  562. /* Processor features */
  563. #define PF_FLOATING_POINT_PRECISION_ERRATA 0
  564. #define PF_FLOATING_POINT_EMULATED 1
  565. #define PF_COMPARE_EXCHANGE_DOUBLE 2
  566. #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
  567. #define PF_PPC_MOVEMEM_64BIT_OK 4
  568. #define PF_ALPHA_BYTE_INSTRUCTIONS 5
  569. #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
  570. #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
  571. #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
  572. #define PF_PAE_ENABLED 9
  573. #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
  574. #define PF_SSE_DAZ_MODE_AVAILABLE 11
  575. #define PF_NX_ENABLED 12
  576. #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
  577. #define PF_COMPARE_EXCHANGE128 14
  578. #define PF_COMPARE64_EXCHANGE128 15
  579. #define PF_CHANNELS_ENABLED 16
  580. #define PF_XSAVE_ENABLED 17
  581. #define MAXIMUM_WAIT_OBJECTS 64
  582. #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
  583. #define ASSERT_DPC(Object) \
  584. ASSERT(((Object)->Type == 0) || \
  585. ((Object)->Type == DpcObject) || \
  586. ((Object)->Type == ThreadedDpcObject))
  587. #define ASSERT_GATE(object) \
  588. NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
  589. (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
  590. #define ASSERT_DEVICE_QUEUE(Object) \
  591. NT_ASSERT((Object)->Type == DeviceQueueObject)
  592. #define ASSERT_TIMER(E) \
  593. NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
  594. ((E)->Header.Type == TimerSynchronizationObject))
  595. #define ASSERT_MUTANT(E) \
  596. NT_ASSERT((E)->Header.Type == MutantObject)
  597. #define ASSERT_SEMAPHORE(E) \
  598. NT_ASSERT((E)->Header.Type == SemaphoreObject)
  599. #define ASSERT_EVENT(E) \
  600. NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
  601. ((E)->Header.Type == SynchronizationEvent))
  602. #define DPC_NORMAL 0
  603. #define DPC_THREADED 1
  604. #define GM_LOCK_BIT 0x1
  605. #define GM_LOCK_BIT_V 0x0
  606. #define GM_LOCK_WAITER_WOKEN 0x2
  607. #define GM_LOCK_WAITER_INC 0x4
  608. #define LOCK_QUEUE_WAIT_BIT 0
  609. #define LOCK_QUEUE_OWNER_BIT 1
  610. #define LOCK_QUEUE_WAIT 1
  611. #define LOCK_QUEUE_OWNER 2
  612. #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
  613. #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
  614. #define PROCESSOR_FEATURE_MAX 64
  615. #define DBG_STATUS_CONTROL_C 1
  616. #define DBG_STATUS_SYSRQ 2
  617. #define DBG_STATUS_BUGCHECK_FIRST 3
  618. #define DBG_STATUS_BUGCHECK_SECOND 4
  619. #define DBG_STATUS_FATAL 5
  620. #define DBG_STATUS_DEBUG_CONTROL 6
  621. #define DBG_STATUS_WORKER 7
  622. #if defined(_WIN64)
  623. #define MAXIMUM_PROC_PER_GROUP 64
  624. #else
  625. #define MAXIMUM_PROC_PER_GROUP 32
  626. #endif
  627. #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
  628. /* Exception Records */
  629. #define EXCEPTION_NONCONTINUABLE 1
  630. #define EXCEPTION_MAXIMUM_PARAMETERS 15
  631. #define EXCEPTION_DIVIDED_BY_ZERO 0
  632. #define EXCEPTION_DEBUG 1
  633. #define EXCEPTION_NMI 2
  634. #define EXCEPTION_INT3 3
  635. #define EXCEPTION_BOUND_CHECK 5
  636. #define EXCEPTION_INVALID_OPCODE 6
  637. #define EXCEPTION_NPX_NOT_AVAILABLE 7
  638. #define EXCEPTION_DOUBLE_FAULT 8
  639. #define EXCEPTION_NPX_OVERRUN 9
  640. #define EXCEPTION_INVALID_TSS 0x0A
  641. #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
  642. #define EXCEPTION_STACK_FAULT 0x0C
  643. #define EXCEPTION_GP_FAULT 0x0D
  644. #define EXCEPTION_RESERVED_TRAP 0x0F
  645. #define EXCEPTION_NPX_ERROR 0x010
  646. #define EXCEPTION_ALIGNMENT_CHECK 0x011
  647. typedef struct _EXCEPTION_RECORD {
  648. NTSTATUS ExceptionCode;
  649. ULONG ExceptionFlags;
  650. struct _EXCEPTION_RECORD *ExceptionRecord;
  651. PVOID ExceptionAddress;
  652. ULONG NumberParameters;
  653. ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  654. } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
  655. typedef struct _EXCEPTION_RECORD32 {
  656. NTSTATUS ExceptionCode;
  657. ULONG ExceptionFlags;
  658. ULONG ExceptionRecord;
  659. ULONG ExceptionAddress;
  660. ULONG NumberParameters;
  661. ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  662. } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
  663. typedef struct _EXCEPTION_RECORD64 {
  664. NTSTATUS ExceptionCode;
  665. ULONG ExceptionFlags;
  666. ULONG64 ExceptionRecord;
  667. ULONG64 ExceptionAddress;
  668. ULONG NumberParameters;
  669. ULONG __unusedAlignment;
  670. ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  671. } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
  672. typedef struct _EXCEPTION_POINTERS {
  673. PEXCEPTION_RECORD ExceptionRecord;
  674. PCONTEXT ContextRecord;
  675. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
  676. typedef enum _KBUGCHECK_CALLBACK_REASON {
  677. KbCallbackInvalid,
  678. KbCallbackReserved1,
  679. KbCallbackSecondaryDumpData,
  680. KbCallbackDumpIo,
  681. KbCallbackAddPages,
  682. KbCallbackSecondaryMultiPartDumpData,
  683. KbCallbackRemovePages,
  684. KbCallbackTriageDumpData
  685. } KBUGCHECK_CALLBACK_REASON;
  686. struct _KBUGCHECK_REASON_CALLBACK_RECORD;
  687. typedef VOID
  688. (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
  689. IN KBUGCHECK_CALLBACK_REASON Reason,
  690. IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
  691. IN OUT PVOID ReasonSpecificData,
  692. IN ULONG ReasonSpecificDataLength);
  693. typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
  694. typedef struct _KBUGCHECK_ADD_PAGES {
  695. IN OUT PVOID Context;
  696. IN OUT ULONG Flags;
  697. IN ULONG BugCheckCode;
  698. OUT ULONG_PTR Address;
  699. OUT ULONG_PTR Count;
  700. } KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES;
  701. typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA {
  702. IN PVOID InBuffer;
  703. IN ULONG InBufferLength;
  704. IN ULONG MaximumAllowed;
  705. OUT GUID Guid;
  706. OUT PVOID OutBuffer;
  707. OUT ULONG OutBufferLength;
  708. } KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA;
  709. typedef enum _KBUGCHECK_DUMP_IO_TYPE {
  710. KbDumpIoInvalid,
  711. KbDumpIoHeader,
  712. KbDumpIoBody,
  713. KbDumpIoSecondaryData,
  714. KbDumpIoComplete
  715. } KBUGCHECK_DUMP_IO_TYPE;
  716. typedef struct _KBUGCHECK_DUMP_IO {
  717. IN ULONG64 Offset;
  718. IN PVOID Buffer;
  719. IN ULONG BufferLength;
  720. IN KBUGCHECK_DUMP_IO_TYPE Type;
  721. } KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO;
  722. #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
  723. #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
  724. #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
  725. typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
  726. LIST_ENTRY Entry;
  727. PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
  728. PUCHAR Component;
  729. ULONG_PTR Checksum;
  730. KBUGCHECK_CALLBACK_REASON Reason;
  731. UCHAR State;
  732. } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
  733. typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
  734. BufferEmpty,
  735. BufferInserted,
  736. BufferStarted,
  737. BufferFinished,
  738. BufferIncomplete
  739. } KBUGCHECK_BUFFER_DUMP_STATE;
  740. typedef VOID
  741. (NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
  742. IN PVOID Buffer,
  743. IN ULONG Length);
  744. typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
  745. typedef struct _KBUGCHECK_CALLBACK_RECORD {
  746. LIST_ENTRY Entry;
  747. PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
  748. PVOID Buffer;
  749. ULONG Length;
  750. PUCHAR Component;
  751. ULONG_PTR Checksum;
  752. UCHAR State;
  753. } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
  754. typedef BOOLEAN
  755. (NTAPI NMI_CALLBACK)(
  756. IN PVOID Context,
  757. IN BOOLEAN Handled);
  758. typedef NMI_CALLBACK *PNMI_CALLBACK;
  759. typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE {
  760. KeProcessorAddStartNotify = 0,
  761. KeProcessorAddCompleteNotify,
  762. KeProcessorAddFailureNotify
  763. } KE_PROCESSOR_CHANGE_NOTIFY_STATE;
  764. typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT {
  765. KE_PROCESSOR_CHANGE_NOTIFY_STATE State;
  766. ULONG NtNumber;
  767. NTSTATUS Status;
  768. #if (NTDDI_VERSION >= NTDDI_WIN7)
  769. PROCESSOR_NUMBER ProcNumber;
  770. #endif
  771. } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
  772. typedef VOID
  773. (NTAPI PROCESSOR_CALLBACK_FUNCTION)(
  774. IN PVOID CallbackContext,
  775. IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
  776. IN OUT PNTSTATUS OperationStatus);
  777. typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION;
  778. #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
  779. #define INVALID_PROCESSOR_INDEX 0xffffffff
  780. typedef enum _KINTERRUPT_POLARITY {
  781. InterruptPolarityUnknown,
  782. InterruptActiveHigh,
  783. InterruptRisingEdge = InterruptActiveHigh,
  784. InterruptActiveLow,
  785. InterruptFallingEdge = InterruptActiveLow,
  786. #if NTDDI_VERSION >= NTDDI_WIN8
  787. InterruptActiveBoth,
  788. #endif
  789. #if NTDDI_VERSION >= NTDDI_WINBLUE
  790. InterruptActiveBothTriggerLow = InterruptActiveBoth,
  791. InterruptActiveBothTriggerHigh
  792. #endif
  793. } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
  794. typedef enum _KPROFILE_SOURCE {
  795. ProfileTime,
  796. ProfileAlignmentFixup,
  797. ProfileTotalIssues,
  798. ProfilePipelineDry,
  799. ProfileLoadInstructions,
  800. ProfilePipelineFrozen,
  801. ProfileBranchInstructions,
  802. ProfileTotalNonissues,
  803. ProfileDcacheMisses,
  804. ProfileIcacheMisses,
  805. ProfileCacheMisses,
  806. ProfileBranchMispredictions,
  807. ProfileStoreInstructions,
  808. ProfileFpInstructions,
  809. ProfileIntegerInstructions,
  810. Profile2Issue,
  811. Profile3Issue,
  812. Profile4Issue,
  813. ProfileSpecialInstructions,
  814. ProfileTotalCycles,
  815. ProfileIcacheIssues,
  816. ProfileDcacheAccesses,
  817. ProfileMemoryBarrierCycles,
  818. ProfileLoadLinkedIssues,
  819. ProfileMaximum
  820. } KPROFILE_SOURCE;
  821. typedef enum _KWAIT_REASON {
  822. Executive,
  823. FreePage,
  824. PageIn,
  825. PoolAllocation,
  826. DelayExecution,
  827. Suspended,
  828. UserRequest,
  829. WrExecutive,
  830. WrFreePage,
  831. WrPageIn,
  832. WrPoolAllocation,
  833. WrDelayExecution,
  834. WrSuspended,
  835. WrUserRequest,
  836. WrSpare0,
  837. WrQueue,
  838. WrLpcReceive,
  839. WrLpcReply,
  840. WrVirtualMemory,
  841. WrPageOut,
  842. WrRendezvous,
  843. WrKeyedEvent,
  844. WrTerminated,
  845. WrProcessInSwap,
  846. WrCpuRateControl,
  847. WrCalloutStack,
  848. WrKernel,
  849. WrResource,
  850. WrPushLock,
  851. WrMutex,
  852. WrQuantumEnd,
  853. WrDispatchInt,
  854. WrPreempted,
  855. WrYieldExecution,
  856. WrFastMutex,
  857. WrGuardedMutex,
  858. WrRundown,
  859. WrAlertByThreadId,
  860. WrDeferredPreempt,
  861. WrPhysicalFault,
  862. MaximumWaitReason
  863. } KWAIT_REASON;
  864. typedef struct _KWAIT_BLOCK {
  865. LIST_ENTRY WaitListEntry;
  866. struct _KTHREAD *Thread;
  867. PVOID Object;
  868. struct _KWAIT_BLOCK *NextWaitBlock;
  869. USHORT WaitKey;
  870. UCHAR WaitType;
  871. volatile UCHAR BlockState;
  872. #if defined(_WIN64)
  873. LONG SpareLong;
  874. #endif
  875. } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
  876. typedef enum _KINTERRUPT_MODE {
  877. LevelSensitive,
  878. Latched
  879. } KINTERRUPT_MODE;
  880. #define THREAD_WAIT_OBJECTS 3
  881. typedef VOID
  882. (NTAPI KSTART_ROUTINE)(
  883. IN PVOID StartContext);
  884. typedef KSTART_ROUTINE *PKSTART_ROUTINE;
  885. typedef VOID
  886. (NTAPI *PKINTERRUPT_ROUTINE)(
  887. VOID);
  888. typedef BOOLEAN
  889. (NTAPI KSERVICE_ROUTINE)(
  890. IN struct _KINTERRUPT *Interrupt,
  891. IN PVOID ServiceContext);
  892. typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
  893. typedef BOOLEAN
  894. (NTAPI KMESSAGE_SERVICE_ROUTINE)(
  895. IN struct _KINTERRUPT *Interrupt,
  896. IN PVOID ServiceContext,
  897. IN ULONG MessageID);
  898. typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE;
  899. typedef enum _KD_OPTION {
  900. KD_OPTION_SET_BLOCK_ENABLE,
  901. } KD_OPTION;
  902. typedef VOID
  903. (NTAPI *PKNORMAL_ROUTINE)(
  904. IN PVOID NormalContext OPTIONAL,
  905. IN PVOID SystemArgument1 OPTIONAL,
  906. IN PVOID SystemArgument2 OPTIONAL);
  907. typedef VOID
  908. (NTAPI *PKRUNDOWN_ROUTINE)(
  909. IN struct _KAPC *Apc);
  910. typedef VOID
  911. (NTAPI *PKKERNEL_ROUTINE)(
  912. IN struct _KAPC *Apc,
  913. IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
  914. IN OUT PVOID *NormalContext OPTIONAL,
  915. IN OUT PVOID *SystemArgument1 OPTIONAL,
  916. IN OUT PVOID *SystemArgument2 OPTIONAL);
  917. typedef struct _KAPC {
  918. UCHAR Type;
  919. UCHAR SpareByte0;
  920. UCHAR Size;
  921. UCHAR SpareByte1;
  922. ULONG SpareLong0;
  923. struct _KTHREAD *Thread;
  924. LIST_ENTRY ApcListEntry;
  925. PKKERNEL_ROUTINE KernelRoutine;
  926. PKRUNDOWN_ROUTINE RundownRoutine;
  927. PKNORMAL_ROUTINE NormalRoutine;
  928. PVOID NormalContext;
  929. PVOID SystemArgument1;
  930. PVOID SystemArgument2;
  931. CCHAR ApcStateIndex;
  932. KPROCESSOR_MODE ApcMode;
  933. BOOLEAN Inserted;
  934. } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
  935. #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
  936. #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
  937. #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
  938. #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
  939. #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
  940. #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
  941. #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
  942. typedef struct _KDEVICE_QUEUE_ENTRY {
  943. LIST_ENTRY DeviceListEntry;
  944. ULONG SortKey;
  945. BOOLEAN Inserted;
  946. } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
  947. *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
  948. typedef PVOID PKIPI_CONTEXT;
  949. typedef VOID
  950. (NTAPI *PKIPI_WORKER)(
  951. IN OUT PKIPI_CONTEXT PacketContext,
  952. IN PVOID Parameter1 OPTIONAL,
  953. IN PVOID Parameter2 OPTIONAL,
  954. IN PVOID Parameter3 OPTIONAL);
  955. typedef struct _KIPI_COUNTS {
  956. ULONG Freeze;
  957. ULONG Packet;
  958. ULONG DPC;
  959. ULONG APC;
  960. ULONG FlushSingleTb;
  961. ULONG FlushMultipleTb;
  962. ULONG FlushEntireTb;
  963. ULONG GenericCall;
  964. ULONG ChangeColor;
  965. ULONG SweepDcache;
  966. ULONG SweepIcache;
  967. ULONG SweepIcacheRange;
  968. ULONG FlushIoBuffers;
  969. ULONG GratuitousDPC;
  970. } KIPI_COUNTS, *PKIPI_COUNTS;
  971. typedef ULONG_PTR
  972. (NTAPI KIPI_BROADCAST_WORKER)(
  973. IN ULONG_PTR Argument);
  974. typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER;
  975. typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
  976. typedef struct _KSPIN_LOCK_QUEUE {
  977. struct _KSPIN_LOCK_QUEUE *volatile Next;
  978. PKSPIN_LOCK volatile Lock;
  979. } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
  980. typedef struct _KLOCK_QUEUE_HANDLE {
  981. KSPIN_LOCK_QUEUE LockQueue;
  982. KIRQL OldIrql;
  983. } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
  984. #if defined(_AMD64_)
  985. typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
  986. #define LockQueueUnusedSpare0 0
  987. #define LockQueueUnusedSpare1 1
  988. #define LockQueueUnusedSpare2 2
  989. #define LockQueueUnusedSpare3 3
  990. #define LockQueueVacbLock 4
  991. #define LockQueueMasterLock 5
  992. #define LockQueueNonPagedPoolLock 6
  993. #define LockQueueIoCancelLock 7
  994. #define LockQueueUnusedSpare8 8
  995. #define LockQueueIoVpbLock 9
  996. #define LockQueueIoDatabaseLock 10
  997. #define LockQueueIoCompletionLock 11
  998. #define LockQueueNtfsStructLock 12
  999. #define LockQueueAfdWorkQueueLock 13
  1000. #define LockQueueBcbLock 14
  1001. #define LockQueueUnusedSpare15 15
  1002. #define LockQueueUnusedSpare16 16
  1003. #define LockQueueMaximumLock 17
  1004. #else
  1005. typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
  1006. LockQueueUnusedSpare0,
  1007. LockQueueUnusedSpare1,
  1008. LockQueueUnusedSpare2,
  1009. LockQueueUnusedSpare3,
  1010. LockQueueVacbLock,
  1011. LockQueueMasterLock,
  1012. LockQueueNonPagedPoolLock,
  1013. LockQueueIoCancelLock,
  1014. LockQueueUnusedSpare8,
  1015. LockQueueIoVpbLock,
  1016. LockQueueIoDatabaseLock,
  1017. LockQueueIoCompletionLock,
  1018. LockQueueNtfsStructLock,
  1019. LockQueueAfdWorkQueueLock,
  1020. LockQueueBcbLock,
  1021. LockQueueUnusedSpare15,
  1022. LockQueueUnusedSpare16,
  1023. LockQueueMaximumLock = LockQueueUnusedSpare16 + 1
  1024. } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
  1025. #endif /* defined(_AMD64_) */
  1026. typedef VOID
  1027. (NTAPI KDEFERRED_ROUTINE)(
  1028. IN struct _KDPC *Dpc,
  1029. IN PVOID DeferredContext OPTIONAL,
  1030. IN PVOID SystemArgument1 OPTIONAL,
  1031. IN PVOID SystemArgument2 OPTIONAL);
  1032. typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE;
  1033. typedef enum _KDPC_IMPORTANCE {
  1034. LowImportance,
  1035. MediumImportance,
  1036. HighImportance,
  1037. MediumHighImportance
  1038. } KDPC_IMPORTANCE;
  1039. typedef struct _KDPC {
  1040. UCHAR Type;
  1041. UCHAR Importance;
  1042. volatile USHORT Number;
  1043. LIST_ENTRY DpcListEntry;
  1044. PKDEFERRED_ROUTINE DeferredRoutine;
  1045. PVOID DeferredContext;
  1046. PVOID SystemArgument1;
  1047. PVOID SystemArgument2;
  1048. volatile PVOID DpcData;
  1049. } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
  1050. typedef struct _KDPC_WATCHDOG_INFORMATION {
  1051. ULONG DpcTimeLimit;
  1052. ULONG DpcTimeCount;
  1053. ULONG DpcWatchdogLimit;
  1054. ULONG DpcWatchdogCount;
  1055. ULONG Reserved;
  1056. } KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
  1057. typedef struct _KDEVICE_QUEUE {
  1058. CSHORT Type;
  1059. CSHORT Size;
  1060. LIST_ENTRY DeviceListHead;
  1061. KSPIN_LOCK Lock;
  1062. # if defined(_AMD64_)
  1063. _ANONYMOUS_UNION union {
  1064. BOOLEAN Busy;
  1065. _ANONYMOUS_STRUCT struct {
  1066. LONG64 Reserved:8;
  1067. LONG64 Hint:56;
  1068. } DUMMYSTRUCTNAME;
  1069. } DUMMYUNIONNAME;
  1070. # else
  1071. BOOLEAN Busy;
  1072. # endif
  1073. } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
  1074. #define TIMER_EXPIRED_INDEX_BITS 6
  1075. #define TIMER_PROCESSOR_INDEX_BITS 5
  1076. typedef struct _DISPATCHER_HEADER {
  1077. _ANONYMOUS_UNION union {
  1078. _ANONYMOUS_STRUCT struct {
  1079. UCHAR Type;
  1080. _ANONYMOUS_UNION union {
  1081. _ANONYMOUS_UNION union {
  1082. UCHAR TimerControlFlags;
  1083. _ANONYMOUS_STRUCT struct {
  1084. UCHAR Absolute:1;
  1085. UCHAR Coalescable:1;
  1086. UCHAR KeepShifting:1;
  1087. UCHAR EncodedTolerableDelay:5;
  1088. } DUMMYSTRUCTNAME;
  1089. } DUMMYUNIONNAME;
  1090. UCHAR Abandoned;
  1091. #if (NTDDI_VERSION < NTDDI_WIN7)
  1092. UCHAR NpxIrql;
  1093. #endif
  1094. BOOLEAN Signalling;
  1095. } DUMMYUNIONNAME;
  1096. _ANONYMOUS_UNION union {
  1097. _ANONYMOUS_UNION union {
  1098. UCHAR ThreadControlFlags;
  1099. _ANONYMOUS_STRUCT struct {
  1100. UCHAR CpuThrottled:1;
  1101. UCHAR CycleProfiling:1;
  1102. UCHAR CounterProfiling:1;
  1103. UCHAR Reserved:5;
  1104. } DUMMYSTRUCTNAME;
  1105. } DUMMYUNIONNAME;
  1106. UCHAR Size;
  1107. UCHAR Hand;
  1108. } DUMMYUNIONNAME2;
  1109. _ANONYMOUS_UNION union {
  1110. #if (NTDDI_VERSION >= NTDDI_WIN7)
  1111. _ANONYMOUS_UNION union {
  1112. UCHAR TimerMiscFlags;
  1113. _ANONYMOUS_STRUCT struct {
  1114. #if !defined(_X86_)
  1115. UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
  1116. #else
  1117. UCHAR Index:1;
  1118. UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
  1119. #endif
  1120. UCHAR Inserted:1;
  1121. volatile UCHAR Expired:1;
  1122. } DUMMYSTRUCTNAME;
  1123. } DUMMYUNIONNAME;
  1124. #else
  1125. /* Pre Win7 compatibility fix to latest WDK */
  1126. UCHAR Inserted;
  1127. #endif
  1128. _ANONYMOUS_UNION union {
  1129. BOOLEAN DebugActive;
  1130. _ANONYMOUS_STRUCT struct {
  1131. BOOLEAN ActiveDR7:1;
  1132. BOOLEAN Instrumented:1;
  1133. BOOLEAN Reserved2:4;
  1134. BOOLEAN UmsScheduled:1;
  1135. BOOLEAN UmsPrimary:1;
  1136. } DUMMYSTRUCTNAME;
  1137. } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
  1138. BOOLEAN DpcActive;
  1139. } DUMMYUNIONNAME3;
  1140. } DUMMYSTRUCTNAME;
  1141. volatile LONG Lock;
  1142. } DUMMYUNIONNAME;
  1143. LONG SignalState;
  1144. LIST_ENTRY WaitListHead;
  1145. } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
  1146. typedef struct _KEVENT {
  1147. DISPATCHER_HEADER Header;
  1148. } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
  1149. typedef struct _KSEMAPHORE {
  1150. DISPATCHER_HEADER Header;
  1151. LONG Limit;
  1152. } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
  1153. #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
  1154. typedef struct _KGATE {
  1155. DISPATCHER_HEADER Header;
  1156. } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
  1157. typedef struct _KGUARDED_MUTEX {
  1158. volatile LONG Count;
  1159. PKTHREAD Owner;
  1160. ULONG Contention;
  1161. KGATE Gate;
  1162. _ANONYMOUS_UNION union {
  1163. _ANONYMOUS_STRUCT struct {
  1164. SHORT KernelApcDisable;
  1165. SHORT SpecialApcDisable;
  1166. } DUMMYSTRUCTNAME;
  1167. ULONG CombinedApcDisable;
  1168. } DUMMYUNIONNAME;
  1169. } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
  1170. typedef struct _KMUTANT {
  1171. DISPATCHER_HEADER Header;
  1172. LIST_ENTRY MutantListEntry;
  1173. struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
  1174. BOOLEAN Abandoned;
  1175. UCHAR ApcDisable;
  1176. } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
  1177. #define TIMER_TABLE_SIZE 512
  1178. #define TIMER_TABLE_SHIFT 9
  1179. typedef struct _KTIMER {
  1180. DISPATCHER_HEADER Header;
  1181. ULARGE_INTEGER DueTime;
  1182. LIST_ENTRY TimerListEntry;
  1183. struct _KDPC *Dpc;
  1184. # if !defined(_X86_)
  1185. ULONG Processor;
  1186. # endif
  1187. ULONG Period;
  1188. } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
  1189. typedef enum _LOCK_OPERATION {
  1190. IoReadAccess,
  1191. IoWriteAccess,
  1192. IoModifyAccess
  1193. } LOCK_OPERATION;
  1194. #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
  1195. typedef BOOLEAN (NTAPI KSYNCHRONIZE_ROUTINE)(PVOID SynchronizeContext);
  1196. typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE;
  1197. typedef enum _POOL_TYPE {
  1198. NonPagedPool,
  1199. NonPagedPoolExecute = NonPagedPool,
  1200. PagedPool,
  1201. NonPagedPoolMustSucceed,
  1202. DontUseThisType,
  1203. NonPagedPoolCacheAligned,
  1204. PagedPoolCacheAligned,
  1205. NonPagedPoolCacheAlignedMustS,
  1206. MaxPoolType,
  1207. NonPagedPoolBase = 0,
  1208. NonPagedPoolBaseMustSucceed = 2,
  1209. NonPagedPoolBaseCacheAligned = 4,
  1210. NonPagedPoolBaseCacheAlignedMustS = 6,
  1211. NonPagedPoolSession = 32,
  1212. PagedPoolSession,
  1213. NonPagedPoolMustSucceedSession,
  1214. DontUseThisTypeSession,
  1215. NonPagedPoolCacheAlignedSession,
  1216. PagedPoolCacheAlignedSession,
  1217. NonPagedPoolCacheAlignedMustSSession,
  1218. NonPagedPoolNx = 512,
  1219. NonPagedPoolNxCacheAligned = 516,
  1220. NonPagedPoolSessionNx = 544,
  1221. } POOL_TYPE;
  1222. typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
  1223. StandardDesign,
  1224. NEC98x86,
  1225. EndAlternatives
  1226. } ALTERNATIVE_ARCHITECTURE_TYPE;
  1227. #ifndef _X86_
  1228. #ifndef IsNEC_98
  1229. #define IsNEC_98 (FALSE)
  1230. #endif
  1231. #ifndef IsNotNEC_98
  1232. #define IsNotNEC_98 (TRUE)
  1233. #endif
  1234. #ifndef SetNEC_98
  1235. #define SetNEC_98
  1236. #endif
  1237. #ifndef SetNotNEC_98
  1238. #define SetNotNEC_98
  1239. #endif
  1240. #endif
  1241. typedef struct _KSYSTEM_TIME {
  1242. ULONG LowPart;
  1243. LONG High1Time;
  1244. LONG High2Time;
  1245. } KSYSTEM_TIME, *PKSYSTEM_TIME;
  1246. typedef struct DECLSPEC_ALIGN(16) _M128A {
  1247. ULONGLONG Low;
  1248. LONGLONG High;
  1249. } M128A, *PM128A;
  1250. typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
  1251. USHORT ControlWord;
  1252. USHORT StatusWord;
  1253. UCHAR TagWord;
  1254. UCHAR Reserved1;
  1255. USHORT ErrorOpcode;
  1256. ULONG ErrorOffset;
  1257. USHORT ErrorSelector;
  1258. USHORT Reserved2;
  1259. ULONG DataOffset;
  1260. USHORT DataSelector;
  1261. USHORT Reserved3;
  1262. ULONG MxCsr;
  1263. ULONG MxCsr_Mask;
  1264. M128A FloatRegisters[8];
  1265. #if defined(_WIN64)
  1266. M128A XmmRegisters[16];
  1267. UCHAR Reserved4[96];
  1268. #else
  1269. M128A XmmRegisters[8];
  1270. UCHAR Reserved4[192];
  1271. ULONG StackControl[7];
  1272. ULONG Cr0NpxState;
  1273. #endif
  1274. } XSAVE_FORMAT, *PXSAVE_FORMAT;
  1275. typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER {
  1276. ULONG64 Mask;
  1277. ULONG64 Reserved[7];
  1278. } XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER;
  1279. typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA {
  1280. XSAVE_FORMAT LegacyState;
  1281. XSAVE_AREA_HEADER Header;
  1282. } XSAVE_AREA, *PXSAVE_AREA;
  1283. typedef struct _XSTATE_CONTEXT {
  1284. ULONG64 Mask;
  1285. ULONG Length;
  1286. ULONG Reserved1;
  1287. PXSAVE_AREA Area;
  1288. #if defined(_X86_)
  1289. ULONG Reserved2;
  1290. #endif
  1291. PVOID Buffer;
  1292. #if defined(_X86_)
  1293. ULONG Reserved3;
  1294. #endif
  1295. } XSTATE_CONTEXT, *PXSTATE_CONTEXT;
  1296. typedef struct _XSTATE_SAVE {
  1297. #if defined(_AMD64_)
  1298. struct _XSTATE_SAVE* Prev;
  1299. struct _KTHREAD* Thread;
  1300. UCHAR Level;
  1301. XSTATE_CONTEXT XStateContext;
  1302. #elif defined(_IA64_)
  1303. ULONG Dummy;
  1304. #elif defined(_X86_)
  1305. _ANONYMOUS_UNION union {
  1306. _ANONYMOUS_STRUCT struct {
  1307. LONG64 Reserved1;
  1308. ULONG Reserved2;
  1309. struct _XSTATE_SAVE* Prev;
  1310. PXSAVE_AREA Reserved3;
  1311. struct _KTHREAD* Thread;
  1312. PVOID Reserved4;
  1313. UCHAR Level;
  1314. } DUMMYSTRUCTNAME;
  1315. XSTATE_CONTEXT XStateContext;
  1316. } DUMMYUNIONNAME;
  1317. #endif
  1318. } XSTATE_SAVE, *PXSTATE_SAVE;
  1319. #ifdef _X86_
  1320. #define MAXIMUM_SUPPORTED_EXTENSION 512
  1321. #if !defined(__midl) && !defined(MIDL_PASS)
  1322. C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION);
  1323. #endif
  1324. #endif /* _X86_ */
  1325. #define XSAVE_ALIGN 64
  1326. #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
  1327. #if !defined(__midl) && !defined(MIDL_PASS)
  1328. C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0);
  1329. C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0);
  1330. C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64);
  1331. #endif
  1332. typedef struct _CONTEXT_CHUNK {
  1333. LONG Offset;
  1334. ULONG Length;
  1335. } CONTEXT_CHUNK, *PCONTEXT_CHUNK;
  1336. typedef struct _CONTEXT_EX {
  1337. CONTEXT_CHUNK All;
  1338. CONTEXT_CHUNK Legacy;
  1339. CONTEXT_CHUNK XState;
  1340. } CONTEXT_EX, *PCONTEXT_EX;
  1341. #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
  1342. #if (NTDDI_VERSION >= NTDDI_VISTA)
  1343. extern NTSYSAPI volatile CCHAR KeNumberProcessors;
  1344. #elif (NTDDI_VERSION >= NTDDI_WINXP)
  1345. extern NTSYSAPI CCHAR KeNumberProcessors;
  1346. #else
  1347. extern PCCHAR KeNumberProcessors;
  1348. #endif
  1349. /******************************************************************************
  1350. * Memory manager Types *
  1351. ******************************************************************************/
  1352. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  1353. typedef ULONG NODE_REQUIREMENT;
  1354. #define MM_ANY_NODE_OK 0x80000000
  1355. #endif
  1356. #define MM_DONT_ZERO_ALLOCATION 0x00000001
  1357. #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
  1358. #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
  1359. #define MM_ALLOCATE_NO_WAIT 0x00000008
  1360. #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
  1361. #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
  1362. #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
  1363. #define MDL_PAGES_LOCKED 0x0002
  1364. #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
  1365. #define MDL_ALLOCATED_FIXED_SIZE 0x0008
  1366. #define MDL_PARTIAL 0x0010
  1367. #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
  1368. #define MDL_IO_PAGE_READ 0x0040
  1369. #define MDL_WRITE_OPERATION 0x0080
  1370. #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
  1371. #define MDL_FREE_EXTRA_PTES 0x0200
  1372. #define MDL_DESCRIBES_AWE 0x0400
  1373. #define MDL_IO_SPACE 0x0800
  1374. #define MDL_NETWORK_HEADER 0x1000
  1375. #define MDL_MAPPING_CAN_FAIL 0x2000
  1376. #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
  1377. #define MDL_INTERNAL 0x8000
  1378. #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
  1379. MDL_PAGES_LOCKED | \
  1380. MDL_SOURCE_IS_NONPAGED_POOL | \
  1381. MDL_PARTIAL_HAS_BEEN_MAPPED | \
  1382. MDL_PARENT_MAPPED_SYSTEM_VA | \
  1383. MDL_SYSTEM_VA | \
  1384. MDL_IO_SPACE)
  1385. #define FLUSH_MULTIPLE_MAXIMUM 32
  1386. /* Section access rights */
  1387. #define SECTION_QUERY 0x0001
  1388. #define SECTION_MAP_WRITE 0x0002
  1389. #define SECTION_MAP_READ 0x0004
  1390. #define SECTION_MAP_EXECUTE 0x0008
  1391. #define SECTION_EXTEND_SIZE 0x0010
  1392. #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
  1393. #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
  1394. SECTION_MAP_WRITE | \
  1395. SECTION_MAP_READ | \
  1396. SECTION_MAP_EXECUTE | \
  1397. SECTION_EXTEND_SIZE)
  1398. #define SESSION_QUERY_ACCESS 0x0001
  1399. #define SESSION_MODIFY_ACCESS 0x0002
  1400. #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
  1401. SESSION_QUERY_ACCESS | \
  1402. SESSION_MODIFY_ACCESS)
  1403. #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
  1404. #define PAGE_NOACCESS 0x01
  1405. #define PAGE_READONLY 0x02
  1406. #define PAGE_READWRITE 0x04
  1407. #define PAGE_WRITECOPY 0x08
  1408. #define PAGE_EXECUTE 0x10
  1409. #define PAGE_EXECUTE_READ 0x20
  1410. #define PAGE_EXECUTE_READWRITE 0x40
  1411. #define PAGE_EXECUTE_WRITECOPY 0x80
  1412. #define PAGE_GUARD 0x100
  1413. #define PAGE_NOCACHE 0x200
  1414. #define PAGE_WRITECOMBINE 0x400
  1415. #define MEM_COMMIT 0x1000
  1416. #define MEM_RESERVE 0x2000
  1417. #define MEM_DECOMMIT 0x4000
  1418. #define MEM_RELEASE 0x8000
  1419. #define MEM_FREE 0x10000
  1420. #define MEM_PRIVATE 0x20000
  1421. #define MEM_MAPPED 0x40000
  1422. #define MEM_RESET 0x80000
  1423. #define MEM_TOP_DOWN 0x100000
  1424. #define MEM_LARGE_PAGES 0x20000000
  1425. #define MEM_4MB_PAGES 0x80000000
  1426. #define SEC_RESERVE 0x4000000
  1427. #define SEC_COMMIT 0x8000000
  1428. #define SEC_LARGE_PAGES 0x80000000
  1429. /* Section map options */
  1430. typedef enum _SECTION_INHERIT {
  1431. ViewShare = 1,
  1432. ViewUnmap = 2
  1433. } SECTION_INHERIT;
  1434. typedef ULONG PFN_COUNT;
  1435. typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
  1436. typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
  1437. typedef struct _MDL {
  1438. struct _MDL *Next;
  1439. CSHORT Size;
  1440. CSHORT MdlFlags;
  1441. struct _EPROCESS *Process;
  1442. PVOID MappedSystemVa;
  1443. PVOID StartVa;
  1444. ULONG ByteCount;
  1445. ULONG ByteOffset;
  1446. } MDL, *PMDL;
  1447. typedef MDL *PMDLX;
  1448. typedef enum _MEMORY_CACHING_TYPE_ORIG {
  1449. MmFrameBufferCached = 2
  1450. } MEMORY_CACHING_TYPE_ORIG;
  1451. typedef enum _MEMORY_CACHING_TYPE {
  1452. MmNonCached = FALSE,
  1453. MmCached = TRUE,
  1454. MmWriteCombined = MmFrameBufferCached,
  1455. MmHardwareCoherentCached,
  1456. MmNonCachedUnordered,
  1457. MmUSWCCached,
  1458. MmMaximumCacheType,
  1459. MmNotMapped = -1
  1460. } MEMORY_CACHING_TYPE;
  1461. typedef enum _MM_PAGE_PRIORITY {
  1462. LowPagePriority,
  1463. NormalPagePriority = 16,
  1464. HighPagePriority = 32
  1465. } MM_PAGE_PRIORITY;
  1466. typedef enum _MM_SYSTEM_SIZE {
  1467. MmSmallSystem,
  1468. MmMediumSystem,
  1469. MmLargeSystem
  1470. } MM_SYSTEMSIZE;
  1471. extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
  1472. extern PVOID MmBadPointer;
  1473. /******************************************************************************
  1474. * Executive Types *
  1475. ******************************************************************************/
  1476. #define EX_RUNDOWN_ACTIVE 0x1
  1477. #define EX_RUNDOWN_COUNT_SHIFT 0x1
  1478. #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
  1479. typedef struct _FAST_MUTEX {
  1480. volatile LONG Count;
  1481. PKTHREAD Owner;
  1482. ULONG Contention;
  1483. KEVENT Event;
  1484. ULONG OldIrql;
  1485. } FAST_MUTEX, *PFAST_MUTEX;
  1486. typedef enum _SUITE_TYPE {
  1487. SmallBusiness,
  1488. Enterprise,
  1489. BackOffice,
  1490. CommunicationServer,
  1491. TerminalServer,
  1492. SmallBusinessRestricted,
  1493. EmbeddedNT,
  1494. DataCenter,
  1495. SingleUserTS,
  1496. Personal,
  1497. Blade,
  1498. EmbeddedRestricted,
  1499. SecurityAppliance,
  1500. StorageServer,
  1501. ComputeServer,
  1502. WHServer,
  1503. MaxSuiteType
  1504. } SUITE_TYPE;
  1505. typedef enum _EX_POOL_PRIORITY {
  1506. LowPoolPriority,
  1507. LowPoolPrioritySpecialPoolOverrun = 8,
  1508. LowPoolPrioritySpecialPoolUnderrun = 9,
  1509. NormalPoolPriority = 16,
  1510. NormalPoolPrioritySpecialPoolOverrun = 24,
  1511. NormalPoolPrioritySpecialPoolUnderrun = 25,
  1512. HighPoolPriority = 32,
  1513. HighPoolPrioritySpecialPoolOverrun = 40,
  1514. HighPoolPrioritySpecialPoolUnderrun = 41
  1515. } EX_POOL_PRIORITY;
  1516. #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
  1517. #define LOOKASIDE_ALIGN
  1518. #else
  1519. #define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN
  1520. #endif
  1521. typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
  1522. typedef PVOID
  1523. (NTAPI *PALLOCATE_FUNCTION)(
  1524. IN POOL_TYPE PoolType,
  1525. IN SIZE_T NumberOfBytes,
  1526. IN ULONG Tag);
  1527. typedef PVOID
  1528. (NTAPI *PALLOCATE_FUNCTION_EX)(
  1529. IN POOL_TYPE PoolType,
  1530. IN SIZE_T NumberOfBytes,
  1531. IN ULONG Tag,
  1532. IN OUT PLOOKASIDE_LIST_EX Lookaside);
  1533. typedef VOID
  1534. (NTAPI *PFREE_FUNCTION)(
  1535. IN PVOID Buffer);
  1536. typedef VOID
  1537. (NTAPI *PFREE_FUNCTION_EX)(
  1538. IN PVOID Buffer,
  1539. IN OUT PLOOKASIDE_LIST_EX Lookaside);
  1540. typedef VOID
  1541. (NTAPI CALLBACK_FUNCTION)(
  1542. IN PVOID CallbackContext OPTIONAL,
  1543. IN PVOID Argument1 OPTIONAL,
  1544. IN PVOID Argument2 OPTIONAL);
  1545. typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
  1546. #define GENERAL_LOOKASIDE_LAYOUT \
  1547. _ANONYMOUS_UNION union { \
  1548. SLIST_HEADER ListHead; \
  1549. SINGLE_LIST_ENTRY SingleListHead; \
  1550. } DUMMYUNIONNAME; \
  1551. USHORT Depth; \
  1552. USHORT MaximumDepth; \
  1553. ULONG TotalAllocates; \
  1554. _ANONYMOUS_UNION union { \
  1555. ULONG AllocateMisses; \
  1556. ULONG AllocateHits; \
  1557. } DUMMYUNIONNAME2; \
  1558. ULONG TotalFrees; \
  1559. _ANONYMOUS_UNION union { \
  1560. ULONG FreeMisses; \
  1561. ULONG FreeHits; \
  1562. } DUMMYUNIONNAME3; \
  1563. POOL_TYPE Type; \
  1564. ULONG Tag; \
  1565. ULONG Size; \
  1566. _ANONYMOUS_UNION union { \
  1567. PALLOCATE_FUNCTION_EX AllocateEx; \
  1568. PALLOCATE_FUNCTION Allocate; \
  1569. } DUMMYUNIONNAME4; \
  1570. _ANONYMOUS_UNION union { \
  1571. PFREE_FUNCTION_EX FreeEx; \
  1572. PFREE_FUNCTION Free; \
  1573. } DUMMYUNIONNAME5; \
  1574. LIST_ENTRY ListEntry; \
  1575. ULONG LastTotalAllocates; \
  1576. _ANONYMOUS_UNION union { \
  1577. ULONG LastAllocateMisses; \
  1578. ULONG LastAllocateHits; \
  1579. } DUMMYUNIONNAME6; \
  1580. ULONG Future[2];
  1581. typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
  1582. GENERAL_LOOKASIDE_LAYOUT
  1583. } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
  1584. typedef struct _GENERAL_LOOKASIDE_POOL {
  1585. GENERAL_LOOKASIDE_LAYOUT
  1586. } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
  1587. #define LOOKASIDE_CHECK(f) \
  1588. C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
  1589. LOOKASIDE_CHECK(TotalFrees);
  1590. LOOKASIDE_CHECK(Tag);
  1591. LOOKASIDE_CHECK(Future);
  1592. typedef struct _PAGED_LOOKASIDE_LIST {
  1593. GENERAL_LOOKASIDE L;
  1594. #if !defined(_AMD64_) && !defined(_IA64_)
  1595. FAST_MUTEX Lock__ObsoleteButDoNotDelete;
  1596. #endif
  1597. } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
  1598. typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
  1599. GENERAL_LOOKASIDE L;
  1600. #if !defined(_AMD64_) && !defined(_IA64_)
  1601. KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
  1602. #endif
  1603. } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
  1604. #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
  1605. typedef struct _LOOKASIDE_LIST_EX {
  1606. GENERAL_LOOKASIDE_POOL L;
  1607. } LOOKASIDE_LIST_EX;
  1608. #if (NTDDI_VERSION >= NTDDI_VISTA)
  1609. #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
  1610. #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
  1611. #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
  1612. #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
  1613. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  1614. typedef struct _EX_RUNDOWN_REF {
  1615. _ANONYMOUS_UNION union {
  1616. volatile ULONG_PTR Count;
  1617. volatile PVOID Ptr;
  1618. } DUMMYUNIONNAME;
  1619. } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
  1620. typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
  1621. typedef enum _WORK_QUEUE_TYPE {
  1622. CriticalWorkQueue,
  1623. DelayedWorkQueue,
  1624. HyperCriticalWorkQueue,
  1625. NormalWorkQueue,
  1626. BackgroundWorkQueue,
  1627. RealTimeWorkQueue,
  1628. SuperCriticalWorkQueue,
  1629. MaximumWorkQueue,
  1630. CustomPriorityWorkQueue = 32
  1631. } WORK_QUEUE_TYPE;
  1632. typedef VOID
  1633. (NTAPI WORKER_THREAD_ROUTINE)(
  1634. IN PVOID Parameter);
  1635. typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
  1636. typedef struct _WORK_QUEUE_ITEM {
  1637. LIST_ENTRY List;
  1638. PWORKER_THREAD_ROUTINE WorkerRoutine;
  1639. volatile PVOID Parameter;
  1640. } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
  1641. typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
  1642. typedef struct _OWNER_ENTRY {
  1643. ERESOURCE_THREAD OwnerThread;
  1644. _ANONYMOUS_UNION union {
  1645. _ANONYMOUS_STRUCT struct {
  1646. ULONG IoPriorityBoosted:1;
  1647. ULONG OwnerReferenced:1;
  1648. ULONG OwnerCount:30;
  1649. } DUMMYSTRUCTNAME;
  1650. ULONG TableSize;
  1651. } DUMMYUNIONNAME;
  1652. } OWNER_ENTRY, *POWNER_ENTRY;
  1653. typedef struct _ERESOURCE {
  1654. LIST_ENTRY SystemResourcesList;
  1655. POWNER_ENTRY OwnerTable;
  1656. SHORT ActiveCount;
  1657. USHORT Flag;
  1658. volatile PKSEMAPHORE SharedWaiters;
  1659. volatile PKEVENT ExclusiveWaiters;
  1660. OWNER_ENTRY OwnerEntry;
  1661. ULONG ActiveEntries;
  1662. ULONG ContentionCount;
  1663. ULONG NumberOfSharedWaiters;
  1664. ULONG NumberOfExclusiveWaiters;
  1665. #if defined(_WIN64)
  1666. PVOID Reserved2;
  1667. #endif
  1668. _ANONYMOUS_UNION union {
  1669. PVOID Address;
  1670. ULONG_PTR CreatorBackTraceIndex;
  1671. } DUMMYUNIONNAME;
  1672. KSPIN_LOCK SpinLock;
  1673. } ERESOURCE, *PERESOURCE;
  1674. /* ERESOURCE.Flag */
  1675. #define ResourceNeverExclusive 0x0010
  1676. #define ResourceReleaseByOtherThread 0x0020
  1677. #define ResourceOwnedExclusive 0x0080
  1678. #define RESOURCE_HASH_TABLE_SIZE 64
  1679. typedef struct _RESOURCE_HASH_ENTRY {
  1680. LIST_ENTRY ListEntry;
  1681. PVOID Address;
  1682. ULONG ContentionCount;
  1683. ULONG Number;
  1684. } RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY;
  1685. typedef struct _RESOURCE_PERFORMANCE_DATA {
  1686. ULONG ActiveResourceCount;
  1687. ULONG TotalResourceCount;
  1688. ULONG ExclusiveAcquire;
  1689. ULONG SharedFirstLevel;
  1690. ULONG SharedSecondLevel;
  1691. ULONG StarveFirstLevel;
  1692. ULONG StarveSecondLevel;
  1693. ULONG WaitForExclusive;
  1694. ULONG OwnerTableExpands;
  1695. ULONG MaximumTableExpand;
  1696. LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE];
  1697. } RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA;
  1698. /* Global debug flag */
  1699. #if DEVL
  1700. extern ULONG NtGlobalFlag;
  1701. #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
  1702. #else
  1703. #define IF_NTOS_DEBUG(FlagName) if(FALSE)
  1704. #endif
  1705. /******************************************************************************
  1706. * Security Manager Types *
  1707. ******************************************************************************/
  1708. /* Simple types */
  1709. typedef PVOID PSECURITY_DESCRIPTOR;
  1710. typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
  1711. typedef ULONG ACCESS_MASK, *PACCESS_MASK;
  1712. typedef PVOID PACCESS_TOKEN;
  1713. typedef PVOID PSID;
  1714. #define DELETE 0x00010000L
  1715. #define READ_CONTROL 0x00020000L
  1716. #define WRITE_DAC 0x00040000L
  1717. #define WRITE_OWNER 0x00080000L
  1718. #define SYNCHRONIZE 0x00100000L
  1719. #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
  1720. #define STANDARD_RIGHTS_READ READ_CONTROL
  1721. #define STANDARD_RIGHTS_WRITE READ_CONTROL
  1722. #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
  1723. #define STANDARD_RIGHTS_ALL 0x001F0000L
  1724. #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
  1725. #define ACCESS_SYSTEM_SECURITY 0x01000000L
  1726. #define MAXIMUM_ALLOWED 0x02000000L
  1727. #define GENERIC_READ 0x80000000L
  1728. #define GENERIC_WRITE 0x40000000L
  1729. #define GENERIC_EXECUTE 0x20000000L
  1730. #define GENERIC_ALL 0x10000000L
  1731. typedef struct _GENERIC_MAPPING {
  1732. ACCESS_MASK GenericRead;
  1733. ACCESS_MASK GenericWrite;
  1734. ACCESS_MASK GenericExecute;
  1735. ACCESS_MASK GenericAll;
  1736. } GENERIC_MAPPING, *PGENERIC_MAPPING;
  1737. #define ACL_REVISION 2
  1738. #define ACL_REVISION_DS 4
  1739. #define ACL_REVISION1 1
  1740. #define ACL_REVISION2 2
  1741. #define ACL_REVISION3 3
  1742. #define ACL_REVISION4 4
  1743. #define MIN_ACL_REVISION ACL_REVISION2
  1744. #define MAX_ACL_REVISION ACL_REVISION4
  1745. typedef struct _ACL {
  1746. UCHAR AclRevision;
  1747. UCHAR Sbz1;
  1748. USHORT AclSize;
  1749. USHORT AceCount;
  1750. USHORT Sbz2;
  1751. } ACL, *PACL;
  1752. /* Current security descriptor revision value */
  1753. #define SECURITY_DESCRIPTOR_REVISION (1)
  1754. #define SECURITY_DESCRIPTOR_REVISION1 (1)
  1755. /* Privilege attributes */
  1756. #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
  1757. #define SE_PRIVILEGE_ENABLED (0x00000002L)
  1758. #define SE_PRIVILEGE_REMOVED (0X00000004L)
  1759. #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
  1760. #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
  1761. SE_PRIVILEGE_ENABLED | \
  1762. SE_PRIVILEGE_REMOVED | \
  1763. SE_PRIVILEGE_USED_FOR_ACCESS)
  1764. #include <pshpack4.h>
  1765. typedef struct _LUID_AND_ATTRIBUTES {
  1766. LUID Luid;
  1767. ULONG Attributes;
  1768. } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
  1769. #include <poppack.h>
  1770. typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
  1771. typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
  1772. /* Privilege sets */
  1773. #define PRIVILEGE_SET_ALL_NECESSARY (1)
  1774. typedef struct _PRIVILEGE_SET {
  1775. ULONG PrivilegeCount;
  1776. ULONG Control;
  1777. LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
  1778. } PRIVILEGE_SET,*PPRIVILEGE_SET;
  1779. typedef enum _SECURITY_IMPERSONATION_LEVEL {
  1780. SecurityAnonymous,
  1781. SecurityIdentification,
  1782. SecurityImpersonation,
  1783. SecurityDelegation
  1784. } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
  1785. #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
  1786. #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
  1787. #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
  1788. #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
  1789. #define SECURITY_DYNAMIC_TRACKING (TRUE)
  1790. #define SECURITY_STATIC_TRACKING (FALSE)
  1791. typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
  1792. typedef struct _SECURITY_QUALITY_OF_SERVICE {
  1793. ULONG Length;
  1794. SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  1795. SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
  1796. BOOLEAN EffectiveOnly;
  1797. } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
  1798. typedef struct _SE_IMPERSONATION_STATE {
  1799. PACCESS_TOKEN Token;
  1800. BOOLEAN CopyOnOpen;
  1801. BOOLEAN EffectiveOnly;
  1802. SECURITY_IMPERSONATION_LEVEL Level;
  1803. } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
  1804. #define OWNER_SECURITY_INFORMATION (0x00000001L)
  1805. #define GROUP_SECURITY_INFORMATION (0x00000002L)
  1806. #define DACL_SECURITY_INFORMATION (0x00000004L)
  1807. #define SACL_SECURITY_INFORMATION (0x00000008L)
  1808. #define LABEL_SECURITY_INFORMATION (0x00000010L)
  1809. #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
  1810. #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
  1811. #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
  1812. #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
  1813. typedef enum _SECURITY_OPERATION_CODE {
  1814. SetSecurityDescriptor,
  1815. QuerySecurityDescriptor,
  1816. DeleteSecurityDescriptor,
  1817. AssignSecurityDescriptor
  1818. } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
  1819. #define INITIAL_PRIVILEGE_COUNT 3
  1820. typedef struct _INITIAL_PRIVILEGE_SET {
  1821. ULONG PrivilegeCount;
  1822. ULONG Control;
  1823. LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
  1824. } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
  1825. #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
  1826. #define SE_CREATE_TOKEN_PRIVILEGE 2
  1827. #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
  1828. #define SE_LOCK_MEMORY_PRIVILEGE 4
  1829. #define SE_INCREASE_QUOTA_PRIVILEGE 5
  1830. #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
  1831. #define SE_TCB_PRIVILEGE 7
  1832. #define SE_SECURITY_PRIVILEGE 8
  1833. #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
  1834. #define SE_LOAD_DRIVER_PRIVILEGE 10
  1835. #define SE_SYSTEM_PROFILE_PRIVILEGE 11
  1836. #define SE_SYSTEMTIME_PRIVILEGE 12
  1837. #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
  1838. #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
  1839. #define SE_CREATE_PAGEFILE_PRIVILEGE 15
  1840. #define SE_CREATE_PERMANENT_PRIVILEGE 16
  1841. #define SE_BACKUP_PRIVILEGE 17
  1842. #define SE_RESTORE_PRIVILEGE 18
  1843. #define SE_SHUTDOWN_PRIVILEGE 19
  1844. #define SE_DEBUG_PRIVILEGE 20
  1845. #define SE_AUDIT_PRIVILEGE 21
  1846. #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
  1847. #define SE_CHANGE_NOTIFY_PRIVILEGE 23
  1848. #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
  1849. #define SE_UNDOCK_PRIVILEGE 25
  1850. #define SE_SYNC_AGENT_PRIVILEGE 26
  1851. #define SE_ENABLE_DELEGATION_PRIVILEGE 27
  1852. #define SE_MANAGE_VOLUME_PRIVILEGE 28
  1853. #define SE_IMPERSONATE_PRIVILEGE 29
  1854. #define SE_CREATE_GLOBAL_PRIVILEGE 30
  1855. #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
  1856. #define SE_RELABEL_PRIVILEGE 32
  1857. #define SE_INC_WORKING_SET_PRIVILEGE 33
  1858. #define SE_TIME_ZONE_PRIVILEGE 34
  1859. #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
  1860. #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
  1861. typedef struct _SECURITY_SUBJECT_CONTEXT {
  1862. PACCESS_TOKEN ClientToken;
  1863. SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  1864. PACCESS_TOKEN PrimaryToken;
  1865. PVOID ProcessAuditId;
  1866. } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
  1867. typedef struct _ACCESS_STATE {
  1868. LUID OperationID;
  1869. BOOLEAN SecurityEvaluated;
  1870. BOOLEAN GenerateAudit;
  1871. BOOLEAN GenerateOnClose;
  1872. BOOLEAN PrivilegesAllocated;
  1873. ULONG Flags;
  1874. ACCESS_MASK RemainingDesiredAccess;
  1875. ACCESS_MASK PreviouslyGrantedAccess;
  1876. ACCESS_MASK OriginalDesiredAccess;
  1877. SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
  1878. PSECURITY_DESCRIPTOR SecurityDescriptor;
  1879. PVOID AuxData;
  1880. union {
  1881. INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
  1882. PRIVILEGE_SET PrivilegeSet;
  1883. } Privileges;
  1884. BOOLEAN AuditPrivileges;
  1885. UNICODE_STRING ObjectName;
  1886. UNICODE_STRING ObjectTypeName;
  1887. } ACCESS_STATE, *PACCESS_STATE;
  1888. typedef VOID
  1889. (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)(
  1890. IN PVOID Vcb,
  1891. IN PSECURITY_DESCRIPTOR SecurityDescriptor);
  1892. #ifndef _NTLSA_IFS_
  1893. #ifndef _NTLSA_AUDIT_
  1894. #define _NTLSA_AUDIT_
  1895. #define SE_MAX_AUDIT_PARAMETERS 32
  1896. #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
  1897. #define SE_ADT_OBJECT_ONLY 0x1
  1898. #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
  1899. #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
  1900. #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
  1901. #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
  1902. #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
  1903. #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
  1904. ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
  1905. (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
  1906. typedef enum _SE_ADT_PARAMETER_TYPE {
  1907. SeAdtParmTypeNone = 0,
  1908. SeAdtParmTypeString,
  1909. SeAdtParmTypeFileSpec,
  1910. SeAdtParmTypeUlong,
  1911. SeAdtParmTypeSid,
  1912. SeAdtParmTypeLogonId,
  1913. SeAdtParmTypeNoLogonId,
  1914. SeAdtParmTypeAccessMask,
  1915. SeAdtParmTypePrivs,
  1916. SeAdtParmTypeObjectTypes,
  1917. SeAdtParmTypeHexUlong,
  1918. SeAdtParmTypePtr,
  1919. SeAdtParmTypeTime,
  1920. SeAdtParmTypeGuid,
  1921. SeAdtParmTypeLuid,
  1922. SeAdtParmTypeHexInt64,
  1923. SeAdtParmTypeStringList,
  1924. SeAdtParmTypeSidList,
  1925. SeAdtParmTypeDuration,
  1926. SeAdtParmTypeUserAccountControl,
  1927. SeAdtParmTypeNoUac,
  1928. SeAdtParmTypeMessage,
  1929. SeAdtParmTypeDateTime,
  1930. SeAdtParmTypeSockAddr,
  1931. SeAdtParmTypeSD,
  1932. SeAdtParmTypeLogonHours,
  1933. SeAdtParmTypeLogonIdNoSid,
  1934. SeAdtParmTypeUlongNoConv,
  1935. SeAdtParmTypeSockAddrNoPort,
  1936. SeAdtParmTypeAccessReason,
  1937. SeAdtParmTypeStagingReason,
  1938. SeAdtParmTypeResourceAttribute,
  1939. SeAdtParmTypeClaims,
  1940. SeAdtParmTypeLogonIdAsSid,
  1941. SeAdtParmTypeMultiSzString,
  1942. SeAdtParmTypeLogonIdEx
  1943. } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
  1944. typedef struct _SE_ADT_OBJECT_TYPE {
  1945. GUID ObjectType;
  1946. USHORT Flags;
  1947. USHORT Level;
  1948. ACCESS_MASK AccessMask;
  1949. } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
  1950. typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
  1951. SE_ADT_PARAMETER_TYPE Type;
  1952. ULONG Length;
  1953. ULONG_PTR Data[2];
  1954. PVOID Address;
  1955. } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
  1956. typedef struct _SE_ADT_ACCESS_REASON {
  1957. ACCESS_MASK AccessMask;
  1958. ULONG AccessReasons[32];
  1959. ULONG ObjectTypeIndex;
  1960. ULONG AccessGranted;
  1961. PSECURITY_DESCRIPTOR SecurityDescriptor;
  1962. } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
  1963. typedef struct _SE_ADT_PARAMETER_ARRAY {
  1964. ULONG CategoryId;
  1965. ULONG AuditId;
  1966. ULONG ParameterCount;
  1967. ULONG Length;
  1968. USHORT FlatSubCategoryId;
  1969. USHORT Type;
  1970. ULONG Flags;
  1971. SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
  1972. } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
  1973. #endif /* !_NTLSA_AUDIT_ */
  1974. #endif /* !_NTLSA_IFS_ */
  1975. /******************************************************************************
  1976. * Power Management Support Types *
  1977. ******************************************************************************/
  1978. #ifndef _PO_DDK_
  1979. #define _PO_DDK_
  1980. #define PO_CB_SYSTEM_POWER_POLICY 0
  1981. #define PO_CB_AC_STATUS 1
  1982. #define PO_CB_BUTTON_COLLISION 2
  1983. #define PO_CB_SYSTEM_STATE_LOCK 3
  1984. #define PO_CB_LID_SWITCH_STATE 4
  1985. #define PO_CB_PROCESSOR_POWER_POLICY 5
  1986. /* Power States/Levels */
  1987. typedef enum _SYSTEM_POWER_STATE {
  1988. PowerSystemUnspecified = 0,
  1989. PowerSystemWorking,
  1990. PowerSystemSleeping1,
  1991. PowerSystemSleeping2,
  1992. PowerSystemSleeping3,
  1993. PowerSystemHibernate,
  1994. PowerSystemShutdown,
  1995. PowerSystemMaximum
  1996. } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
  1997. #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
  1998. typedef enum _POWER_INFORMATION_LEVEL {
  1999. SystemPowerPolicyAc,
  2000. SystemPowerPolicyDc,
  2001. VerifySystemPolicyAc,
  2002. VerifySystemPolicyDc,
  2003. SystemPowerCapabilities,
  2004. SystemBatteryState,
  2005. SystemPowerStateHandler,
  2006. ProcessorStateHandler,
  2007. SystemPowerPolicyCurrent,
  2008. AdministratorPowerPolicy,
  2009. SystemReserveHiberFile,
  2010. ProcessorInformation,
  2011. SystemPowerInformation,
  2012. ProcessorStateHandler2,
  2013. LastWakeTime,
  2014. LastSleepTime,
  2015. SystemExecutionState,
  2016. SystemPowerStateNotifyHandler,
  2017. ProcessorPowerPolicyAc,
  2018. ProcessorPowerPolicyDc,
  2019. VerifyProcessorPowerPolicyAc,
  2020. VerifyProcessorPowerPolicyDc,
  2021. ProcessorPowerPolicyCurrent,
  2022. SystemPowerStateLogging,
  2023. SystemPowerLoggingEntry,
  2024. SetPowerSettingValue,
  2025. NotifyUserPowerSetting,
  2026. PowerInformationLevelUnused0,
  2027. SystemMonitorHiberBootPowerOff,
  2028. SystemVideoState,
  2029. TraceApplicationPowerMessage,
  2030. TraceApplicationPowerMessageEnd,
  2031. ProcessorPerfStates,
  2032. ProcessorIdleStates,
  2033. ProcessorCap,
  2034. SystemWakeSource,
  2035. SystemHiberFileInformation,
  2036. TraceServicePowerMessage,
  2037. ProcessorLoad,
  2038. PowerShutdownNotification,
  2039. MonitorCapabilities,
  2040. SessionPowerInit,
  2041. SessionDisplayState,
  2042. PowerRequestCreate,
  2043. PowerRequestAction,
  2044. GetPowerRequestList,
  2045. ProcessorInformationEx,
  2046. NotifyUserModeLegacyPowerEvent,
  2047. GroupPark,
  2048. ProcessorIdleDomains,
  2049. WakeTimerList,
  2050. SystemHiberFileSize,
  2051. ProcessorIdleStatesHv,
  2052. ProcessorPerfStatesHv,
  2053. ProcessorPerfCapHv,
  2054. ProcessorSetIdle,
  2055. LogicalProcessorIdling,
  2056. UserPresence,
  2057. PowerSettingNotificationName,
  2058. GetPowerSettingValue,
  2059. IdleResiliency,
  2060. SessionRITState,
  2061. SessionConnectNotification,
  2062. SessionPowerCleanup,
  2063. SessionLockState,
  2064. SystemHiberbootState,
  2065. PlatformInformation,
  2066. PdcInvocation,
  2067. MonitorInvocation,
  2068. FirmwareTableInformationRegistered,
  2069. SetShutdownSelectedTime,
  2070. SuspendResumeInvocation,
  2071. PlmPowerRequestCreate,
  2072. ScreenOff,
  2073. CsDeviceNotification,
  2074. PlatformRole,
  2075. LastResumePerformance,
  2076. DisplayBurst,
  2077. ExitLatencySamplingPercentage,
  2078. RegisterSpmPowerSettings,
  2079. PlatformIdleStates,
  2080. ProcessorIdleVeto,
  2081. PlatformIdleVeto,
  2082. SystemBatteryStatePrecise,
  2083. ThermalEvent,
  2084. PowerRequestActionInternal,
  2085. BatteryDeviceState,
  2086. PowerInformationInternal,
  2087. ThermalStandby,
  2088. SystemHiberFileType,
  2089. PhysicalPowerButtonPress,
  2090. QueryPotentialDripsConstraint,
  2091. EnergyTrackerCreate,
  2092. EnergyTrackerQuery,
  2093. UpdateBlackBoxRecorder,
  2094. SessionAllowExternalDmaDevices,
  2095. PowerInformationLevelMaximum
  2096. } POWER_INFORMATION_LEVEL;
  2097. typedef enum {
  2098. PowerActionNone = 0,
  2099. PowerActionReserved,
  2100. PowerActionSleep,
  2101. PowerActionHibernate,
  2102. PowerActionShutdown,
  2103. PowerActionShutdownReset,
  2104. PowerActionShutdownOff,
  2105. PowerActionWarmEject,
  2106. PowerActionDisplayOff
  2107. } POWER_ACTION, *PPOWER_ACTION;
  2108. typedef enum _DEVICE_POWER_STATE {
  2109. PowerDeviceUnspecified = 0,
  2110. PowerDeviceD0,
  2111. PowerDeviceD1,
  2112. PowerDeviceD2,
  2113. PowerDeviceD3,
  2114. PowerDeviceMaximum
  2115. } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
  2116. typedef enum _MONITOR_DISPLAY_STATE {
  2117. PowerMonitorOff = 0,
  2118. PowerMonitorOn,
  2119. PowerMonitorDim
  2120. } MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
  2121. typedef union _POWER_STATE {
  2122. SYSTEM_POWER_STATE SystemState;
  2123. DEVICE_POWER_STATE DeviceState;
  2124. } POWER_STATE, *PPOWER_STATE;
  2125. typedef enum _POWER_STATE_TYPE {
  2126. SystemPowerState = 0,
  2127. DevicePowerState
  2128. } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
  2129. #if (NTDDI_VERSION >= NTDDI_VISTA)
  2130. typedef struct _SYSTEM_POWER_STATE_CONTEXT {
  2131. _ANONYMOUS_UNION union {
  2132. _ANONYMOUS_STRUCT struct {
  2133. ULONG Reserved1:8;
  2134. ULONG TargetSystemState:4;
  2135. ULONG EffectiveSystemState:4;
  2136. ULONG CurrentSystemState:4;
  2137. ULONG IgnoreHibernationPath:1;
  2138. ULONG PseudoTransition:1;
  2139. ULONG Reserved2:10;
  2140. } DUMMYSTRUCTNAME;
  2141. ULONG ContextAsUlong;
  2142. } DUMMYUNIONNAME;
  2143. } SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
  2144. #endif
  2145. #if (NTDDI_VERSION >= NTDDI_WIN7)
  2146. typedef struct _COUNTED_REASON_CONTEXT {
  2147. ULONG Version;
  2148. ULONG Flags;
  2149. _ANONYMOUS_UNION union {
  2150. _ANONYMOUS_STRUCT struct {
  2151. UNICODE_STRING ResourceFileName;
  2152. USHORT ResourceReasonId;
  2153. ULONG StringCount;
  2154. PUNICODE_STRING ReasonStrings;
  2155. } DUMMYSTRUCTNAME;
  2156. UNICODE_STRING SimpleString;
  2157. } DUMMYUNIONNAME;
  2158. } COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;
  2159. #endif
  2160. #define IOCTL_QUERY_DEVICE_POWER_STATE \
  2161. CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
  2162. #define IOCTL_SET_DEVICE_WAKE \
  2163. CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
  2164. #define IOCTL_CANCEL_DEVICE_WAKE \
  2165. CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
  2166. #define ES_SYSTEM_REQUIRED 0x00000001
  2167. #define ES_DISPLAY_REQUIRED 0x00000002
  2168. #define ES_USER_PRESENT 0x00000004
  2169. #define ES_CONTINUOUS 0x80000000
  2170. typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE;
  2171. typedef enum {
  2172. LT_DONT_CARE,
  2173. LT_LOWEST_LATENCY
  2174. } LATENCY_TIME;
  2175. #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
  2176. #define DIAGNOSTIC_REASON_VERSION 0
  2177. #define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001
  2178. #define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002
  2179. #define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000
  2180. #define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003)
  2181. #endif
  2182. #define POWER_REQUEST_CONTEXT_VERSION 0
  2183. #define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
  2184. #define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
  2185. #define PowerRequestMaximum 3
  2186. typedef enum _POWER_REQUEST_TYPE {
  2187. PowerRequestDisplayRequired,
  2188. PowerRequestSystemRequired,
  2189. PowerRequestAwayModeRequired,
  2190. PowerRequestExecutionRequired
  2191. } POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE;
  2192. #if (NTDDI_VERSION >= NTDDI_WINXP)
  2193. #define PDCAP_D0_SUPPORTED 0x00000001
  2194. #define PDCAP_D1_SUPPORTED 0x00000002
  2195. #define PDCAP_D2_SUPPORTED 0x00000004
  2196. #define PDCAP_D3_SUPPORTED 0x00000008
  2197. #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
  2198. #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
  2199. #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
  2200. #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
  2201. #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
  2202. typedef struct CM_Power_Data_s {
  2203. ULONG PD_Size;
  2204. DEVICE_POWER_STATE PD_MostRecentPowerState;
  2205. ULONG PD_Capabilities;
  2206. ULONG PD_D1Latency;
  2207. ULONG PD_D2Latency;
  2208. ULONG PD_D3Latency;
  2209. DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
  2210. SYSTEM_POWER_STATE PD_DeepestSystemWake;
  2211. } CM_POWER_DATA, *PCM_POWER_DATA;
  2212. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  2213. typedef enum _SYSTEM_POWER_CONDITION {
  2214. PoAc,
  2215. PoDc,
  2216. PoHot,
  2217. PoConditionMaximum
  2218. } SYSTEM_POWER_CONDITION;
  2219. typedef struct _SET_POWER_SETTING_VALUE {
  2220. ULONG Version;
  2221. GUID Guid;
  2222. SYSTEM_POWER_CONDITION PowerCondition;
  2223. ULONG DataLength;
  2224. UCHAR Data[ANYSIZE_ARRAY];
  2225. } SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
  2226. #define POWER_SETTING_VALUE_VERSION (0x1)
  2227. typedef struct _NOTIFY_USER_POWER_SETTING {
  2228. GUID Guid;
  2229. } NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
  2230. typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
  2231. LARGE_INTEGER ActivationTime;
  2232. ULONG Flags;
  2233. ULONG ButtonInstanceID;
  2234. } APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
  2235. typedef enum _POWER_PLATFORM_ROLE {
  2236. PlatformRoleUnspecified = 0,
  2237. PlatformRoleDesktop,
  2238. PlatformRoleMobile,
  2239. PlatformRoleWorkstation,
  2240. PlatformRoleEnterpriseServer,
  2241. PlatformRoleSOHOServer,
  2242. PlatformRoleAppliancePC,
  2243. PlatformRolePerformanceServer,
  2244. PlatformRoleSlate,
  2245. PlatformRoleMaximum
  2246. } POWER_PLATFORM_ROLE;
  2247. #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
  2248. typedef struct {
  2249. ULONG Granularity;
  2250. ULONG Capacity;
  2251. } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
  2252. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
  2253. #endif /* !_PO_DDK_ */
  2254. #define CORE_PARKING_POLICY_CHANGE_IDEAL 0
  2255. #define CORE_PARKING_POLICY_CHANGE_SINGLE 1
  2256. #define CORE_PARKING_POLICY_CHANGE_ROCKET 2
  2257. #define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
  2258. DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
  2259. DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
  2260. DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
  2261. DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
  2262. DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
  2263. DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
  2264. DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
  2265. DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
  2266. DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
  2267. DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
  2268. DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
  2269. DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
  2270. DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
  2271. DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
  2272. DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
  2273. DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
  2274. DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
  2275. DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
  2276. DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
  2277. DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
  2278. DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
  2279. DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
  2280. DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
  2281. DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
  2282. DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
  2283. DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
  2284. DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
  2285. DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
  2286. DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
  2287. DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
  2288. DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
  2289. DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
  2290. DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
  2291. DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
  2292. DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
  2293. DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
  2294. DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
  2295. DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
  2296. DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
  2297. DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
  2298. DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
  2299. DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
  2300. DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
  2301. DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
  2302. DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
  2303. DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
  2304. DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
  2305. DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
  2306. DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
  2307. DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
  2308. DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
  2309. DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
  2310. DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
  2311. DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
  2312. DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
  2313. DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
  2314. DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
  2315. DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
  2316. DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
  2317. DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
  2318. DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
  2319. DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
  2320. DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
  2321. DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
  2322. DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
  2323. DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
  2324. DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
  2325. DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
  2326. DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
  2327. DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
  2328. DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
  2329. DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
  2330. DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
  2331. DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
  2332. DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
  2333. DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
  2334. DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
  2335. DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
  2336. DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
  2337. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
  2338. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
  2339. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
  2340. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
  2341. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
  2342. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
  2343. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
  2344. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
  2345. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
  2346. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
  2347. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
  2348. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
  2349. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
  2350. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
  2351. DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
  2352. DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
  2353. DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
  2354. DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
  2355. DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
  2356. DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
  2357. DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
  2358. DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
  2359. DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
  2360. DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
  2361. DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
  2362. DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
  2363. DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
  2364. DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
  2365. DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
  2366. DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
  2367. #define PERFSTATE_POLICY_CHANGE_IDEAL 0
  2368. #define PERFSTATE_POLICY_CHANGE_SINGLE 1
  2369. #define PERFSTATE_POLICY_CHANGE_ROCKET 2
  2370. #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
  2371. #define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
  2372. #define PROCESSOR_PERF_BOOST_POLICY_MAX 100
  2373. #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
  2374. #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
  2375. typedef VOID
  2376. (NTAPI REQUEST_POWER_COMPLETE)(
  2377. IN struct _DEVICE_OBJECT *DeviceObject,
  2378. IN UCHAR MinorFunction,
  2379. IN POWER_STATE PowerState,
  2380. IN PVOID Context,
  2381. IN struct _IO_STATUS_BLOCK *IoStatus);
  2382. typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE;
  2383. typedef
  2384. NTSTATUS
  2385. (NTAPI POWER_SETTING_CALLBACK)(
  2386. IN LPCGUID SettingGuid,
  2387. IN PVOID Value,
  2388. IN ULONG ValueLength,
  2389. IN OUT PVOID Context OPTIONAL);
  2390. typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
  2391. DECLARE_HANDLE(POHANDLE);
  2392. #define PO_FX_VERSION_V1 1
  2393. #define PO_FX_VERSION_V2 2
  2394. #define PO_FX_VERSION PO_FX_VERSION_V2
  2395. typedef void (NTAPI PO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK)(void *context, ULONG component);
  2396. typedef PO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK *PPO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK;
  2397. typedef void (NTAPI PO_FX_COMPONENT_IDLE_CONDITION_CALLBACK)(void *context, ULONG component);
  2398. typedef PO_FX_COMPONENT_IDLE_CONDITION_CALLBACK *PPO_FX_COMPONENT_IDLE_CONDITION_CALLBACK;
  2399. typedef void (NTAPI PO_FX_COMPONENT_IDLE_STATE_CALLBACK)(void *context, ULONG component, ULONG state);
  2400. typedef PO_FX_COMPONENT_IDLE_STATE_CALLBACK *PPO_FX_COMPONENT_IDLE_STATE_CALLBACK;
  2401. typedef NTSTATUS (NTAPI PO_FX_POWER_CONTROL_CALLBACK)(void *context, const GUID *code, void *in, SIZE_T in_size, void *out, SIZE_T out_size, SIZE_T *ret_size);
  2402. typedef PO_FX_POWER_CONTROL_CALLBACK *PPO_FX_POWER_CONTROL_CALLBACK;
  2403. typedef struct _PO_FX_COMPONENT_IDLE_STATE
  2404. {
  2405. ULONGLONG TransitionLatency;
  2406. ULONGLONG ResidencyRequirement;
  2407. ULONG NominalPower;
  2408. } PO_FX_COMPONENT_IDLE_STATE, *PPO_FX_COMPONENT_IDLE_STATE;
  2409. typedef struct _PO_FX_COMPONENT_V1
  2410. {
  2411. GUID Id;
  2412. ULONG IdleStateCount;
  2413. ULONG DeepestWakeableIdleState;
  2414. PO_FX_COMPONENT_IDLE_STATE *IdleStates;
  2415. } PO_FX_COMPONENT_V1, *PPO_FX_COMPONENT_V1;
  2416. typedef struct _PO_FX_COMPONENT_V2
  2417. {
  2418. GUID Id;
  2419. ULONGLONG Flags;
  2420. ULONG DeepestWakeableIdleState;
  2421. ULONG IdleStateCount;
  2422. PO_FX_COMPONENT_IDLE_STATE *IdleStates;
  2423. ULONG ProviderCount;
  2424. ULONG *Providers;
  2425. } PO_FX_COMPONENT_V2, *PPO_FX_COMPONENT_V2;
  2426. #if PO_FX_VERSION == PO_FX_VERSION_V1
  2427. typedef PO_FX_COMPONENT_V1 PO_FX_COMPONENT, *PPO_FX_COMPONENT;
  2428. #else
  2429. typedef PO_FX_COMPONENT_V2 PO_FX_COMPONENT, *PPO_FX_COMPONENT;
  2430. #endif
  2431. /******************************************************************************
  2432. * Configuration Manager Types *
  2433. ******************************************************************************/
  2434. /* Resource list definitions */
  2435. typedef int CM_RESOURCE_TYPE;
  2436. #define CmResourceTypeNull 0
  2437. #define CmResourceTypePort 1
  2438. #define CmResourceTypeInterrupt 2
  2439. #define CmResourceTypeMemory 3
  2440. #define CmResourceTypeDma 4
  2441. #define CmResourceTypeDeviceSpecific 5
  2442. #define CmResourceTypeBusNumber 6
  2443. #define CmResourceTypeNonArbitrated 128
  2444. #define CmResourceTypeConfigData 128
  2445. #define CmResourceTypeDevicePrivate 129
  2446. #define CmResourceTypePcCardConfig 130
  2447. #define CmResourceTypeMfCardConfig 131
  2448. /* KEY_VALUE_Xxx.Type */
  2449. #define REG_NONE 0
  2450. #define REG_SZ 1
  2451. #define REG_EXPAND_SZ 2
  2452. #define REG_BINARY 3
  2453. #define REG_DWORD 4
  2454. #define REG_DWORD_LITTLE_ENDIAN 4
  2455. #define REG_DWORD_BIG_ENDIAN 5
  2456. #define REG_LINK 6
  2457. #define REG_MULTI_SZ 7
  2458. #define REG_RESOURCE_LIST 8
  2459. #define REG_FULL_RESOURCE_DESCRIPTOR 9
  2460. #define REG_RESOURCE_REQUIREMENTS_LIST 10
  2461. #define REG_QWORD 11
  2462. #define REG_QWORD_LITTLE_ENDIAN 11
  2463. /* Registry Access Rights */
  2464. #define KEY_QUERY_VALUE (0x0001)
  2465. #define KEY_SET_VALUE (0x0002)
  2466. #define KEY_CREATE_SUB_KEY (0x0004)
  2467. #define KEY_ENUMERATE_SUB_KEYS (0x0008)
  2468. #define KEY_NOTIFY (0x0010)
  2469. #define KEY_CREATE_LINK (0x0020)
  2470. #define KEY_WOW64_32KEY (0x0200)
  2471. #define KEY_WOW64_64KEY (0x0100)
  2472. #define KEY_WOW64_RES (0x0300)
  2473. #define KEY_READ ((STANDARD_RIGHTS_READ |\
  2474. KEY_QUERY_VALUE |\
  2475. KEY_ENUMERATE_SUB_KEYS |\
  2476. KEY_NOTIFY) \
  2477. & \
  2478. (~SYNCHRONIZE))
  2479. #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
  2480. KEY_SET_VALUE |\
  2481. KEY_CREATE_SUB_KEY) \
  2482. & \
  2483. (~SYNCHRONIZE))
  2484. #define KEY_EXECUTE ((KEY_READ) \
  2485. & \
  2486. (~SYNCHRONIZE))
  2487. #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
  2488. KEY_QUERY_VALUE |\
  2489. KEY_SET_VALUE |\
  2490. KEY_CREATE_SUB_KEY |\
  2491. KEY_ENUMERATE_SUB_KEYS |\
  2492. KEY_NOTIFY |\
  2493. KEY_CREATE_LINK) \
  2494. & \
  2495. (~SYNCHRONIZE))
  2496. /* Registry Open/Create Options */
  2497. #define REG_OPTION_RESERVED (0x00000000L)
  2498. #define REG_OPTION_NON_VOLATILE (0x00000000L)
  2499. #define REG_OPTION_VOLATILE (0x00000001L)
  2500. #define REG_OPTION_CREATE_LINK (0x00000002L)
  2501. #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
  2502. #define REG_OPTION_OPEN_LINK (0x00000008L)
  2503. #define REG_LEGAL_OPTION \
  2504. (REG_OPTION_RESERVED |\
  2505. REG_OPTION_NON_VOLATILE |\
  2506. REG_OPTION_VOLATILE |\
  2507. REG_OPTION_CREATE_LINK |\
  2508. REG_OPTION_BACKUP_RESTORE |\
  2509. REG_OPTION_OPEN_LINK)
  2510. #define REG_OPEN_LEGAL_OPTION \
  2511. (REG_OPTION_RESERVED |\
  2512. REG_OPTION_BACKUP_RESTORE |\
  2513. REG_OPTION_OPEN_LINK)
  2514. #define REG_STANDARD_FORMAT 1
  2515. #define REG_LATEST_FORMAT 2
  2516. #define REG_NO_COMPRESSION 4
  2517. /* Key creation/open disposition */
  2518. #define REG_CREATED_NEW_KEY (0x00000001L)
  2519. #define REG_OPENED_EXISTING_KEY (0x00000002L)
  2520. /* Key restore & hive load flags */
  2521. #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
  2522. #define REG_REFRESH_HIVE (0x00000002L)
  2523. #define REG_NO_LAZY_FLUSH (0x00000004L)
  2524. #define REG_FORCE_RESTORE (0x00000008L)
  2525. #define REG_APP_HIVE (0x00000010L)
  2526. #define REG_PROCESS_PRIVATE (0x00000020L)
  2527. #define REG_START_JOURNAL (0x00000040L)
  2528. #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
  2529. #define REG_HIVE_NO_RM (0x00000100L)
  2530. #define REG_HIVE_SINGLE_LOG (0x00000200L)
  2531. #define REG_BOOT_HIVE (0x00000400L)
  2532. /* Unload Flags */
  2533. #define REG_FORCE_UNLOAD 1
  2534. /* Notify Filter Values */
  2535. #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
  2536. #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
  2537. #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
  2538. #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
  2539. #define REG_LEGAL_CHANGE_FILTER \
  2540. (REG_NOTIFY_CHANGE_NAME |\
  2541. REG_NOTIFY_CHANGE_ATTRIBUTES |\
  2542. REG_NOTIFY_CHANGE_LAST_SET |\
  2543. REG_NOTIFY_CHANGE_SECURITY)
  2544. #include <pshpack4.h>
  2545. typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
  2546. UCHAR Type;
  2547. UCHAR ShareDisposition;
  2548. USHORT Flags;
  2549. union {
  2550. struct {
  2551. PHYSICAL_ADDRESS Start;
  2552. ULONG Length;
  2553. } Generic;
  2554. struct {
  2555. PHYSICAL_ADDRESS Start;
  2556. ULONG Length;
  2557. } Port;
  2558. struct {
  2559. #if defined(NT_PROCESSOR_GROUPS)
  2560. USHORT Level;
  2561. USHORT Group;
  2562. #else
  2563. ULONG Level;
  2564. #endif
  2565. ULONG Vector;
  2566. KAFFINITY Affinity;
  2567. } Interrupt;
  2568. #if (NTDDI_VERSION >= NTDDI_LONGHORN)
  2569. struct {
  2570. _ANONYMOUS_UNION union {
  2571. struct {
  2572. #if defined(NT_PROCESSOR_GROUPS)
  2573. USHORT Group;
  2574. #else
  2575. USHORT Reserved;
  2576. #endif
  2577. USHORT MessageCount;
  2578. ULONG Vector;
  2579. KAFFINITY Affinity;
  2580. } Raw;
  2581. struct {
  2582. #if defined(NT_PROCESSOR_GROUPS)
  2583. USHORT Level;
  2584. USHORT Group;
  2585. #else
  2586. ULONG Level;
  2587. #endif
  2588. ULONG Vector;
  2589. KAFFINITY Affinity;
  2590. } Translated;
  2591. } DUMMYUNIONNAME;
  2592. } MessageInterrupt;
  2593. #endif
  2594. struct {
  2595. PHYSICAL_ADDRESS Start;
  2596. ULONG Length;
  2597. } Memory;
  2598. struct {
  2599. ULONG Channel;
  2600. ULONG Port;
  2601. ULONG Reserved1;
  2602. } Dma;
  2603. struct {
  2604. ULONG Data[3];
  2605. } DevicePrivate;
  2606. struct {
  2607. ULONG Start;
  2608. ULONG Length;
  2609. ULONG Reserved;
  2610. } BusNumber;
  2611. struct {
  2612. ULONG DataSize;
  2613. ULONG Reserved1;
  2614. ULONG Reserved2;
  2615. } DeviceSpecificData;
  2616. #if (NTDDI_VERSION >= NTDDI_LONGHORN)
  2617. struct {
  2618. PHYSICAL_ADDRESS Start;
  2619. ULONG Length40;
  2620. } Memory40;
  2621. struct {
  2622. PHYSICAL_ADDRESS Start;
  2623. ULONG Length48;
  2624. } Memory48;
  2625. struct {
  2626. PHYSICAL_ADDRESS Start;
  2627. ULONG Length64;
  2628. } Memory64;
  2629. #endif
  2630. } u;
  2631. } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
  2632. #include <poppack.h>
  2633. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
  2634. #define CmResourceTypeNull 0
  2635. #define CmResourceTypePort 1
  2636. #define CmResourceTypeInterrupt 2
  2637. #define CmResourceTypeMemory 3
  2638. #define CmResourceTypeDma 4
  2639. #define CmResourceTypeDeviceSpecific 5
  2640. #define CmResourceTypeBusNumber 6
  2641. #define CmResourceTypeMemoryLarge 7
  2642. #define CmResourceTypeNonArbitrated 128
  2643. #define CmResourceTypeConfigData 128
  2644. #define CmResourceTypeDevicePrivate 129
  2645. #define CmResourceTypePcCardConfig 130
  2646. #define CmResourceTypeMfCardConfig 131
  2647. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
  2648. typedef enum _CM_SHARE_DISPOSITION {
  2649. CmResourceShareUndetermined = 0,
  2650. CmResourceShareDeviceExclusive,
  2651. CmResourceShareDriverExclusive,
  2652. CmResourceShareShared
  2653. } CM_SHARE_DISPOSITION;
  2654. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
  2655. #define CM_RESOURCE_PORT_MEMORY 0x0000
  2656. #define CM_RESOURCE_PORT_IO 0x0001
  2657. #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
  2658. #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
  2659. #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
  2660. #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
  2661. #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
  2662. #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
  2663. #define CM_RESOURCE_PORT_BAR 0x0100
  2664. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
  2665. #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
  2666. #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
  2667. #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
  2668. #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
  2669. #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
  2670. #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN ((ULONG)-2)
  2671. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
  2672. #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
  2673. #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
  2674. #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
  2675. #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
  2676. #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
  2677. #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
  2678. #define CM_RESOURCE_MEMORY_24 0x0010
  2679. #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
  2680. #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
  2681. #define CM_RESOURCE_MEMORY_BAR 0x0080
  2682. #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
  2683. #define CM_RESOURCE_MEMORY_LARGE 0x0E00
  2684. #define CM_RESOURCE_MEMORY_LARGE_40 0x0200
  2685. #define CM_RESOURCE_MEMORY_LARGE_48 0x0400
  2686. #define CM_RESOURCE_MEMORY_LARGE_64 0x0800
  2687. #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN 0x000000FFFFFFFF00
  2688. #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN 0x0000FFFFFFFF0000
  2689. #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN 0xFFFFFFFF00000000
  2690. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
  2691. #define CM_RESOURCE_DMA_8 0x0000
  2692. #define CM_RESOURCE_DMA_16 0x0001
  2693. #define CM_RESOURCE_DMA_32 0x0002
  2694. #define CM_RESOURCE_DMA_8_AND_16 0x0004
  2695. #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
  2696. #define CM_RESOURCE_DMA_TYPE_A 0x0010
  2697. #define CM_RESOURCE_DMA_TYPE_B 0x0020
  2698. #define CM_RESOURCE_DMA_TYPE_F 0x0040
  2699. typedef struct _DEVICE_FLAGS {
  2700. ULONG Failed:1;
  2701. ULONG ReadOnly:1;
  2702. ULONG Removable:1;
  2703. ULONG ConsoleIn:1;
  2704. ULONG ConsoleOut:1;
  2705. ULONG Input:1;
  2706. ULONG Output:1;
  2707. } DEVICE_FLAGS, *PDEVICE_FLAGS;
  2708. typedef enum _INTERFACE_TYPE {
  2709. InterfaceTypeUndefined = -1,
  2710. Internal,
  2711. Isa,
  2712. Eisa,
  2713. MicroChannel,
  2714. TurboChannel,
  2715. PCIBus,
  2716. VMEBus,
  2717. NuBus,
  2718. PCMCIABus,
  2719. CBus,
  2720. MPIBus,
  2721. MPSABus,
  2722. ProcessorInternal,
  2723. InternalPowerBus,
  2724. PNPISABus,
  2725. PNPBus,
  2726. Vmcs,
  2727. ACPIBus,
  2728. MaximumInterfaceType
  2729. } INTERFACE_TYPE, *PINTERFACE_TYPE;
  2730. typedef struct _CM_COMPONENT_INFORMATION {
  2731. DEVICE_FLAGS Flags;
  2732. ULONG Version;
  2733. ULONG Key;
  2734. KAFFINITY AffinityMask;
  2735. } CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
  2736. typedef struct _CM_ROM_BLOCK {
  2737. ULONG Address;
  2738. ULONG Size;
  2739. } CM_ROM_BLOCK, *PCM_ROM_BLOCK;
  2740. typedef struct _CM_PARTIAL_RESOURCE_LIST {
  2741. USHORT Version;
  2742. USHORT Revision;
  2743. ULONG Count;
  2744. CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
  2745. } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
  2746. typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
  2747. INTERFACE_TYPE InterfaceType;
  2748. ULONG BusNumber;
  2749. CM_PARTIAL_RESOURCE_LIST PartialResourceList;
  2750. } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
  2751. typedef struct _CM_RESOURCE_LIST {
  2752. ULONG Count;
  2753. CM_FULL_RESOURCE_DESCRIPTOR List[1];
  2754. } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
  2755. typedef struct _PNP_BUS_INFORMATION {
  2756. GUID BusTypeGuid;
  2757. INTERFACE_TYPE LegacyBusType;
  2758. ULONG BusNumber;
  2759. } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
  2760. #include <pshpack1.h>
  2761. typedef struct _CM_INT13_DRIVE_PARAMETER {
  2762. USHORT DriveSelect;
  2763. ULONG MaxCylinders;
  2764. USHORT SectorsPerTrack;
  2765. USHORT MaxHeads;
  2766. USHORT NumberDrives;
  2767. } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
  2768. typedef struct _CM_MCA_POS_DATA {
  2769. USHORT AdapterId;
  2770. UCHAR PosData1;
  2771. UCHAR PosData2;
  2772. UCHAR PosData3;
  2773. UCHAR PosData4;
  2774. } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
  2775. typedef struct _CM_PNP_BIOS_DEVICE_NODE {
  2776. USHORT Size;
  2777. UCHAR Node;
  2778. ULONG ProductId;
  2779. UCHAR DeviceType[3];
  2780. USHORT DeviceAttributes;
  2781. } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
  2782. typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
  2783. UCHAR Signature[4];
  2784. UCHAR Revision;
  2785. UCHAR Length;
  2786. USHORT ControlField;
  2787. UCHAR Checksum;
  2788. ULONG EventFlagAddress;
  2789. USHORT RealModeEntryOffset;
  2790. USHORT RealModeEntrySegment;
  2791. USHORT ProtectedModeEntryOffset;
  2792. ULONG ProtectedModeCodeBaseAddress;
  2793. ULONG OemDeviceId;
  2794. USHORT RealModeDataBaseAddress;
  2795. ULONG ProtectedModeDataBaseAddress;
  2796. } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
  2797. #include <poppack.h>
  2798. typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
  2799. ULONG BytesPerSector;
  2800. ULONG NumberOfCylinders;
  2801. ULONG SectorsPerTrack;
  2802. ULONG NumberOfHeads;
  2803. } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
  2804. typedef struct _CM_KEYBOARD_DEVICE_DATA {
  2805. USHORT Version;
  2806. USHORT Revision;
  2807. UCHAR Type;
  2808. UCHAR Subtype;
  2809. USHORT KeyboardFlags;
  2810. } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
  2811. typedef struct _CM_SCSI_DEVICE_DATA {
  2812. USHORT Version;
  2813. USHORT Revision;
  2814. UCHAR HostIdentifier;
  2815. } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
  2816. typedef struct _CM_VIDEO_DEVICE_DATA {
  2817. USHORT Version;
  2818. USHORT Revision;
  2819. ULONG VideoClock;
  2820. } CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
  2821. typedef struct _CM_SONIC_DEVICE_DATA {
  2822. USHORT Version;
  2823. USHORT Revision;
  2824. USHORT DataConfigurationRegister;
  2825. UCHAR EthernetAddress[8];
  2826. } CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
  2827. typedef struct _CM_SERIAL_DEVICE_DATA {
  2828. USHORT Version;
  2829. USHORT Revision;
  2830. ULONG BaudClock;
  2831. } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
  2832. typedef struct _CM_MONITOR_DEVICE_DATA {
  2833. USHORT Version;
  2834. USHORT Revision;
  2835. USHORT HorizontalScreenSize;
  2836. USHORT VerticalScreenSize;
  2837. USHORT HorizontalResolution;
  2838. USHORT VerticalResolution;
  2839. USHORT HorizontalDisplayTimeLow;
  2840. USHORT HorizontalDisplayTime;
  2841. USHORT HorizontalDisplayTimeHigh;
  2842. USHORT HorizontalBackPorchLow;
  2843. USHORT HorizontalBackPorch;
  2844. USHORT HorizontalBackPorchHigh;
  2845. USHORT HorizontalFrontPorchLow;
  2846. USHORT HorizontalFrontPorch;
  2847. USHORT HorizontalFrontPorchHigh;
  2848. USHORT HorizontalSyncLow;
  2849. USHORT HorizontalSync;
  2850. USHORT HorizontalSyncHigh;
  2851. USHORT VerticalBackPorchLow;
  2852. USHORT VerticalBackPorch;
  2853. USHORT VerticalBackPorchHigh;
  2854. USHORT VerticalFrontPorchLow;
  2855. USHORT VerticalFrontPorch;
  2856. USHORT VerticalFrontPorchHigh;
  2857. USHORT VerticalSyncLow;
  2858. USHORT VerticalSync;
  2859. USHORT VerticalSyncHigh;
  2860. } CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA;
  2861. typedef struct _CM_FLOPPY_DEVICE_DATA {
  2862. USHORT Version;
  2863. USHORT Revision;
  2864. CHAR Size[8];
  2865. ULONG MaxDensity;
  2866. ULONG MountDensity;
  2867. UCHAR StepRateHeadUnloadTime;
  2868. UCHAR HeadLoadTime;
  2869. UCHAR MotorOffTime;
  2870. UCHAR SectorLengthCode;
  2871. UCHAR SectorPerTrack;
  2872. UCHAR ReadWriteGapLength;
  2873. UCHAR DataTransferLength;
  2874. UCHAR FormatGapLength;
  2875. UCHAR FormatFillCharacter;
  2876. UCHAR HeadSettleTime;
  2877. UCHAR MotorSettleTime;
  2878. UCHAR MaximumTrackValue;
  2879. UCHAR DataTransferRate;
  2880. } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
  2881. typedef enum _KEY_INFORMATION_CLASS {
  2882. KeyBasicInformation,
  2883. KeyNodeInformation,
  2884. KeyFullInformation,
  2885. KeyNameInformation,
  2886. KeyCachedInformation,
  2887. KeyFlagsInformation,
  2888. KeyVirtualizationInformation,
  2889. KeyHandleTagsInformation,
  2890. KeyTrustInformation,
  2891. KeyLayerInformation,
  2892. MaxKeyInfoClass
  2893. } KEY_INFORMATION_CLASS;
  2894. typedef struct _KEY_BASIC_INFORMATION {
  2895. LARGE_INTEGER LastWriteTime;
  2896. ULONG TitleIndex;
  2897. ULONG NameLength;
  2898. WCHAR Name[1];
  2899. } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
  2900. typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
  2901. ULONG ControlFlags;
  2902. } KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;
  2903. typedef struct _KEY_FULL_INFORMATION {
  2904. LARGE_INTEGER LastWriteTime;
  2905. ULONG TitleIndex;
  2906. ULONG ClassOffset;
  2907. ULONG ClassLength;
  2908. ULONG SubKeys;
  2909. ULONG MaxNameLen;
  2910. ULONG MaxClassLen;
  2911. ULONG Values;
  2912. ULONG MaxValueNameLen;
  2913. ULONG MaxValueDataLen;
  2914. WCHAR Class[1];
  2915. } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
  2916. typedef struct _KEY_HANDLE_TAGS_INFORMATION {
  2917. ULONG HandleTags;
  2918. } KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;
  2919. typedef struct _KEY_NODE_INFORMATION {
  2920. LARGE_INTEGER LastWriteTime;
  2921. ULONG TitleIndex;
  2922. ULONG ClassOffset;
  2923. ULONG ClassLength;
  2924. ULONG NameLength;
  2925. WCHAR Name[1];
  2926. } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
  2927. typedef enum _KEY_SET_INFORMATION_CLASS {
  2928. KeyWriteTimeInformation,
  2929. KeyWow64FlagsInformation,
  2930. KeyControlFlagsInformation,
  2931. KeySetVirtualizationInformation,
  2932. KeySetDebugInformation,
  2933. KeySetHandleTagsInformation,
  2934. KeySetLayerInformation,
  2935. MaxKeySetInfoClass
  2936. } KEY_SET_INFORMATION_CLASS;
  2937. typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION {
  2938. ULONG VirtualTarget:1;
  2939. ULONG VirtualStore:1;
  2940. ULONG VirtualSource:1;
  2941. ULONG Reserved:29;
  2942. } KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;
  2943. typedef struct _KEY_VALUE_BASIC_INFORMATION {
  2944. ULONG TitleIndex;
  2945. ULONG Type;
  2946. ULONG NameLength;
  2947. WCHAR Name[1];
  2948. } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
  2949. typedef struct _KEY_VALUE_FULL_INFORMATION {
  2950. ULONG TitleIndex;
  2951. ULONG Type;
  2952. ULONG DataOffset;
  2953. ULONG DataLength;
  2954. ULONG NameLength;
  2955. WCHAR Name[1];
  2956. } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
  2957. typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
  2958. ULONG TitleIndex;
  2959. ULONG Type;
  2960. ULONG DataLength;
  2961. UCHAR Data[1];
  2962. } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
  2963. typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
  2964. ULONG Type;
  2965. ULONG DataLength;
  2966. UCHAR Data[1];
  2967. } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
  2968. typedef struct _KEY_VALUE_ENTRY {
  2969. PUNICODE_STRING ValueName;
  2970. ULONG DataLength;
  2971. ULONG DataOffset;
  2972. ULONG Type;
  2973. } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
  2974. typedef enum _KEY_VALUE_INFORMATION_CLASS {
  2975. KeyValueBasicInformation,
  2976. KeyValueFullInformation,
  2977. KeyValuePartialInformation,
  2978. KeyValueFullInformationAlign64,
  2979. KeyValuePartialInformationAlign64,
  2980. KeyValueLayerInformation,
  2981. MaxKeyValueInfoClass
  2982. } KEY_VALUE_INFORMATION_CLASS;
  2983. typedef struct _KEY_WOW64_FLAGS_INFORMATION {
  2984. ULONG UserFlags;
  2985. } KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;
  2986. typedef struct _KEY_WRITE_TIME_INFORMATION {
  2987. LARGE_INTEGER LastWriteTime;
  2988. } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
  2989. typedef enum _REG_NOTIFY_CLASS {
  2990. RegNtDeleteKey,
  2991. RegNtPreDeleteKey = RegNtDeleteKey,
  2992. RegNtSetValueKey,
  2993. RegNtPreSetValueKey = RegNtSetValueKey,
  2994. RegNtDeleteValueKey,
  2995. RegNtPreDeleteValueKey = RegNtDeleteValueKey,
  2996. RegNtSetInformationKey,
  2997. RegNtPreSetInformationKey = RegNtSetInformationKey,
  2998. RegNtRenameKey,
  2999. RegNtPreRenameKey = RegNtRenameKey,
  3000. RegNtEnumerateKey,
  3001. RegNtPreEnumerateKey = RegNtEnumerateKey,
  3002. RegNtEnumerateValueKey,
  3003. RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
  3004. RegNtQueryKey,
  3005. RegNtPreQueryKey = RegNtQueryKey,
  3006. RegNtQueryValueKey,
  3007. RegNtPreQueryValueKey = RegNtQueryValueKey,
  3008. RegNtQueryMultipleValueKey,
  3009. RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
  3010. RegNtPreCreateKey,
  3011. RegNtPostCreateKey,
  3012. RegNtPreOpenKey,
  3013. RegNtPostOpenKey,
  3014. RegNtKeyHandleClose,
  3015. RegNtPreKeyHandleClose = RegNtKeyHandleClose,
  3016. RegNtPostDeleteKey,
  3017. RegNtPostSetValueKey,
  3018. RegNtPostDeleteValueKey,
  3019. RegNtPostSetInformationKey,
  3020. RegNtPostRenameKey,
  3021. RegNtPostEnumerateKey,
  3022. RegNtPostEnumerateValueKey,
  3023. RegNtPostQueryKey,
  3024. RegNtPostQueryValueKey,
  3025. RegNtPostQueryMultipleValueKey,
  3026. RegNtPostKeyHandleClose,
  3027. RegNtPreCreateKeyEx,
  3028. RegNtPostCreateKeyEx,
  3029. RegNtPreOpenKeyEx,
  3030. RegNtPostOpenKeyEx,
  3031. RegNtPreFlushKey,
  3032. RegNtPostFlushKey,
  3033. RegNtPreLoadKey,
  3034. RegNtPostLoadKey,
  3035. RegNtPreUnLoadKey,
  3036. RegNtPostUnLoadKey,
  3037. RegNtPreQueryKeySecurity,
  3038. RegNtPostQueryKeySecurity,
  3039. RegNtPreSetKeySecurity,
  3040. RegNtPostSetKeySecurity,
  3041. RegNtCallbackObjectContextCleanup,
  3042. RegNtPreRestoreKey,
  3043. RegNtPostRestoreKey,
  3044. RegNtPreSaveKey,
  3045. RegNtPostSaveKey,
  3046. RegNtPreReplaceKey,
  3047. RegNtPostReplaceKey,
  3048. RegNtPreQueryKeyName,
  3049. RegNtPostQueryKeyName,
  3050. MaxRegNtNotifyClass
  3051. } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
  3052. typedef NTSTATUS
  3053. (NTAPI EX_CALLBACK_FUNCTION)(
  3054. IN PVOID CallbackContext,
  3055. IN PVOID Argument1,
  3056. IN PVOID Argument2);
  3057. typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
  3058. typedef struct _REG_DELETE_KEY_INFORMATION {
  3059. PVOID Object;
  3060. PVOID CallContext;
  3061. PVOID ObjectContext;
  3062. PVOID Reserved;
  3063. } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
  3064. #if (NTDDI_VERSION >= NTDDI_VISTA)
  3065. , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
  3066. #endif
  3067. ;
  3068. typedef struct _REG_SET_VALUE_KEY_INFORMATION {
  3069. PVOID Object;
  3070. PUNICODE_STRING ValueName;
  3071. ULONG TitleIndex;
  3072. ULONG Type;
  3073. PVOID Data;
  3074. ULONG DataSize;
  3075. PVOID CallContext;
  3076. PVOID ObjectContext;
  3077. PVOID Reserved;
  3078. } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
  3079. typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
  3080. PVOID Object;
  3081. PUNICODE_STRING ValueName;
  3082. PVOID CallContext;
  3083. PVOID ObjectContext;
  3084. PVOID Reserved;
  3085. } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
  3086. typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
  3087. PVOID Object;
  3088. KEY_SET_INFORMATION_CLASS KeySetInformationClass;
  3089. PVOID KeySetInformation;
  3090. ULONG KeySetInformationLength;
  3091. PVOID CallContext;
  3092. PVOID ObjectContext;
  3093. PVOID Reserved;
  3094. } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
  3095. typedef struct _REG_ENUMERATE_KEY_INFORMATION {
  3096. PVOID Object;
  3097. ULONG Index;
  3098. KEY_INFORMATION_CLASS KeyInformationClass;
  3099. PVOID KeyInformation;
  3100. ULONG Length;
  3101. PULONG ResultLength;
  3102. PVOID CallContext;
  3103. PVOID ObjectContext;
  3104. PVOID Reserved;
  3105. } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
  3106. typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
  3107. PVOID Object;
  3108. ULONG Index;
  3109. KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
  3110. PVOID KeyValueInformation;
  3111. ULONG Length;
  3112. PULONG ResultLength;
  3113. PVOID CallContext;
  3114. PVOID ObjectContext;
  3115. PVOID Reserved;
  3116. } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
  3117. typedef struct _REG_QUERY_KEY_INFORMATION {
  3118. PVOID Object;
  3119. KEY_INFORMATION_CLASS KeyInformationClass;
  3120. PVOID KeyInformation;
  3121. ULONG Length;
  3122. PULONG ResultLength;
  3123. PVOID CallContext;
  3124. PVOID ObjectContext;
  3125. PVOID Reserved;
  3126. } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
  3127. typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
  3128. PVOID Object;
  3129. PUNICODE_STRING ValueName;
  3130. KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
  3131. PVOID KeyValueInformation;
  3132. ULONG Length;
  3133. PULONG ResultLength;
  3134. PVOID CallContext;
  3135. PVOID ObjectContext;
  3136. PVOID Reserved;
  3137. } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
  3138. typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
  3139. PVOID Object;
  3140. PKEY_VALUE_ENTRY ValueEntries;
  3141. ULONG EntryCount;
  3142. PVOID ValueBuffer;
  3143. PULONG BufferLength;
  3144. PULONG RequiredBufferLength;
  3145. PVOID CallContext;
  3146. PVOID ObjectContext;
  3147. PVOID Reserved;
  3148. } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
  3149. typedef struct _REG_RENAME_KEY_INFORMATION {
  3150. PVOID Object;
  3151. PUNICODE_STRING NewName;
  3152. PVOID CallContext;
  3153. PVOID ObjectContext;
  3154. PVOID Reserved;
  3155. } REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION;
  3156. typedef struct _REG_CREATE_KEY_INFORMATION {
  3157. PUNICODE_STRING CompleteName;
  3158. PVOID RootObject;
  3159. PVOID ObjectType;
  3160. ULONG CreateOptions;
  3161. PUNICODE_STRING Class;
  3162. PVOID SecurityDescriptor;
  3163. PVOID SecurityQualityOfService;
  3164. ACCESS_MASK DesiredAccess;
  3165. ACCESS_MASK GrantedAccess;
  3166. PULONG Disposition;
  3167. PVOID *ResultObject;
  3168. PVOID CallContext;
  3169. PVOID RootObjectContext;
  3170. PVOID Transaction;
  3171. PVOID Reserved;
  3172. } REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION;
  3173. typedef struct _REG_CREATE_KEY_INFORMATION_V1 {
  3174. PUNICODE_STRING CompleteName;
  3175. PVOID RootObject;
  3176. PVOID ObjectType;
  3177. ULONG Options;
  3178. PUNICODE_STRING Class;
  3179. PVOID SecurityDescriptor;
  3180. PVOID SecurityQualityOfService;
  3181. ACCESS_MASK DesiredAccess;
  3182. ACCESS_MASK GrantedAccess;
  3183. PULONG Disposition;
  3184. PVOID *ResultObject;
  3185. PVOID CallContext;
  3186. PVOID RootObjectContext;
  3187. PVOID Transaction;
  3188. ULONG_PTR Version;
  3189. PUNICODE_STRING RemainingName;
  3190. ULONG Wow64Flags;
  3191. ULONG Attributes;
  3192. KPROCESSOR_MODE CheckAccessMode;
  3193. } REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1;
  3194. typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
  3195. PUNICODE_STRING CompleteName;
  3196. } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
  3197. typedef struct _REG_POST_CREATE_KEY_INFORMATION {
  3198. PUNICODE_STRING CompleteName;
  3199. PVOID Object;
  3200. NTSTATUS Status;
  3201. } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
  3202. typedef struct _REG_POST_OPERATION_INFORMATION {
  3203. PVOID Object;
  3204. NTSTATUS Status;
  3205. PVOID PreInformation;
  3206. NTSTATUS ReturnStatus;
  3207. PVOID CallContext;
  3208. PVOID ObjectContext;
  3209. PVOID Reserved;
  3210. } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
  3211. typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
  3212. PVOID Object;
  3213. PVOID CallContext;
  3214. PVOID ObjectContext;
  3215. PVOID Reserved;
  3216. } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
  3217. #if (NTDDI_VERSION >= NTDDI_VISTA)
  3218. typedef struct _REG_LOAD_KEY_INFORMATION {
  3219. PVOID Object;
  3220. PUNICODE_STRING KeyName;
  3221. PUNICODE_STRING SourceFile;
  3222. ULONG Flags;
  3223. PVOID TrustClassObject;
  3224. PVOID UserEvent;
  3225. ACCESS_MASK DesiredAccess;
  3226. PHANDLE RootHandle;
  3227. PVOID CallContext;
  3228. PVOID ObjectContext;
  3229. PVOID Reserved;
  3230. } REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION;
  3231. typedef struct _REG_UNLOAD_KEY_INFORMATION {
  3232. PVOID Object;
  3233. PVOID UserEvent;
  3234. PVOID CallContext;
  3235. PVOID ObjectContext;
  3236. PVOID Reserved;
  3237. } REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION;
  3238. typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION {
  3239. PVOID Object;
  3240. PVOID ObjectContext;
  3241. PVOID Reserved;
  3242. } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION;
  3243. typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION {
  3244. PVOID Object;
  3245. PSECURITY_INFORMATION SecurityInformation;
  3246. PSECURITY_DESCRIPTOR SecurityDescriptor;
  3247. PULONG Length;
  3248. PVOID CallContext;
  3249. PVOID ObjectContext;
  3250. PVOID Reserved;
  3251. } REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION;
  3252. typedef struct _REG_SET_KEY_SECURITY_INFORMATION {
  3253. PVOID Object;
  3254. PSECURITY_INFORMATION SecurityInformation;
  3255. PSECURITY_DESCRIPTOR SecurityDescriptor;
  3256. PVOID CallContext;
  3257. PVOID ObjectContext;
  3258. PVOID Reserved;
  3259. } REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION;
  3260. typedef struct _REG_RESTORE_KEY_INFORMATION {
  3261. PVOID Object;
  3262. HANDLE FileHandle;
  3263. ULONG Flags;
  3264. PVOID CallContext;
  3265. PVOID ObjectContext;
  3266. PVOID Reserved;
  3267. } REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION;
  3268. typedef struct _REG_SAVE_KEY_INFORMATION {
  3269. PVOID Object;
  3270. HANDLE FileHandle;
  3271. ULONG Format;
  3272. PVOID CallContext;
  3273. PVOID ObjectContext;
  3274. PVOID Reserved;
  3275. } REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION;
  3276. typedef struct _REG_REPLACE_KEY_INFORMATION {
  3277. PVOID Object;
  3278. PUNICODE_STRING OldFileName;
  3279. PUNICODE_STRING NewFileName;
  3280. PVOID CallContext;
  3281. PVOID ObjectContext;
  3282. PVOID Reserved;
  3283. } REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION;
  3284. #endif /* NTDDI_VERSION >= NTDDI_VISTA */
  3285. #define SERVICE_KERNEL_DRIVER 0x00000001
  3286. #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
  3287. #define SERVICE_ADAPTER 0x00000004
  3288. #define SERVICE_RECOGNIZER_DRIVER 0x00000008
  3289. #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
  3290. SERVICE_FILE_SYSTEM_DRIVER | \
  3291. SERVICE_RECOGNIZER_DRIVER)
  3292. #define SERVICE_WIN32_OWN_PROCESS 0x00000010
  3293. #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
  3294. #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
  3295. SERVICE_WIN32_SHARE_PROCESS)
  3296. #define SERVICE_INTERACTIVE_PROCESS 0x00000100
  3297. #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
  3298. SERVICE_ADAPTER | \
  3299. SERVICE_DRIVER | \
  3300. SERVICE_INTERACTIVE_PROCESS)
  3301. /* Service Start Types */
  3302. #define SERVICE_BOOT_START 0x00000000
  3303. #define SERVICE_SYSTEM_START 0x00000001
  3304. #define SERVICE_AUTO_START 0x00000002
  3305. #define SERVICE_DEMAND_START 0x00000003
  3306. #define SERVICE_DISABLED 0x00000004
  3307. #define SERVICE_ERROR_IGNORE 0x00000000
  3308. #define SERVICE_ERROR_NORMAL 0x00000001
  3309. #define SERVICE_ERROR_SEVERE 0x00000002
  3310. #define SERVICE_ERROR_CRITICAL 0x00000003
  3311. typedef enum _CM_SERVICE_NODE_TYPE {
  3312. DriverType = SERVICE_KERNEL_DRIVER,
  3313. FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
  3314. Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
  3315. Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
  3316. AdapterType = SERVICE_ADAPTER,
  3317. RecognizerType = SERVICE_RECOGNIZER_DRIVER
  3318. } SERVICE_NODE_TYPE;
  3319. typedef enum _CM_SERVICE_LOAD_TYPE {
  3320. BootLoad = SERVICE_BOOT_START,
  3321. SystemLoad = SERVICE_SYSTEM_START,
  3322. AutoLoad = SERVICE_AUTO_START,
  3323. DemandLoad = SERVICE_DEMAND_START,
  3324. DisableLoad = SERVICE_DISABLED
  3325. } SERVICE_LOAD_TYPE;
  3326. typedef enum _CM_ERROR_CONTROL_TYPE {
  3327. IgnoreError = SERVICE_ERROR_IGNORE,
  3328. NormalError = SERVICE_ERROR_NORMAL,
  3329. SevereError = SERVICE_ERROR_SEVERE,
  3330. CriticalError = SERVICE_ERROR_CRITICAL
  3331. } SERVICE_ERROR_TYPE;
  3332. #define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
  3333. #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
  3334. #define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
  3335. #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
  3336. CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
  3337. CM_SERVICE_USB_DISK_BOOT_LOAD)
  3338. /******************************************************************************
  3339. * I/O Manager Types *
  3340. ******************************************************************************/
  3341. #define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
  3342. #define CONNECT_FULLY_SPECIFIED 0x1
  3343. #define CONNECT_LINE_BASED 0x2
  3344. #define CONNECT_MESSAGE_BASED 0x3
  3345. #define CONNECT_FULLY_SPECIFIED_GROUP 0x4
  3346. #define CONNECT_CURRENT_VERSION 0x4
  3347. #define POOL_COLD_ALLOCATION 256
  3348. #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
  3349. #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
  3350. #define IO_TYPE_ADAPTER 1
  3351. #define IO_TYPE_CONTROLLER 2
  3352. #define IO_TYPE_DEVICE 3
  3353. #define IO_TYPE_DRIVER 4
  3354. #define IO_TYPE_FILE 5
  3355. #define IO_TYPE_IRP 6
  3356. #define IO_TYPE_MASTER_ADAPTER 7
  3357. #define IO_TYPE_OPEN_PACKET 8
  3358. #define IO_TYPE_TIMER 9
  3359. #define IO_TYPE_VPB 10
  3360. #define IO_TYPE_ERROR_LOG 11
  3361. #define IO_TYPE_ERROR_MESSAGE 12
  3362. #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
  3363. #define IO_TYPE_CSQ_IRP_CONTEXT 1
  3364. #define IO_TYPE_CSQ 2
  3365. #define IO_TYPE_CSQ_EX 3
  3366. /* IO_RESOURCE_DESCRIPTOR.Option */
  3367. #define IO_RESOURCE_PREFERRED 0x01
  3368. #define IO_RESOURCE_DEFAULT 0x02
  3369. #define IO_RESOURCE_ALTERNATIVE 0x08
  3370. #define FILE_DEVICE_BEEP 0x00000001
  3371. #define FILE_DEVICE_CD_ROM 0x00000002
  3372. #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
  3373. #define FILE_DEVICE_CONTROLLER 0x00000004
  3374. #define FILE_DEVICE_DATALINK 0x00000005
  3375. #define FILE_DEVICE_DFS 0x00000006
  3376. #define FILE_DEVICE_DISK 0x00000007
  3377. #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
  3378. #define FILE_DEVICE_FILE_SYSTEM 0x00000009
  3379. #define FILE_DEVICE_INPORT_PORT 0x0000000a
  3380. #define FILE_DEVICE_KEYBOARD 0x0000000b
  3381. #define FILE_DEVICE_MAILSLOT 0x0000000c
  3382. #define FILE_DEVICE_MIDI_IN 0x0000000d
  3383. #define FILE_DEVICE_MIDI_OUT 0x0000000e
  3384. #define FILE_DEVICE_MOUSE 0x0000000f
  3385. #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
  3386. #define FILE_DEVICE_NAMED_PIPE 0x00000011
  3387. #define FILE_DEVICE_NETWORK 0x00000012
  3388. #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
  3389. #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
  3390. #define FILE_DEVICE_NULL 0x00000015
  3391. #define FILE_DEVICE_PARALLEL_PORT 0x00000016
  3392. #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
  3393. #define FILE_DEVICE_PRINTER 0x00000018
  3394. #define FILE_DEVICE_SCANNER 0x00000019
  3395. #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
  3396. #define FILE_DEVICE_SERIAL_PORT 0x0000001b
  3397. #define FILE_DEVICE_SCREEN 0x0000001c
  3398. #define FILE_DEVICE_SOUND 0x0000001d
  3399. #define FILE_DEVICE_STREAMS 0x0000001e
  3400. #define FILE_DEVICE_TAPE 0x0000001f
  3401. #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
  3402. #define FILE_DEVICE_TRANSPORT 0x00000021
  3403. #define FILE_DEVICE_UNKNOWN 0x00000022
  3404. #define FILE_DEVICE_VIDEO 0x00000023
  3405. #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
  3406. #define FILE_DEVICE_WAVE_IN 0x00000025
  3407. #define FILE_DEVICE_WAVE_OUT 0x00000026
  3408. #define FILE_DEVICE_8042_PORT 0x00000027
  3409. #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
  3410. #define FILE_DEVICE_BATTERY 0x00000029
  3411. #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
  3412. #define FILE_DEVICE_MODEM 0x0000002b
  3413. #define FILE_DEVICE_VDM 0x0000002c
  3414. #define FILE_DEVICE_MASS_STORAGE 0x0000002d
  3415. #define FILE_DEVICE_SMB 0x0000002e
  3416. #define FILE_DEVICE_KS 0x0000002f
  3417. #define FILE_DEVICE_CHANGER 0x00000030
  3418. #define FILE_DEVICE_SMARTCARD 0x00000031
  3419. #define FILE_DEVICE_ACPI 0x00000032
  3420. #define FILE_DEVICE_DVD 0x00000033
  3421. #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
  3422. #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
  3423. #define FILE_DEVICE_DFS_VOLUME 0x00000036
  3424. #define FILE_DEVICE_SERENUM 0x00000037
  3425. #define FILE_DEVICE_TERMSRV 0x00000038
  3426. #define FILE_DEVICE_KSEC 0x00000039
  3427. #define FILE_DEVICE_FIPS 0x0000003A
  3428. #define FILE_DEVICE_INFINIBAND 0x0000003B
  3429. #define FILE_DEVICE_VMBUS 0x0000003E
  3430. #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
  3431. #define FILE_DEVICE_WPD 0x00000040
  3432. #define FILE_DEVICE_BLUETOOTH 0x00000041
  3433. #define FILE_DEVICE_MT_COMPOSITE 0x00000042
  3434. #define FILE_DEVICE_MT_TRANSPORT 0x00000043
  3435. #define FILE_DEVICE_BIOMETRIC 0x00000044
  3436. #define FILE_DEVICE_PMI 0x00000045
  3437. #if defined(NT_PROCESSOR_GROUPS)
  3438. typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
  3439. typedef enum _IRQ_DEVICE_POLICY_USHORT {
  3440. IrqPolicyMachineDefault = 0,
  3441. IrqPolicyAllCloseProcessors = 1,
  3442. IrqPolicyOneCloseProcessor = 2,
  3443. IrqPolicyAllProcessorsInMachine = 3,
  3444. IrqPolicyAllProcessorsInGroup = 3,
  3445. IrqPolicySpecifiedProcessors = 4,
  3446. IrqPolicySpreadMessagesAcrossAllProcessors = 5,
  3447. IrqPolicyAllProcessorsInMachineWhenSteered = 6,
  3448. IrqPolicyAllProcessorsInGroupWhenSteered = 6
  3449. };
  3450. #else /* defined(NT_PROCESSOR_GROUPS) */
  3451. typedef enum _IRQ_DEVICE_POLICY {
  3452. IrqPolicyMachineDefault = 0,
  3453. IrqPolicyAllCloseProcessors,
  3454. IrqPolicyOneCloseProcessor,
  3455. IrqPolicyAllProcessorsInMachine,
  3456. IrqPolicySpecifiedProcessors,
  3457. IrqPolicySpreadMessagesAcrossAllProcessors,
  3458. IrqPolicyAllProcessorsInMachineWhenSteered
  3459. } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
  3460. #endif
  3461. typedef enum _IRQ_PRIORITY {
  3462. IrqPriorityUndefined = 0,
  3463. IrqPriorityLow,
  3464. IrqPriorityNormal,
  3465. IrqPriorityHigh
  3466. } IRQ_PRIORITY, *PIRQ_PRIORITY;
  3467. typedef enum _IRQ_GROUP_POLICY {
  3468. GroupAffinityAllGroupZero = 0,
  3469. GroupAffinityDontCare
  3470. } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
  3471. #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
  3472. typedef struct _OBJECT_HANDLE_INFORMATION {
  3473. ULONG HandleAttributes;
  3474. ACCESS_MASK GrantedAccess;
  3475. } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
  3476. typedef struct _CLIENT_ID {
  3477. HANDLE UniqueProcess;
  3478. HANDLE UniqueThread;
  3479. } CLIENT_ID, *PCLIENT_ID;
  3480. typedef struct _VPB {
  3481. CSHORT Type;
  3482. CSHORT Size;
  3483. USHORT Flags;
  3484. USHORT VolumeLabelLength;
  3485. struct _DEVICE_OBJECT *DeviceObject;
  3486. struct _DEVICE_OBJECT *RealDevice;
  3487. ULONG SerialNumber;
  3488. ULONG ReferenceCount;
  3489. WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
  3490. } VPB, *PVPB;
  3491. typedef enum _IO_ALLOCATION_ACTION {
  3492. KeepObject = 1,
  3493. DeallocateObject,
  3494. DeallocateObjectKeepRegisters
  3495. } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
  3496. typedef IO_ALLOCATION_ACTION
  3497. (NTAPI DRIVER_CONTROL)(
  3498. IN struct _DEVICE_OBJECT *DeviceObject,
  3499. IN struct _IRP *Irp,
  3500. IN PVOID MapRegisterBase,
  3501. IN PVOID Context);
  3502. typedef DRIVER_CONTROL *PDRIVER_CONTROL;
  3503. typedef struct _WAIT_CONTEXT_BLOCK {
  3504. KDEVICE_QUEUE_ENTRY WaitQueueEntry;
  3505. PDRIVER_CONTROL DeviceRoutine;
  3506. PVOID DeviceContext;
  3507. ULONG NumberOfMapRegisters;
  3508. PVOID DeviceObject;
  3509. PVOID CurrentIrp;
  3510. PKDPC BufferChainingDpc;
  3511. } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
  3512. /* DEVICE_OBJECT.Flags */
  3513. #define DO_VERIFY_VOLUME 0x00000002
  3514. #define DO_BUFFERED_IO 0x00000004
  3515. #define DO_EXCLUSIVE 0x00000008
  3516. #define DO_DIRECT_IO 0x00000010
  3517. #define DO_MAP_IO_BUFFER 0x00000020
  3518. #define DO_DEVICE_INITIALIZING 0x00000080
  3519. #define DO_SHUTDOWN_REGISTERED 0x00000800
  3520. #define DO_BUS_ENUMERATED_DEVICE 0x00001000
  3521. #define DO_POWER_PAGABLE 0x00002000
  3522. #define DO_POWER_INRUSH 0x00004000
  3523. /* DEVICE_OBJECT.Characteristics */
  3524. #define FILE_REMOVABLE_MEDIA 0x00000001
  3525. #define FILE_READ_ONLY_DEVICE 0x00000002
  3526. #define FILE_FLOPPY_DISKETTE 0x00000004
  3527. #define FILE_WRITE_ONCE_MEDIA 0x00000008
  3528. #define FILE_REMOTE_DEVICE 0x00000010
  3529. #define FILE_DEVICE_IS_MOUNTED 0x00000020
  3530. #define FILE_VIRTUAL_VOLUME 0x00000040
  3531. #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
  3532. #define FILE_DEVICE_SECURE_OPEN 0x00000100
  3533. #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
  3534. #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
  3535. #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
  3536. /* DEVICE_OBJECT.AlignmentRequirement */
  3537. #define FILE_BYTE_ALIGNMENT 0x00000000
  3538. #define FILE_WORD_ALIGNMENT 0x00000001
  3539. #define FILE_LONG_ALIGNMENT 0x00000003
  3540. #define FILE_QUAD_ALIGNMENT 0x00000007
  3541. #define FILE_OCTA_ALIGNMENT 0x0000000f
  3542. #define FILE_32_BYTE_ALIGNMENT 0x0000001f
  3543. #define FILE_64_BYTE_ALIGNMENT 0x0000003f
  3544. #define FILE_128_BYTE_ALIGNMENT 0x0000007f
  3545. #define FILE_256_BYTE_ALIGNMENT 0x000000ff
  3546. #define FILE_512_BYTE_ALIGNMENT 0x000001ff
  3547. /* DEVICE_OBJECT.DeviceType */
  3548. #define DEVICE_TYPE ULONG
  3549. typedef struct _DEVICE_OBJECT {
  3550. CSHORT Type;
  3551. USHORT Size;
  3552. LONG ReferenceCount;
  3553. struct _DRIVER_OBJECT *DriverObject;
  3554. struct _DEVICE_OBJECT *NextDevice;
  3555. struct _DEVICE_OBJECT *AttachedDevice;
  3556. struct _IRP *CurrentIrp;
  3557. PIO_TIMER Timer;
  3558. ULONG Flags;
  3559. ULONG Characteristics;
  3560. volatile PVPB Vpb;
  3561. PVOID DeviceExtension;
  3562. DEVICE_TYPE DeviceType;
  3563. CCHAR StackSize;
  3564. union {
  3565. LIST_ENTRY ListEntry;
  3566. WAIT_CONTEXT_BLOCK Wcb;
  3567. } Queue;
  3568. ULONG AlignmentRequirement;
  3569. KDEVICE_QUEUE DeviceQueue;
  3570. KDPC Dpc;
  3571. ULONG ActiveThreadCount;
  3572. PSECURITY_DESCRIPTOR SecurityDescriptor;
  3573. KEVENT DeviceLock;
  3574. USHORT SectorSize;
  3575. USHORT Spare1;
  3576. struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
  3577. PVOID Reserved;
  3578. } DEVICE_OBJECT, *PDEVICE_OBJECT;
  3579. typedef enum _IO_SESSION_STATE {
  3580. IoSessionStateCreated = 1,
  3581. IoSessionStateInitialized,
  3582. IoSessionStateConnected,
  3583. IoSessionStateDisconnected,
  3584. IoSessionStateDisconnectedLoggedOn,
  3585. IoSessionStateLoggedOn,
  3586. IoSessionStateLoggedOff,
  3587. IoSessionStateTerminated,
  3588. IoSessionStateMax
  3589. } IO_SESSION_STATE, *PIO_SESSION_STATE;
  3590. typedef enum _IO_COMPLETION_ROUTINE_RESULT {
  3591. ContinueCompletion = STATUS_CONTINUE_COMPLETION,
  3592. StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
  3593. } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
  3594. typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
  3595. PHYSICAL_ADDRESS MessageAddress;
  3596. KAFFINITY TargetProcessorSet;
  3597. PKINTERRUPT InterruptObject;
  3598. ULONG MessageData;
  3599. ULONG Vector;
  3600. KIRQL Irql;
  3601. KINTERRUPT_MODE Mode;
  3602. KINTERRUPT_POLARITY Polarity;
  3603. } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
  3604. typedef struct _IO_INTERRUPT_MESSAGE_INFO {
  3605. KIRQL UnifiedIrql;
  3606. ULONG MessageCount;
  3607. IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
  3608. } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
  3609. typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
  3610. IN PDEVICE_OBJECT PhysicalDeviceObject;
  3611. OUT PKINTERRUPT *InterruptObject;
  3612. IN PKSERVICE_ROUTINE ServiceRoutine;
  3613. IN PVOID ServiceContext;
  3614. IN PKSPIN_LOCK SpinLock OPTIONAL;
  3615. IN KIRQL SynchronizeIrql;
  3616. IN BOOLEAN FloatingSave;
  3617. IN BOOLEAN ShareVector;
  3618. IN ULONG Vector;
  3619. IN KIRQL Irql;
  3620. IN KINTERRUPT_MODE InterruptMode;
  3621. IN KAFFINITY ProcessorEnableMask;
  3622. IN USHORT Group;
  3623. } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
  3624. typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
  3625. IN PDEVICE_OBJECT PhysicalDeviceObject;
  3626. OUT PKINTERRUPT *InterruptObject;
  3627. IN PKSERVICE_ROUTINE ServiceRoutine;
  3628. IN PVOID ServiceContext;
  3629. IN PKSPIN_LOCK SpinLock OPTIONAL;
  3630. IN KIRQL SynchronizeIrql OPTIONAL;
  3631. IN BOOLEAN FloatingSave;
  3632. } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
  3633. typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
  3634. IN PDEVICE_OBJECT PhysicalDeviceObject;
  3635. union {
  3636. OUT PVOID *Generic;
  3637. OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
  3638. OUT PKINTERRUPT *InterruptObject;
  3639. } ConnectionContext;
  3640. IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
  3641. IN PVOID ServiceContext;
  3642. IN PKSPIN_LOCK SpinLock OPTIONAL;
  3643. IN KIRQL SynchronizeIrql OPTIONAL;
  3644. IN BOOLEAN FloatingSave;
  3645. IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL;
  3646. } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
  3647. typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
  3648. IN OUT ULONG Version;
  3649. _ANONYMOUS_UNION union {
  3650. IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
  3651. IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
  3652. IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
  3653. } DUMMYUNIONNAME;
  3654. } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
  3655. typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
  3656. IN ULONG Version;
  3657. union {
  3658. IN PVOID Generic;
  3659. IN PKINTERRUPT InterruptObject;
  3660. IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
  3661. } ConnectionContext;
  3662. } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
  3663. typedef enum _IO_ACCESS_TYPE {
  3664. ReadAccess,
  3665. WriteAccess,
  3666. ModifyAccess
  3667. } IO_ACCESS_TYPE;
  3668. typedef enum _IO_ACCESS_MODE {
  3669. SequentialAccess,
  3670. RandomAccess
  3671. } IO_ACCESS_MODE;
  3672. typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
  3673. IoSessionStateNotification,
  3674. IoMaxContainerNotificationClass
  3675. } IO_CONTAINER_NOTIFICATION_CLASS;
  3676. typedef struct _IO_SESSION_STATE_NOTIFICATION {
  3677. ULONG Size;
  3678. ULONG Flags;
  3679. PVOID IoObject;
  3680. ULONG EventMask;
  3681. PVOID Context;
  3682. } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
  3683. typedef enum _IO_CONTAINER_INFORMATION_CLASS {
  3684. IoSessionStateInformation,
  3685. IoMaxContainerInformationClass
  3686. } IO_CONTAINER_INFORMATION_CLASS;
  3687. typedef struct _IO_SESSION_STATE_INFORMATION {
  3688. ULONG SessionId;
  3689. IO_SESSION_STATE SessionState;
  3690. BOOLEAN LocalSession;
  3691. } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
  3692. #if (NTDDI_VERSION >= NTDDI_WIN7)
  3693. typedef NTSTATUS
  3694. (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
  3695. VOID);
  3696. typedef NTSTATUS
  3697. (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
  3698. IN PVOID SessionObject,
  3699. IN PVOID IoObject,
  3700. IN ULONG Event,
  3701. IN PVOID Context,
  3702. IN PVOID NotificationPayload,
  3703. IN ULONG PayloadLength);
  3704. typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
  3705. #endif
  3706. typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
  3707. typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
  3708. BOOLEAN Removed;
  3709. BOOLEAN Reserved[3];
  3710. volatile LONG IoCount;
  3711. KEVENT RemoveEvent;
  3712. } IO_REMOVE_LOCK_COMMON_BLOCK;
  3713. typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
  3714. LONG Signature;
  3715. LONG HighWatermark;
  3716. LONGLONG MaxLockedTicks;
  3717. LONG AllocateTag;
  3718. LIST_ENTRY LockList;
  3719. KSPIN_LOCK Spin;
  3720. volatile LONG LowMemoryCount;
  3721. ULONG Reserved1[4];
  3722. PVOID Reserved2;
  3723. PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
  3724. } IO_REMOVE_LOCK_DBG_BLOCK;
  3725. typedef struct _IO_REMOVE_LOCK {
  3726. IO_REMOVE_LOCK_COMMON_BLOCK Common;
  3727. #if DBG
  3728. IO_REMOVE_LOCK_DBG_BLOCK Dbg;
  3729. #endif
  3730. } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
  3731. typedef struct _IO_WORKITEM *PIO_WORKITEM;
  3732. typedef VOID
  3733. (NTAPI IO_WORKITEM_ROUTINE)(
  3734. IN PDEVICE_OBJECT DeviceObject,
  3735. IN PVOID Context);
  3736. typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
  3737. typedef VOID
  3738. (NTAPI IO_WORKITEM_ROUTINE_EX)(
  3739. IN PVOID IoObject,
  3740. IN PVOID Context OPTIONAL,
  3741. IN PIO_WORKITEM IoWorkItem);
  3742. typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
  3743. typedef struct _SHARE_ACCESS {
  3744. ULONG OpenCount;
  3745. ULONG Readers;
  3746. ULONG Writers;
  3747. ULONG Deleters;
  3748. ULONG SharedRead;
  3749. ULONG SharedWrite;
  3750. ULONG SharedDelete;
  3751. } SHARE_ACCESS, *PSHARE_ACCESS;
  3752. /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
  3753. inheritance, even from a struct renders the type non-POD. So we use
  3754. this hack */
  3755. #define PCI_COMMON_HEADER_LAYOUT \
  3756. USHORT VendorID; \
  3757. USHORT DeviceID; \
  3758. USHORT Command; \
  3759. USHORT Status; \
  3760. UCHAR RevisionID; \
  3761. UCHAR ProgIf; \
  3762. UCHAR SubClass; \
  3763. UCHAR BaseClass; \
  3764. UCHAR CacheLineSize; \
  3765. UCHAR LatencyTimer; \
  3766. UCHAR HeaderType; \
  3767. UCHAR BIST; \
  3768. union { \
  3769. struct /* _PCI_HEADER_TYPE_0 */ { \
  3770. ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
  3771. ULONG CIS; \
  3772. USHORT SubVendorID; \
  3773. USHORT SubSystemID; \
  3774. ULONG ROMBaseAddress; \
  3775. UCHAR CapabilitiesPtr; \
  3776. UCHAR Reserved1[3]; \
  3777. ULONG Reserved2; \
  3778. UCHAR InterruptLine; \
  3779. UCHAR InterruptPin; \
  3780. UCHAR MinimumGrant; \
  3781. UCHAR MaximumLatency; \
  3782. } type0; \
  3783. struct /* _PCI_HEADER_TYPE_1 */ { \
  3784. ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
  3785. UCHAR PrimaryBus; \
  3786. UCHAR SecondaryBus; \
  3787. UCHAR SubordinateBus; \
  3788. UCHAR SecondaryLatency; \
  3789. UCHAR IOBase; \
  3790. UCHAR IOLimit; \
  3791. USHORT SecondaryStatus; \
  3792. USHORT MemoryBase; \
  3793. USHORT MemoryLimit; \
  3794. USHORT PrefetchBase; \
  3795. USHORT PrefetchLimit; \
  3796. ULONG PrefetchBaseUpper32; \
  3797. ULONG PrefetchLimitUpper32; \
  3798. USHORT IOBaseUpper16; \
  3799. USHORT IOLimitUpper16; \
  3800. UCHAR CapabilitiesPtr; \
  3801. UCHAR Reserved1[3]; \
  3802. ULONG ROMBaseAddress; \
  3803. UCHAR InterruptLine; \
  3804. UCHAR InterruptPin; \
  3805. USHORT BridgeControl; \
  3806. } type1; \
  3807. struct /* _PCI_HEADER_TYPE_2 */ { \
  3808. ULONG SocketRegistersBaseAddress; \
  3809. UCHAR CapabilitiesPtr; \
  3810. UCHAR Reserved; \
  3811. USHORT SecondaryStatus; \
  3812. UCHAR PrimaryBus; \
  3813. UCHAR SecondaryBus; \
  3814. UCHAR SubordinateBus; \
  3815. UCHAR SecondaryLatency; \
  3816. struct { \
  3817. ULONG Base; \
  3818. ULONG Limit; \
  3819. } Range[PCI_TYPE2_ADDRESSES-1]; \
  3820. UCHAR InterruptLine; \
  3821. UCHAR InterruptPin; \
  3822. USHORT BridgeControl; \
  3823. } type2; \
  3824. } u;
  3825. typedef enum _CREATE_FILE_TYPE {
  3826. CreateFileTypeNone,
  3827. CreateFileTypeNamedPipe,
  3828. CreateFileTypeMailslot
  3829. } CREATE_FILE_TYPE;
  3830. typedef struct _NAMED_PIPE_CREATE_PARAMETERS {
  3831. ULONG NamedPipeType;
  3832. ULONG ReadMode;
  3833. ULONG CompletionMode;
  3834. ULONG MaximumInstances;
  3835. ULONG InboundQuota;
  3836. ULONG OutboundQuota;
  3837. LARGE_INTEGER DefaultTimeout;
  3838. BOOLEAN TimeoutSpecified;
  3839. } NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;
  3840. typedef struct _MAILSLOT_CREATE_PARAMETERS {
  3841. ULONG MailslotQuota;
  3842. ULONG MaximumMessageSize;
  3843. LARGE_INTEGER ReadTimeout;
  3844. BOOLEAN TimeoutSpecified;
  3845. } MAILSLOT_CREATE_PARAMETERS, *PMAILSLOT_CREATE_PARAMETERS;
  3846. #define IO_FORCE_ACCESS_CHECK 0x001
  3847. #define IO_NO_PARAMETER_CHECKING 0x100
  3848. #define IO_REPARSE 0x0
  3849. #define IO_REMOUNT 0x1
  3850. typedef struct _IO_STATUS_BLOCK {
  3851. _ANONYMOUS_UNION union {
  3852. NTSTATUS Status;
  3853. PVOID Pointer;
  3854. } DUMMYUNIONNAME;
  3855. ULONG_PTR Information;
  3856. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
  3857. #if defined(_WIN64)
  3858. typedef struct _IO_STATUS_BLOCK32 {
  3859. NTSTATUS Status;
  3860. ULONG Information;
  3861. } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
  3862. #endif
  3863. typedef VOID
  3864. (NTAPI *PIO_APC_ROUTINE)(
  3865. IN PVOID ApcContext,
  3866. IN PIO_STATUS_BLOCK IoStatusBlock,
  3867. IN ULONG Reserved);
  3868. #define PIO_APC_ROUTINE_DEFINED
  3869. typedef enum _IO_SESSION_EVENT {
  3870. IoSessionEventIgnore = 0,
  3871. IoSessionEventCreated,
  3872. IoSessionEventTerminated,
  3873. IoSessionEventConnected,
  3874. IoSessionEventDisconnected,
  3875. IoSessionEventLogon,
  3876. IoSessionEventLogoff,
  3877. IoSessionEventMax
  3878. } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
  3879. #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
  3880. #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
  3881. #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
  3882. #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
  3883. #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
  3884. #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
  3885. #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
  3886. #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
  3887. #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
  3888. typedef struct _IO_SESSION_CONNECT_INFO {
  3889. ULONG SessionId;
  3890. BOOLEAN LocalSession;
  3891. } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
  3892. #define EVENT_INCREMENT 1
  3893. #define IO_NO_INCREMENT 0
  3894. #define IO_CD_ROM_INCREMENT 1
  3895. #define IO_DISK_INCREMENT 1
  3896. #define IO_KEYBOARD_INCREMENT 6
  3897. #define IO_MAILSLOT_INCREMENT 2
  3898. #define IO_MOUSE_INCREMENT 6
  3899. #define IO_NAMED_PIPE_INCREMENT 2
  3900. #define IO_NETWORK_INCREMENT 2
  3901. #define IO_PARALLEL_INCREMENT 1
  3902. #define IO_SERIAL_INCREMENT 2
  3903. #define IO_SOUND_INCREMENT 8
  3904. #define IO_VIDEO_INCREMENT 1
  3905. #define SEMAPHORE_INCREMENT 1
  3906. #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
  3907. typedef struct _BOOTDISK_INFORMATION {
  3908. LONGLONG BootPartitionOffset;
  3909. LONGLONG SystemPartitionOffset;
  3910. ULONG BootDeviceSignature;
  3911. ULONG SystemDeviceSignature;
  3912. } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
  3913. typedef struct _BOOTDISK_INFORMATION_EX {
  3914. LONGLONG BootPartitionOffset;
  3915. LONGLONG SystemPartitionOffset;
  3916. ULONG BootDeviceSignature;
  3917. ULONG SystemDeviceSignature;
  3918. GUID BootDeviceGuid;
  3919. GUID SystemDeviceGuid;
  3920. BOOLEAN BootDeviceIsGpt;
  3921. BOOLEAN SystemDeviceIsGpt;
  3922. } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
  3923. #if (NTDDI_VERSION >= NTDDI_WIN7)
  3924. typedef struct _LOADER_PARTITION_INFORMATION_EX {
  3925. ULONG PartitionStyle;
  3926. ULONG PartitionNumber;
  3927. _ANONYMOUS_UNION union {
  3928. ULONG Signature;
  3929. GUID DeviceId;
  3930. } DUMMYUNIONNAME;
  3931. ULONG Flags;
  3932. } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
  3933. typedef struct _BOOTDISK_INFORMATION_LITE {
  3934. ULONG NumberEntries;
  3935. LOADER_PARTITION_INFORMATION_EX Entries[1];
  3936. } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
  3937. #else
  3938. #if (NTDDI_VERSION >= NTDDI_VISTA)
  3939. typedef struct _BOOTDISK_INFORMATION_LITE {
  3940. ULONG BootDeviceSignature;
  3941. ULONG SystemDeviceSignature;
  3942. GUID BootDeviceGuid;
  3943. GUID SystemDeviceGuid;
  3944. BOOLEAN BootDeviceIsGpt;
  3945. BOOLEAN SystemDeviceIsGpt;
  3946. } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
  3947. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  3948. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  3949. #include <pshpack1.h>
  3950. typedef struct _EISA_MEMORY_TYPE {
  3951. UCHAR ReadWrite:1;
  3952. UCHAR Cached:1;
  3953. UCHAR Reserved0:1;
  3954. UCHAR Type:2;
  3955. UCHAR Shared:1;
  3956. UCHAR Reserved1:1;
  3957. UCHAR MoreEntries:1;
  3958. } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
  3959. typedef struct _EISA_MEMORY_CONFIGURATION {
  3960. EISA_MEMORY_TYPE ConfigurationByte;
  3961. UCHAR DataSize;
  3962. USHORT AddressLowWord;
  3963. UCHAR AddressHighByte;
  3964. USHORT MemorySize;
  3965. } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
  3966. typedef struct _EISA_IRQ_DESCRIPTOR {
  3967. UCHAR Interrupt:4;
  3968. UCHAR Reserved:1;
  3969. UCHAR LevelTriggered:1;
  3970. UCHAR Shared:1;
  3971. UCHAR MoreEntries:1;
  3972. } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
  3973. typedef struct _EISA_IRQ_CONFIGURATION {
  3974. EISA_IRQ_DESCRIPTOR ConfigurationByte;
  3975. UCHAR Reserved;
  3976. } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
  3977. typedef struct _DMA_CONFIGURATION_BYTE0 {
  3978. UCHAR Channel:3;
  3979. UCHAR Reserved:3;
  3980. UCHAR Shared:1;
  3981. UCHAR MoreEntries:1;
  3982. } DMA_CONFIGURATION_BYTE0;
  3983. typedef struct _DMA_CONFIGURATION_BYTE1 {
  3984. UCHAR Reserved0:2;
  3985. UCHAR TransferSize:2;
  3986. UCHAR Timing:2;
  3987. UCHAR Reserved1:2;
  3988. } DMA_CONFIGURATION_BYTE1;
  3989. typedef struct _EISA_DMA_CONFIGURATION {
  3990. DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
  3991. DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
  3992. } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
  3993. typedef struct _EISA_PORT_DESCRIPTOR {
  3994. UCHAR NumberPorts:5;
  3995. UCHAR Reserved:1;
  3996. UCHAR Shared:1;
  3997. UCHAR MoreEntries:1;
  3998. } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
  3999. typedef struct _EISA_PORT_CONFIGURATION {
  4000. EISA_PORT_DESCRIPTOR Configuration;
  4001. USHORT PortAddress;
  4002. } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
  4003. typedef struct _CM_EISA_SLOT_INFORMATION {
  4004. UCHAR ReturnCode;
  4005. UCHAR ReturnFlags;
  4006. UCHAR MajorRevision;
  4007. UCHAR MinorRevision;
  4008. USHORT Checksum;
  4009. UCHAR NumberFunctions;
  4010. UCHAR FunctionInformation;
  4011. ULONG CompressedId;
  4012. } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
  4013. typedef struct _CM_EISA_FUNCTION_INFORMATION {
  4014. ULONG CompressedId;
  4015. UCHAR IdSlotFlags1;
  4016. UCHAR IdSlotFlags2;
  4017. UCHAR MinorRevision;
  4018. UCHAR MajorRevision;
  4019. UCHAR Selections[26];
  4020. UCHAR FunctionFlags;
  4021. UCHAR TypeString[80];
  4022. EISA_MEMORY_CONFIGURATION EisaMemory[9];
  4023. EISA_IRQ_CONFIGURATION EisaIrq[7];
  4024. EISA_DMA_CONFIGURATION EisaDma[4];
  4025. EISA_PORT_CONFIGURATION EisaPort[20];
  4026. UCHAR InitializationData[60];
  4027. } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
  4028. #include <poppack.h>
  4029. /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
  4030. #define EISA_FUNCTION_ENABLED 0x80
  4031. #define EISA_FREE_FORM_DATA 0x40
  4032. #define EISA_HAS_PORT_INIT_ENTRY 0x20
  4033. #define EISA_HAS_PORT_RANGE 0x10
  4034. #define EISA_HAS_DMA_ENTRY 0x08
  4035. #define EISA_HAS_IRQ_ENTRY 0x04
  4036. #define EISA_HAS_MEMORY_ENTRY 0x02
  4037. #define EISA_HAS_TYPE_ENTRY 0x01
  4038. #define EISA_HAS_INFORMATION \
  4039. (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
  4040. + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
  4041. #define EISA_MORE_ENTRIES 0x80
  4042. #define EISA_SYSTEM_MEMORY 0x00
  4043. #define EISA_MEMORY_TYPE_RAM 0x01
  4044. /* CM_EISA_SLOT_INFORMATION.ReturnCode */
  4045. #define EISA_INVALID_SLOT 0x80
  4046. #define EISA_INVALID_FUNCTION 0x81
  4047. #define EISA_INVALID_CONFIGURATION 0x82
  4048. #define EISA_EMPTY_SLOT 0x83
  4049. #define EISA_INVALID_BIOS_CALL 0x86
  4050. /*
  4051. ** Plug and Play structures
  4052. */
  4053. typedef VOID
  4054. (NTAPI *PINTERFACE_REFERENCE)(
  4055. PVOID Context);
  4056. typedef VOID
  4057. (NTAPI *PINTERFACE_DEREFERENCE)(
  4058. PVOID Context);
  4059. typedef BOOLEAN
  4060. (NTAPI TRANSLATE_BUS_ADDRESS)(
  4061. IN PVOID Context,
  4062. IN PHYSICAL_ADDRESS BusAddress,
  4063. IN ULONG Length,
  4064. IN OUT PULONG AddressSpace,
  4065. OUT PPHYSICAL_ADDRESS TranslatedAddress);
  4066. typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
  4067. typedef struct _DMA_ADAPTER*
  4068. (NTAPI GET_DMA_ADAPTER)(
  4069. IN PVOID Context,
  4070. IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
  4071. OUT PULONG NumberOfMapRegisters);
  4072. typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
  4073. typedef ULONG
  4074. (NTAPI GET_SET_DEVICE_DATA)(
  4075. IN PVOID Context,
  4076. IN ULONG DataType,
  4077. IN PVOID Buffer,
  4078. IN ULONG Offset,
  4079. IN ULONG Length);
  4080. typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
  4081. typedef enum _DEVICE_INSTALL_STATE {
  4082. InstallStateInstalled,
  4083. InstallStateNeedsReinstall,
  4084. InstallStateFailedInstall,
  4085. InstallStateFinishInstall
  4086. } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
  4087. typedef struct _LEGACY_BUS_INFORMATION {
  4088. GUID BusTypeGuid;
  4089. INTERFACE_TYPE LegacyBusType;
  4090. ULONG BusNumber;
  4091. } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
  4092. typedef enum _DEVICE_REMOVAL_POLICY {
  4093. RemovalPolicyExpectNoRemoval = 1,
  4094. RemovalPolicyExpectOrderlyRemoval = 2,
  4095. RemovalPolicyExpectSurpriseRemoval = 3
  4096. } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
  4097. typedef VOID
  4098. (NTAPI*PREENUMERATE_SELF)(
  4099. IN PVOID Context);
  4100. typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
  4101. USHORT Size;
  4102. USHORT Version;
  4103. PVOID Context;
  4104. PINTERFACE_REFERENCE InterfaceReference;
  4105. PINTERFACE_DEREFERENCE InterfaceDereference;
  4106. PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
  4107. } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
  4108. typedef VOID
  4109. (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
  4110. IN NTSTATUS Status,
  4111. IN OUT PVOID Context OPTIONAL);
  4112. #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
  4113. /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
  4114. #define PCI_USE_SUBSYSTEM_IDS 0x00000001
  4115. #define PCI_USE_REVISION 0x00000002
  4116. #define PCI_USE_VENDEV_IDS 0x00000004
  4117. #define PCI_USE_CLASS_SUBCLASS 0x00000008
  4118. #define PCI_USE_PROGIF 0x00000010
  4119. #define PCI_USE_LOCAL_BUS 0x00000020
  4120. #define PCI_USE_LOCAL_DEVICE 0x00000040
  4121. typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
  4122. ULONG Size;
  4123. ULONG Flags;
  4124. USHORT VendorID;
  4125. USHORT DeviceID;
  4126. UCHAR RevisionID;
  4127. USHORT SubVendorID;
  4128. USHORT SubSystemID;
  4129. UCHAR BaseClass;
  4130. UCHAR SubClass;
  4131. UCHAR ProgIf;
  4132. } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
  4133. typedef BOOLEAN
  4134. (NTAPI PCI_IS_DEVICE_PRESENT)(
  4135. IN USHORT VendorID,
  4136. IN USHORT DeviceID,
  4137. IN UCHAR RevisionID,
  4138. IN USHORT SubVendorID,
  4139. IN USHORT SubSystemID,
  4140. IN ULONG Flags);
  4141. typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
  4142. typedef BOOLEAN
  4143. (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
  4144. IN PVOID Context,
  4145. IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
  4146. typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
  4147. typedef struct _BUS_INTERFACE_STANDARD {
  4148. USHORT Size;
  4149. USHORT Version;
  4150. PVOID Context;
  4151. PINTERFACE_REFERENCE InterfaceReference;
  4152. PINTERFACE_DEREFERENCE InterfaceDereference;
  4153. PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
  4154. PGET_DMA_ADAPTER GetDmaAdapter;
  4155. PGET_SET_DEVICE_DATA SetBusData;
  4156. PGET_SET_DEVICE_DATA GetBusData;
  4157. } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
  4158. typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
  4159. USHORT Size;
  4160. USHORT Version;
  4161. PVOID Context;
  4162. PINTERFACE_REFERENCE InterfaceReference;
  4163. PINTERFACE_DEREFERENCE InterfaceDereference;
  4164. PPCI_IS_DEVICE_PRESENT IsDevicePresent;
  4165. PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
  4166. } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
  4167. typedef struct _DEVICE_CAPABILITIES {
  4168. USHORT Size;
  4169. USHORT Version;
  4170. ULONG DeviceD1:1;
  4171. ULONG DeviceD2:1;
  4172. ULONG LockSupported:1;
  4173. ULONG EjectSupported:1;
  4174. ULONG Removable:1;
  4175. ULONG DockDevice:1;
  4176. ULONG UniqueID:1;
  4177. ULONG SilentInstall:1;
  4178. ULONG RawDeviceOK:1;
  4179. ULONG SurpriseRemovalOK:1;
  4180. ULONG WakeFromD0:1;
  4181. ULONG WakeFromD1:1;
  4182. ULONG WakeFromD2:1;
  4183. ULONG WakeFromD3:1;
  4184. ULONG HardwareDisabled:1;
  4185. ULONG NonDynamic:1;
  4186. ULONG WarmEjectSupported:1;
  4187. ULONG NoDisplayInUI:1;
  4188. ULONG Reserved:14;
  4189. ULONG Address;
  4190. ULONG UINumber;
  4191. DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
  4192. SYSTEM_POWER_STATE SystemWake;
  4193. DEVICE_POWER_STATE DeviceWake;
  4194. ULONG D1Latency;
  4195. ULONG D2Latency;
  4196. ULONG D3Latency;
  4197. } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
  4198. typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
  4199. USHORT Version;
  4200. USHORT Size;
  4201. GUID Event;
  4202. GUID InterfaceClassGuid;
  4203. PUNICODE_STRING SymbolicLinkName;
  4204. } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
  4205. typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
  4206. USHORT Version;
  4207. USHORT Size;
  4208. GUID Event;
  4209. } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
  4210. #undef INTERFACE
  4211. typedef struct _INTERFACE {
  4212. USHORT Size;
  4213. USHORT Version;
  4214. PVOID Context;
  4215. PINTERFACE_REFERENCE InterfaceReference;
  4216. PINTERFACE_DEREFERENCE InterfaceDereference;
  4217. } INTERFACE, *PINTERFACE;
  4218. typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
  4219. USHORT Version;
  4220. USHORT Size;
  4221. GUID Event;
  4222. } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
  4223. typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
  4224. /* PNP_DEVICE_STATE */
  4225. #define PNP_DEVICE_DISABLED 0x00000001
  4226. #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
  4227. #define PNP_DEVICE_FAILED 0x00000004
  4228. #define PNP_DEVICE_REMOVED 0x00000008
  4229. #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
  4230. #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
  4231. typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
  4232. USHORT Version;
  4233. USHORT Size;
  4234. GUID Event;
  4235. struct _FILE_OBJECT *FileObject;
  4236. LONG NameBufferOffset;
  4237. UCHAR CustomDataBuffer[1];
  4238. } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
  4239. typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
  4240. USHORT Version;
  4241. USHORT Size;
  4242. GUID Event;
  4243. struct _FILE_OBJECT *FileObject;
  4244. } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
  4245. #if (NTDDI_VERSION >= NTDDI_VISTA)
  4246. #include <devpropdef.h>
  4247. #define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001
  4248. #endif
  4249. #define PNP_REPLACE_NO_MAP MAXLONGLONG
  4250. typedef NTSTATUS
  4251. (NTAPI *PREPLACE_MAP_MEMORY)(
  4252. IN PHYSICAL_ADDRESS TargetPhysicalAddress,
  4253. IN PHYSICAL_ADDRESS SparePhysicalAddress,
  4254. IN OUT PLARGE_INTEGER NumberOfBytes,
  4255. OUT PVOID *TargetAddress,
  4256. OUT PVOID *SpareAddress);
  4257. typedef struct _PNP_REPLACE_MEMORY_LIST {
  4258. ULONG AllocatedCount;
  4259. ULONG Count;
  4260. ULONGLONG TotalLength;
  4261. struct {
  4262. PHYSICAL_ADDRESS Address;
  4263. ULONGLONG Length;
  4264. } Ranges[ANYSIZE_ARRAY];
  4265. } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
  4266. typedef struct _PNP_REPLACE_PROCESSOR_LIST {
  4267. PKAFFINITY Affinity;
  4268. ULONG GroupCount;
  4269. ULONG AllocatedCount;
  4270. ULONG Count;
  4271. ULONG ApicIds[ANYSIZE_ARRAY];
  4272. } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
  4273. typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
  4274. KAFFINITY AffinityMask;
  4275. ULONG AllocatedCount;
  4276. ULONG Count;
  4277. ULONG ApicIds[ANYSIZE_ARRAY];
  4278. } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
  4279. #define PNP_REPLACE_PARAMETERS_VERSION 2
  4280. typedef struct _PNP_REPLACE_PARAMETERS {
  4281. ULONG Size;
  4282. ULONG Version;
  4283. ULONG64 Target;
  4284. ULONG64 Spare;
  4285. PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
  4286. PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
  4287. PPNP_REPLACE_MEMORY_LIST TargetMemory;
  4288. PPNP_REPLACE_MEMORY_LIST SpareMemory;
  4289. PREPLACE_MAP_MEMORY MapMemory;
  4290. } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
  4291. typedef VOID
  4292. (NTAPI *PREPLACE_UNLOAD)(
  4293. VOID);
  4294. typedef NTSTATUS
  4295. (NTAPI *PREPLACE_BEGIN)(
  4296. IN PPNP_REPLACE_PARAMETERS Parameters,
  4297. OUT PVOID *Context);
  4298. typedef NTSTATUS
  4299. (NTAPI *PREPLACE_END)(
  4300. IN PVOID Context);
  4301. typedef NTSTATUS
  4302. (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
  4303. IN PVOID Context,
  4304. IN PHYSICAL_ADDRESS PhysicalAddress,
  4305. IN LARGE_INTEGER ByteCount);
  4306. typedef NTSTATUS
  4307. (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
  4308. IN PVOID Context,
  4309. IN ULONG ApicId,
  4310. IN BOOLEAN Target);
  4311. typedef NTSTATUS
  4312. (NTAPI *PREPLACE_SWAP)(
  4313. IN PVOID Context);
  4314. typedef NTSTATUS
  4315. (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
  4316. IN PVOID Context);
  4317. typedef NTSTATUS
  4318. (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
  4319. IN PVOID Context);
  4320. typedef NTSTATUS
  4321. (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
  4322. IN PVOID Context,
  4323. IN PHYSICAL_ADDRESS SourceAddress,
  4324. OUT PPHYSICAL_ADDRESS DestinationAddress);
  4325. typedef NTSTATUS
  4326. (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
  4327. IN PVOID Context,
  4328. IN BOOLEAN Enable);
  4329. #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1
  4330. #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
  4331. FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
  4332. #define PNP_REPLACE_MEMORY_SUPPORTED 0x0001
  4333. #define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002
  4334. #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004
  4335. #define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008
  4336. #define PNP_REPLACE_HARDWARE_QUIESCE 0x0010
  4337. typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
  4338. ULONG Size;
  4339. ULONG Version;
  4340. ULONG Flags;
  4341. PREPLACE_UNLOAD Unload;
  4342. PREPLACE_BEGIN BeginReplace;
  4343. PREPLACE_END EndReplace;
  4344. PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
  4345. PREPLACE_SET_PROCESSOR_ID SetProcessorId;
  4346. PREPLACE_SWAP Swap;
  4347. PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
  4348. PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
  4349. PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
  4350. PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
  4351. } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
  4352. typedef NTSTATUS
  4353. (NTAPI *PREPLACE_DRIVER_INIT)(
  4354. IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface,
  4355. IN PVOID Unused);
  4356. typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
  4357. DeviceUsageTypeUndefined,
  4358. DeviceUsageTypePaging,
  4359. DeviceUsageTypeHibernation,
  4360. DeviceUsageTypeDumpFile,
  4361. DeviceUsageTypeBoot,
  4362. DeviceUsageTypePostDisplay,
  4363. DeviceUsageTypeGuestAssigned
  4364. } DEVICE_USAGE_NOTIFICATION_TYPE;
  4365. typedef struct _POWER_SEQUENCE {
  4366. ULONG SequenceD1;
  4367. ULONG SequenceD2;
  4368. ULONG SequenceD3;
  4369. } POWER_SEQUENCE, *PPOWER_SEQUENCE;
  4370. typedef enum {
  4371. DevicePropertyDeviceDescription = 0x0,
  4372. DevicePropertyHardwareID = 0x1,
  4373. DevicePropertyCompatibleIDs = 0x2,
  4374. DevicePropertyBootConfiguration = 0x3,
  4375. DevicePropertyBootConfigurationTranslated = 0x4,
  4376. DevicePropertyClassName = 0x5,
  4377. DevicePropertyClassGuid = 0x6,
  4378. DevicePropertyDriverKeyName = 0x7,
  4379. DevicePropertyManufacturer = 0x8,
  4380. DevicePropertyFriendlyName = 0x9,
  4381. DevicePropertyLocationInformation = 0xa,
  4382. DevicePropertyPhysicalDeviceObjectName = 0xb,
  4383. DevicePropertyBusTypeGuid = 0xc,
  4384. DevicePropertyLegacyBusType = 0xd,
  4385. DevicePropertyBusNumber = 0xe,
  4386. DevicePropertyEnumeratorName = 0xf,
  4387. DevicePropertyAddress = 0x10,
  4388. DevicePropertyUINumber = 0x11,
  4389. DevicePropertyInstallState = 0x12,
  4390. DevicePropertyRemovalPolicy = 0x13,
  4391. DevicePropertyResourceRequirements = 0x14,
  4392. DevicePropertyAllocatedResources = 0x15,
  4393. DevicePropertyContainerID = 0x16
  4394. } DEVICE_REGISTRY_PROPERTY;
  4395. typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
  4396. EventCategoryReserved,
  4397. EventCategoryHardwareProfileChange,
  4398. EventCategoryDeviceInterfaceChange,
  4399. EventCategoryTargetDeviceChange,
  4400. EventCategoryKernelSoftRestart
  4401. } IO_NOTIFICATION_EVENT_CATEGORY;
  4402. typedef enum _IO_PRIORITY_HINT {
  4403. IoPriorityVeryLow = 0,
  4404. IoPriorityLow,
  4405. IoPriorityNormal,
  4406. IoPriorityHigh,
  4407. IoPriorityCritical,
  4408. MaxIoPriorityTypes
  4409. } IO_PRIORITY_HINT;
  4410. #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
  4411. typedef NTSTATUS
  4412. (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
  4413. IN PVOID NotificationStructure,
  4414. IN PVOID Context);
  4415. typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
  4416. typedef VOID
  4417. (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
  4418. IN PVOID Context);
  4419. typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
  4420. typedef enum _FILE_INFORMATION_CLASS {
  4421. FileDirectoryInformation = 1,
  4422. FileFullDirectoryInformation,
  4423. FileBothDirectoryInformation,
  4424. FileBasicInformation,
  4425. FileStandardInformation,
  4426. FileInternalInformation,
  4427. FileEaInformation,
  4428. FileAccessInformation,
  4429. FileNameInformation,
  4430. FileRenameInformation,
  4431. FileLinkInformation,
  4432. FileNamesInformation,
  4433. FileDispositionInformation,
  4434. FilePositionInformation,
  4435. FileFullEaInformation,
  4436. FileModeInformation,
  4437. FileAlignmentInformation,
  4438. FileAllInformation,
  4439. FileAllocationInformation,
  4440. FileEndOfFileInformation,
  4441. FileAlternateNameInformation,
  4442. FileStreamInformation,
  4443. FilePipeInformation,
  4444. FilePipeLocalInformation,
  4445. FilePipeRemoteInformation,
  4446. FileMailslotQueryInformation,
  4447. FileMailslotSetInformation,
  4448. FileCompressionInformation,
  4449. FileObjectIdInformation,
  4450. FileCompletionInformation,
  4451. FileMoveClusterInformation,
  4452. FileQuotaInformation,
  4453. FileReparsePointInformation,
  4454. FileNetworkOpenInformation,
  4455. FileAttributeTagInformation,
  4456. FileTrackingInformation,
  4457. FileIdBothDirectoryInformation,
  4458. FileIdFullDirectoryInformation,
  4459. FileValidDataLengthInformation,
  4460. FileShortNameInformation,
  4461. FileIoCompletionNotificationInformation,
  4462. FileIoStatusBlockRangeInformation,
  4463. FileIoPriorityHintInformation,
  4464. FileSfioReserveInformation,
  4465. FileSfioVolumeInformation,
  4466. FileHardLinkInformation,
  4467. FileProcessIdsUsingFileInformation,
  4468. FileNormalizedNameInformation,
  4469. FileNetworkPhysicalNameInformation,
  4470. FileIdGlobalTxDirectoryInformation,
  4471. FileIsRemoteDeviceInformation,
  4472. FileUnusedInformation,
  4473. FileNumaNodeInformation,
  4474. FileStandardLinkInformation,
  4475. FileRemoteProtocolInformation,
  4476. FileRenameInformationBypassAccessCheck,
  4477. FileLinkInformationBypassAccessCheck,
  4478. FileVolumeNameInformation,
  4479. FileIdInformation,
  4480. FileIdExtdDirectoryInformation,
  4481. FileReplaceCompletionInformation,
  4482. FileHardLinkFullIdInformation,
  4483. FileIdExtdBothDirectoryInformation,
  4484. FileDispositionInformationEx,
  4485. FileRenameInformationEx,
  4486. FileRenameInformationExBypassAccessCheck,
  4487. FileDesiredStorageClassInformation,
  4488. FileStatInformation,
  4489. FileMemoryPartitionInformation,
  4490. FileStatLxInformation,
  4491. FileCaseSensitiveInformation,
  4492. FileLinkInformationEx,
  4493. FileLinkInformationExBypassAccessCheck,
  4494. FileStorageReserveIdInformation,
  4495. FileCaseSensitiveInformationForceAccessCheck,
  4496. FileMaximumInformation
  4497. } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
  4498. typedef enum _DIRECTORY_NOTIFY_INFORMATION_CLASS {
  4499. DirectoryNotifyInformation = 1,
  4500. DirectoryNotifyExtendedInformation
  4501. } DIRECTORY_NOTIFY_INFORMATION_CLASS, *PDIRECTORY_NOTIFY_INFORMATION_CLASS;
  4502. typedef struct _FILE_POSITION_INFORMATION {
  4503. LARGE_INTEGER CurrentByteOffset;
  4504. } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
  4505. typedef struct _FILE_BASIC_INFORMATION {
  4506. LARGE_INTEGER CreationTime;
  4507. LARGE_INTEGER LastAccessTime;
  4508. LARGE_INTEGER LastWriteTime;
  4509. LARGE_INTEGER ChangeTime;
  4510. ULONG FileAttributes;
  4511. } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
  4512. typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
  4513. IO_PRIORITY_HINT PriorityHint;
  4514. } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
  4515. typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
  4516. ULONG Flags;
  4517. } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
  4518. typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
  4519. PUCHAR IoStatusBlockRange;
  4520. ULONG Length;
  4521. } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
  4522. typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
  4523. BOOLEAN IsRemote;
  4524. } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
  4525. typedef struct _FILE_NUMA_NODE_INFORMATION {
  4526. USHORT NodeNumber;
  4527. } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
  4528. typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
  4529. ULONG NumberOfProcessIdsInList;
  4530. ULONG_PTR ProcessIdList[1];
  4531. } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
  4532. typedef struct _FILE_STANDARD_INFORMATION {
  4533. LARGE_INTEGER AllocationSize;
  4534. LARGE_INTEGER EndOfFile;
  4535. ULONG NumberOfLinks;
  4536. BOOLEAN DeletePending;
  4537. BOOLEAN Directory;
  4538. } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
  4539. typedef struct _FILE_NETWORK_OPEN_INFORMATION {
  4540. LARGE_INTEGER CreationTime;
  4541. LARGE_INTEGER LastAccessTime;
  4542. LARGE_INTEGER LastWriteTime;
  4543. LARGE_INTEGER ChangeTime;
  4544. LARGE_INTEGER AllocationSize;
  4545. LARGE_INTEGER EndOfFile;
  4546. ULONG FileAttributes;
  4547. } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
  4548. typedef enum _FSINFOCLASS {
  4549. FileFsVolumeInformation = 1,
  4550. FileFsLabelInformation,
  4551. FileFsSizeInformation,
  4552. FileFsDeviceInformation,
  4553. FileFsAttributeInformation,
  4554. FileFsControlInformation,
  4555. FileFsFullSizeInformation,
  4556. FileFsObjectIdInformation,
  4557. FileFsDriverPathInformation,
  4558. FileFsVolumeFlagsInformation,
  4559. FileFsSectorSizeInformation,
  4560. FileFsDataCopyInformation,
  4561. FileFsMetadataSizeInformation,
  4562. FileFsFullSizeInformationEx,
  4563. FileFsMaximumInformation
  4564. } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
  4565. typedef struct _FILE_FS_DEVICE_INFORMATION {
  4566. DEVICE_TYPE DeviceType;
  4567. ULONG Characteristics;
  4568. } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
  4569. typedef struct _FILE_FULL_EA_INFORMATION {
  4570. ULONG NextEntryOffset;
  4571. UCHAR Flags;
  4572. UCHAR EaNameLength;
  4573. USHORT EaValueLength;
  4574. CHAR EaName[1];
  4575. } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
  4576. typedef struct _FILE_SFIO_RESERVE_INFORMATION {
  4577. ULONG RequestsPerPeriod;
  4578. ULONG Period;
  4579. BOOLEAN RetryFailures;
  4580. BOOLEAN Discardable;
  4581. ULONG RequestSize;
  4582. ULONG NumOutstandingRequests;
  4583. } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
  4584. typedef struct _FILE_SFIO_VOLUME_INFORMATION {
  4585. ULONG MaximumRequestsPerPeriod;
  4586. ULONG MinimumPeriod;
  4587. ULONG MinimumTransferSize;
  4588. } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
  4589. #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
  4590. #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
  4591. #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
  4592. #define FM_LOCK_BIT (0x1)
  4593. #define FM_LOCK_BIT_V (0x0)
  4594. #define FM_LOCK_WAITER_WOKEN (0x2)
  4595. #define FM_LOCK_WAITER_INC (0x4)
  4596. typedef BOOLEAN
  4597. (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
  4598. IN struct _FILE_OBJECT *FileObject,
  4599. IN PLARGE_INTEGER FileOffset,
  4600. IN ULONG Length,
  4601. IN BOOLEAN Wait,
  4602. IN ULONG LockKey,
  4603. IN BOOLEAN CheckForReadOperation,
  4604. OUT PIO_STATUS_BLOCK IoStatus,
  4605. IN struct _DEVICE_OBJECT *DeviceObject);
  4606. typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
  4607. typedef BOOLEAN
  4608. (NTAPI FAST_IO_READ)(
  4609. IN struct _FILE_OBJECT *FileObject,
  4610. IN PLARGE_INTEGER FileOffset,
  4611. IN ULONG Length,
  4612. IN BOOLEAN Wait,
  4613. IN ULONG LockKey,
  4614. OUT PVOID Buffer,
  4615. OUT PIO_STATUS_BLOCK IoStatus,
  4616. IN struct _DEVICE_OBJECT *DeviceObject);
  4617. typedef FAST_IO_READ *PFAST_IO_READ;
  4618. typedef BOOLEAN
  4619. (NTAPI FAST_IO_WRITE)(
  4620. IN struct _FILE_OBJECT *FileObject,
  4621. IN PLARGE_INTEGER FileOffset,
  4622. IN ULONG Length,
  4623. IN BOOLEAN Wait,
  4624. IN ULONG LockKey,
  4625. IN PVOID Buffer,
  4626. OUT PIO_STATUS_BLOCK IoStatus,
  4627. IN struct _DEVICE_OBJECT *DeviceObject);
  4628. typedef FAST_IO_WRITE *PFAST_IO_WRITE;
  4629. typedef BOOLEAN
  4630. (NTAPI FAST_IO_QUERY_BASIC_INFO)(
  4631. IN struct _FILE_OBJECT *FileObject,
  4632. IN BOOLEAN Wait,
  4633. OUT PFILE_BASIC_INFORMATION Buffer,
  4634. OUT PIO_STATUS_BLOCK IoStatus,
  4635. IN struct _DEVICE_OBJECT *DeviceObject);
  4636. typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
  4637. typedef BOOLEAN
  4638. (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
  4639. IN struct _FILE_OBJECT *FileObject,
  4640. IN BOOLEAN Wait,
  4641. OUT PFILE_STANDARD_INFORMATION Buffer,
  4642. OUT PIO_STATUS_BLOCK IoStatus,
  4643. IN struct _DEVICE_OBJECT *DeviceObject);
  4644. typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
  4645. typedef BOOLEAN
  4646. (NTAPI FAST_IO_LOCK)(
  4647. IN struct _FILE_OBJECT *FileObject,
  4648. IN PLARGE_INTEGER FileOffset,
  4649. IN PLARGE_INTEGER Length,
  4650. PEPROCESS ProcessId,
  4651. ULONG Key,
  4652. BOOLEAN FailImmediately,
  4653. BOOLEAN ExclusiveLock,
  4654. OUT PIO_STATUS_BLOCK IoStatus,
  4655. IN struct _DEVICE_OBJECT *DeviceObject);
  4656. typedef FAST_IO_LOCK *PFAST_IO_LOCK;
  4657. typedef BOOLEAN
  4658. (NTAPI FAST_IO_UNLOCK_SINGLE)(
  4659. IN struct _FILE_OBJECT *FileObject,
  4660. IN PLARGE_INTEGER FileOffset,
  4661. IN PLARGE_INTEGER Length,
  4662. PEPROCESS ProcessId,
  4663. ULONG Key,
  4664. OUT PIO_STATUS_BLOCK IoStatus,
  4665. IN struct _DEVICE_OBJECT *DeviceObject);
  4666. typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
  4667. typedef BOOLEAN
  4668. (NTAPI FAST_IO_UNLOCK_ALL)(
  4669. IN struct _FILE_OBJECT *FileObject,
  4670. PEPROCESS ProcessId,
  4671. OUT PIO_STATUS_BLOCK IoStatus,
  4672. IN struct _DEVICE_OBJECT *DeviceObject);
  4673. typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
  4674. typedef BOOLEAN
  4675. (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
  4676. IN struct _FILE_OBJECT *FileObject,
  4677. PVOID ProcessId,
  4678. ULONG Key,
  4679. OUT PIO_STATUS_BLOCK IoStatus,
  4680. IN struct _DEVICE_OBJECT *DeviceObject);
  4681. typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
  4682. typedef BOOLEAN
  4683. (NTAPI FAST_IO_DEVICE_CONTROL)(
  4684. IN struct _FILE_OBJECT *FileObject,
  4685. IN BOOLEAN Wait,
  4686. IN PVOID InputBuffer OPTIONAL,
  4687. IN ULONG InputBufferLength,
  4688. OUT PVOID OutputBuffer OPTIONAL,
  4689. IN ULONG OutputBufferLength,
  4690. IN ULONG IoControlCode,
  4691. OUT PIO_STATUS_BLOCK IoStatus,
  4692. IN struct _DEVICE_OBJECT *DeviceObject);
  4693. typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
  4694. typedef VOID
  4695. (NTAPI FAST_IO_ACQUIRE_FILE)(
  4696. IN struct _FILE_OBJECT *FileObject);
  4697. typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
  4698. typedef VOID
  4699. (NTAPI FAST_IO_RELEASE_FILE)(
  4700. IN struct _FILE_OBJECT *FileObject);
  4701. typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
  4702. typedef VOID
  4703. (NTAPI FAST_IO_DETACH_DEVICE)(
  4704. IN struct _DEVICE_OBJECT *SourceDevice,
  4705. IN struct _DEVICE_OBJECT *TargetDevice);
  4706. typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
  4707. typedef BOOLEAN
  4708. (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
  4709. IN struct _FILE_OBJECT *FileObject,
  4710. IN BOOLEAN Wait,
  4711. OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
  4712. OUT struct _IO_STATUS_BLOCK *IoStatus,
  4713. IN struct _DEVICE_OBJECT *DeviceObject);
  4714. typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
  4715. typedef NTSTATUS
  4716. (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
  4717. IN struct _FILE_OBJECT *FileObject,
  4718. IN PLARGE_INTEGER EndingOffset,
  4719. OUT struct _ERESOURCE **ResourceToRelease,
  4720. IN struct _DEVICE_OBJECT *DeviceObject);
  4721. typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
  4722. typedef BOOLEAN
  4723. (NTAPI FAST_IO_MDL_READ)(
  4724. IN struct _FILE_OBJECT *FileObject,
  4725. IN PLARGE_INTEGER FileOffset,
  4726. IN ULONG Length,
  4727. IN ULONG LockKey,
  4728. OUT PMDL *MdlChain,
  4729. OUT PIO_STATUS_BLOCK IoStatus,
  4730. IN struct _DEVICE_OBJECT *DeviceObject);
  4731. typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
  4732. typedef BOOLEAN
  4733. (NTAPI FAST_IO_MDL_READ_COMPLETE)(
  4734. IN struct _FILE_OBJECT *FileObject,
  4735. IN PMDL MdlChain,
  4736. IN struct _DEVICE_OBJECT *DeviceObject);
  4737. typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
  4738. typedef BOOLEAN
  4739. (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
  4740. IN struct _FILE_OBJECT *FileObject,
  4741. IN PLARGE_INTEGER FileOffset,
  4742. IN ULONG Length,
  4743. IN ULONG LockKey,
  4744. OUT PMDL *MdlChain,
  4745. OUT PIO_STATUS_BLOCK IoStatus,
  4746. IN struct _DEVICE_OBJECT *DeviceObject);
  4747. typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
  4748. typedef BOOLEAN
  4749. (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
  4750. IN struct _FILE_OBJECT *FileObject,
  4751. IN PLARGE_INTEGER FileOffset,
  4752. IN PMDL MdlChain,
  4753. IN struct _DEVICE_OBJECT *DeviceObject);
  4754. typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
  4755. typedef BOOLEAN
  4756. (NTAPI FAST_IO_READ_COMPRESSED)(
  4757. IN struct _FILE_OBJECT *FileObject,
  4758. IN PLARGE_INTEGER FileOffset,
  4759. IN ULONG Length,
  4760. IN ULONG LockKey,
  4761. OUT PVOID Buffer,
  4762. OUT PMDL *MdlChain,
  4763. OUT PIO_STATUS_BLOCK IoStatus,
  4764. OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
  4765. IN ULONG CompressedDataInfoLength,
  4766. IN struct _DEVICE_OBJECT *DeviceObject);
  4767. typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
  4768. typedef BOOLEAN
  4769. (NTAPI FAST_IO_WRITE_COMPRESSED)(
  4770. IN struct _FILE_OBJECT *FileObject,
  4771. IN PLARGE_INTEGER FileOffset,
  4772. IN ULONG Length,
  4773. IN ULONG LockKey,
  4774. IN PVOID Buffer,
  4775. OUT PMDL *MdlChain,
  4776. OUT PIO_STATUS_BLOCK IoStatus,
  4777. IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
  4778. IN ULONG CompressedDataInfoLength,
  4779. IN struct _DEVICE_OBJECT *DeviceObject);
  4780. typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
  4781. typedef BOOLEAN
  4782. (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
  4783. IN struct _FILE_OBJECT *FileObject,
  4784. IN PMDL MdlChain,
  4785. IN struct _DEVICE_OBJECT *DeviceObject);
  4786. typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
  4787. typedef BOOLEAN
  4788. (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
  4789. IN struct _FILE_OBJECT *FileObject,
  4790. IN PLARGE_INTEGER FileOffset,
  4791. IN PMDL MdlChain,
  4792. IN struct _DEVICE_OBJECT *DeviceObject);
  4793. typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
  4794. typedef BOOLEAN
  4795. (NTAPI FAST_IO_QUERY_OPEN)(
  4796. IN struct _IRP *Irp,
  4797. OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
  4798. IN struct _DEVICE_OBJECT *DeviceObject);
  4799. typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
  4800. typedef NTSTATUS
  4801. (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
  4802. IN struct _FILE_OBJECT *FileObject,
  4803. IN struct _ERESOURCE *ResourceToRelease,
  4804. IN struct _DEVICE_OBJECT *DeviceObject);
  4805. typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
  4806. typedef NTSTATUS
  4807. (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
  4808. IN struct _FILE_OBJECT *FileObject,
  4809. IN struct _DEVICE_OBJECT *DeviceObject);
  4810. typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
  4811. typedef NTSTATUS
  4812. (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
  4813. IN struct _FILE_OBJECT *FileObject,
  4814. IN struct _DEVICE_OBJECT *DeviceObject);
  4815. typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
  4816. typedef struct _FAST_IO_DISPATCH {
  4817. ULONG SizeOfFastIoDispatch;
  4818. PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
  4819. PFAST_IO_READ FastIoRead;
  4820. PFAST_IO_WRITE FastIoWrite;
  4821. PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
  4822. PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
  4823. PFAST_IO_LOCK FastIoLock;
  4824. PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
  4825. PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
  4826. PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
  4827. PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
  4828. PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
  4829. PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
  4830. PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
  4831. PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
  4832. PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
  4833. PFAST_IO_MDL_READ MdlRead;
  4834. PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
  4835. PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
  4836. PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
  4837. PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
  4838. PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
  4839. PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
  4840. PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
  4841. PFAST_IO_QUERY_OPEN FastIoQueryOpen;
  4842. PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
  4843. PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
  4844. PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
  4845. } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
  4846. typedef struct _SECTION_OBJECT_POINTERS {
  4847. PVOID DataSectionObject;
  4848. PVOID SharedCacheMap;
  4849. PVOID ImageSectionObject;
  4850. } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
  4851. typedef struct _IO_COMPLETION_CONTEXT {
  4852. PVOID Port;
  4853. PVOID Key;
  4854. } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
  4855. /* FILE_OBJECT.Flags */
  4856. #define FO_FILE_OPEN 0x00000001
  4857. #define FO_SYNCHRONOUS_IO 0x00000002
  4858. #define FO_ALERTABLE_IO 0x00000004
  4859. #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
  4860. #define FO_WRITE_THROUGH 0x00000010
  4861. #define FO_SEQUENTIAL_ONLY 0x00000020
  4862. #define FO_CACHE_SUPPORTED 0x00000040
  4863. #define FO_NAMED_PIPE 0x00000080
  4864. #define FO_STREAM_FILE 0x00000100
  4865. #define FO_MAILSLOT 0x00000200
  4866. #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
  4867. #define FO_QUEUE_IRP_TO_THREAD 0x00000400
  4868. #define FO_DIRECT_DEVICE_OPEN 0x00000800
  4869. #define FO_FILE_MODIFIED 0x00001000
  4870. #define FO_FILE_SIZE_CHANGED 0x00002000
  4871. #define FO_CLEANUP_COMPLETE 0x00004000
  4872. #define FO_TEMPORARY_FILE 0x00008000
  4873. #define FO_DELETE_ON_CLOSE 0x00010000
  4874. #define FO_OPENED_CASE_SENSITIVE 0x00020000
  4875. #define FO_HANDLE_CREATED 0x00040000
  4876. #define FO_FILE_FAST_IO_READ 0x00080000
  4877. #define FO_RANDOM_ACCESS 0x00100000
  4878. #define FO_FILE_OPEN_CANCELLED 0x00200000
  4879. #define FO_VOLUME_OPEN 0x00400000
  4880. #define FO_REMOTE_ORIGIN 0x01000000
  4881. #define FO_DISALLOW_EXCLUSIVE 0x02000000
  4882. #define FO_SKIP_COMPLETION_PORT 0x02000000
  4883. #define FO_SKIP_SET_EVENT 0x04000000
  4884. #define FO_SKIP_SET_FAST_IO 0x08000000
  4885. #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
  4886. /* VPB.Flags */
  4887. #define VPB_MOUNTED 0x0001
  4888. #define VPB_LOCKED 0x0002
  4889. #define VPB_PERSISTENT 0x0004
  4890. #define VPB_REMOVE_PENDING 0x0008
  4891. #define VPB_RAW_MOUNT 0x0010
  4892. #define VPB_DIRECT_WRITES_ALLOWED 0x0020
  4893. /* IRP.Flags */
  4894. #define SL_FORCE_ACCESS_CHECK 0x01
  4895. #define SL_OPEN_PAGING_FILE 0x02
  4896. #define SL_OPEN_TARGET_DIRECTORY 0x04
  4897. #define SL_STOP_ON_SYMLINK 0x08
  4898. #define SL_CASE_SENSITIVE 0x80
  4899. #define SL_KEY_SPECIFIED 0x01
  4900. #define SL_OVERRIDE_VERIFY_VOLUME 0x02
  4901. #define SL_WRITE_THROUGH 0x04
  4902. #define SL_FT_SEQUENTIAL_WRITE 0x08
  4903. #define SL_FORCE_DIRECT_WRITE 0x10
  4904. #define SL_REALTIME_STREAM 0x20
  4905. #define SL_READ_ACCESS_GRANTED 0x01
  4906. #define SL_WRITE_ACCESS_GRANTED 0x04
  4907. #define SL_FAIL_IMMEDIATELY 0x01
  4908. #define SL_EXCLUSIVE_LOCK 0x02
  4909. #define SL_RESTART_SCAN 0x01
  4910. #define SL_RETURN_SINGLE_ENTRY 0x02
  4911. #define SL_INDEX_SPECIFIED 0x04
  4912. #define SL_WATCH_TREE 0x01
  4913. #define SL_ALLOW_RAW_MOUNT 0x01
  4914. #define CTL_CODE(DeviceType, Function, Method, Access) \
  4915. (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
  4916. #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
  4917. #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
  4918. #define IRP_NOCACHE 0x00000001
  4919. #define IRP_PAGING_IO 0x00000002
  4920. #define IRP_MOUNT_COMPLETION 0x00000002
  4921. #define IRP_SYNCHRONOUS_API 0x00000004
  4922. #define IRP_ASSOCIATED_IRP 0x00000008
  4923. #define IRP_BUFFERED_IO 0x00000010
  4924. #define IRP_DEALLOCATE_BUFFER 0x00000020
  4925. #define IRP_INPUT_OPERATION 0x00000040
  4926. #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
  4927. #define IRP_CREATE_OPERATION 0x00000080
  4928. #define IRP_READ_OPERATION 0x00000100
  4929. #define IRP_WRITE_OPERATION 0x00000200
  4930. #define IRP_CLOSE_OPERATION 0x00000400
  4931. #define IRP_DEFER_IO_COMPLETION 0x00000800
  4932. #define IRP_OB_QUERY_NAME 0x00001000
  4933. #define IRP_HOLD_DEVICE_QUEUE 0x00002000
  4934. #define IRP_RETRY_IO_COMPLETION 0x00004000
  4935. #define IRP_CLASS_CACHE_OPERATION 0x00008000
  4936. #define IRP_QUOTA_CHARGED 0x01
  4937. #define IRP_ALLOCATED_MUST_SUCCEED 0x02
  4938. #define IRP_ALLOCATED_FIXED_SIZE 0x04
  4939. #define IRP_LOOKASIDE_ALLOCATION 0x08
  4940. /*
  4941. ** IRP function codes
  4942. */
  4943. #define IRP_MJ_CREATE 0x00
  4944. #define IRP_MJ_CREATE_NAMED_PIPE 0x01
  4945. #define IRP_MJ_CLOSE 0x02
  4946. #define IRP_MJ_READ 0x03
  4947. #define IRP_MJ_WRITE 0x04
  4948. #define IRP_MJ_QUERY_INFORMATION 0x05
  4949. #define IRP_MJ_SET_INFORMATION 0x06
  4950. #define IRP_MJ_QUERY_EA 0x07
  4951. #define IRP_MJ_SET_EA 0x08
  4952. #define IRP_MJ_FLUSH_BUFFERS 0x09
  4953. #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
  4954. #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
  4955. #define IRP_MJ_DIRECTORY_CONTROL 0x0c
  4956. #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
  4957. #define IRP_MJ_DEVICE_CONTROL 0x0e
  4958. #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
  4959. #define IRP_MJ_SCSI 0x0f
  4960. #define IRP_MJ_SHUTDOWN 0x10
  4961. #define IRP_MJ_LOCK_CONTROL 0x11
  4962. #define IRP_MJ_CLEANUP 0x12
  4963. #define IRP_MJ_CREATE_MAILSLOT 0x13
  4964. #define IRP_MJ_QUERY_SECURITY 0x14
  4965. #define IRP_MJ_SET_SECURITY 0x15
  4966. #define IRP_MJ_POWER 0x16
  4967. #define IRP_MJ_SYSTEM_CONTROL 0x17
  4968. #define IRP_MJ_DEVICE_CHANGE 0x18
  4969. #define IRP_MJ_QUERY_QUOTA 0x19
  4970. #define IRP_MJ_SET_QUOTA 0x1a
  4971. #define IRP_MJ_PNP 0x1b
  4972. #define IRP_MJ_PNP_POWER 0x1b
  4973. #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
  4974. #define IRP_MN_SCSI_CLASS 0x01
  4975. #define IRP_MN_START_DEVICE 0x00
  4976. #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
  4977. #define IRP_MN_REMOVE_DEVICE 0x02
  4978. #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
  4979. #define IRP_MN_STOP_DEVICE 0x04
  4980. #define IRP_MN_QUERY_STOP_DEVICE 0x05
  4981. #define IRP_MN_CANCEL_STOP_DEVICE 0x06
  4982. #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
  4983. #define IRP_MN_QUERY_INTERFACE 0x08
  4984. #define IRP_MN_QUERY_CAPABILITIES 0x09
  4985. #define IRP_MN_QUERY_RESOURCES 0x0A
  4986. #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
  4987. #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
  4988. #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
  4989. #define IRP_MN_READ_CONFIG 0x0F
  4990. #define IRP_MN_WRITE_CONFIG 0x10
  4991. #define IRP_MN_EJECT 0x11
  4992. #define IRP_MN_SET_LOCK 0x12
  4993. #define IRP_MN_QUERY_ID 0x13
  4994. #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
  4995. #define IRP_MN_QUERY_BUS_INFORMATION 0x15
  4996. #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
  4997. #define IRP_MN_SURPRISE_REMOVAL 0x17
  4998. #if (NTDDI_VERSION >= NTDDI_WIN7)
  4999. #define IRP_MN_DEVICE_ENUMERATED 0x19
  5000. #endif
  5001. #define IRP_MN_WAIT_WAKE 0x00
  5002. #define IRP_MN_POWER_SEQUENCE 0x01
  5003. #define IRP_MN_SET_POWER 0x02
  5004. #define IRP_MN_QUERY_POWER 0x03
  5005. #define IRP_MN_QUERY_ALL_DATA 0x00
  5006. #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
  5007. #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
  5008. #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
  5009. #define IRP_MN_ENABLE_EVENTS 0x04
  5010. #define IRP_MN_DISABLE_EVENTS 0x05
  5011. #define IRP_MN_ENABLE_COLLECTION 0x06
  5012. #define IRP_MN_DISABLE_COLLECTION 0x07
  5013. #define IRP_MN_REGINFO 0x08
  5014. #define IRP_MN_EXECUTE_METHOD 0x09
  5015. #define IRP_MN_REGINFO_EX 0x0b
  5016. typedef struct _FILE_OBJECT {
  5017. CSHORT Type;
  5018. CSHORT Size;
  5019. PDEVICE_OBJECT DeviceObject;
  5020. PVPB Vpb;
  5021. PVOID FsContext;
  5022. PVOID FsContext2;
  5023. PSECTION_OBJECT_POINTERS SectionObjectPointer;
  5024. PVOID PrivateCacheMap;
  5025. NTSTATUS FinalStatus;
  5026. struct _FILE_OBJECT *RelatedFileObject;
  5027. BOOLEAN LockOperation;
  5028. BOOLEAN DeletePending;
  5029. BOOLEAN ReadAccess;
  5030. BOOLEAN WriteAccess;
  5031. BOOLEAN DeleteAccess;
  5032. BOOLEAN SharedRead;
  5033. BOOLEAN SharedWrite;
  5034. BOOLEAN SharedDelete;
  5035. ULONG Flags;
  5036. UNICODE_STRING FileName;
  5037. LARGE_INTEGER CurrentByteOffset;
  5038. volatile ULONG Waiters;
  5039. volatile ULONG Busy;
  5040. PVOID LastLock;
  5041. KEVENT Lock;
  5042. KEVENT Event;
  5043. volatile PIO_COMPLETION_CONTEXT CompletionContext;
  5044. KSPIN_LOCK IrpListLock;
  5045. LIST_ENTRY IrpList;
  5046. volatile PVOID FileObjectExtension;
  5047. } FILE_OBJECT, *PFILE_OBJECT;
  5048. typedef struct _IO_ERROR_LOG_PACKET {
  5049. UCHAR MajorFunctionCode;
  5050. UCHAR RetryCount;
  5051. USHORT DumpDataSize;
  5052. USHORT NumberOfStrings;
  5053. USHORT StringOffset;
  5054. USHORT EventCategory;
  5055. NTSTATUS ErrorCode;
  5056. ULONG UniqueErrorValue;
  5057. NTSTATUS FinalStatus;
  5058. ULONG SequenceNumber;
  5059. ULONG IoControlCode;
  5060. LARGE_INTEGER DeviceOffset;
  5061. ULONG DumpData[1];
  5062. } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
  5063. typedef struct _IO_ERROR_LOG_MESSAGE {
  5064. USHORT Type;
  5065. USHORT Size;
  5066. USHORT DriverNameLength;
  5067. LARGE_INTEGER TimeStamp;
  5068. ULONG DriverNameOffset;
  5069. IO_ERROR_LOG_PACKET EntryData;
  5070. } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
  5071. #define ERROR_LOG_LIMIT_SIZE 240
  5072. #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
  5073. sizeof(IO_ERROR_LOG_PACKET) + \
  5074. (sizeof(WCHAR) * 40))
  5075. #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
  5076. (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
  5077. #define IO_ERROR_LOG_MESSAGE_LENGTH \
  5078. ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
  5079. ERROR_LOG_MESSAGE_LIMIT_SIZE : \
  5080. PORT_MAXIMUM_MESSAGE_LENGTH)
  5081. #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
  5082. IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
  5083. #ifdef _WIN64
  5084. #define PORT_MAXIMUM_MESSAGE_LENGTH 512
  5085. #else
  5086. #define PORT_MAXIMUM_MESSAGE_LENGTH 256
  5087. #endif
  5088. typedef enum _DMA_WIDTH {
  5089. Width8Bits,
  5090. Width16Bits,
  5091. Width32Bits,
  5092. Width64Bits,
  5093. WidthNoWrap,
  5094. MaximumDmaWidth
  5095. } DMA_WIDTH, *PDMA_WIDTH;
  5096. typedef enum _DMA_SPEED {
  5097. Compatible,
  5098. TypeA,
  5099. TypeB,
  5100. TypeC,
  5101. TypeF,
  5102. MaximumDmaSpeed
  5103. } DMA_SPEED, *PDMA_SPEED;
  5104. /* DEVICE_DESCRIPTION.Version */
  5105. #define DEVICE_DESCRIPTION_VERSION 0x0000
  5106. #define DEVICE_DESCRIPTION_VERSION1 0x0001
  5107. #define DEVICE_DESCRIPTION_VERSION2 0x0002
  5108. typedef struct _DEVICE_DESCRIPTION {
  5109. ULONG Version;
  5110. BOOLEAN Master;
  5111. BOOLEAN ScatterGather;
  5112. BOOLEAN DemandMode;
  5113. BOOLEAN AutoInitialize;
  5114. BOOLEAN Dma32BitAddresses;
  5115. BOOLEAN IgnoreCount;
  5116. BOOLEAN Reserved1;
  5117. BOOLEAN Dma64BitAddresses;
  5118. ULONG BusNumber;
  5119. ULONG DmaChannel;
  5120. INTERFACE_TYPE InterfaceType;
  5121. DMA_WIDTH DmaWidth;
  5122. DMA_SPEED DmaSpeed;
  5123. ULONG MaximumLength;
  5124. ULONG DmaPort;
  5125. } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
  5126. typedef enum _DEVICE_RELATION_TYPE {
  5127. BusRelations,
  5128. EjectionRelations,
  5129. PowerRelations,
  5130. RemovalRelations,
  5131. TargetDeviceRelation,
  5132. SingleBusRelations,
  5133. TransportRelations
  5134. } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
  5135. typedef struct _DEVICE_RELATIONS {
  5136. ULONG Count;
  5137. PDEVICE_OBJECT Objects[1];
  5138. } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
  5139. typedef struct _DEVOBJ_EXTENSION {
  5140. CSHORT Type;
  5141. USHORT Size;
  5142. PDEVICE_OBJECT DeviceObject;
  5143. } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
  5144. typedef struct _SCATTER_GATHER_ELEMENT {
  5145. PHYSICAL_ADDRESS Address;
  5146. ULONG Length;
  5147. ULONG_PTR Reserved;
  5148. } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
  5149. #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
  5150. #if defined(_MSC_VER)
  5151. #if _MSC_VER >= 1200
  5152. #pragma warning(push)
  5153. #endif
  5154. #pragma warning(disable:4200)
  5155. #endif /* _MSC_VER */
  5156. typedef struct _SCATTER_GATHER_LIST {
  5157. ULONG NumberOfElements;
  5158. ULONG_PTR Reserved;
  5159. SCATTER_GATHER_ELEMENT Elements[1];
  5160. } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
  5161. #if defined(_MSC_VER)
  5162. #if _MSC_VER >= 1200
  5163. #pragma warning(pop)
  5164. #else
  5165. #pragma warning(default:4200)
  5166. #endif
  5167. #endif /* _MSC_VER */
  5168. #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
  5169. struct _SCATTER_GATHER_LIST;
  5170. typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
  5171. #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
  5172. typedef NTSTATUS
  5173. (NTAPI DRIVER_ADD_DEVICE)(
  5174. IN struct _DRIVER_OBJECT *DriverObject,
  5175. IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
  5176. typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
  5177. typedef struct _DRIVER_EXTENSION {
  5178. struct _DRIVER_OBJECT *DriverObject;
  5179. PDRIVER_ADD_DEVICE AddDevice;
  5180. ULONG Count;
  5181. UNICODE_STRING ServiceKeyName;
  5182. } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
  5183. #define DRVO_UNLOAD_INVOKED 0x00000001
  5184. #define DRVO_LEGACY_DRIVER 0x00000002
  5185. #define DRVO_BUILTIN_DRIVER 0x00000004
  5186. typedef NTSTATUS
  5187. (NTAPI DRIVER_INITIALIZE)(
  5188. IN struct _DRIVER_OBJECT *DriverObject,
  5189. IN PUNICODE_STRING RegistryPath);
  5190. typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
  5191. typedef VOID
  5192. (NTAPI DRIVER_STARTIO)(
  5193. IN struct _DEVICE_OBJECT *DeviceObject,
  5194. IN struct _IRP *Irp);
  5195. typedef DRIVER_STARTIO *PDRIVER_STARTIO;
  5196. typedef VOID
  5197. (NTAPI DRIVER_UNLOAD)(
  5198. IN struct _DRIVER_OBJECT *DriverObject);
  5199. typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
  5200. typedef NTSTATUS
  5201. (NTAPI DRIVER_DISPATCH)(
  5202. IN struct _DEVICE_OBJECT *DeviceObject,
  5203. IN struct _IRP *Irp);
  5204. typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
  5205. typedef struct _DRIVER_OBJECT {
  5206. CSHORT Type;
  5207. CSHORT Size;
  5208. PDEVICE_OBJECT DeviceObject;
  5209. ULONG Flags;
  5210. PVOID DriverStart;
  5211. ULONG DriverSize;
  5212. PVOID DriverSection;
  5213. PDRIVER_EXTENSION DriverExtension;
  5214. UNICODE_STRING DriverName;
  5215. PUNICODE_STRING HardwareDatabase;
  5216. struct _FAST_IO_DISPATCH *FastIoDispatch;
  5217. PDRIVER_INITIALIZE DriverInit;
  5218. PDRIVER_STARTIO DriverStartIo;
  5219. PDRIVER_UNLOAD DriverUnload;
  5220. PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
  5221. } DRIVER_OBJECT, *PDRIVER_OBJECT;
  5222. typedef struct _DMA_ADAPTER {
  5223. USHORT Version;
  5224. USHORT Size;
  5225. struct _DMA_OPERATIONS* DmaOperations;
  5226. } DMA_ADAPTER, *PDMA_ADAPTER;
  5227. typedef enum
  5228. {
  5229. DmaComplete,
  5230. DmaAborted,
  5231. DmaError,
  5232. DmaCancelled,
  5233. } DMA_COMPLETION_STATUS;
  5234. typedef VOID
  5235. (NTAPI *PPUT_DMA_ADAPTER)(
  5236. IN PDMA_ADAPTER DmaAdapter);
  5237. typedef PVOID
  5238. (NTAPI *PALLOCATE_COMMON_BUFFER)(
  5239. IN PDMA_ADAPTER DmaAdapter,
  5240. IN ULONG Length,
  5241. OUT PPHYSICAL_ADDRESS LogicalAddress,
  5242. IN BOOLEAN CacheEnabled);
  5243. typedef VOID
  5244. (NTAPI *PFREE_COMMON_BUFFER)(
  5245. IN PDMA_ADAPTER DmaAdapter,
  5246. IN ULONG Length,
  5247. IN PHYSICAL_ADDRESS LogicalAddress,
  5248. IN PVOID VirtualAddress,
  5249. IN BOOLEAN CacheEnabled);
  5250. typedef NTSTATUS
  5251. (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
  5252. IN PDMA_ADAPTER DmaAdapter,
  5253. IN PDEVICE_OBJECT DeviceObject,
  5254. IN ULONG NumberOfMapRegisters,
  5255. IN PDRIVER_CONTROL ExecutionRoutine,
  5256. IN PVOID Context);
  5257. typedef BOOLEAN
  5258. (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
  5259. IN PDMA_ADAPTER DmaAdapter,
  5260. IN PMDL Mdl,
  5261. IN PVOID MapRegisterBase,
  5262. IN PVOID CurrentVa,
  5263. IN ULONG Length,
  5264. IN BOOLEAN WriteToDevice);
  5265. typedef VOID
  5266. (NTAPI *PFREE_ADAPTER_CHANNEL)(
  5267. IN PDMA_ADAPTER DmaAdapter);
  5268. typedef VOID
  5269. (NTAPI *PFREE_MAP_REGISTERS)(
  5270. IN PDMA_ADAPTER DmaAdapter,
  5271. PVOID MapRegisterBase,
  5272. ULONG NumberOfMapRegisters);
  5273. typedef PHYSICAL_ADDRESS
  5274. (NTAPI *PMAP_TRANSFER)(
  5275. IN PDMA_ADAPTER DmaAdapter,
  5276. IN PMDL Mdl,
  5277. IN PVOID MapRegisterBase,
  5278. IN PVOID CurrentVa,
  5279. IN OUT PULONG Length,
  5280. IN BOOLEAN WriteToDevice);
  5281. typedef ULONG
  5282. (NTAPI *PGET_DMA_ALIGNMENT)(
  5283. IN PDMA_ADAPTER DmaAdapter);
  5284. typedef ULONG
  5285. (NTAPI *PREAD_DMA_COUNTER)(
  5286. IN PDMA_ADAPTER DmaAdapter);
  5287. typedef VOID
  5288. (NTAPI DRIVER_LIST_CONTROL)(
  5289. IN struct _DEVICE_OBJECT *DeviceObject,
  5290. IN struct _IRP *Irp,
  5291. IN struct _SCATTER_GATHER_LIST *ScatterGather,
  5292. IN PVOID Context);
  5293. typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
  5294. typedef NTSTATUS
  5295. (NTAPI *PGET_SCATTER_GATHER_LIST)(
  5296. IN PDMA_ADAPTER DmaAdapter,
  5297. IN PDEVICE_OBJECT DeviceObject,
  5298. IN PMDL Mdl,
  5299. IN PVOID CurrentVa,
  5300. IN ULONG Length,
  5301. IN PDRIVER_LIST_CONTROL ExecutionRoutine,
  5302. IN PVOID Context,
  5303. IN BOOLEAN WriteToDevice);
  5304. typedef VOID
  5305. (NTAPI *PPUT_SCATTER_GATHER_LIST)(
  5306. IN PDMA_ADAPTER DmaAdapter,
  5307. IN PSCATTER_GATHER_LIST ScatterGather,
  5308. IN BOOLEAN WriteToDevice);
  5309. typedef NTSTATUS
  5310. (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
  5311. IN PDMA_ADAPTER DmaAdapter,
  5312. IN PMDL Mdl OPTIONAL,
  5313. IN PVOID CurrentVa,
  5314. IN ULONG Length,
  5315. OUT PULONG ScatterGatherListSize,
  5316. OUT PULONG pNumberOfMapRegisters OPTIONAL);
  5317. typedef NTSTATUS
  5318. (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
  5319. IN PDMA_ADAPTER DmaAdapter,
  5320. IN PDEVICE_OBJECT DeviceObject,
  5321. IN PMDL Mdl,
  5322. IN PVOID CurrentVa,
  5323. IN ULONG Length,
  5324. IN PDRIVER_LIST_CONTROL ExecutionRoutine,
  5325. IN PVOID Context,
  5326. IN BOOLEAN WriteToDevice,
  5327. IN PVOID ScatterGatherBuffer,
  5328. IN ULONG ScatterGatherLength);
  5329. typedef NTSTATUS
  5330. (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
  5331. IN PDMA_ADAPTER DmaAdapter,
  5332. IN PSCATTER_GATHER_LIST ScatterGather,
  5333. IN PMDL OriginalMdl,
  5334. OUT PMDL *TargetMdl);
  5335. typedef struct _DMA_OPERATIONS {
  5336. ULONG Size;
  5337. PPUT_DMA_ADAPTER PutDmaAdapter;
  5338. PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
  5339. PFREE_COMMON_BUFFER FreeCommonBuffer;
  5340. PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
  5341. PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
  5342. PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
  5343. PFREE_MAP_REGISTERS FreeMapRegisters;
  5344. PMAP_TRANSFER MapTransfer;
  5345. PGET_DMA_ALIGNMENT GetDmaAlignment;
  5346. PREAD_DMA_COUNTER ReadDmaCounter;
  5347. PGET_SCATTER_GATHER_LIST GetScatterGatherList;
  5348. PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
  5349. PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
  5350. PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
  5351. PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
  5352. } DMA_OPERATIONS, *PDMA_OPERATIONS;
  5353. typedef struct _IO_RESOURCE_DESCRIPTOR {
  5354. UCHAR Option;
  5355. UCHAR Type;
  5356. UCHAR ShareDisposition;
  5357. UCHAR Spare1;
  5358. USHORT Flags;
  5359. USHORT Spare2;
  5360. union {
  5361. struct {
  5362. ULONG Length;
  5363. ULONG Alignment;
  5364. PHYSICAL_ADDRESS MinimumAddress;
  5365. PHYSICAL_ADDRESS MaximumAddress;
  5366. } Port;
  5367. struct {
  5368. ULONG Length;
  5369. ULONG Alignment;
  5370. PHYSICAL_ADDRESS MinimumAddress;
  5371. PHYSICAL_ADDRESS MaximumAddress;
  5372. } Memory;
  5373. struct {
  5374. ULONG MinimumVector;
  5375. ULONG MaximumVector;
  5376. } Interrupt;
  5377. struct {
  5378. ULONG MinimumChannel;
  5379. ULONG MaximumChannel;
  5380. } Dma;
  5381. struct {
  5382. ULONG Length;
  5383. ULONG Alignment;
  5384. PHYSICAL_ADDRESS MinimumAddress;
  5385. PHYSICAL_ADDRESS MaximumAddress;
  5386. } Generic;
  5387. struct {
  5388. ULONG Data[3];
  5389. } DevicePrivate;
  5390. struct {
  5391. ULONG Length;
  5392. ULONG MinBusNumber;
  5393. ULONG MaxBusNumber;
  5394. ULONG Reserved;
  5395. } BusNumber;
  5396. struct {
  5397. ULONG Priority;
  5398. ULONG Reserved1;
  5399. ULONG Reserved2;
  5400. } ConfigData;
  5401. } u;
  5402. } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
  5403. typedef struct _IO_RESOURCE_LIST {
  5404. USHORT Version;
  5405. USHORT Revision;
  5406. ULONG Count;
  5407. IO_RESOURCE_DESCRIPTOR Descriptors[1];
  5408. } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
  5409. typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
  5410. ULONG ListSize;
  5411. INTERFACE_TYPE InterfaceType;
  5412. ULONG BusNumber;
  5413. ULONG SlotNumber;
  5414. ULONG Reserved[3];
  5415. ULONG AlternativeLists;
  5416. IO_RESOURCE_LIST List[1];
  5417. } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
  5418. typedef VOID
  5419. (NTAPI DRIVER_CANCEL)(
  5420. IN struct _DEVICE_OBJECT *DeviceObject,
  5421. IN struct _IRP *Irp);
  5422. typedef DRIVER_CANCEL *PDRIVER_CANCEL;
  5423. typedef struct _IRP {
  5424. CSHORT Type;
  5425. USHORT Size;
  5426. struct _MDL *MdlAddress;
  5427. ULONG Flags;
  5428. union {
  5429. struct _IRP *MasterIrp;
  5430. volatile LONG IrpCount;
  5431. PVOID SystemBuffer;
  5432. } AssociatedIrp;
  5433. LIST_ENTRY ThreadListEntry;
  5434. IO_STATUS_BLOCK IoStatus;
  5435. KPROCESSOR_MODE RequestorMode;
  5436. BOOLEAN PendingReturned;
  5437. CHAR StackCount;
  5438. CHAR CurrentLocation;
  5439. BOOLEAN Cancel;
  5440. KIRQL CancelIrql;
  5441. CCHAR ApcEnvironment;
  5442. UCHAR AllocationFlags;
  5443. PIO_STATUS_BLOCK UserIosb;
  5444. PKEVENT UserEvent;
  5445. union {
  5446. struct {
  5447. _ANONYMOUS_UNION union {
  5448. PIO_APC_ROUTINE UserApcRoutine;
  5449. PVOID IssuingProcess;
  5450. } DUMMYUNIONNAME;
  5451. PVOID UserApcContext;
  5452. } AsynchronousParameters;
  5453. LARGE_INTEGER AllocationSize;
  5454. } Overlay;
  5455. volatile PDRIVER_CANCEL CancelRoutine;
  5456. PVOID UserBuffer;
  5457. union {
  5458. struct {
  5459. _ANONYMOUS_UNION union {
  5460. KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
  5461. _ANONYMOUS_STRUCT struct {
  5462. PVOID DriverContext[4];
  5463. } DUMMYSTRUCTNAME;
  5464. } DUMMYUNIONNAME;
  5465. PETHREAD Thread;
  5466. PCHAR AuxiliaryBuffer;
  5467. _ANONYMOUS_STRUCT struct {
  5468. LIST_ENTRY ListEntry;
  5469. _ANONYMOUS_UNION union {
  5470. struct _IO_STACK_LOCATION *CurrentStackLocation;
  5471. ULONG PacketType;
  5472. } DUMMYUNIONNAME;
  5473. } DUMMYSTRUCTNAME;
  5474. struct _FILE_OBJECT *OriginalFileObject;
  5475. } Overlay;
  5476. KAPC Apc;
  5477. PVOID CompletionKey;
  5478. } Tail;
  5479. } IRP, *PIRP;
  5480. typedef enum _IO_PAGING_PRIORITY {
  5481. IoPagingPriorityInvalid,
  5482. IoPagingPriorityNormal,
  5483. IoPagingPriorityHigh,
  5484. IoPagingPriorityReserved1,
  5485. IoPagingPriorityReserved2
  5486. } IO_PAGING_PRIORITY;
  5487. typedef NTSTATUS
  5488. (NTAPI IO_COMPLETION_ROUTINE)(
  5489. IN struct _DEVICE_OBJECT *DeviceObject,
  5490. IN struct _IRP *Irp,
  5491. IN PVOID Context);
  5492. typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
  5493. typedef VOID
  5494. (NTAPI IO_DPC_ROUTINE)(
  5495. IN struct _KDPC *Dpc,
  5496. IN struct _DEVICE_OBJECT *DeviceObject,
  5497. IN struct _IRP *Irp,
  5498. IN PVOID Context);
  5499. typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
  5500. typedef NTSTATUS
  5501. (NTAPI *PMM_DLL_INITIALIZE)(
  5502. IN PUNICODE_STRING RegistryPath);
  5503. typedef NTSTATUS
  5504. (NTAPI *PMM_DLL_UNLOAD)(
  5505. VOID);
  5506. typedef VOID
  5507. (NTAPI IO_TIMER_ROUTINE)(
  5508. IN struct _DEVICE_OBJECT *DeviceObject,
  5509. IN PVOID Context);
  5510. typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
  5511. typedef struct _IO_SECURITY_CONTEXT {
  5512. PSECURITY_QUALITY_OF_SERVICE SecurityQos;
  5513. PACCESS_STATE AccessState;
  5514. ACCESS_MASK DesiredAccess;
  5515. ULONG FullCreateOptions;
  5516. } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
  5517. struct _IO_CSQ;
  5518. typedef struct _IO_CSQ_IRP_CONTEXT {
  5519. ULONG Type;
  5520. struct _IRP *Irp;
  5521. struct _IO_CSQ *Csq;
  5522. } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
  5523. typedef VOID
  5524. (NTAPI *PIO_CSQ_INSERT_IRP)(
  5525. IN struct _IO_CSQ *Csq,
  5526. IN PIRP Irp);
  5527. typedef NTSTATUS
  5528. (NTAPI IO_CSQ_INSERT_IRP_EX)(
  5529. IN struct _IO_CSQ *Csq,
  5530. IN PIRP Irp,
  5531. IN PVOID InsertContext);
  5532. typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
  5533. typedef VOID
  5534. (NTAPI *PIO_CSQ_REMOVE_IRP)(
  5535. IN struct _IO_CSQ *Csq,
  5536. IN PIRP Irp);
  5537. typedef PIRP
  5538. (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
  5539. IN struct _IO_CSQ *Csq,
  5540. IN PIRP Irp,
  5541. IN PVOID PeekContext);
  5542. typedef VOID
  5543. (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
  5544. IN struct _IO_CSQ *Csq,
  5545. OUT PKIRQL Irql);
  5546. typedef VOID
  5547. (NTAPI *PIO_CSQ_RELEASE_LOCK)(
  5548. IN struct _IO_CSQ *Csq,
  5549. IN KIRQL Irql);
  5550. typedef VOID
  5551. (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
  5552. IN struct _IO_CSQ *Csq,
  5553. IN PIRP Irp);
  5554. typedef struct _IO_CSQ {
  5555. ULONG Type;
  5556. PIO_CSQ_INSERT_IRP CsqInsertIrp;
  5557. PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
  5558. PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
  5559. PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
  5560. PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
  5561. PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
  5562. PVOID ReservePointer;
  5563. } IO_CSQ, *PIO_CSQ;
  5564. typedef enum _BUS_QUERY_ID_TYPE {
  5565. BusQueryDeviceID,
  5566. BusQueryHardwareIDs,
  5567. BusQueryCompatibleIDs,
  5568. BusQueryInstanceID,
  5569. BusQueryDeviceSerialNumber,
  5570. BusQueryContainerID
  5571. } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
  5572. typedef enum _DEVICE_TEXT_TYPE {
  5573. DeviceTextDescription,
  5574. DeviceTextLocationInformation
  5575. } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
  5576. typedef BOOLEAN
  5577. (NTAPI *PGPE_SERVICE_ROUTINE)(
  5578. PVOID,
  5579. PVOID);
  5580. typedef NTSTATUS
  5581. (NTAPI *PGPE_CONNECT_VECTOR)(
  5582. PDEVICE_OBJECT,
  5583. ULONG,
  5584. KINTERRUPT_MODE,
  5585. BOOLEAN,
  5586. PGPE_SERVICE_ROUTINE,
  5587. PVOID,
  5588. PVOID);
  5589. typedef NTSTATUS
  5590. (NTAPI *PGPE_DISCONNECT_VECTOR)(
  5591. PVOID);
  5592. typedef NTSTATUS
  5593. (NTAPI *PGPE_ENABLE_EVENT)(
  5594. PDEVICE_OBJECT,
  5595. PVOID);
  5596. typedef NTSTATUS
  5597. (NTAPI *PGPE_DISABLE_EVENT)(
  5598. PDEVICE_OBJECT,
  5599. PVOID);
  5600. typedef NTSTATUS
  5601. (NTAPI *PGPE_CLEAR_STATUS)(
  5602. PDEVICE_OBJECT,
  5603. PVOID);
  5604. typedef VOID
  5605. (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
  5606. PVOID,
  5607. ULONG);
  5608. typedef NTSTATUS
  5609. (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
  5610. PDEVICE_OBJECT,
  5611. PDEVICE_NOTIFY_CALLBACK,
  5612. PVOID);
  5613. typedef VOID
  5614. (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
  5615. PDEVICE_OBJECT,
  5616. PDEVICE_NOTIFY_CALLBACK);
  5617. typedef struct _ACPI_INTERFACE_STANDARD {
  5618. USHORT Size;
  5619. USHORT Version;
  5620. PVOID Context;
  5621. PINTERFACE_REFERENCE InterfaceReference;
  5622. PINTERFACE_DEREFERENCE InterfaceDereference;
  5623. PGPE_CONNECT_VECTOR GpeConnectVector;
  5624. PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
  5625. PGPE_ENABLE_EVENT GpeEnableEvent;
  5626. PGPE_DISABLE_EVENT GpeDisableEvent;
  5627. PGPE_CLEAR_STATUS GpeClearStatus;
  5628. PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
  5629. PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
  5630. } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
  5631. typedef BOOLEAN
  5632. (NTAPI *PGPE_SERVICE_ROUTINE2)(
  5633. PVOID ObjectContext,
  5634. PVOID ServiceContext);
  5635. typedef NTSTATUS
  5636. (NTAPI *PGPE_CONNECT_VECTOR2)(
  5637. PVOID Context,
  5638. ULONG GpeNumber,
  5639. KINTERRUPT_MODE Mode,
  5640. BOOLEAN Shareable,
  5641. PGPE_SERVICE_ROUTINE ServiceRoutine,
  5642. PVOID ServiceContext,
  5643. PVOID *ObjectContext);
  5644. typedef NTSTATUS
  5645. (NTAPI *PGPE_DISCONNECT_VECTOR2)(
  5646. PVOID Context,
  5647. PVOID ObjectContext);
  5648. typedef NTSTATUS
  5649. (NTAPI *PGPE_ENABLE_EVENT2)(
  5650. PVOID Context,
  5651. PVOID ObjectContext);
  5652. typedef NTSTATUS
  5653. (NTAPI *PGPE_DISABLE_EVENT2)(
  5654. PVOID Context,
  5655. PVOID ObjectContext);
  5656. typedef NTSTATUS
  5657. (NTAPI *PGPE_CLEAR_STATUS2)(
  5658. PVOID Context,
  5659. PVOID ObjectContext);
  5660. typedef VOID
  5661. (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
  5662. PVOID NotificationContext,
  5663. ULONG NotifyCode);
  5664. typedef NTSTATUS
  5665. (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
  5666. PVOID Context,
  5667. PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
  5668. PVOID NotificationContext);
  5669. typedef VOID
  5670. (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
  5671. PVOID Context);
  5672. typedef struct _ACPI_INTERFACE_STANDARD2 {
  5673. USHORT Size;
  5674. USHORT Version;
  5675. PVOID Context;
  5676. PINTERFACE_REFERENCE InterfaceReference;
  5677. PINTERFACE_DEREFERENCE InterfaceDereference;
  5678. PGPE_CONNECT_VECTOR2 GpeConnectVector;
  5679. PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
  5680. PGPE_ENABLE_EVENT2 GpeEnableEvent;
  5681. PGPE_DISABLE_EVENT2 GpeDisableEvent;
  5682. PGPE_CLEAR_STATUS2 GpeClearStatus;
  5683. PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
  5684. PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
  5685. } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
  5686. #if !defined(_AMD64_) && !defined(_IA64_)
  5687. #include <pshpack4.h>
  5688. #endif
  5689. typedef struct _IO_STACK_LOCATION {
  5690. UCHAR MajorFunction;
  5691. UCHAR MinorFunction;
  5692. UCHAR Flags;
  5693. UCHAR Control;
  5694. union {
  5695. struct {
  5696. PIO_SECURITY_CONTEXT SecurityContext;
  5697. ULONG Options;
  5698. USHORT POINTER_ALIGNMENT FileAttributes;
  5699. USHORT ShareAccess;
  5700. ULONG POINTER_ALIGNMENT EaLength;
  5701. } Create;
  5702. struct {
  5703. PIO_SECURITY_CONTEXT SecurityContext;
  5704. ULONG Options;
  5705. USHORT POINTER_ALIGNMENT Reserved;
  5706. USHORT ShareAccess;
  5707. PNAMED_PIPE_CREATE_PARAMETERS Parameters;
  5708. } CreatePipe;
  5709. struct {
  5710. PIO_SECURITY_CONTEXT SecurityContext;
  5711. ULONG Options;
  5712. USHORT POINTER_ALIGNMENT Reserved;
  5713. USHORT ShareAccess;
  5714. PMAILSLOT_CREATE_PARAMETERS Parameters;
  5715. } CreateMailslot;
  5716. struct {
  5717. ULONG Length;
  5718. ULONG POINTER_ALIGNMENT Key;
  5719. #ifdef _WIN64
  5720. ULONG Flags;
  5721. #endif
  5722. LARGE_INTEGER ByteOffset;
  5723. } Read;
  5724. struct {
  5725. ULONG Length;
  5726. ULONG POINTER_ALIGNMENT Key;
  5727. #ifdef _WIN64
  5728. ULONG Flags;
  5729. #endif
  5730. LARGE_INTEGER ByteOffset;
  5731. } Write;
  5732. struct {
  5733. ULONG Length;
  5734. PUNICODE_STRING FileName;
  5735. FILE_INFORMATION_CLASS FileInformationClass;
  5736. ULONG POINTER_ALIGNMENT FileIndex;
  5737. } QueryDirectory;
  5738. struct {
  5739. ULONG Length;
  5740. ULONG POINTER_ALIGNMENT CompletionFilter;
  5741. } NotifyDirectory;
  5742. struct {
  5743. ULONG Length;
  5744. ULONG POINTER_ALIGNMENT CompletionFilter;
  5745. DIRECTORY_NOTIFY_INFORMATION_CLASS POINTER_ALIGNMENT DirectoryNotifyInformationClass;
  5746. } NotifyDirectoryEx;
  5747. struct {
  5748. ULONG Length;
  5749. FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
  5750. } QueryFile;
  5751. struct {
  5752. ULONG Length;
  5753. FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
  5754. PFILE_OBJECT FileObject;
  5755. _ANONYMOUS_UNION union {
  5756. _ANONYMOUS_STRUCT struct {
  5757. BOOLEAN ReplaceIfExists;
  5758. BOOLEAN AdvanceOnly;
  5759. } DUMMYSTRUCTNAME;
  5760. ULONG ClusterCount;
  5761. HANDLE DeleteHandle;
  5762. } DUMMYUNIONNAME;
  5763. } SetFile;
  5764. struct {
  5765. ULONG Length;
  5766. PVOID EaList;
  5767. ULONG EaListLength;
  5768. ULONG POINTER_ALIGNMENT EaIndex;
  5769. } QueryEa;
  5770. struct {
  5771. ULONG Length;
  5772. } SetEa;
  5773. struct {
  5774. ULONG Length;
  5775. FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
  5776. } QueryVolume;
  5777. struct {
  5778. ULONG Length;
  5779. FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
  5780. } SetVolume;
  5781. struct {
  5782. ULONG OutputBufferLength;
  5783. ULONG POINTER_ALIGNMENT InputBufferLength;
  5784. ULONG POINTER_ALIGNMENT FsControlCode;
  5785. PVOID Type3InputBuffer;
  5786. } FileSystemControl;
  5787. struct {
  5788. PLARGE_INTEGER Length;
  5789. ULONG POINTER_ALIGNMENT Key;
  5790. LARGE_INTEGER ByteOffset;
  5791. } LockControl;
  5792. struct {
  5793. ULONG OutputBufferLength;
  5794. ULONG POINTER_ALIGNMENT InputBufferLength;
  5795. ULONG POINTER_ALIGNMENT IoControlCode;
  5796. PVOID Type3InputBuffer;
  5797. } DeviceIoControl;
  5798. struct {
  5799. SECURITY_INFORMATION SecurityInformation;
  5800. ULONG POINTER_ALIGNMENT Length;
  5801. } QuerySecurity;
  5802. struct {
  5803. SECURITY_INFORMATION SecurityInformation;
  5804. PSECURITY_DESCRIPTOR SecurityDescriptor;
  5805. } SetSecurity;
  5806. struct {
  5807. PVPB Vpb;
  5808. PDEVICE_OBJECT DeviceObject;
  5809. } MountVolume;
  5810. struct {
  5811. PVPB Vpb;
  5812. PDEVICE_OBJECT DeviceObject;
  5813. } VerifyVolume;
  5814. struct {
  5815. struct _SCSI_REQUEST_BLOCK *Srb;
  5816. } Scsi;
  5817. struct {
  5818. ULONG Length;
  5819. PSID StartSid;
  5820. struct _FILE_GET_QUOTA_INFORMATION *SidList;
  5821. ULONG SidListLength;
  5822. } QueryQuota;
  5823. struct {
  5824. ULONG Length;
  5825. } SetQuota;
  5826. struct {
  5827. DEVICE_RELATION_TYPE Type;
  5828. } QueryDeviceRelations;
  5829. struct {
  5830. CONST GUID *InterfaceType;
  5831. USHORT Size;
  5832. USHORT Version;
  5833. PINTERFACE Interface;
  5834. PVOID InterfaceSpecificData;
  5835. } QueryInterface;
  5836. struct {
  5837. PDEVICE_CAPABILITIES Capabilities;
  5838. } DeviceCapabilities;
  5839. struct {
  5840. PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
  5841. } FilterResourceRequirements;
  5842. struct {
  5843. ULONG WhichSpace;
  5844. PVOID Buffer;
  5845. ULONG Offset;
  5846. ULONG POINTER_ALIGNMENT Length;
  5847. } ReadWriteConfig;
  5848. struct {
  5849. BOOLEAN Lock;
  5850. } SetLock;
  5851. struct {
  5852. BUS_QUERY_ID_TYPE IdType;
  5853. } QueryId;
  5854. struct {
  5855. DEVICE_TEXT_TYPE DeviceTextType;
  5856. LCID POINTER_ALIGNMENT LocaleId;
  5857. } QueryDeviceText;
  5858. struct {
  5859. BOOLEAN InPath;
  5860. BOOLEAN Reserved[3];
  5861. DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
  5862. } UsageNotification;
  5863. struct {
  5864. SYSTEM_POWER_STATE PowerState;
  5865. } WaitWake;
  5866. struct {
  5867. PPOWER_SEQUENCE PowerSequence;
  5868. } PowerSequence;
  5869. struct {
  5870. #if (NTDDI_VERSION >= NTDDI_WINVISTA)
  5871. _ANONYMOUS_UNION union {
  5872. #endif
  5873. ULONG SystemContext;
  5874. #if (NTDDI_VERSION >= NTDDI_WINVISTA)
  5875. SYSTEM_POWER_STATE_CONTEXT SystemPowerStateContext;
  5876. } DUMMYUNIONNAME;
  5877. #endif
  5878. POWER_STATE_TYPE POINTER_ALIGNMENT Type;
  5879. POWER_STATE POINTER_ALIGNMENT State;
  5880. POWER_ACTION POINTER_ALIGNMENT ShutdownType;
  5881. } Power;
  5882. struct {
  5883. PCM_RESOURCE_LIST AllocatedResources;
  5884. PCM_RESOURCE_LIST AllocatedResourcesTranslated;
  5885. } StartDevice;
  5886. struct {
  5887. ULONG_PTR ProviderId;
  5888. PVOID DataPath;
  5889. ULONG BufferSize;
  5890. PVOID Buffer;
  5891. } WMI;
  5892. struct {
  5893. PVOID Argument1;
  5894. PVOID Argument2;
  5895. PVOID Argument3;
  5896. PVOID Argument4;
  5897. } Others;
  5898. } Parameters;
  5899. PDEVICE_OBJECT DeviceObject;
  5900. PFILE_OBJECT FileObject;
  5901. PIO_COMPLETION_ROUTINE CompletionRoutine;
  5902. PVOID Context;
  5903. } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
  5904. #if !defined(_AMD64_) && !defined(_IA64_)
  5905. #include <poppack.h>
  5906. #endif
  5907. /* IO_STACK_LOCATION.Control */
  5908. #define SL_PENDING_RETURNED 0x01
  5909. #define SL_ERROR_RETURNED 0x02
  5910. #define SL_INVOKE_ON_CANCEL 0x20
  5911. #define SL_INVOKE_ON_SUCCESS 0x40
  5912. #define SL_INVOKE_ON_ERROR 0x80
  5913. #define METHOD_BUFFERED 0
  5914. #define METHOD_IN_DIRECT 1
  5915. #define METHOD_OUT_DIRECT 2
  5916. #define METHOD_NEITHER 3
  5917. #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
  5918. #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
  5919. #define FILE_SUPERSEDED 0x00000000
  5920. #define FILE_OPENED 0x00000001
  5921. #define FILE_CREATED 0x00000002
  5922. #define FILE_OVERWRITTEN 0x00000003
  5923. #define FILE_EXISTS 0x00000004
  5924. #define FILE_DOES_NOT_EXIST 0x00000005
  5925. #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
  5926. #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
  5927. /* also in winnt.h */
  5928. #define FILE_LIST_DIRECTORY 0x00000001
  5929. #define FILE_READ_DATA 0x00000001
  5930. #define FILE_ADD_FILE 0x00000002
  5931. #define FILE_WRITE_DATA 0x00000002
  5932. #define FILE_ADD_SUBDIRECTORY 0x00000004
  5933. #define FILE_APPEND_DATA 0x00000004
  5934. #define FILE_CREATE_PIPE_INSTANCE 0x00000004
  5935. #define FILE_READ_EA 0x00000008
  5936. #define FILE_WRITE_EA 0x00000010
  5937. #define FILE_EXECUTE 0x00000020
  5938. #define FILE_TRAVERSE 0x00000020
  5939. #define FILE_DELETE_CHILD 0x00000040
  5940. #define FILE_READ_ATTRIBUTES 0x00000080
  5941. #define FILE_WRITE_ATTRIBUTES 0x00000100
  5942. #define FILE_SHARE_READ 0x00000001
  5943. #define FILE_SHARE_WRITE 0x00000002
  5944. #define FILE_SHARE_DELETE 0x00000004
  5945. #define FILE_SHARE_VALID_FLAGS 0x00000007
  5946. #define FILE_ATTRIBUTE_READONLY 0x00000001
  5947. #define FILE_ATTRIBUTE_HIDDEN 0x00000002
  5948. #define FILE_ATTRIBUTE_SYSTEM 0x00000004
  5949. #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
  5950. #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
  5951. #define FILE_ATTRIBUTE_DEVICE 0x00000040
  5952. #define FILE_ATTRIBUTE_NORMAL 0x00000080
  5953. #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
  5954. #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
  5955. #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
  5956. #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
  5957. #define FILE_ATTRIBUTE_OFFLINE 0x00001000
  5958. #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
  5959. #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
  5960. #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
  5961. #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
  5962. #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
  5963. #define FILE_VALID_OPTION_FLAGS 0x00ffffff
  5964. #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
  5965. #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
  5966. #define FILE_VALID_SET_FLAGS 0x00000036
  5967. #define FILE_SUPERSEDE 0x00000000
  5968. #define FILE_OPEN 0x00000001
  5969. #define FILE_CREATE 0x00000002
  5970. #define FILE_OPEN_IF 0x00000003
  5971. #define FILE_OVERWRITE 0x00000004
  5972. #define FILE_OVERWRITE_IF 0x00000005
  5973. #define FILE_MAXIMUM_DISPOSITION 0x00000005
  5974. #define FILE_DIRECTORY_FILE 0x00000001
  5975. #define FILE_WRITE_THROUGH 0x00000002
  5976. #define FILE_SEQUENTIAL_ONLY 0x00000004
  5977. #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
  5978. #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
  5979. #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
  5980. #define FILE_NON_DIRECTORY_FILE 0x00000040
  5981. #define FILE_CREATE_TREE_CONNECTION 0x00000080
  5982. #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
  5983. #define FILE_NO_EA_KNOWLEDGE 0x00000200
  5984. #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
  5985. #define FILE_RANDOM_ACCESS 0x00000800
  5986. #define FILE_DELETE_ON_CLOSE 0x00001000
  5987. #define FILE_OPEN_BY_FILE_ID 0x00002000
  5988. #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
  5989. #define FILE_NO_COMPRESSION 0x00008000
  5990. #if (NTDDI_VERSION >= NTDDI_WIN7)
  5991. #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
  5992. #define FILE_DISALLOW_EXCLUSIVE 0x00020000
  5993. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  5994. #define FILE_RESERVE_OPFILTER 0x00100000
  5995. #define FILE_OPEN_REPARSE_POINT 0x00200000
  5996. #define FILE_OPEN_NO_RECALL 0x00400000
  5997. #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
  5998. #define FILE_ANY_ACCESS 0x00000000
  5999. #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
  6000. #define FILE_READ_ACCESS 0x00000001
  6001. #define FILE_WRITE_ACCESS 0x00000002
  6002. #define FILE_ALL_ACCESS \
  6003. (STANDARD_RIGHTS_REQUIRED | \
  6004. SYNCHRONIZE | \
  6005. 0x1FF)
  6006. #define FILE_GENERIC_EXECUTE \
  6007. (STANDARD_RIGHTS_EXECUTE | \
  6008. FILE_READ_ATTRIBUTES | \
  6009. FILE_EXECUTE | \
  6010. SYNCHRONIZE)
  6011. #define FILE_GENERIC_READ \
  6012. (STANDARD_RIGHTS_READ | \
  6013. FILE_READ_DATA | \
  6014. FILE_READ_ATTRIBUTES | \
  6015. FILE_READ_EA | \
  6016. SYNCHRONIZE)
  6017. #define FILE_GENERIC_WRITE \
  6018. (STANDARD_RIGHTS_WRITE | \
  6019. FILE_WRITE_DATA | \
  6020. FILE_WRITE_ATTRIBUTES | \
  6021. FILE_WRITE_EA | \
  6022. FILE_APPEND_DATA | \
  6023. SYNCHRONIZE)
  6024. /* end winnt.h */
  6025. #define WMIREG_ACTION_REGISTER 1
  6026. #define WMIREG_ACTION_DEREGISTER 2
  6027. #define WMIREG_ACTION_REREGISTER 3
  6028. #define WMIREG_ACTION_UPDATE_GUIDS 4
  6029. #define WMIREG_ACTION_BLOCK_IRPS 5
  6030. #define WMIREGISTER 0
  6031. #define WMIUPDATE 1
  6032. typedef VOID
  6033. (NTAPI FWMI_NOTIFICATION_CALLBACK)(
  6034. PVOID Wnode,
  6035. PVOID Context);
  6036. typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
  6037. #ifndef _PCI_X_
  6038. #define _PCI_X_
  6039. typedef struct _PCI_SLOT_NUMBER {
  6040. union {
  6041. struct {
  6042. ULONG DeviceNumber:5;
  6043. ULONG FunctionNumber:3;
  6044. ULONG Reserved:24;
  6045. } bits;
  6046. ULONG AsULONG;
  6047. } u;
  6048. } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
  6049. #define PCI_TYPE0_ADDRESSES 6
  6050. #define PCI_TYPE1_ADDRESSES 2
  6051. #define PCI_TYPE2_ADDRESSES 5
  6052. typedef struct _PCI_COMMON_HEADER {
  6053. PCI_COMMON_HEADER_LAYOUT
  6054. } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
  6055. #ifdef __cplusplus
  6056. typedef struct _PCI_COMMON_CONFIG {
  6057. PCI_COMMON_HEADER_LAYOUT
  6058. UCHAR DeviceSpecific[192];
  6059. } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
  6060. #else
  6061. typedef struct _PCI_COMMON_CONFIG {
  6062. __extension__ struct {
  6063. PCI_COMMON_HEADER_LAYOUT
  6064. };
  6065. UCHAR DeviceSpecific[192];
  6066. } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
  6067. #endif
  6068. #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
  6069. #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
  6070. #define PCI_MAX_DEVICES 32
  6071. #define PCI_MAX_FUNCTION 8
  6072. #define PCI_MAX_BRIDGE_NUMBER 0xFF
  6073. #define PCI_INVALID_VENDORID 0xFFFF
  6074. /* PCI_COMMON_CONFIG.HeaderType */
  6075. #define PCI_MULTIFUNCTION 0x80
  6076. #define PCI_DEVICE_TYPE 0x00
  6077. #define PCI_BRIDGE_TYPE 0x01
  6078. #define PCI_CARDBUS_BRIDGE_TYPE 0x02
  6079. #define PCI_CONFIGURATION_TYPE(PciData) \
  6080. (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
  6081. #define PCI_MULTIFUNCTION_DEVICE(PciData) \
  6082. ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
  6083. /* PCI_COMMON_CONFIG.Command */
  6084. #define PCI_ENABLE_IO_SPACE 0x0001
  6085. #define PCI_ENABLE_MEMORY_SPACE 0x0002
  6086. #define PCI_ENABLE_BUS_MASTER 0x0004
  6087. #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
  6088. #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
  6089. #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
  6090. #define PCI_ENABLE_PARITY 0x0040
  6091. #define PCI_ENABLE_WAIT_CYCLE 0x0080
  6092. #define PCI_ENABLE_SERR 0x0100
  6093. #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
  6094. #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
  6095. /* PCI_COMMON_CONFIG.Status */
  6096. #define PCI_STATUS_INTERRUPT_PENDING 0x0008
  6097. #define PCI_STATUS_CAPABILITIES_LIST 0x0010
  6098. #define PCI_STATUS_66MHZ_CAPABLE 0x0020
  6099. #define PCI_STATUS_UDF_SUPPORTED 0x0040
  6100. #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
  6101. #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
  6102. #define PCI_STATUS_DEVSEL 0x0600
  6103. #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
  6104. #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
  6105. #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
  6106. #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
  6107. #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
  6108. /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
  6109. #define PCI_WHICHSPACE_CONFIG 0x0
  6110. #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
  6111. #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
  6112. #define PCI_CAPABILITY_ID_AGP 0x02
  6113. #define PCI_CAPABILITY_ID_VPD 0x03
  6114. #define PCI_CAPABILITY_ID_SLOT_ID 0x04
  6115. #define PCI_CAPABILITY_ID_MSI 0x05
  6116. #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
  6117. #define PCI_CAPABILITY_ID_PCIX 0x07
  6118. #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
  6119. #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
  6120. #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
  6121. #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
  6122. #define PCI_CAPABILITY_ID_SHPC 0x0C
  6123. #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
  6124. #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
  6125. #define PCI_CAPABILITY_ID_SECURE 0x0F
  6126. #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
  6127. #define PCI_CAPABILITY_ID_MSIX 0x11
  6128. typedef struct _PCI_CAPABILITIES_HEADER {
  6129. UCHAR CapabilityID;
  6130. UCHAR Next;
  6131. } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
  6132. typedef struct _PCI_PMC {
  6133. UCHAR Version:3;
  6134. UCHAR PMEClock:1;
  6135. UCHAR Rsvd1:1;
  6136. UCHAR DeviceSpecificInitialization:1;
  6137. UCHAR Rsvd2:2;
  6138. struct _PM_SUPPORT {
  6139. UCHAR Rsvd2:1;
  6140. UCHAR D1:1;
  6141. UCHAR D2:1;
  6142. UCHAR PMED0:1;
  6143. UCHAR PMED1:1;
  6144. UCHAR PMED2:1;
  6145. UCHAR PMED3Hot:1;
  6146. UCHAR PMED3Cold:1;
  6147. } Support;
  6148. } PCI_PMC, *PPCI_PMC;
  6149. typedef struct _PCI_PMCSR {
  6150. USHORT PowerState:2;
  6151. USHORT Rsvd1:6;
  6152. USHORT PMEEnable:1;
  6153. USHORT DataSelect:4;
  6154. USHORT DataScale:2;
  6155. USHORT PMEStatus:1;
  6156. } PCI_PMCSR, *PPCI_PMCSR;
  6157. typedef struct _PCI_PMCSR_BSE {
  6158. UCHAR Rsvd1:6;
  6159. UCHAR D3HotSupportsStopClock:1;
  6160. UCHAR BusPowerClockControlEnabled:1;
  6161. } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
  6162. typedef struct _PCI_PM_CAPABILITY {
  6163. PCI_CAPABILITIES_HEADER Header;
  6164. union {
  6165. PCI_PMC Capabilities;
  6166. USHORT AsUSHORT;
  6167. } PMC;
  6168. union {
  6169. PCI_PMCSR ControlStatus;
  6170. USHORT AsUSHORT;
  6171. } PMCSR;
  6172. union {
  6173. PCI_PMCSR_BSE BridgeSupport;
  6174. UCHAR AsUCHAR;
  6175. } PMCSR_BSE;
  6176. UCHAR Data;
  6177. } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
  6178. typedef struct {
  6179. PCI_CAPABILITIES_HEADER Header;
  6180. union {
  6181. struct {
  6182. USHORT DataParityErrorRecoveryEnable:1;
  6183. USHORT EnableRelaxedOrdering:1;
  6184. USHORT MaxMemoryReadByteCount:2;
  6185. USHORT MaxOutstandingSplitTransactions:3;
  6186. USHORT Reserved:9;
  6187. } bits;
  6188. USHORT AsUSHORT;
  6189. } Command;
  6190. union {
  6191. struct {
  6192. ULONG FunctionNumber:3;
  6193. ULONG DeviceNumber:5;
  6194. ULONG BusNumber:8;
  6195. ULONG Device64Bit:1;
  6196. ULONG Capable133MHz:1;
  6197. ULONG SplitCompletionDiscarded:1;
  6198. ULONG UnexpectedSplitCompletion:1;
  6199. ULONG DeviceComplexity:1;
  6200. ULONG DesignedMaxMemoryReadByteCount:2;
  6201. ULONG DesignedMaxOutstandingSplitTransactions:3;
  6202. ULONG DesignedMaxCumulativeReadSize:3;
  6203. ULONG ReceivedSplitCompletionErrorMessage:1;
  6204. ULONG CapablePCIX266:1;
  6205. ULONG CapablePCIX533:1;
  6206. } bits;
  6207. ULONG AsULONG;
  6208. } Status;
  6209. } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
  6210. #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
  6211. #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
  6212. #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
  6213. #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
  6214. #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
  6215. #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
  6216. #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
  6217. #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
  6218. #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
  6219. #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
  6220. #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
  6221. typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
  6222. USHORT CapabilityID;
  6223. USHORT Version:4;
  6224. USHORT Next:12;
  6225. } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
  6226. typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
  6227. PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
  6228. ULONG LowSerialNumber;
  6229. ULONG HighSerialNumber;
  6230. } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
  6231. typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
  6232. _ANONYMOUS_STRUCT struct {
  6233. ULONG Undefined:1;
  6234. ULONG Reserved1:3;
  6235. ULONG DataLinkProtocolError:1;
  6236. ULONG SurpriseDownError:1;
  6237. ULONG Reserved2:6;
  6238. ULONG PoisonedTLP:1;
  6239. ULONG FlowControlProtocolError:1;
  6240. ULONG CompletionTimeout:1;
  6241. ULONG CompleterAbort:1;
  6242. ULONG UnexpectedCompletion:1;
  6243. ULONG ReceiverOverflow:1;
  6244. ULONG MalformedTLP:1;
  6245. ULONG ECRCError:1;
  6246. ULONG UnsupportedRequestError:1;
  6247. ULONG Reserved3:11;
  6248. } DUMMYSTRUCTNAME;
  6249. ULONG AsULONG;
  6250. } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
  6251. typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
  6252. _ANONYMOUS_STRUCT struct {
  6253. ULONG Undefined:1;
  6254. ULONG Reserved1:3;
  6255. ULONG DataLinkProtocolError:1;
  6256. ULONG SurpriseDownError:1;
  6257. ULONG Reserved2:6;
  6258. ULONG PoisonedTLP:1;
  6259. ULONG FlowControlProtocolError:1;
  6260. ULONG CompletionTimeout:1;
  6261. ULONG CompleterAbort:1;
  6262. ULONG UnexpectedCompletion:1;
  6263. ULONG ReceiverOverflow:1;
  6264. ULONG MalformedTLP:1;
  6265. ULONG ECRCError:1;
  6266. ULONG UnsupportedRequestError:1;
  6267. ULONG Reserved3:11;
  6268. } DUMMYSTRUCTNAME;
  6269. ULONG AsULONG;
  6270. } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
  6271. typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
  6272. _ANONYMOUS_STRUCT struct {
  6273. ULONG Undefined:1;
  6274. ULONG Reserved1:3;
  6275. ULONG DataLinkProtocolError:1;
  6276. ULONG SurpriseDownError:1;
  6277. ULONG Reserved2:6;
  6278. ULONG PoisonedTLP:1;
  6279. ULONG FlowControlProtocolError:1;
  6280. ULONG CompletionTimeout:1;
  6281. ULONG CompleterAbort:1;
  6282. ULONG UnexpectedCompletion:1;
  6283. ULONG ReceiverOverflow:1;
  6284. ULONG MalformedTLP:1;
  6285. ULONG ECRCError:1;
  6286. ULONG UnsupportedRequestError:1;
  6287. ULONG Reserved3:11;
  6288. } DUMMYSTRUCTNAME;
  6289. ULONG AsULONG;
  6290. } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
  6291. typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
  6292. _ANONYMOUS_STRUCT struct {
  6293. ULONG ReceiverError:1;
  6294. ULONG Reserved1:5;
  6295. ULONG BadTLP:1;
  6296. ULONG BadDLLP:1;
  6297. ULONG ReplayNumRollover:1;
  6298. ULONG Reserved2:3;
  6299. ULONG ReplayTimerTimeout:1;
  6300. ULONG AdvisoryNonFatalError:1;
  6301. ULONG Reserved3:18;
  6302. } DUMMYSTRUCTNAME;
  6303. ULONG AsULONG;
  6304. } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
  6305. typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
  6306. _ANONYMOUS_STRUCT struct {
  6307. ULONG ReceiverError:1;
  6308. ULONG Reserved1:5;
  6309. ULONG BadTLP:1;
  6310. ULONG BadDLLP:1;
  6311. ULONG ReplayNumRollover:1;
  6312. ULONG Reserved2:3;
  6313. ULONG ReplayTimerTimeout:1;
  6314. ULONG AdvisoryNonFatalError:1;
  6315. ULONG Reserved3:18;
  6316. } DUMMYSTRUCTNAME;
  6317. ULONG AsULONG;
  6318. } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
  6319. typedef union _PCI_EXPRESS_AER_CAPABILITIES {
  6320. _ANONYMOUS_STRUCT struct {
  6321. ULONG FirstErrorPointer:5;
  6322. ULONG ECRCGenerationCapable:1;
  6323. ULONG ECRCGenerationEnable:1;
  6324. ULONG ECRCCheckCapable:1;
  6325. ULONG ECRCCheckEnable:1;
  6326. ULONG Reserved:23;
  6327. } DUMMYSTRUCTNAME;
  6328. ULONG AsULONG;
  6329. } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
  6330. typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
  6331. _ANONYMOUS_STRUCT struct {
  6332. ULONG CorrectableErrorReportingEnable:1;
  6333. ULONG NonFatalErrorReportingEnable:1;
  6334. ULONG FatalErrorReportingEnable:1;
  6335. ULONG Reserved:29;
  6336. } DUMMYSTRUCTNAME;
  6337. ULONG AsULONG;
  6338. } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
  6339. typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
  6340. _ANONYMOUS_STRUCT struct {
  6341. ULONG CorrectableErrorReceived:1;
  6342. ULONG MultipleCorrectableErrorsReceived:1;
  6343. ULONG UncorrectableErrorReceived:1;
  6344. ULONG MultipleUncorrectableErrorsReceived:1;
  6345. ULONG FirstUncorrectableFatal:1;
  6346. ULONG NonFatalErrorMessagesReceived:1;
  6347. ULONG FatalErrorMessagesReceived:1;
  6348. ULONG Reserved:20;
  6349. ULONG AdvancedErrorInterruptMessageNumber:5;
  6350. } DUMMYSTRUCTNAME;
  6351. ULONG AsULONG;
  6352. } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
  6353. typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
  6354. _ANONYMOUS_STRUCT struct {
  6355. USHORT CorrectableSourceIdFun:3;
  6356. USHORT CorrectableSourceIdDev:5;
  6357. USHORT CorrectableSourceIdBus:8;
  6358. USHORT UncorrectableSourceIdFun:3;
  6359. USHORT UncorrectableSourceIdDev:5;
  6360. USHORT UncorrectableSourceIdBus:8;
  6361. } DUMMYSTRUCTNAME;
  6362. ULONG AsULONG;
  6363. } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
  6364. typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
  6365. _ANONYMOUS_STRUCT struct {
  6366. ULONG TargetAbortOnSplitCompletion:1;
  6367. ULONG MasterAbortOnSplitCompletion:1;
  6368. ULONG ReceivedTargetAbort:1;
  6369. ULONG ReceivedMasterAbort:1;
  6370. ULONG RsvdZ:1;
  6371. ULONG UnexpectedSplitCompletionError:1;
  6372. ULONG UncorrectableSplitCompletion:1;
  6373. ULONG UncorrectableDataError:1;
  6374. ULONG UncorrectableAttributeError:1;
  6375. ULONG UncorrectableAddressError:1;
  6376. ULONG DelayedTransactionDiscardTimerExpired:1;
  6377. ULONG PERRAsserted:1;
  6378. ULONG SERRAsserted:1;
  6379. ULONG InternalBridgeError:1;
  6380. ULONG Reserved:18;
  6381. } DUMMYSTRUCTNAME;
  6382. ULONG AsULONG;
  6383. } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
  6384. typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
  6385. _ANONYMOUS_STRUCT struct {
  6386. ULONG TargetAbortOnSplitCompletion:1;
  6387. ULONG MasterAbortOnSplitCompletion:1;
  6388. ULONG ReceivedTargetAbort:1;
  6389. ULONG ReceivedMasterAbort:1;
  6390. ULONG RsvdZ:1;
  6391. ULONG UnexpectedSplitCompletionError:1;
  6392. ULONG UncorrectableSplitCompletion:1;
  6393. ULONG UncorrectableDataError:1;
  6394. ULONG UncorrectableAttributeError:1;
  6395. ULONG UncorrectableAddressError:1;
  6396. ULONG DelayedTransactionDiscardTimerExpired:1;
  6397. ULONG PERRAsserted:1;
  6398. ULONG SERRAsserted:1;
  6399. ULONG InternalBridgeError:1;
  6400. ULONG Reserved:18;
  6401. } DUMMYSTRUCTNAME;
  6402. ULONG AsULONG;
  6403. } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
  6404. typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
  6405. _ANONYMOUS_STRUCT struct {
  6406. ULONG TargetAbortOnSplitCompletion:1;
  6407. ULONG MasterAbortOnSplitCompletion:1;
  6408. ULONG ReceivedTargetAbort:1;
  6409. ULONG ReceivedMasterAbort:1;
  6410. ULONG RsvdZ:1;
  6411. ULONG UnexpectedSplitCompletionError:1;
  6412. ULONG UncorrectableSplitCompletion:1;
  6413. ULONG UncorrectableDataError:1;
  6414. ULONG UncorrectableAttributeError:1;
  6415. ULONG UncorrectableAddressError:1;
  6416. ULONG DelayedTransactionDiscardTimerExpired:1;
  6417. ULONG PERRAsserted:1;
  6418. ULONG SERRAsserted:1;
  6419. ULONG InternalBridgeError:1;
  6420. ULONG Reserved:18;
  6421. } DUMMYSTRUCTNAME;
  6422. ULONG AsULONG;
  6423. } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
  6424. typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
  6425. _ANONYMOUS_STRUCT struct {
  6426. ULONG SecondaryUncorrectableFirstErrorPtr:5;
  6427. ULONG Reserved:27;
  6428. } DUMMYSTRUCTNAME;
  6429. ULONG AsULONG;
  6430. } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
  6431. #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
  6432. #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
  6433. #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
  6434. #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
  6435. (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
  6436. ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
  6437. ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
  6438. typedef struct _PCI_EXPRESS_AER_CAPABILITY {
  6439. PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
  6440. PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
  6441. PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
  6442. PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
  6443. PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
  6444. PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
  6445. PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
  6446. ULONG HeaderLog[4];
  6447. PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
  6448. PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
  6449. PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
  6450. PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
  6451. ULONG SecHeaderLog[4];
  6452. } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
  6453. typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
  6454. PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
  6455. PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
  6456. PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
  6457. PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
  6458. PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
  6459. PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
  6460. PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
  6461. ULONG HeaderLog[4];
  6462. PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
  6463. PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
  6464. PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
  6465. } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
  6466. typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
  6467. PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
  6468. PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
  6469. PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
  6470. PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
  6471. PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
  6472. PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
  6473. PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
  6474. ULONG HeaderLog[4];
  6475. PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
  6476. PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
  6477. PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
  6478. PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
  6479. ULONG SecHeaderLog[4];
  6480. } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
  6481. typedef union _PCI_EXPRESS_SRIOV_CAPS {
  6482. _ANONYMOUS_STRUCT struct {
  6483. ULONG VFMigrationCapable:1;
  6484. ULONG Reserved1:20;
  6485. ULONG VFMigrationInterruptNumber:11;
  6486. } DUMMYSTRUCTNAME;
  6487. ULONG AsULONG;
  6488. } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
  6489. typedef union _PCI_EXPRESS_SRIOV_CONTROL {
  6490. _ANONYMOUS_STRUCT struct {
  6491. USHORT VFEnable:1;
  6492. USHORT VFMigrationEnable:1;
  6493. USHORT VFMigrationInterruptEnable:1;
  6494. USHORT VFMemorySpaceEnable:1;
  6495. USHORT ARICapableHierarchy:1;
  6496. USHORT Reserved1:11;
  6497. } DUMMYSTRUCTNAME;
  6498. USHORT AsUSHORT;
  6499. } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
  6500. typedef union _PCI_EXPRESS_SRIOV_STATUS {
  6501. _ANONYMOUS_STRUCT struct {
  6502. USHORT VFMigrationStatus:1;
  6503. USHORT Reserved1:15;
  6504. } DUMMYSTRUCTNAME;
  6505. USHORT AsUSHORT;
  6506. } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
  6507. typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
  6508. _ANONYMOUS_STRUCT struct {
  6509. ULONG VFMigrationStateBIR:3;
  6510. ULONG VFMigrationStateOffset:29;
  6511. } DUMMYSTRUCTNAME;
  6512. ULONG AsULONG;
  6513. } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
  6514. typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
  6515. PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
  6516. PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
  6517. PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
  6518. PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
  6519. USHORT InitialVFs;
  6520. USHORT TotalVFs;
  6521. USHORT NumVFs;
  6522. UCHAR FunctionDependencyLink;
  6523. UCHAR RsvdP1;
  6524. USHORT FirstVFOffset;
  6525. USHORT VFStride;
  6526. USHORT RsvdP2;
  6527. USHORT VFDeviceId;
  6528. ULONG SupportedPageSizes;
  6529. ULONG SystemPageSize;
  6530. ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
  6531. PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
  6532. } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
  6533. /* PCI device classes */
  6534. #define PCI_CLASS_PRE_20 0x00
  6535. #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
  6536. #define PCI_CLASS_NETWORK_CTLR 0x02
  6537. #define PCI_CLASS_DISPLAY_CTLR 0x03
  6538. #define PCI_CLASS_MULTIMEDIA_DEV 0x04
  6539. #define PCI_CLASS_MEMORY_CTLR 0x05
  6540. #define PCI_CLASS_BRIDGE_DEV 0x06
  6541. #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
  6542. #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
  6543. #define PCI_CLASS_INPUT_DEV 0x09
  6544. #define PCI_CLASS_DOCKING_STATION 0x0a
  6545. #define PCI_CLASS_PROCESSOR 0x0b
  6546. #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
  6547. #define PCI_CLASS_WIRELESS_CTLR 0x0d
  6548. #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
  6549. #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
  6550. #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
  6551. #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
  6552. #define PCI_CLASS_NOT_DEFINED 0xff
  6553. /* PCI device subclasses for class 0 */
  6554. #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
  6555. #define PCI_SUBCLASS_PRE_20_VGA 0x01
  6556. /* PCI device subclasses for class 1 (mass storage controllers)*/
  6557. #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
  6558. #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
  6559. #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
  6560. #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
  6561. #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
  6562. #define PCI_SUBCLASS_MSC_OTHER 0x80
  6563. /* PCI device subclasses for class 2 (network controllers)*/
  6564. #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
  6565. #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
  6566. #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
  6567. #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
  6568. #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
  6569. #define PCI_SUBCLASS_NET_OTHER 0x80
  6570. /* PCI device subclasses for class 3 (display controllers)*/
  6571. #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
  6572. #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
  6573. #define PCI_SUBCLASS_VID_3D_CTLR 0x02
  6574. #define PCI_SUBCLASS_VID_OTHER 0x80
  6575. /* PCI device subclasses for class 4 (multimedia device)*/
  6576. #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
  6577. #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
  6578. #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
  6579. #define PCI_SUBCLASS_MM_OTHER 0x80
  6580. /* PCI device subclasses for class 5 (memory controller)*/
  6581. #define PCI_SUBCLASS_MEM_RAM 0x00
  6582. #define PCI_SUBCLASS_MEM_FLASH 0x01
  6583. #define PCI_SUBCLASS_MEM_OTHER 0x80
  6584. /* PCI device subclasses for class 6 (bridge device)*/
  6585. #define PCI_SUBCLASS_BR_HOST 0x00
  6586. #define PCI_SUBCLASS_BR_ISA 0x01
  6587. #define PCI_SUBCLASS_BR_EISA 0x02
  6588. #define PCI_SUBCLASS_BR_MCA 0x03
  6589. #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
  6590. #define PCI_SUBCLASS_BR_PCMCIA 0x05
  6591. #define PCI_SUBCLASS_BR_NUBUS 0x06
  6592. #define PCI_SUBCLASS_BR_CARDBUS 0x07
  6593. #define PCI_SUBCLASS_BR_RACEWAY 0x08
  6594. #define PCI_SUBCLASS_BR_OTHER 0x80
  6595. #define PCI_SUBCLASS_COM_SERIAL 0x00
  6596. #define PCI_SUBCLASS_COM_PARALLEL 0x01
  6597. #define PCI_SUBCLASS_COM_MULTIPORT 0x02
  6598. #define PCI_SUBCLASS_COM_MODEM 0x03
  6599. #define PCI_SUBCLASS_COM_OTHER 0x80
  6600. #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
  6601. #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
  6602. #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
  6603. #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
  6604. #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
  6605. #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
  6606. #define PCI_SUBCLASS_SYS_OTHER 0x80
  6607. #define PCI_SUBCLASS_INP_KEYBOARD 0x00
  6608. #define PCI_SUBCLASS_INP_DIGITIZER 0x01
  6609. #define PCI_SUBCLASS_INP_MOUSE 0x02
  6610. #define PCI_SUBCLASS_INP_SCANNER 0x03
  6611. #define PCI_SUBCLASS_INP_GAMEPORT 0x04
  6612. #define PCI_SUBCLASS_INP_OTHER 0x80
  6613. #define PCI_SUBCLASS_DOC_GENERIC 0x00
  6614. #define PCI_SUBCLASS_DOC_OTHER 0x80
  6615. #define PCI_SUBCLASS_PROC_386 0x00
  6616. #define PCI_SUBCLASS_PROC_486 0x01
  6617. #define PCI_SUBCLASS_PROC_PENTIUM 0x02
  6618. #define PCI_SUBCLASS_PROC_ALPHA 0x10
  6619. #define PCI_SUBCLASS_PROC_POWERPC 0x20
  6620. #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
  6621. /* PCI device subclasses for class C (serial bus controller)*/
  6622. #define PCI_SUBCLASS_SB_IEEE1394 0x00
  6623. #define PCI_SUBCLASS_SB_ACCESS 0x01
  6624. #define PCI_SUBCLASS_SB_SSA 0x02
  6625. #define PCI_SUBCLASS_SB_USB 0x03
  6626. #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
  6627. #define PCI_SUBCLASS_SB_SMBUS 0x05
  6628. #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
  6629. #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
  6630. #define PCI_SUBCLASS_WIRELESS_RF 0x10
  6631. #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
  6632. #define PCI_SUBCLASS_INTIO_I2O 0x00
  6633. #define PCI_SUBCLASS_SAT_TV 0x01
  6634. #define PCI_SUBCLASS_SAT_AUDIO 0x02
  6635. #define PCI_SUBCLASS_SAT_VOICE 0x03
  6636. #define PCI_SUBCLASS_SAT_DATA 0x04
  6637. #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
  6638. #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
  6639. #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
  6640. #define PCI_SUBCLASS_DASP_DPIO 0x00
  6641. #define PCI_SUBCLASS_DASP_OTHER 0x80
  6642. #define PCI_ADDRESS_IO_SPACE 0x00000001
  6643. #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
  6644. #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
  6645. #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
  6646. #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
  6647. #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
  6648. #define PCI_TYPE_32BIT 0
  6649. #define PCI_TYPE_20BIT 2
  6650. #define PCI_TYPE_64BIT 4
  6651. #define PCI_ROMADDRESS_ENABLED 0x00000001
  6652. #endif /* _PCI_X_ */
  6653. #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
  6654. typedef NTSTATUS
  6655. (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
  6656. IN OUT PVOID Context);
  6657. typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
  6658. typedef NTSTATUS
  6659. (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
  6660. IN OUT PVOID Context);
  6661. typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
  6662. typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
  6663. USHORT Size;
  6664. USHORT Version;
  6665. PVOID Context;
  6666. PINTERFACE_REFERENCE InterfaceReference;
  6667. PINTERFACE_DEREFERENCE InterfaceDereference;
  6668. PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
  6669. PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
  6670. } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
  6671. #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
  6672. typedef ULONG
  6673. (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
  6674. IN PVOID Context,
  6675. OUT PVOID Buffer,
  6676. IN ULONG Offset,
  6677. IN ULONG Length);
  6678. typedef ULONG
  6679. (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
  6680. IN PVOID Context,
  6681. IN PVOID Buffer,
  6682. IN ULONG Offset,
  6683. IN ULONG Length);
  6684. typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
  6685. USHORT Size;
  6686. USHORT Version;
  6687. PVOID Context;
  6688. PINTERFACE_REFERENCE InterfaceReference;
  6689. PINTERFACE_DEREFERENCE InterfaceDereference;
  6690. PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
  6691. PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
  6692. } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
  6693. #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
  6694. typedef NTSTATUS
  6695. (NTAPI PCI_MSIX_SET_ENTRY)(
  6696. IN PVOID Context,
  6697. IN ULONG TableEntry,
  6698. IN ULONG MessageNumber);
  6699. typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
  6700. typedef NTSTATUS
  6701. (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
  6702. IN PVOID Context,
  6703. IN ULONG TableEntry);
  6704. typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
  6705. typedef NTSTATUS
  6706. (NTAPI PCI_MSIX_GET_ENTRY)(
  6707. IN PVOID Context,
  6708. IN ULONG TableEntry,
  6709. OUT PULONG MessageNumber,
  6710. OUT PBOOLEAN Masked);
  6711. typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
  6712. typedef NTSTATUS
  6713. (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
  6714. IN PVOID Context,
  6715. OUT PULONG TableSize);
  6716. typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
  6717. typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
  6718. USHORT Size;
  6719. USHORT Version;
  6720. PVOID Context;
  6721. PINTERFACE_REFERENCE InterfaceReference;
  6722. PINTERFACE_DEREFERENCE InterfaceDereference;
  6723. PPCI_MSIX_SET_ENTRY SetTableEntry;
  6724. PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
  6725. PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
  6726. PPCI_MSIX_GET_ENTRY GetTableEntry;
  6727. PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
  6728. } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
  6729. #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
  6730. RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
  6731. /******************************************************************************
  6732. * Object Manager Types *
  6733. ******************************************************************************/
  6734. #define MAXIMUM_FILENAME_LENGTH 256
  6735. #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
  6736. #define OBJECT_TYPE_CREATE 0x0001
  6737. #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
  6738. #define DIRECTORY_QUERY 0x0001
  6739. #define DIRECTORY_TRAVERSE 0x0002
  6740. #define DIRECTORY_CREATE_OBJECT 0x0004
  6741. #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
  6742. #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
  6743. #define SYMBOLIC_LINK_QUERY 0x0001
  6744. #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
  6745. #define DUPLICATE_CLOSE_SOURCE 0x00000001
  6746. #define DUPLICATE_SAME_ACCESS 0x00000002
  6747. #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
  6748. #define OB_FLT_REGISTRATION_VERSION_0100 0x0100
  6749. #define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
  6750. typedef ULONG OB_OPERATION;
  6751. #define OB_OPERATION_HANDLE_CREATE 0x00000001
  6752. #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
  6753. typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
  6754. IN OUT ACCESS_MASK DesiredAccess;
  6755. IN ACCESS_MASK OriginalDesiredAccess;
  6756. } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;
  6757. typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION {
  6758. IN OUT ACCESS_MASK DesiredAccess;
  6759. IN ACCESS_MASK OriginalDesiredAccess;
  6760. IN PVOID SourceProcess;
  6761. IN PVOID TargetProcess;
  6762. } OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION;
  6763. typedef union _OB_PRE_OPERATION_PARAMETERS {
  6764. IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;
  6765. IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
  6766. } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;
  6767. typedef struct _OB_PRE_OPERATION_INFORMATION {
  6768. IN OB_OPERATION Operation;
  6769. _ANONYMOUS_UNION union {
  6770. IN ULONG Flags;
  6771. _ANONYMOUS_STRUCT struct {
  6772. IN ULONG KernelHandle:1;
  6773. IN ULONG Reserved:31;
  6774. } DUMMYSTRUCTNAME;
  6775. } DUMMYUNIONNAME;
  6776. IN PVOID Object;
  6777. IN POBJECT_TYPE ObjectType;
  6778. OUT PVOID CallContext;
  6779. IN POB_PRE_OPERATION_PARAMETERS Parameters;
  6780. } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;
  6781. typedef struct _OB_POST_CREATE_HANDLE_INFORMATION {
  6782. IN ACCESS_MASK GrantedAccess;
  6783. } OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;
  6784. typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION {
  6785. IN ACCESS_MASK GrantedAccess;
  6786. } OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION;
  6787. typedef union _OB_POST_OPERATION_PARAMETERS {
  6788. IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation;
  6789. IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
  6790. } OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
  6791. typedef struct _OB_POST_OPERATION_INFORMATION {
  6792. IN OB_OPERATION Operation;
  6793. _ANONYMOUS_UNION union {
  6794. IN ULONG Flags;
  6795. _ANONYMOUS_STRUCT struct {
  6796. IN ULONG KernelHandle:1;
  6797. IN ULONG Reserved:31;
  6798. } DUMMYSTRUCTNAME;
  6799. } DUMMYUNIONNAME;
  6800. IN PVOID Object;
  6801. IN POBJECT_TYPE ObjectType;
  6802. IN PVOID CallContext;
  6803. IN NTSTATUS ReturnStatus;
  6804. IN POB_POST_OPERATION_PARAMETERS Parameters;
  6805. } OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION;
  6806. typedef enum _OB_PREOP_CALLBACK_STATUS {
  6807. OB_PREOP_SUCCESS
  6808. } OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS;
  6809. typedef OB_PREOP_CALLBACK_STATUS
  6810. (NTAPI *POB_PRE_OPERATION_CALLBACK)(
  6811. IN PVOID RegistrationContext,
  6812. IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation);
  6813. typedef VOID
  6814. (NTAPI *POB_POST_OPERATION_CALLBACK)(
  6815. IN PVOID RegistrationContext,
  6816. IN POB_POST_OPERATION_INFORMATION OperationInformation);
  6817. typedef struct _OB_OPERATION_REGISTRATION {
  6818. IN POBJECT_TYPE *ObjectType;
  6819. IN OB_OPERATION Operations;
  6820. IN POB_PRE_OPERATION_CALLBACK PreOperation;
  6821. IN POB_POST_OPERATION_CALLBACK PostOperation;
  6822. } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
  6823. typedef struct _OB_CALLBACK_REGISTRATION {
  6824. IN USHORT Version;
  6825. IN USHORT OperationRegistrationCount;
  6826. IN UNICODE_STRING Altitude;
  6827. IN PVOID RegistrationContext;
  6828. IN OB_OPERATION_REGISTRATION *OperationRegistration;
  6829. } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
  6830. typedef struct _OBJECT_NAME_INFORMATION {
  6831. UNICODE_STRING Name;
  6832. } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
  6833. /* Exported object types */
  6834. extern POBJECT_TYPE NTSYSAPI *CmKeyObjectType;
  6835. extern POBJECT_TYPE NTSYSAPI *ExEventObjectType;
  6836. extern POBJECT_TYPE NTSYSAPI *ExSemaphoreObjectType;
  6837. extern POBJECT_TYPE NTSYSAPI *IoFileObjectType;
  6838. extern POBJECT_TYPE NTSYSAPI *PsThreadType;
  6839. extern POBJECT_TYPE NTSYSAPI *SeTokenObjectType;
  6840. extern POBJECT_TYPE NTSYSAPI *PsProcessType;
  6841. extern POBJECT_TYPE NTSYSAPI *TmEnlistmentObjectType;
  6842. extern POBJECT_TYPE NTSYSAPI *TmResourceManagerObjectType;
  6843. extern POBJECT_TYPE NTSYSAPI *TmTransactionManagerObjectType;
  6844. extern POBJECT_TYPE NTSYSAPI *TmTransactionObjectType;
  6845. /******************************************************************************
  6846. * Process Manager Types *
  6847. ******************************************************************************/
  6848. #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
  6849. #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
  6850. #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
  6851. #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
  6852. #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
  6853. /* Thread Access Rights */
  6854. #define THREAD_TERMINATE 0x0001
  6855. #define THREAD_SUSPEND_RESUME 0x0002
  6856. #define THREAD_ALERT 0x0004
  6857. #define THREAD_GET_CONTEXT 0x0008
  6858. #define THREAD_SET_CONTEXT 0x0010
  6859. #define THREAD_SET_INFORMATION 0x0020
  6860. #define THREAD_SET_LIMITED_INFORMATION 0x0400
  6861. #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
  6862. #define PROCESS_DUP_HANDLE (0x0040)
  6863. #if (NTDDI_VERSION >= NTDDI_VISTA)
  6864. #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
  6865. #else
  6866. #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
  6867. #endif
  6868. #if (NTDDI_VERSION >= NTDDI_VISTA)
  6869. #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
  6870. #else
  6871. #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
  6872. #endif
  6873. #define LOW_PRIORITY 0
  6874. #define LOW_REALTIME_PRIORITY 16
  6875. #define HIGH_PRIORITY 31
  6876. #define MAXIMUM_PRIORITY 32
  6877. /******************************************************************************
  6878. * WMI Library Support Types *
  6879. ******************************************************************************/
  6880. #ifdef RUN_WPP
  6881. #include <evntrace.h>
  6882. #include <stdarg.h>
  6883. #endif
  6884. #ifndef _TRACEHANDLE_DEFINED
  6885. #define _TRACEHANDLE_DEFINED
  6886. typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
  6887. #endif
  6888. #ifndef TRACE_INFORMATION_CLASS_DEFINE
  6889. typedef struct _ETW_TRACE_SESSION_SETTINGS {
  6890. ULONG Version;
  6891. ULONG BufferSize;
  6892. ULONG MinimumBuffers;
  6893. ULONG MaximumBuffers;
  6894. ULONG LoggerMode;
  6895. ULONG FlushTimer;
  6896. ULONG FlushThreshold;
  6897. ULONG ClockType;
  6898. } ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS;
  6899. typedef enum _TRACE_INFORMATION_CLASS {
  6900. TraceIdClass,
  6901. TraceHandleClass,
  6902. TraceEnableFlagsClass,
  6903. TraceEnableLevelClass,
  6904. GlobalLoggerHandleClass,
  6905. EventLoggerHandleClass,
  6906. AllLoggerHandlesClass,
  6907. TraceHandleByNameClass,
  6908. LoggerEventsLostClass,
  6909. TraceSessionSettingsClass,
  6910. LoggerEventsLoggedClass,
  6911. DiskIoNotifyRoutinesClass,
  6912. TraceInformationClassReserved1,
  6913. FltIoNotifyRoutinesClass,
  6914. TraceInformationClassReserved2,
  6915. WdfNotifyRoutinesClass,
  6916. MaxTraceInformationClass
  6917. } TRACE_INFORMATION_CLASS;
  6918. #endif /* TRACE_INFORMATION_CLASS_DEFINE */
  6919. #ifndef _ETW_KM_
  6920. #define _ETW_KM_
  6921. #endif
  6922. #include <evntprov.h>
  6923. typedef VOID
  6924. (NTAPI *PETWENABLECALLBACK)(
  6925. IN LPCGUID SourceId,
  6926. IN ULONG ControlCode,
  6927. IN UCHAR Level,
  6928. IN ULONGLONG MatchAnyKeyword,
  6929. IN ULONGLONG MatchAllKeyword,
  6930. IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL,
  6931. IN OUT PVOID CallbackContext OPTIONAL);
  6932. #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001
  6933. #if defined(_M_IX86)
  6934. /** Kernel definitions for x86 **/
  6935. /* Interrupt request levels */
  6936. #define PASSIVE_LEVEL 0
  6937. #define LOW_LEVEL 0
  6938. #define APC_LEVEL 1
  6939. #define DISPATCH_LEVEL 2
  6940. #define CMCI_LEVEL 5
  6941. #define PROFILE_LEVEL 27
  6942. #define CLOCK1_LEVEL 28
  6943. #define CLOCK2_LEVEL 28
  6944. #define IPI_LEVEL 29
  6945. #define POWER_LEVEL 30
  6946. #define HIGH_LEVEL 31
  6947. #define CLOCK_LEVEL CLOCK2_LEVEL
  6948. #define KIP0PCRADDRESS 0xffdff000
  6949. #define KI_USER_SHARED_DATA 0xffdf0000
  6950. #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
  6951. #define PAGE_SIZE 0x1000
  6952. #define PAGE_SHIFT 12L
  6953. #define KeGetDcacheFillSize() 1L
  6954. #define EFLAG_SIGN 0x8000
  6955. #define EFLAG_ZERO 0x4000
  6956. #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
  6957. #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
  6958. #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
  6959. #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
  6960. typedef struct _KFLOATING_SAVE {
  6961. ULONG ControlWord;
  6962. ULONG StatusWord;
  6963. ULONG ErrorOffset;
  6964. ULONG ErrorSelector;
  6965. ULONG DataOffset;
  6966. ULONG DataSelector;
  6967. ULONG Cr0NpxState;
  6968. ULONG Spare1;
  6969. } KFLOATING_SAVE, *PKFLOATING_SAVE;
  6970. extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
  6971. #define YieldProcessor _mm_pause
  6972. FORCEINLINE
  6973. VOID
  6974. KeMemoryBarrier(VOID)
  6975. {
  6976. volatile LONG Barrier;
  6977. #if defined(__GNUC__)
  6978. __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
  6979. #elif defined(_MSC_VER)
  6980. __asm xchg [Barrier], eax
  6981. #endif
  6982. }
  6983. NTHALAPI
  6984. KIRQL
  6985. NTAPI
  6986. KeGetCurrentIrql(VOID);
  6987. NTHALAPI
  6988. VOID
  6989. FASTCALL
  6990. KfLowerIrql(
  6991. IN KIRQL NewIrql);
  6992. #define KeLowerIrql(a) KfLowerIrql(a)
  6993. NTHALAPI
  6994. KIRQL
  6995. FASTCALL
  6996. KfRaiseIrql(
  6997. IN KIRQL NewIrql);
  6998. #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
  6999. NTHALAPI
  7000. KIRQL
  7001. NTAPI
  7002. KeRaiseIrqlToDpcLevel(VOID);
  7003. NTHALAPI
  7004. KIRQL
  7005. NTAPI
  7006. KeRaiseIrqlToSynchLevel(VOID);
  7007. NTHALAPI
  7008. KIRQL
  7009. FASTCALL
  7010. KfAcquireSpinLock(
  7011. IN OUT PKSPIN_LOCK SpinLock);
  7012. #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
  7013. NTHALAPI
  7014. VOID
  7015. FASTCALL
  7016. KfReleaseSpinLock(
  7017. IN OUT PKSPIN_LOCK SpinLock,
  7018. IN KIRQL NewIrql);
  7019. #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
  7020. NTKERNELAPI
  7021. VOID
  7022. FASTCALL
  7023. KefAcquireSpinLockAtDpcLevel(
  7024. IN OUT PKSPIN_LOCK SpinLock);
  7025. #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
  7026. NTKERNELAPI
  7027. VOID
  7028. FASTCALL
  7029. KefReleaseSpinLockFromDpcLevel(
  7030. IN OUT PKSPIN_LOCK SpinLock);
  7031. #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
  7032. NTSYSAPI
  7033. PKTHREAD
  7034. NTAPI
  7035. KeGetCurrentThread(VOID);
  7036. NTKERNELAPI
  7037. NTSTATUS
  7038. NTAPI
  7039. KeSaveFloatingPointState(
  7040. OUT PKFLOATING_SAVE FloatSave);
  7041. NTKERNELAPI
  7042. NTSTATUS
  7043. NTAPI
  7044. KeRestoreFloatingPointState(
  7045. IN PKFLOATING_SAVE FloatSave);
  7046. /* VOID
  7047. * KeFlushIoBuffers(
  7048. * IN PMDL Mdl,
  7049. * IN BOOLEAN ReadOperation,
  7050. * IN BOOLEAN DmaOperation)
  7051. */
  7052. #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
  7053. /* x86 and x64 performs a 0x2C interrupt */
  7054. #define DbgRaiseAssertionFailure __int2c
  7055. FORCEINLINE
  7056. VOID
  7057. _KeQueryTickCount(
  7058. OUT PLARGE_INTEGER CurrentCount)
  7059. {
  7060. for (;;) {
  7061. #ifdef NONAMELESSUNION
  7062. CurrentCount->s.HighPart = KeTickCount.High1Time;
  7063. CurrentCount->s.LowPart = KeTickCount.LowPart;
  7064. if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
  7065. #else
  7066. CurrentCount->HighPart = KeTickCount.High1Time;
  7067. CurrentCount->LowPart = KeTickCount.LowPart;
  7068. if (CurrentCount->HighPart == KeTickCount.High2Time) break;
  7069. #endif
  7070. YieldProcessor();
  7071. }
  7072. }
  7073. #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
  7074. #elif defined(_M_AMD64)
  7075. /** Kernel definitions for AMD64 **/
  7076. /* Interrupt request levels */
  7077. #define PASSIVE_LEVEL 0
  7078. #define LOW_LEVEL 0
  7079. #define APC_LEVEL 1
  7080. #define DISPATCH_LEVEL 2
  7081. #define CMCI_LEVEL 5
  7082. #define CLOCK_LEVEL 13
  7083. #define IPI_LEVEL 14
  7084. #define DRS_LEVEL 14
  7085. #define POWER_LEVEL 14
  7086. #define PROFILE_LEVEL 15
  7087. #define HIGH_LEVEL 15
  7088. #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
  7089. #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
  7090. #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
  7091. #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
  7092. #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
  7093. #define PAGE_SIZE 0x1000
  7094. #define PAGE_SHIFT 12L
  7095. #define EFLAG_SIGN 0x8000
  7096. #define EFLAG_ZERO 0x4000
  7097. #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
  7098. typedef struct _KFLOATING_SAVE {
  7099. ULONG Dummy;
  7100. } KFLOATING_SAVE, *PKFLOATING_SAVE;
  7101. typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
  7102. #define KeQueryInterruptTime() \
  7103. (*(volatile ULONG64*)SharedInterruptTime)
  7104. #define KeQuerySystemTime(CurrentCount) \
  7105. *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
  7106. #define KeQueryTickCount(CurrentCount) \
  7107. *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
  7108. #define KeGetDcacheFillSize() 1L
  7109. #define YieldProcessor _mm_pause
  7110. FORCEINLINE
  7111. KIRQL
  7112. KeGetCurrentIrql(VOID)
  7113. {
  7114. return (KIRQL)__readcr8();
  7115. }
  7116. FORCEINLINE
  7117. VOID
  7118. KeLowerIrql(IN KIRQL NewIrql)
  7119. {
  7120. //ASSERT(KeGetCurrentIrql() >= NewIrql);
  7121. __writecr8(NewIrql);
  7122. }
  7123. FORCEINLINE
  7124. KIRQL
  7125. KfRaiseIrql(IN KIRQL NewIrql)
  7126. {
  7127. KIRQL OldIrql;
  7128. OldIrql = (KIRQL)__readcr8();
  7129. //ASSERT(OldIrql <= NewIrql);
  7130. __writecr8(NewIrql);
  7131. return OldIrql;
  7132. }
  7133. #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
  7134. FORCEINLINE
  7135. KIRQL
  7136. KeRaiseIrqlToDpcLevel(VOID)
  7137. {
  7138. return KfRaiseIrql(DISPATCH_LEVEL);
  7139. }
  7140. FORCEINLINE
  7141. KIRQL
  7142. KeRaiseIrqlToSynchLevel(VOID)
  7143. {
  7144. return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
  7145. }
  7146. FORCEINLINE
  7147. PKTHREAD
  7148. KeGetCurrentThread(VOID)
  7149. {
  7150. return (struct _KTHREAD *)__readgsqword(0x188);
  7151. }
  7152. /* VOID
  7153. * KeFlushIoBuffers(
  7154. * IN PMDL Mdl,
  7155. * IN BOOLEAN ReadOperation,
  7156. * IN BOOLEAN DmaOperation)
  7157. */
  7158. #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
  7159. /* x86 and x64 performs a 0x2C interrupt */
  7160. #define DbgRaiseAssertionFailure __int2c
  7161. #elif defined(_M_IA64)
  7162. /** Kernel definitions for IA64 **/
  7163. /* Interrupt request levels */
  7164. #define PASSIVE_LEVEL 0
  7165. #define LOW_LEVEL 0
  7166. #define APC_LEVEL 1
  7167. #define DISPATCH_LEVEL 2
  7168. #define CMC_LEVEL 3
  7169. #define DEVICE_LEVEL_BASE 4
  7170. #define PC_LEVEL 12
  7171. #define IPI_LEVEL 14
  7172. #define DRS_LEVEL 14
  7173. #define CLOCK_LEVEL 13
  7174. #define POWER_LEVEL 15
  7175. #define PROFILE_LEVEL 15
  7176. #define HIGH_LEVEL 15
  7177. #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
  7178. extern volatile LARGE_INTEGER KeTickCount;
  7179. #define PAUSE_PROCESSOR __yield();
  7180. FORCEINLINE
  7181. VOID
  7182. KeFlushWriteBuffer(VOID)
  7183. {
  7184. __mf ();
  7185. return;
  7186. }
  7187. NTSYSAPI
  7188. PKTHREAD
  7189. NTAPI
  7190. KeGetCurrentThread(VOID);
  7191. #elif defined(_M_PPC)
  7192. /* Interrupt request levels */
  7193. #define PASSIVE_LEVEL 0
  7194. #define LOW_LEVEL 0
  7195. #define APC_LEVEL 1
  7196. #define DISPATCH_LEVEL 2
  7197. #define PROFILE_LEVEL 27
  7198. #define CLOCK1_LEVEL 28
  7199. #define CLOCK2_LEVEL 28
  7200. #define IPI_LEVEL 29
  7201. #define POWER_LEVEL 30
  7202. #define HIGH_LEVEL 31
  7203. //
  7204. // Used to contain PFNs and PFN counts
  7205. //
  7206. typedef ULONG PFN_COUNT;
  7207. typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
  7208. typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
  7209. typedef struct _KFLOATING_SAVE {
  7210. ULONG Dummy;
  7211. } KFLOATING_SAVE, *PKFLOATING_SAVE;
  7212. typedef struct _KPCR_TIB {
  7213. PVOID ExceptionList; /* 00 */
  7214. PVOID StackBase; /* 04 */
  7215. PVOID StackLimit; /* 08 */
  7216. PVOID SubSystemTib; /* 0C */
  7217. _ANONYMOUS_UNION union {
  7218. PVOID FiberData; /* 10 */
  7219. ULONG Version; /* 10 */
  7220. } DUMMYUNIONNAME;
  7221. PVOID ArbitraryUserPointer; /* 14 */
  7222. struct _KPCR_TIB *Self; /* 18 */
  7223. } KPCR_TIB, *PKPCR_TIB; /* 1C */
  7224. #define PCR_MINOR_VERSION 1
  7225. #define PCR_MAJOR_VERSION 1
  7226. typedef struct _KPCR {
  7227. KPCR_TIB Tib; /* 00 */
  7228. struct _KPCR *Self; /* 1C */
  7229. struct _KPRCB *Prcb; /* 20 */
  7230. KIRQL Irql; /* 24 */
  7231. ULONG IRR; /* 28 */
  7232. ULONG IrrActive; /* 2C */
  7233. ULONG IDR; /* 30 */
  7234. PVOID KdVersionBlock; /* 34 */
  7235. PUSHORT IDT; /* 38 */
  7236. PUSHORT GDT; /* 3C */
  7237. struct _KTSS *TSS; /* 40 */
  7238. USHORT MajorVersion; /* 44 */
  7239. USHORT MinorVersion; /* 46 */
  7240. KAFFINITY SetMember; /* 48 */
  7241. ULONG StallScaleFactor; /* 4C */
  7242. UCHAR SpareUnused; /* 50 */
  7243. UCHAR Number; /* 51 */
  7244. } KPCR, *PKPCR; /* 54 */
  7245. #define KeGetPcr() PCR
  7246. #define YieldProcessor() __asm__ __volatile__("nop");
  7247. FORCEINLINE
  7248. ULONG
  7249. NTAPI
  7250. KeGetCurrentProcessorNumber(VOID)
  7251. {
  7252. ULONG Number;
  7253. __asm__ __volatile__ (
  7254. "lwz %0, %c1(12)\n"
  7255. : "=r" (Number)
  7256. : "i" (FIELD_OFFSET(KPCR, Number))
  7257. );
  7258. return Number;
  7259. }
  7260. NTHALAPI
  7261. VOID
  7262. FASTCALL
  7263. KfLowerIrql(
  7264. IN KIRQL NewIrql);
  7265. #define KeLowerIrql(a) KfLowerIrql(a)
  7266. NTHALAPI
  7267. KIRQL
  7268. FASTCALL
  7269. KfRaiseIrql(
  7270. IN KIRQL NewIrql);
  7271. #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
  7272. NTHALAPI
  7273. KIRQL
  7274. NTAPI
  7275. KeRaiseIrqlToDpcLevel(VOID);
  7276. NTHALAPI
  7277. KIRQL
  7278. NTAPI
  7279. KeRaiseIrqlToSynchLevel(VOID);
  7280. #elif defined(_M_MIPS)
  7281. #error MIPS Headers are totally incorrect
  7282. //
  7283. // Used to contain PFNs and PFN counts
  7284. //
  7285. typedef ULONG PFN_COUNT;
  7286. typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
  7287. typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
  7288. #define PASSIVE_LEVEL 0
  7289. #define APC_LEVEL 1
  7290. #define DISPATCH_LEVEL 2
  7291. #define PROFILE_LEVEL 27
  7292. #define IPI_LEVEL 29
  7293. #define HIGH_LEVEL 31
  7294. typedef struct _KPCR {
  7295. struct _KPRCB *Prcb; /* 20 */
  7296. KIRQL Irql; /* 24 */
  7297. ULONG IRR; /* 28 */
  7298. ULONG IDR; /* 30 */
  7299. } KPCR, *PKPCR;
  7300. #define KeGetPcr() PCR
  7301. typedef struct _KFLOATING_SAVE {
  7302. } KFLOATING_SAVE, *PKFLOATING_SAVE;
  7303. static __inline
  7304. ULONG
  7305. NTAPI
  7306. KeGetCurrentProcessorNumber(VOID)
  7307. {
  7308. return 0;
  7309. }
  7310. #define YieldProcessor() __asm__ __volatile__("nop");
  7311. #define KeLowerIrql(a) KfLowerIrql(a)
  7312. #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
  7313. NTKERNELAPI
  7314. VOID
  7315. NTAPI
  7316. KfLowerIrql(
  7317. IN KIRQL NewIrql);
  7318. NTKERNELAPI
  7319. KIRQL
  7320. NTAPI
  7321. KfRaiseIrql(
  7322. IN KIRQL NewIrql);
  7323. NTKERNELAPI
  7324. KIRQL
  7325. NTAPI
  7326. KeRaiseIrqlToDpcLevel(VOID);
  7327. NTKERNELAPI
  7328. KIRQL
  7329. NTAPI
  7330. KeRaiseIrqlToSynchLevel(VOID);
  7331. #elif defined(_M_ARM)
  7332. #include <armddk.h>
  7333. #else
  7334. #error Unknown Architecture
  7335. #endif
  7336. /******************************************************************************
  7337. * Runtime Library Functions *
  7338. ******************************************************************************/
  7339. #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
  7340. #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
  7341. FORCEINLINE
  7342. VOID
  7343. InitializeListHead(
  7344. OUT PLIST_ENTRY ListHead)
  7345. {
  7346. ListHead->Flink = ListHead->Blink = ListHead;
  7347. }
  7348. FORCEINLINE
  7349. BOOLEAN
  7350. IsListEmpty(
  7351. IN CONST LIST_ENTRY * ListHead)
  7352. {
  7353. return (BOOLEAN)(ListHead->Flink == ListHead);
  7354. }
  7355. FORCEINLINE
  7356. BOOLEAN
  7357. RemoveEntryList(
  7358. IN PLIST_ENTRY Entry)
  7359. {
  7360. PLIST_ENTRY OldFlink;
  7361. PLIST_ENTRY OldBlink;
  7362. OldFlink = Entry->Flink;
  7363. OldBlink = Entry->Blink;
  7364. OldFlink->Blink = OldBlink;
  7365. OldBlink->Flink = OldFlink;
  7366. return (BOOLEAN)(OldFlink == OldBlink);
  7367. }
  7368. FORCEINLINE
  7369. PLIST_ENTRY
  7370. RemoveHeadList(
  7371. IN OUT PLIST_ENTRY ListHead)
  7372. {
  7373. PLIST_ENTRY Flink;
  7374. PLIST_ENTRY Entry;
  7375. Entry = ListHead->Flink;
  7376. Flink = Entry->Flink;
  7377. ListHead->Flink = Flink;
  7378. Flink->Blink = ListHead;
  7379. return Entry;
  7380. }
  7381. FORCEINLINE
  7382. PLIST_ENTRY
  7383. RemoveTailList(
  7384. IN OUT PLIST_ENTRY ListHead)
  7385. {
  7386. PLIST_ENTRY Blink;
  7387. PLIST_ENTRY Entry;
  7388. Entry = ListHead->Blink;
  7389. Blink = Entry->Blink;
  7390. ListHead->Blink = Blink;
  7391. Blink->Flink = ListHead;
  7392. return Entry;
  7393. }
  7394. FORCEINLINE
  7395. VOID
  7396. InsertTailList(
  7397. IN OUT PLIST_ENTRY ListHead,
  7398. IN OUT PLIST_ENTRY Entry)
  7399. {
  7400. PLIST_ENTRY OldBlink;
  7401. OldBlink = ListHead->Blink;
  7402. Entry->Flink = ListHead;
  7403. Entry->Blink = OldBlink;
  7404. OldBlink->Flink = Entry;
  7405. ListHead->Blink = Entry;
  7406. }
  7407. FORCEINLINE
  7408. VOID
  7409. InsertHeadList(
  7410. IN OUT PLIST_ENTRY ListHead,
  7411. IN OUT PLIST_ENTRY Entry)
  7412. {
  7413. PLIST_ENTRY OldFlink;
  7414. OldFlink = ListHead->Flink;
  7415. Entry->Flink = OldFlink;
  7416. Entry->Blink = ListHead;
  7417. OldFlink->Blink = Entry;
  7418. ListHead->Flink = Entry;
  7419. }
  7420. FORCEINLINE
  7421. VOID
  7422. AppendTailList(
  7423. IN OUT PLIST_ENTRY ListHead,
  7424. IN OUT PLIST_ENTRY ListToAppend)
  7425. {
  7426. PLIST_ENTRY ListEnd = ListHead->Blink;
  7427. ListHead->Blink->Flink = ListToAppend;
  7428. ListHead->Blink = ListToAppend->Blink;
  7429. ListToAppend->Blink->Flink = ListHead;
  7430. ListToAppend->Blink = ListEnd;
  7431. }
  7432. FORCEINLINE
  7433. PSINGLE_LIST_ENTRY
  7434. PopEntryList(
  7435. IN OUT PSINGLE_LIST_ENTRY ListHead)
  7436. {
  7437. PSINGLE_LIST_ENTRY FirstEntry;
  7438. FirstEntry = ListHead->Next;
  7439. if (FirstEntry != NULL) {
  7440. ListHead->Next = FirstEntry->Next;
  7441. }
  7442. return FirstEntry;
  7443. }
  7444. FORCEINLINE
  7445. VOID
  7446. PushEntryList(
  7447. IN OUT PSINGLE_LIST_ENTRY ListHead,
  7448. IN OUT PSINGLE_LIST_ENTRY Entry)
  7449. {
  7450. Entry->Next = ListHead->Next;
  7451. ListHead->Next = Entry;
  7452. }
  7453. #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
  7454. NTSYSAPI
  7455. VOID
  7456. NTAPI
  7457. RtlAssert(
  7458. IN PVOID FailedAssertion,
  7459. IN PVOID FileName,
  7460. IN ULONG LineNumber,
  7461. IN PSTR Message);
  7462. /* VOID
  7463. * RtlCopyMemory(
  7464. * IN VOID UNALIGNED *Destination,
  7465. * IN CONST VOID UNALIGNED *Source,
  7466. * IN SIZE_T Length)
  7467. */
  7468. #define RtlCopyMemory(Destination, Source, Length) \
  7469. memcpy(Destination, Source, Length)
  7470. #define RtlCopyBytes RtlCopyMemory
  7471. #if defined(_M_AMD64)
  7472. NTSYSAPI
  7473. VOID
  7474. NTAPI
  7475. RtlCopyMemoryNonTemporal(
  7476. VOID UNALIGNED *Destination,
  7477. CONST VOID UNALIGNED *Source,
  7478. SIZE_T Length);
  7479. #else
  7480. #define RtlCopyMemoryNonTemporal RtlCopyMemory
  7481. #endif
  7482. /* BOOLEAN
  7483. * RtlEqualLuid(
  7484. * IN PLUID Luid1,
  7485. * IN PLUID Luid2)
  7486. */
  7487. #define RtlEqualLuid(Luid1, Luid2) \
  7488. (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
  7489. /* ULONG
  7490. * RtlEqualMemory(
  7491. * IN VOID UNALIGNED *Destination,
  7492. * IN CONST VOID UNALIGNED *Source,
  7493. * IN SIZE_T Length)
  7494. */
  7495. #define RtlEqualMemory(Destination, Source, Length) \
  7496. (!memcmp(Destination, Source, Length))
  7497. /* VOID
  7498. * RtlFillMemory(
  7499. * IN VOID UNALIGNED *Destination,
  7500. * IN SIZE_T Length,
  7501. * IN UCHAR Fill)
  7502. */
  7503. #define RtlFillMemory(Destination, Length, Fill) \
  7504. memset(Destination, Fill, Length)
  7505. #define RtlFillBytes RtlFillMemory
  7506. NTSYSAPI
  7507. VOID
  7508. NTAPI
  7509. RtlFreeUnicodeString(
  7510. IN OUT PUNICODE_STRING UnicodeString);
  7511. NTSYSAPI
  7512. NTSTATUS
  7513. NTAPI
  7514. RtlGUIDFromString(
  7515. IN PUNICODE_STRING GuidString,
  7516. OUT GUID *Guid);
  7517. NTSYSAPI
  7518. VOID
  7519. NTAPI
  7520. RtlInitUnicodeString(
  7521. IN OUT PUNICODE_STRING DestinationString,
  7522. IN PCWSTR SourceString OPTIONAL);
  7523. /* VOID
  7524. * RtlMoveMemory(
  7525. * IN VOID UNALIGNED *Destination,
  7526. * IN CONST VOID UNALIGNED *Source,
  7527. * IN SIZE_T Length)
  7528. */
  7529. #define RtlMoveMemory(Destination, Source, Length) \
  7530. memmove(Destination, Source, Length)
  7531. NTSYSAPI
  7532. NTSTATUS
  7533. NTAPI
  7534. RtlStringFromGUID(
  7535. IN REFGUID Guid,
  7536. OUT PUNICODE_STRING GuidString);
  7537. /* VOID
  7538. * RtlZeroMemory(
  7539. * IN VOID UNALIGNED *Destination,
  7540. * IN SIZE_T Length)
  7541. */
  7542. #define RtlZeroMemory(Destination, Length) \
  7543. memset(Destination, 0, Length)
  7544. #define RtlZeroBytes RtlZeroMemory
  7545. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  7546. NTSYSAPI
  7547. BOOLEAN
  7548. NTAPI
  7549. RtlAreBitsClear(
  7550. IN PRTL_BITMAP BitMapHeader,
  7551. IN ULONG StartingIndex,
  7552. IN ULONG Length);
  7553. NTSYSAPI
  7554. BOOLEAN
  7555. NTAPI
  7556. RtlAreBitsSet(
  7557. IN PRTL_BITMAP BitMapHeader,
  7558. IN ULONG StartingIndex,
  7559. IN ULONG Length);
  7560. NTSYSAPI
  7561. NTSTATUS
  7562. NTAPI
  7563. RtlAnsiStringToUnicodeString(
  7564. IN OUT PUNICODE_STRING DestinationString,
  7565. IN PANSI_STRING SourceString,
  7566. IN BOOLEAN AllocateDestinationString);
  7567. NTSYSAPI
  7568. ULONG
  7569. NTAPI
  7570. RtlxAnsiStringToUnicodeSize(
  7571. IN PCANSI_STRING AnsiString);
  7572. #define RtlAnsiStringToUnicodeSize(String) ( \
  7573. NLS_MB_CODE_PAGE_TAG ? \
  7574. RtlxAnsiStringToUnicodeSize(String) : \
  7575. ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
  7576. )
  7577. NTSYSAPI
  7578. NTSTATUS
  7579. NTAPI
  7580. RtlAppendUnicodeStringToString(
  7581. IN OUT PUNICODE_STRING Destination,
  7582. IN PCUNICODE_STRING Source);
  7583. NTSYSAPI
  7584. NTSTATUS
  7585. NTAPI
  7586. RtlAppendUnicodeToString(
  7587. IN OUT PUNICODE_STRING Destination,
  7588. IN PCWSTR Source);
  7589. NTSYSAPI
  7590. NTSTATUS
  7591. NTAPI
  7592. RtlCheckRegistryKey(
  7593. IN ULONG RelativeTo,
  7594. IN PWSTR Path);
  7595. NTSYSAPI
  7596. VOID
  7597. NTAPI
  7598. RtlClearAllBits(
  7599. IN PRTL_BITMAP BitMapHeader);
  7600. NTSYSAPI
  7601. VOID
  7602. NTAPI
  7603. RtlClearBits(
  7604. IN PRTL_BITMAP BitMapHeader,
  7605. IN ULONG StartingIndex,
  7606. IN ULONG NumberToClear);
  7607. NTSYSAPI
  7608. SIZE_T
  7609. NTAPI
  7610. RtlCompareMemory(
  7611. IN CONST VOID *Source1,
  7612. IN CONST VOID *Source2,
  7613. IN SIZE_T Length);
  7614. NTSYSAPI
  7615. LONG
  7616. NTAPI
  7617. RtlCompareUnicodeString(
  7618. IN PCUNICODE_STRING String1,
  7619. IN PCUNICODE_STRING String2,
  7620. IN BOOLEAN CaseInSensitive);
  7621. NTSYSAPI
  7622. LONG
  7623. NTAPI
  7624. RtlCompareUnicodeStrings(
  7625. IN PCWCH String1,
  7626. IN SIZE_T String1Length,
  7627. IN PCWCH String2,
  7628. IN SIZE_T String2Length,
  7629. IN BOOLEAN CaseInSensitive);
  7630. NTSYSAPI
  7631. VOID
  7632. NTAPI
  7633. RtlCopyUnicodeString(
  7634. IN OUT PUNICODE_STRING DestinationString,
  7635. IN PCUNICODE_STRING SourceString OPTIONAL);
  7636. NTSYSAPI
  7637. NTSTATUS
  7638. NTAPI
  7639. RtlCreateRegistryKey(
  7640. IN ULONG RelativeTo,
  7641. IN PWSTR Path);
  7642. NTSYSAPI
  7643. NTSTATUS
  7644. NTAPI
  7645. RtlCreateSecurityDescriptor(
  7646. IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  7647. IN ULONG Revision);
  7648. NTSYSAPI
  7649. NTSTATUS
  7650. NTAPI
  7651. RtlDeleteRegistryValue(
  7652. IN ULONG RelativeTo,
  7653. IN PCWSTR Path,
  7654. IN PCWSTR ValueName);
  7655. NTSYSAPI
  7656. BOOLEAN
  7657. NTAPI
  7658. RtlEqualUnicodeString(
  7659. IN CONST UNICODE_STRING *String1,
  7660. IN CONST UNICODE_STRING *String2,
  7661. IN BOOLEAN CaseInSensitive);
  7662. #if !defined(_AMD64_) && !defined(_IA64_)
  7663. NTSYSAPI
  7664. LARGE_INTEGER
  7665. NTAPI
  7666. RtlExtendedIntegerMultiply(
  7667. IN LARGE_INTEGER Multiplicand,
  7668. IN LONG Multiplier);
  7669. NTSYSAPI
  7670. LARGE_INTEGER
  7671. NTAPI
  7672. RtlExtendedLargeIntegerDivide(
  7673. IN LARGE_INTEGER Dividend,
  7674. IN ULONG Divisor,
  7675. OUT PULONG Remainder OPTIONAL);
  7676. #endif
  7677. #if defined(_X86_) || defined(_IA64_)
  7678. NTSYSAPI
  7679. LARGE_INTEGER
  7680. NTAPI
  7681. RtlExtendedMagicDivide(
  7682. IN LARGE_INTEGER Dividend,
  7683. IN LARGE_INTEGER MagicDivisor,
  7684. IN CCHAR ShiftCount);
  7685. #endif
  7686. NTSYSAPI
  7687. VOID
  7688. NTAPI
  7689. RtlFreeAnsiString(
  7690. IN PANSI_STRING AnsiString);
  7691. NTSYSAPI
  7692. ULONG
  7693. NTAPI
  7694. RtlFindClearBits(
  7695. IN PRTL_BITMAP BitMapHeader,
  7696. IN ULONG NumberToFind,
  7697. IN ULONG HintIndex);
  7698. NTSYSAPI
  7699. ULONG
  7700. NTAPI
  7701. RtlFindClearBitsAndSet(
  7702. IN PRTL_BITMAP BitMapHeader,
  7703. IN ULONG NumberToFind,
  7704. IN ULONG HintIndex);
  7705. NTSYSAPI
  7706. ULONG
  7707. NTAPI
  7708. RtlFindFirstRunClear(
  7709. IN PRTL_BITMAP BitMapHeader,
  7710. OUT PULONG StartingIndex);
  7711. NTSYSAPI
  7712. ULONG
  7713. NTAPI
  7714. RtlFindClearRuns(
  7715. IN PRTL_BITMAP BitMapHeader,
  7716. OUT PRTL_BITMAP_RUN RunArray,
  7717. IN ULONG SizeOfRunArray,
  7718. IN BOOLEAN LocateLongestRuns);
  7719. NTSYSAPI
  7720. ULONG
  7721. NTAPI
  7722. RtlFindLastBackwardRunClear(
  7723. IN PRTL_BITMAP BitMapHeader,
  7724. IN ULONG FromIndex,
  7725. OUT PULONG StartingRunIndex);
  7726. NTSYSAPI
  7727. CCHAR
  7728. NTAPI
  7729. RtlFindLeastSignificantBit(
  7730. IN ULONGLONG Set);
  7731. NTSYSAPI
  7732. ULONG
  7733. NTAPI
  7734. RtlFindLongestRunClear(
  7735. IN PRTL_BITMAP BitMapHeader,
  7736. OUT PULONG StartingIndex);
  7737. NTSYSAPI
  7738. CCHAR
  7739. NTAPI
  7740. RtlFindMostSignificantBit(
  7741. IN ULONGLONG Set);
  7742. NTSYSAPI
  7743. ULONG
  7744. NTAPI
  7745. RtlFindNextForwardRunClear(
  7746. IN PRTL_BITMAP BitMapHeader,
  7747. IN ULONG FromIndex,
  7748. OUT PULONG StartingRunIndex);
  7749. NTSYSAPI
  7750. ULONG
  7751. NTAPI
  7752. RtlFindSetBits(
  7753. IN PRTL_BITMAP BitMapHeader,
  7754. IN ULONG NumberToFind,
  7755. IN ULONG HintIndex);
  7756. NTSYSAPI
  7757. ULONG
  7758. NTAPI
  7759. RtlFindSetBitsAndClear(
  7760. IN PRTL_BITMAP BitMapHeader,
  7761. IN ULONG NumberToFind,
  7762. IN ULONG HintIndex);
  7763. NTSYSAPI
  7764. VOID
  7765. NTAPI
  7766. RtlInitAnsiString(
  7767. IN OUT PANSI_STRING DestinationString,
  7768. IN PCSZ SourceString);
  7769. NTSYSAPI
  7770. VOID
  7771. NTAPI
  7772. RtlInitializeBitMap(
  7773. IN PRTL_BITMAP BitMapHeader,
  7774. IN PULONG BitMapBuffer,
  7775. IN ULONG SizeOfBitMap);
  7776. NTSYSAPI
  7777. VOID
  7778. NTAPI
  7779. RtlInitString(
  7780. IN OUT PSTRING DestinationString,
  7781. IN PCSZ SourceString);
  7782. NTSYSAPI
  7783. NTSTATUS
  7784. NTAPI
  7785. RtlIntegerToUnicodeString(
  7786. IN ULONG Value,
  7787. IN ULONG Base OPTIONAL,
  7788. IN OUT PUNICODE_STRING String);
  7789. NTSYSAPI
  7790. NTSTATUS
  7791. NTAPI
  7792. RtlInt64ToUnicodeString(
  7793. IN ULONGLONG Value,
  7794. IN ULONG Base OPTIONAL,
  7795. IN OUT PUNICODE_STRING String);
  7796. #ifdef _WIN64
  7797. #define RtlIntPtrToUnicodeString(Value, Base, String) \
  7798. RtlInt64ToUnicodeString(Value, Base, String)
  7799. #else
  7800. #define RtlIntPtrToUnicodeString(Value, Base, String) \
  7801. RtlIntegerToUnicodeString(Value, Base, String)
  7802. #endif
  7803. /* BOOLEAN
  7804. * RtlIsZeroLuid(
  7805. * IN PLUID L1);
  7806. */
  7807. #define RtlIsZeroLuid(_L1) \
  7808. ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
  7809. NTSYSAPI
  7810. ULONG
  7811. NTAPI
  7812. RtlLengthSecurityDescriptor(
  7813. IN PSECURITY_DESCRIPTOR SecurityDescriptor);
  7814. NTSYSAPI
  7815. ULONG
  7816. NTAPI
  7817. RtlNumberOfClearBits(
  7818. IN PRTL_BITMAP BitMapHeader);
  7819. NTSYSAPI
  7820. ULONG
  7821. NTAPI
  7822. RtlNumberOfSetBits(
  7823. IN PRTL_BITMAP BitMapHeader);
  7824. NTSYSAPI
  7825. NTSTATUS
  7826. NTAPI
  7827. RtlQueryRegistryValues(
  7828. IN ULONG RelativeTo,
  7829. IN PCWSTR Path,
  7830. IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
  7831. IN PVOID Context OPTIONAL,
  7832. IN PVOID Environment OPTIONAL);
  7833. #define SHORT_SIZE (sizeof(USHORT))
  7834. #define SHORT_MASK (SHORT_SIZE - 1)
  7835. #define LONG_SIZE (sizeof(LONG))
  7836. #define LONGLONG_SIZE (sizeof(LONGLONG))
  7837. #define LONG_MASK (LONG_SIZE - 1)
  7838. #define LONGLONG_MASK (LONGLONG_SIZE - 1)
  7839. #define LOWBYTE_MASK 0x00FF
  7840. #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
  7841. #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
  7842. #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
  7843. #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
  7844. NTSYSAPI
  7845. VOID
  7846. NTAPI
  7847. RtlSetAllBits(
  7848. IN PRTL_BITMAP BitMapHeader);
  7849. NTSYSAPI
  7850. VOID
  7851. NTAPI
  7852. RtlSetBits(
  7853. IN PRTL_BITMAP BitMapHeader,
  7854. IN ULONG StartingIndex,
  7855. IN ULONG NumberToSet);
  7856. NTSYSAPI
  7857. NTSTATUS
  7858. NTAPI
  7859. RtlSetDaclSecurityDescriptor(
  7860. IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  7861. IN BOOLEAN DaclPresent,
  7862. IN PACL Dacl OPTIONAL,
  7863. IN BOOLEAN DaclDefaulted OPTIONAL);
  7864. #if defined(_AMD64_)
  7865. /* VOID
  7866. * RtlStoreUlong(
  7867. * IN PULONG Address,
  7868. * IN ULONG Value);
  7869. */
  7870. #define RtlStoreUlong(Address,Value) \
  7871. *(ULONG UNALIGNED *)(Address) = (Value)
  7872. /* VOID
  7873. * RtlStoreUlonglong(
  7874. * IN OUT PULONGLONG Address,
  7875. * ULONGLONG Value);
  7876. */
  7877. #define RtlStoreUlonglong(Address,Value) \
  7878. *(ULONGLONG UNALIGNED *)(Address) = (Value)
  7879. /* VOID
  7880. * RtlStoreUshort(
  7881. * IN PUSHORT Address,
  7882. * IN USHORT Value);
  7883. */
  7884. #define RtlStoreUshort(Address,Value) \
  7885. *(USHORT UNALIGNED *)(Address) = (Value)
  7886. /* VOID
  7887. * RtlRetrieveUshort(
  7888. * PUSHORT DestinationAddress,
  7889. * PUSHORT SourceAddress);
  7890. */
  7891. #define RtlRetrieveUshort(DestAddress,SrcAddress) \
  7892. *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
  7893. /* VOID
  7894. * RtlRetrieveUlong(
  7895. * PULONG DestinationAddress,
  7896. * PULONG SourceAddress);
  7897. */
  7898. #define RtlRetrieveUlong(DestAddress,SrcAddress) \
  7899. *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
  7900. #else
  7901. #define RtlStoreUlong(Address,Value) \
  7902. if ((ULONG_PTR)(Address) & LONG_MASK) { \
  7903. ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
  7904. ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
  7905. ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
  7906. ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
  7907. } \
  7908. else { \
  7909. *((PULONG)(Address)) = (ULONG) (Value); \
  7910. }
  7911. #define RtlStoreUlonglong(Address,Value) \
  7912. if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
  7913. RtlStoreUlong((ULONG_PTR)(Address), \
  7914. (ULONGLONG)(Value) & 0xFFFFFFFF); \
  7915. RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
  7916. (ULONGLONG)(Value) >> 32); \
  7917. } else { \
  7918. *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
  7919. }
  7920. #define RtlStoreUshort(Address,Value) \
  7921. if ((ULONG_PTR)(Address) & SHORT_MASK) { \
  7922. ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
  7923. ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
  7924. } \
  7925. else { \
  7926. *((PUSHORT) (Address)) = (USHORT)Value; \
  7927. }
  7928. #define RtlRetrieveUshort(DestAddress,SrcAddress) \
  7929. if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
  7930. { \
  7931. ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
  7932. ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
  7933. } \
  7934. else \
  7935. { \
  7936. *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
  7937. }
  7938. #define RtlRetrieveUlong(DestAddress,SrcAddress) \
  7939. if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
  7940. { \
  7941. ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
  7942. ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
  7943. ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
  7944. ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
  7945. } \
  7946. else \
  7947. { \
  7948. *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
  7949. }
  7950. #endif /* defined(_AMD64_) */
  7951. #ifdef _WIN64
  7952. /* VOID
  7953. * RtlStoreUlongPtr(
  7954. * IN OUT PULONG_PTR Address,
  7955. * IN ULONG_PTR Value);
  7956. */
  7957. #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
  7958. #else
  7959. #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
  7960. #endif /* _WIN64 */
  7961. NTSYSAPI
  7962. BOOLEAN
  7963. NTAPI
  7964. RtlTimeFieldsToTime(
  7965. IN PTIME_FIELDS TimeFields,
  7966. IN PLARGE_INTEGER Time);
  7967. NTSYSAPI
  7968. VOID
  7969. NTAPI
  7970. RtlTimeToTimeFields(
  7971. IN PLARGE_INTEGER Time,
  7972. IN PTIME_FIELDS TimeFields);
  7973. NTSYSAPI
  7974. ULONG
  7975. FASTCALL
  7976. RtlUlongByteSwap(
  7977. IN ULONG Source);
  7978. NTSYSAPI
  7979. ULONGLONG
  7980. FASTCALL
  7981. RtlUlonglongByteSwap(
  7982. IN ULONGLONG Source);
  7983. NTSYSAPI
  7984. NTSTATUS
  7985. NTAPI
  7986. RtlUnicodeStringToAnsiString(
  7987. IN OUT PANSI_STRING DestinationString,
  7988. IN PCUNICODE_STRING SourceString,
  7989. IN BOOLEAN AllocateDestinationString);
  7990. NTSYSAPI
  7991. ULONG
  7992. NTAPI
  7993. RtlxUnicodeStringToAnsiSize(
  7994. IN PCUNICODE_STRING UnicodeString);
  7995. #define RtlUnicodeStringToAnsiSize(String) ( \
  7996. NLS_MB_CODE_PAGE_TAG ? \
  7997. RtlxUnicodeStringToAnsiSize(String) : \
  7998. ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
  7999. )
  8000. NTSYSAPI
  8001. NTSTATUS
  8002. NTAPI
  8003. RtlUnicodeStringToInteger(
  8004. IN PCUNICODE_STRING String,
  8005. IN ULONG Base OPTIONAL,
  8006. OUT PULONG Value);
  8007. NTSYSAPI
  8008. WCHAR
  8009. NTAPI
  8010. RtlUpcaseUnicodeChar(
  8011. IN WCHAR SourceCharacter);
  8012. NTSYSAPI
  8013. USHORT
  8014. FASTCALL
  8015. RtlUshortByteSwap(
  8016. IN USHORT Source);
  8017. NTSYSAPI
  8018. BOOLEAN
  8019. NTAPI
  8020. RtlValidRelativeSecurityDescriptor(
  8021. IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
  8022. IN ULONG SecurityDescriptorLength,
  8023. IN SECURITY_INFORMATION RequiredInformation);
  8024. NTSYSAPI
  8025. BOOLEAN
  8026. NTAPI
  8027. RtlValidSecurityDescriptor(
  8028. IN PSECURITY_DESCRIPTOR SecurityDescriptor);
  8029. NTSYSAPI
  8030. NTSTATUS
  8031. NTAPI
  8032. RtlWriteRegistryValue(
  8033. IN ULONG RelativeTo,
  8034. IN PCWSTR Path,
  8035. IN PCWSTR ValueName,
  8036. IN ULONG ValueType,
  8037. IN PVOID ValueData,
  8038. IN ULONG ValueLength);
  8039. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  8040. #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
  8041. NTSYSAPI
  8042. VOID
  8043. FASTCALL
  8044. RtlPrefetchMemoryNonTemporal(
  8045. IN PVOID Source,
  8046. IN SIZE_T Length);
  8047. #endif
  8048. #if (NTDDI_VERSION >= NTDDI_WINXP)
  8049. NTSYSAPI
  8050. VOID
  8051. NTAPI
  8052. RtlClearBit(
  8053. PRTL_BITMAP BitMapHeader,
  8054. ULONG BitNumber);
  8055. NTSYSAPI
  8056. WCHAR
  8057. NTAPI
  8058. RtlDowncaseUnicodeChar(
  8059. IN WCHAR SourceCharacter);
  8060. NTSYSAPI
  8061. VOID
  8062. NTAPI
  8063. RtlSetBit(
  8064. PRTL_BITMAP BitMapHeader,
  8065. ULONG BitNumber);
  8066. NTSYSAPI
  8067. BOOLEAN
  8068. NTAPI
  8069. RtlTestBit(
  8070. IN PRTL_BITMAP BitMapHeader,
  8071. IN ULONG BitNumber);
  8072. NTSYSAPI
  8073. NTSTATUS
  8074. NTAPI
  8075. RtlHashUnicodeString(
  8076. IN CONST UNICODE_STRING *String,
  8077. IN BOOLEAN CaseInSensitive,
  8078. IN ULONG HashAlgorithm,
  8079. OUT PULONG HashValue);
  8080. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  8081. #if (NTDDI_VERSION >= NTDDI_VISTA)
  8082. NTSYSAPI
  8083. ULONG
  8084. NTAPI
  8085. RtlNumberOfSetBitsUlongPtr(
  8086. IN ULONG_PTR Target);
  8087. NTSYSAPI
  8088. ULONGLONG
  8089. NTAPI
  8090. RtlIoDecodeMemIoResource(
  8091. IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
  8092. OUT PULONGLONG Alignment OPTIONAL,
  8093. OUT PULONGLONG MinimumAddress OPTIONAL,
  8094. OUT PULONGLONG MaximumAddress OPTIONAL);
  8095. NTSYSAPI
  8096. NTSTATUS
  8097. NTAPI
  8098. RtlIoEncodeMemIoResource(
  8099. IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
  8100. IN UCHAR Type,
  8101. IN ULONGLONG Length,
  8102. IN ULONGLONG Alignment,
  8103. IN ULONGLONG MinimumAddress,
  8104. IN ULONGLONG MaximumAddress);
  8105. NTSYSAPI
  8106. ULONGLONG
  8107. NTAPI
  8108. RtlCmDecodeMemIoResource(
  8109. IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
  8110. OUT PULONGLONG Start OPTIONAL);
  8111. NTSYSAPI
  8112. NTSTATUS
  8113. NTAPI
  8114. RtlFindClosestEncodableLength(
  8115. IN ULONGLONG SourceLength,
  8116. OUT PULONGLONG TargetLength);
  8117. NTSYSAPI
  8118. NTSTATUS
  8119. NTAPI
  8120. RtlCmEncodeMemIoResource(
  8121. IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
  8122. IN UCHAR Type,
  8123. IN ULONGLONG Length,
  8124. IN ULONGLONG Start);
  8125. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  8126. #if (NTDDI_VERSION >= NTDDI_WIN7)
  8127. NTSYSAPI
  8128. NTSTATUS
  8129. NTAPI
  8130. RtlUnicodeToUTF8N(
  8131. OUT PCHAR UTF8StringDestination,
  8132. IN ULONG UTF8StringMaxByteCount,
  8133. OUT PULONG UTF8StringActualByteCount,
  8134. IN PCWCH UnicodeStringSource,
  8135. IN ULONG UnicodeStringByteCount);
  8136. NTSYSAPI
  8137. NTSTATUS
  8138. NTAPI
  8139. RtlUTF8ToUnicodeN(
  8140. OUT PWSTR UnicodeStringDestination,
  8141. IN ULONG UnicodeStringMaxByteCount,
  8142. OUT PULONG UnicodeStringActualByteCount,
  8143. IN PCCH UTF8StringSource,
  8144. IN ULONG UTF8StringByteCount);
  8145. NTSYSAPI
  8146. ULONG64
  8147. NTAPI
  8148. RtlGetEnabledExtendedFeatures(
  8149. IN ULONG64 FeatureMask);
  8150. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  8151. #if !defined(MIDL_PASS)
  8152. /* inline funftions */
  8153. //DECLSPEC_DEPRECATED_DDK_WINXP
  8154. static __inline
  8155. LARGE_INTEGER
  8156. NTAPI_INLINE
  8157. RtlConvertLongToLargeInteger(
  8158. IN LONG SignedInteger)
  8159. {
  8160. LARGE_INTEGER ret;
  8161. ret.QuadPart = SignedInteger;
  8162. return ret;
  8163. }
  8164. //DECLSPEC_DEPRECATED_DDK_WINXP
  8165. static __inline
  8166. LARGE_INTEGER
  8167. NTAPI_INLINE
  8168. RtlConvertUlongToLargeInteger(
  8169. IN ULONG UnsignedInteger)
  8170. {
  8171. LARGE_INTEGER ret;
  8172. ret.QuadPart = UnsignedInteger;
  8173. return ret;
  8174. }
  8175. //DECLSPEC_DEPRECATED_DDK_WINXP
  8176. static __inline
  8177. LARGE_INTEGER
  8178. NTAPI_INLINE
  8179. RtlLargeIntegerShiftLeft(
  8180. IN LARGE_INTEGER LargeInteger,
  8181. IN CCHAR ShiftCount)
  8182. {
  8183. LARGE_INTEGER Result;
  8184. Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
  8185. return Result;
  8186. }
  8187. //DECLSPEC_DEPRECATED_DDK_WINXP
  8188. static __inline
  8189. LARGE_INTEGER
  8190. NTAPI_INLINE
  8191. RtlLargeIntegerShiftRight(
  8192. IN LARGE_INTEGER LargeInteger,
  8193. IN CCHAR ShiftCount)
  8194. {
  8195. LARGE_INTEGER Result;
  8196. Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
  8197. return Result;
  8198. }
  8199. //DECLSPEC_DEPRECATED_DDK
  8200. static __inline
  8201. ULONG
  8202. NTAPI_INLINE
  8203. RtlEnlargedUnsignedDivide(
  8204. IN ULARGE_INTEGER Dividend,
  8205. IN ULONG Divisor,
  8206. IN OUT PULONG Remainder)
  8207. {
  8208. if (Remainder)
  8209. *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
  8210. return (ULONG)(Dividend.QuadPart / Divisor);
  8211. }
  8212. //DECLSPEC_DEPRECATED_DDK
  8213. static __inline
  8214. LARGE_INTEGER
  8215. NTAPI_INLINE
  8216. RtlLargeIntegerNegate(
  8217. IN LARGE_INTEGER Subtrahend)
  8218. {
  8219. LARGE_INTEGER Difference;
  8220. Difference.QuadPart = -Subtrahend.QuadPart;
  8221. return Difference;
  8222. }
  8223. //DECLSPEC_DEPRECATED_DDK
  8224. static __inline
  8225. LARGE_INTEGER
  8226. NTAPI_INLINE
  8227. RtlLargeIntegerSubtract(
  8228. IN LARGE_INTEGER Minuend,
  8229. IN LARGE_INTEGER Subtrahend)
  8230. {
  8231. LARGE_INTEGER Difference;
  8232. Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
  8233. return Difference;
  8234. }
  8235. //DECLSPEC_DEPRECATED_DDK
  8236. static __inline
  8237. LARGE_INTEGER
  8238. NTAPI_INLINE
  8239. RtlEnlargedUnsignedMultiply(
  8240. IN ULONG Multiplicand,
  8241. IN ULONG Multiplier)
  8242. {
  8243. LARGE_INTEGER ret;
  8244. ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
  8245. return ret;
  8246. }
  8247. //DECLSPEC_DEPRECATED_DDK
  8248. static __inline
  8249. LARGE_INTEGER
  8250. NTAPI_INLINE
  8251. RtlEnlargedIntegerMultiply(
  8252. IN LONG Multiplicand,
  8253. IN LONG Multiplier)
  8254. {
  8255. LARGE_INTEGER ret;
  8256. ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
  8257. return ret;
  8258. }
  8259. FORCEINLINE
  8260. VOID
  8261. RtlInitEmptyAnsiString(
  8262. OUT PANSI_STRING AnsiString,
  8263. IN PCHAR Buffer,
  8264. IN USHORT BufferSize)
  8265. {
  8266. AnsiString->Length = 0;
  8267. AnsiString->MaximumLength = BufferSize;
  8268. AnsiString->Buffer = Buffer;
  8269. }
  8270. FORCEINLINE
  8271. VOID
  8272. RtlInitEmptyUnicodeString(
  8273. OUT PUNICODE_STRING UnicodeString,
  8274. IN PWSTR Buffer,
  8275. IN USHORT BufferSize)
  8276. {
  8277. UnicodeString->Length = 0;
  8278. UnicodeString->MaximumLength = BufferSize;
  8279. UnicodeString->Buffer = Buffer;
  8280. }
  8281. #if defined(_AMD64_) || defined(_IA64_)
  8282. static __inline
  8283. LARGE_INTEGER
  8284. NTAPI_INLINE
  8285. RtlExtendedIntegerMultiply(
  8286. IN LARGE_INTEGER Multiplicand,
  8287. IN LONG Multiplier)
  8288. {
  8289. LARGE_INTEGER ret;
  8290. ret.QuadPart = Multiplicand.QuadPart * Multiplier;
  8291. return ret;
  8292. }
  8293. static __inline
  8294. LARGE_INTEGER
  8295. NTAPI_INLINE
  8296. RtlExtendedLargeIntegerDivide(
  8297. IN LARGE_INTEGER Dividend,
  8298. IN ULONG Divisor,
  8299. OUT PULONG Remainder OPTIONAL)
  8300. {
  8301. LARGE_INTEGER ret;
  8302. ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
  8303. if (Remainder)
  8304. *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
  8305. return ret;
  8306. }
  8307. #endif /* defined(_AMD64_) || defined(_IA64_) */
  8308. #if defined(_AMD64_)
  8309. #define MultiplyHigh __mulh
  8310. #define UnsignedMultiplyHigh __umulh
  8311. //DECLSPEC_DEPRECATED_DDK
  8312. static __inline
  8313. LARGE_INTEGER
  8314. NTAPI_INLINE
  8315. RtlExtendedMagicDivide(
  8316. IN LARGE_INTEGER Dividend,
  8317. IN LARGE_INTEGER MagicDivisor,
  8318. IN CCHAR ShiftCount)
  8319. {
  8320. LARGE_INTEGER ret;
  8321. ULONG64 ret64;
  8322. BOOLEAN Pos;
  8323. Pos = (Dividend.QuadPart >= 0);
  8324. ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
  8325. MagicDivisor.QuadPart);
  8326. ret64 >>= ShiftCount;
  8327. ret.QuadPart = Pos ? (LONG64)ret64 : -(LONG64)ret64;
  8328. return ret;
  8329. }
  8330. #endif
  8331. //DECLSPEC_DEPRECATED_DDK
  8332. static __inline
  8333. LARGE_INTEGER
  8334. NTAPI_INLINE
  8335. RtlLargeIntegerAdd(
  8336. IN LARGE_INTEGER Addend1,
  8337. IN LARGE_INTEGER Addend2)
  8338. {
  8339. LARGE_INTEGER ret;
  8340. ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
  8341. return ret;
  8342. }
  8343. /* VOID
  8344. * RtlLargeIntegerAnd(
  8345. * IN OUT LARGE_INTEGER Result,
  8346. * IN LARGE_INTEGER Source,
  8347. * IN LARGE_INTEGER Mask);
  8348. */
  8349. #define RtlLargeIntegerAnd(Result, Source, Mask) \
  8350. Result.QuadPart = Source.QuadPart & Mask.QuadPart
  8351. //DECLSPEC_DEPRECATED_DDK
  8352. static __inline
  8353. LARGE_INTEGER
  8354. NTAPI_INLINE
  8355. RtlLargeIntegerArithmeticShift(
  8356. IN LARGE_INTEGER LargeInteger,
  8357. IN CCHAR ShiftCount)
  8358. {
  8359. LARGE_INTEGER ret;
  8360. ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
  8361. return ret;
  8362. }
  8363. /* BOOLEAN
  8364. * RtlLargeIntegerEqualTo(
  8365. * IN LARGE_INTEGER Operand1,
  8366. * IN LARGE_INTEGER Operand2);
  8367. */
  8368. #define RtlLargeIntegerEqualTo(X,Y) \
  8369. (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
  8370. FORCEINLINE
  8371. PVOID
  8372. RtlSecureZeroMemory(
  8373. OUT PVOID Pointer,
  8374. IN SIZE_T Size)
  8375. {
  8376. volatile char* vptr = (volatile char*)Pointer;
  8377. #if defined(_M_AMD64)
  8378. __stosb((PUCHAR)vptr, 0, Size);
  8379. #else
  8380. char * endptr = (char *)vptr + Size;
  8381. while (vptr < endptr) {
  8382. *vptr = 0; vptr++;
  8383. }
  8384. #endif
  8385. return Pointer;
  8386. }
  8387. #if defined(_M_AMD64)
  8388. FORCEINLINE
  8389. BOOLEAN
  8390. RtlCheckBit(
  8391. IN PRTL_BITMAP BitMapHeader,
  8392. IN ULONG BitPosition)
  8393. {
  8394. return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
  8395. }
  8396. #else
  8397. #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
  8398. #endif /* defined(_M_AMD64) */
  8399. #define RtlLargeIntegerGreaterThan(X,Y) ( \
  8400. (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
  8401. ((X).HighPart > (Y).HighPart) \
  8402. )
  8403. #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
  8404. (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
  8405. ((X).HighPart > (Y).HighPart) \
  8406. )
  8407. #define RtlLargeIntegerNotEqualTo(X,Y) ( \
  8408. (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
  8409. )
  8410. #define RtlLargeIntegerLessThan(X,Y) ( \
  8411. (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
  8412. ((X).HighPart < (Y).HighPart) \
  8413. )
  8414. #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
  8415. (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
  8416. ((X).HighPart < (Y).HighPart) \
  8417. )
  8418. #define RtlLargeIntegerGreaterThanZero(X) ( \
  8419. (((X).HighPart == 0) && ((X).LowPart > 0)) || \
  8420. ((X).HighPart > 0 ) \
  8421. )
  8422. #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
  8423. #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
  8424. #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
  8425. #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
  8426. #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
  8427. #endif /* !defined(MIDL_PASS) */
  8428. /* Byte Swap Functions */
  8429. #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
  8430. ((defined(_M_AMD64) || defined(_M_IA64)) \
  8431. && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
  8432. #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
  8433. #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
  8434. #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
  8435. #endif
  8436. #if DBG
  8437. #define ASSERT(exp) \
  8438. (VOID)((!(exp)) ? \
  8439. RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
  8440. #define ASSERTMSG(msg, exp) \
  8441. (VOID)((!(exp)) ? \
  8442. RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
  8443. #define RTL_SOFT_ASSERT(exp) \
  8444. (VOID)((!(exp)) ? \
  8445. DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
  8446. #define RTL_SOFT_ASSERTMSG(msg, exp) \
  8447. (VOID)((!(exp)) ? \
  8448. DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
  8449. #define RTL_VERIFY(exp) ASSERT(exp)
  8450. #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
  8451. #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
  8452. #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
  8453. #if defined(_MSC_VER)
  8454. #define NT_ASSERT(exp) \
  8455. ((!(exp)) ? \
  8456. (__annotation(L"Debug", L"AssertFail", L#exp), \
  8457. DbgRaiseAssertionFailure(), FALSE) : TRUE)
  8458. #define NT_ASSERTMSG(msg, exp) \
  8459. ((!(exp)) ? \
  8460. (__annotation(L"Debug", L"AssertFail", L##msg), \
  8461. DbgRaiseAssertionFailure(), FALSE) : TRUE)
  8462. #define NT_ASSERTMSGW(msg, exp) \
  8463. ((!(exp)) ? \
  8464. (__annotation(L"Debug", L"AssertFail", msg), \
  8465. DbgRaiseAssertionFailure(), FALSE) : TRUE)
  8466. #define NT_VERIFY NT_ASSERT
  8467. #define NT_VERIFYMSG NT_ASSERTMSG
  8468. #define NT_VERIFYMSGW NT_ASSERTMSGW
  8469. #else
  8470. /* GCC doesn't support __annotation (nor PDB) */
  8471. #define NT_ASSERT(exp) \
  8472. (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
  8473. #define NT_ASSERTMSG NT_ASSERT
  8474. #define NT_ASSERTMSGW NT_ASSERT
  8475. #endif
  8476. #else /* !DBG */
  8477. #define ASSERT(exp) ((VOID) 0)
  8478. #define ASSERTMSG(msg, exp) ((VOID) 0)
  8479. #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
  8480. #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
  8481. #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
  8482. #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
  8483. #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
  8484. #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
  8485. #define NT_ASSERT(exp) ((VOID)0)
  8486. #define NT_ASSERTMSG(msg, exp) ((VOID)0)
  8487. #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
  8488. #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
  8489. #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
  8490. #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
  8491. #endif /* DBG */
  8492. #define InitializeListHead32(ListHead) (\
  8493. (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
  8494. #if !defined(_WINBASE_)
  8495. #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
  8496. NTKERNELAPI
  8497. VOID
  8498. InitializeSListHead(
  8499. OUT PSLIST_HEADER SListHead);
  8500. #else
  8501. FORCEINLINE
  8502. VOID
  8503. InitializeSListHead(
  8504. OUT PSLIST_HEADER SListHead)
  8505. {
  8506. #if defined(_IA64_)
  8507. ULONG64 FeatureBits;
  8508. #endif
  8509. #if defined(_WIN64)
  8510. if (((ULONG_PTR)SListHead & 0xf) != 0) {
  8511. RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
  8512. }
  8513. #endif
  8514. RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
  8515. #if defined(_IA64_)
  8516. FeatureBits = __getReg(CV_IA64_CPUID4);
  8517. if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
  8518. SListHead->Header16.HeaderType = 1;
  8519. SListHead->Header16.Init = 1;
  8520. }
  8521. #endif
  8522. }
  8523. #endif
  8524. #if defined(_WIN64)
  8525. #define InterlockedPopEntrySList(Head) \
  8526. ExpInterlockedPopEntrySList(Head)
  8527. #define InterlockedPushEntrySList(Head, Entry) \
  8528. ExpInterlockedPushEntrySList(Head, Entry)
  8529. #define InterlockedFlushSList(Head) \
  8530. ExpInterlockedFlushSList(Head)
  8531. #define QueryDepthSList(Head) \
  8532. ExQueryDepthSList(Head)
  8533. #else /* !defined(_WIN64) */
  8534. NTKERNELAPI
  8535. PSLIST_ENTRY
  8536. FASTCALL
  8537. InterlockedPopEntrySList(
  8538. IN PSLIST_HEADER ListHead);
  8539. NTKERNELAPI
  8540. PSLIST_ENTRY
  8541. FASTCALL
  8542. InterlockedPushEntrySList(
  8543. IN PSLIST_HEADER ListHead,
  8544. IN PSLIST_ENTRY ListEntry);
  8545. #define InterlockedFlushSList(ListHead) \
  8546. ExInterlockedFlushSList(ListHead)
  8547. #define QueryDepthSList(Head) \
  8548. ExQueryDepthSList(Head)
  8549. #endif /* !defined(_WIN64) */
  8550. #endif /* !defined(_WINBASE_) */
  8551. #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
  8552. #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
  8553. #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
  8554. ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
  8555. #define RTL_CONTEXT_OFFSET(Context, Chunk) \
  8556. RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
  8557. #define RTL_CONTEXT_LENGTH(Context, Chunk) \
  8558. RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
  8559. #define RTL_CONTEXT_CHUNK(Context, Chunk) \
  8560. RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
  8561. (PCONTEXT_EX)(Context + 1), \
  8562. Chunk)
  8563. BOOLEAN
  8564. RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
  8565. IN ULONG Version);
  8566. BOOLEAN
  8567. RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
  8568. IN ULONG Version);
  8569. #ifndef RtlIsNtDdiVersionAvailable
  8570. #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
  8571. #endif
  8572. #ifndef RtlIsServicePackVersionInstalled
  8573. #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
  8574. #endif
  8575. #define RtlInterlockedSetBits(Flags, Flag) \
  8576. InterlockedOr((PLONG)(Flags), Flag)
  8577. #define RtlInterlockedAndBits(Flags, Flag) \
  8578. InterlockedAnd((PLONG)(Flags), Flag)
  8579. #define RtlInterlockedClearBits(Flags, Flag) \
  8580. RtlInterlockedAndBits(Flags, ~(Flag))
  8581. #define RtlInterlockedXorBits(Flags, Flag) \
  8582. InterlockedXor(Flags, Flag)
  8583. #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
  8584. (VOID) RtlInterlockedSetBits(Flags, Flag)
  8585. #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
  8586. (VOID) RtlInterlockedAndBits(Flags, Flag)
  8587. #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
  8588. RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
  8589. /******************************************************************************
  8590. * Kernel Functions *
  8591. ******************************************************************************/
  8592. NTKERNELAPI
  8593. VOID
  8594. NTAPI
  8595. KeInitializeEvent(
  8596. OUT PRKEVENT Event,
  8597. IN EVENT_TYPE Type,
  8598. IN BOOLEAN State);
  8599. NTKERNELAPI
  8600. VOID
  8601. NTAPI
  8602. KeClearEvent(
  8603. IN OUT PRKEVENT Event);
  8604. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  8605. #if defined(_NTDDK_) || defined(_NTIFS_)
  8606. NTKERNELAPI
  8607. VOID
  8608. NTAPI
  8609. ProbeForRead(
  8610. IN CONST VOID *Address, /* CONST is added */
  8611. IN SIZE_T Length,
  8612. IN ULONG Alignment);
  8613. #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
  8614. NTKERNELAPI
  8615. VOID
  8616. NTAPI
  8617. ProbeForWrite(
  8618. IN PVOID Address,
  8619. IN SIZE_T Length,
  8620. IN ULONG Alignment);
  8621. #if defined(SINGLE_GROUP_LEGACY_API)
  8622. NTKERNELAPI
  8623. VOID
  8624. NTAPI
  8625. KeRevertToUserAffinityThread(VOID);
  8626. NTKERNELAPI
  8627. VOID
  8628. NTAPI
  8629. KeSetSystemAffinityThread(
  8630. IN KAFFINITY Affinity);
  8631. NTKERNELAPI
  8632. VOID
  8633. NTAPI
  8634. KeSetTargetProcessorDpc(
  8635. IN OUT PRKDPC Dpc,
  8636. IN CCHAR Number);
  8637. NTKERNELAPI
  8638. KAFFINITY
  8639. NTAPI
  8640. KeQueryActiveProcessors(VOID);
  8641. #endif /* defined(SINGLE_GROUP_LEGACY_API) */
  8642. #if !defined(_M_AMD64)
  8643. NTKERNELAPI
  8644. ULONGLONG
  8645. NTAPI
  8646. KeQueryInterruptTime(VOID);
  8647. NTKERNELAPI
  8648. VOID
  8649. NTAPI
  8650. KeQuerySystemTime(
  8651. OUT PLARGE_INTEGER CurrentTime);
  8652. #endif /* !_M_AMD64 */
  8653. #if !defined(_X86_) && !defined(_M_ARM)
  8654. NTKERNELAPI
  8655. KIRQL
  8656. NTAPI
  8657. KeAcquireSpinLockRaiseToDpc(
  8658. IN OUT PKSPIN_LOCK SpinLock);
  8659. #define KeAcquireSpinLock(SpinLock, OldIrql) \
  8660. *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
  8661. NTKERNELAPI
  8662. VOID
  8663. NTAPI
  8664. KeAcquireSpinLockAtDpcLevel(
  8665. IN OUT PKSPIN_LOCK SpinLock);
  8666. NTKERNELAPI
  8667. VOID
  8668. NTAPI
  8669. KeReleaseSpinLock(
  8670. IN OUT PKSPIN_LOCK SpinLock,
  8671. IN KIRQL NewIrql);
  8672. NTKERNELAPI
  8673. VOID
  8674. NTAPI
  8675. KeReleaseSpinLockFromDpcLevel(
  8676. IN OUT PKSPIN_LOCK SpinLock);
  8677. #endif /* !_X86_ */
  8678. #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
  8679. NTKERNELAPI
  8680. VOID
  8681. NTAPI
  8682. KeInitializeSpinLock(
  8683. IN PKSPIN_LOCK SpinLock);
  8684. #else
  8685. FORCEINLINE
  8686. VOID
  8687. KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
  8688. {
  8689. /* Clear the lock */
  8690. *SpinLock = 0;
  8691. }
  8692. #endif
  8693. NTKERNELAPI
  8694. DECLSPEC_NORETURN
  8695. VOID
  8696. NTAPI
  8697. KeBugCheckEx(
  8698. IN ULONG BugCheckCode,
  8699. IN ULONG_PTR BugCheckParameter1,
  8700. IN ULONG_PTR BugCheckParameter2,
  8701. IN ULONG_PTR BugCheckParameter3,
  8702. IN ULONG_PTR BugCheckParameter4);
  8703. NTKERNELAPI
  8704. BOOLEAN
  8705. NTAPI
  8706. KeCancelTimer(
  8707. IN OUT PKTIMER);
  8708. NTKERNELAPI
  8709. NTSTATUS
  8710. NTAPI
  8711. KeDelayExecutionThread(
  8712. IN KPROCESSOR_MODE WaitMode,
  8713. IN BOOLEAN Alertable,
  8714. IN PLARGE_INTEGER Interval);
  8715. NTKERNELAPI
  8716. BOOLEAN
  8717. NTAPI
  8718. KeDeregisterBugCheckCallback(
  8719. IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
  8720. NTKERNELAPI
  8721. VOID
  8722. NTAPI
  8723. KeEnterCriticalRegion(VOID);
  8724. NTKERNELAPI
  8725. VOID
  8726. NTAPI
  8727. KeInitializeDeviceQueue(
  8728. OUT PKDEVICE_QUEUE DeviceQueue);
  8729. NTKERNELAPI
  8730. VOID
  8731. NTAPI
  8732. KeInitializeDpc(
  8733. OUT PRKDPC Dpc,
  8734. IN PKDEFERRED_ROUTINE DeferredRoutine,
  8735. IN PVOID DeferredContext OPTIONAL);
  8736. NTKERNELAPI
  8737. VOID
  8738. NTAPI
  8739. KeInitializeMutex(
  8740. OUT PRKMUTEX Mutex,
  8741. IN ULONG Level);
  8742. NTKERNELAPI
  8743. VOID
  8744. NTAPI
  8745. KeInitializeSemaphore(
  8746. OUT PRKSEMAPHORE Semaphore,
  8747. IN LONG Count,
  8748. IN LONG Limit);
  8749. NTKERNELAPI
  8750. VOID
  8751. NTAPI
  8752. KeInitializeTimer(
  8753. OUT PKTIMER Timer);
  8754. NTKERNELAPI
  8755. VOID
  8756. NTAPI
  8757. KeInitializeTimerEx(
  8758. OUT PKTIMER Timer,
  8759. IN TIMER_TYPE Type);
  8760. NTKERNELAPI
  8761. BOOLEAN
  8762. NTAPI
  8763. KeInsertByKeyDeviceQueue(
  8764. IN OUT PKDEVICE_QUEUE DeviceQueue,
  8765. IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
  8766. IN ULONG SortKey);
  8767. NTKERNELAPI
  8768. BOOLEAN
  8769. NTAPI
  8770. KeInsertDeviceQueue(
  8771. IN OUT PKDEVICE_QUEUE DeviceQueue,
  8772. IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
  8773. NTKERNELAPI
  8774. BOOLEAN
  8775. NTAPI
  8776. KeInsertQueueDpc(
  8777. IN OUT PRKDPC Dpc,
  8778. IN PVOID SystemArgument1 OPTIONAL,
  8779. IN PVOID SystemArgument2 OPTIONAL);
  8780. NTKERNELAPI
  8781. VOID
  8782. NTAPI
  8783. KeLeaveCriticalRegion(VOID);
  8784. NTHALAPI
  8785. LARGE_INTEGER
  8786. NTAPI
  8787. KeQueryPerformanceCounter(
  8788. OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
  8789. NTKERNELAPI
  8790. KPRIORITY
  8791. NTAPI
  8792. KeQueryPriorityThread(
  8793. IN PRKTHREAD Thread);
  8794. NTKERNELAPI
  8795. ULONG
  8796. NTAPI
  8797. KeQueryTimeIncrement(VOID);
  8798. NTKERNELAPI
  8799. LONG
  8800. NTAPI
  8801. KeReadStateEvent(
  8802. IN PRKEVENT Event);
  8803. NTKERNELAPI
  8804. LONG
  8805. NTAPI
  8806. KeReadStateMutex(
  8807. IN PRKMUTEX Mutex);
  8808. NTKERNELAPI
  8809. LONG
  8810. NTAPI
  8811. KeReadStateSemaphore(
  8812. IN PRKSEMAPHORE Semaphore);
  8813. NTKERNELAPI
  8814. BOOLEAN
  8815. NTAPI
  8816. KeReadStateTimer(
  8817. IN PKTIMER Timer);
  8818. NTKERNELAPI
  8819. BOOLEAN
  8820. NTAPI
  8821. KeRegisterBugCheckCallback(
  8822. OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
  8823. IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
  8824. IN PVOID Buffer,
  8825. IN ULONG Length,
  8826. IN PUCHAR Component);
  8827. NTKERNELAPI
  8828. LONG
  8829. NTAPI
  8830. KeReleaseMutex(
  8831. IN OUT PRKMUTEX Mutex,
  8832. IN BOOLEAN Wait);
  8833. NTKERNELAPI
  8834. LONG
  8835. NTAPI
  8836. KeReleaseSemaphore(
  8837. IN OUT PRKSEMAPHORE Semaphore,
  8838. IN KPRIORITY Increment,
  8839. IN LONG Adjustment,
  8840. IN BOOLEAN Wait);
  8841. NTKERNELAPI
  8842. PKDEVICE_QUEUE_ENTRY
  8843. NTAPI
  8844. KeRemoveByKeyDeviceQueue(
  8845. IN OUT PKDEVICE_QUEUE DeviceQueue,
  8846. IN ULONG SortKey);
  8847. NTKERNELAPI
  8848. PKDEVICE_QUEUE_ENTRY
  8849. NTAPI
  8850. KeRemoveDeviceQueue(
  8851. IN OUT PKDEVICE_QUEUE DeviceQueue);
  8852. NTKERNELAPI
  8853. BOOLEAN
  8854. NTAPI
  8855. KeRemoveEntryDeviceQueue(
  8856. IN OUT PKDEVICE_QUEUE DeviceQueue,
  8857. IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
  8858. NTKERNELAPI
  8859. BOOLEAN
  8860. NTAPI
  8861. KeRemoveQueueDpc(
  8862. IN OUT PRKDPC Dpc);
  8863. NTKERNELAPI
  8864. LONG
  8865. NTAPI
  8866. KeResetEvent(
  8867. IN OUT PRKEVENT Event);
  8868. NTKERNELAPI
  8869. LONG
  8870. NTAPI
  8871. KeSetEvent(
  8872. IN OUT PRKEVENT Event,
  8873. IN KPRIORITY Increment,
  8874. IN BOOLEAN Wait);
  8875. NTKERNELAPI
  8876. VOID
  8877. NTAPI
  8878. KeSetImportanceDpc(
  8879. IN OUT PRKDPC Dpc,
  8880. IN KDPC_IMPORTANCE Importance);
  8881. NTKERNELAPI
  8882. KPRIORITY
  8883. NTAPI
  8884. KeSetPriorityThread(
  8885. IN OUT PKTHREAD Thread,
  8886. IN KPRIORITY Priority);
  8887. NTKERNELAPI
  8888. BOOLEAN
  8889. NTAPI
  8890. KeSetTimer(
  8891. IN OUT PKTIMER Timer,
  8892. IN LARGE_INTEGER DueTime,
  8893. IN PKDPC Dpc OPTIONAL);
  8894. NTKERNELAPI
  8895. BOOLEAN
  8896. NTAPI
  8897. KeSetTimerEx(
  8898. IN OUT PKTIMER Timer,
  8899. IN LARGE_INTEGER DueTime,
  8900. IN LONG Period OPTIONAL,
  8901. IN PKDPC Dpc OPTIONAL);
  8902. NTHALAPI
  8903. VOID
  8904. NTAPI
  8905. KeStallExecutionProcessor(
  8906. IN ULONG MicroSeconds);
  8907. NTKERNELAPI
  8908. BOOLEAN
  8909. NTAPI
  8910. KeSynchronizeExecution(
  8911. IN OUT PKINTERRUPT Interrupt,
  8912. IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
  8913. IN PVOID SynchronizeContext OPTIONAL);
  8914. NTKERNELAPI
  8915. NTSTATUS
  8916. NTAPI
  8917. KeWaitForMultipleObjects(
  8918. IN ULONG Count,
  8919. IN PVOID Object[],
  8920. IN WAIT_TYPE WaitType,
  8921. IN KWAIT_REASON WaitReason,
  8922. IN KPROCESSOR_MODE WaitMode,
  8923. IN BOOLEAN Alertable,
  8924. IN PLARGE_INTEGER Timeout OPTIONAL,
  8925. OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
  8926. #define KeWaitForMutexObject KeWaitForSingleObject
  8927. NTKERNELAPI
  8928. NTSTATUS
  8929. NTAPI
  8930. KeWaitForSingleObject(
  8931. IN PVOID Object,
  8932. IN KWAIT_REASON WaitReason,
  8933. IN KPROCESSOR_MODE WaitMode,
  8934. IN BOOLEAN Alertable,
  8935. IN PLARGE_INTEGER Timeout OPTIONAL);
  8936. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  8937. #if (NTDDI_VERSION >= NTDDI_WINXP)
  8938. _DECL_HAL_KE_IMPORT
  8939. VOID
  8940. FASTCALL
  8941. KeAcquireInStackQueuedSpinLock(
  8942. IN OUT PKSPIN_LOCK SpinLock,
  8943. OUT PKLOCK_QUEUE_HANDLE LockHandle);
  8944. NTKERNELAPI
  8945. VOID
  8946. FASTCALL
  8947. KeAcquireInStackQueuedSpinLockAtDpcLevel(
  8948. IN OUT PKSPIN_LOCK SpinLock,
  8949. OUT PKLOCK_QUEUE_HANDLE LockHandle);
  8950. NTKERNELAPI
  8951. KIRQL
  8952. NTAPI
  8953. KeAcquireInterruptSpinLock(
  8954. IN OUT PKINTERRUPT Interrupt);
  8955. NTKERNELAPI
  8956. BOOLEAN
  8957. NTAPI
  8958. KeAreApcsDisabled(VOID);
  8959. NTKERNELAPI
  8960. ULONG
  8961. NTAPI
  8962. KeGetRecommendedSharedDataAlignment(VOID);
  8963. NTKERNELAPI
  8964. ULONG
  8965. NTAPI
  8966. KeQueryRuntimeThread(
  8967. IN PKTHREAD Thread,
  8968. OUT PULONG UserTime);
  8969. NTKERNELAPI
  8970. VOID
  8971. FASTCALL
  8972. KeReleaseInStackQueuedSpinLockFromDpcLevel(
  8973. IN PKLOCK_QUEUE_HANDLE LockHandle);
  8974. NTKERNELAPI
  8975. VOID
  8976. NTAPI
  8977. KeReleaseInterruptSpinLock(
  8978. IN OUT PKINTERRUPT Interrupt,
  8979. IN KIRQL OldIrql);
  8980. NTKERNELAPI
  8981. PKDEVICE_QUEUE_ENTRY
  8982. NTAPI
  8983. KeRemoveByKeyDeviceQueueIfBusy(
  8984. IN OUT PKDEVICE_QUEUE DeviceQueue,
  8985. IN ULONG SortKey);
  8986. _DECL_HAL_KE_IMPORT
  8987. VOID
  8988. FASTCALL
  8989. KeReleaseInStackQueuedSpinLock(
  8990. IN PKLOCK_QUEUE_HANDLE LockHandle);
  8991. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  8992. #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
  8993. NTKERNELAPI
  8994. BOOLEAN
  8995. NTAPI
  8996. KeDeregisterBugCheckReasonCallback(
  8997. IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
  8998. NTKERNELAPI
  8999. BOOLEAN
  9000. NTAPI
  9001. KeRegisterBugCheckReasonCallback(
  9002. OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
  9003. IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
  9004. IN KBUGCHECK_CALLBACK_REASON Reason,
  9005. IN PUCHAR Component);
  9006. #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
  9007. #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
  9008. NTKERNELAPI
  9009. VOID
  9010. NTAPI
  9011. KeFlushQueuedDpcs(VOID);
  9012. #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
  9013. #if (NTDDI_VERSION >= NTDDI_WS03)
  9014. NTKERNELAPI
  9015. PVOID
  9016. NTAPI
  9017. KeRegisterNmiCallback(
  9018. IN PNMI_CALLBACK CallbackRoutine,
  9019. IN PVOID Context OPTIONAL);
  9020. NTKERNELAPI
  9021. NTSTATUS
  9022. NTAPI
  9023. KeDeregisterNmiCallback(
  9024. IN PVOID Handle);
  9025. NTKERNELAPI
  9026. VOID
  9027. NTAPI
  9028. KeInitializeThreadedDpc(
  9029. OUT PRKDPC Dpc,
  9030. IN PKDEFERRED_ROUTINE DeferredRoutine,
  9031. IN PVOID DeferredContext OPTIONAL);
  9032. NTKERNELAPI
  9033. ULONG_PTR
  9034. NTAPI
  9035. KeIpiGenericCall(
  9036. IN PKIPI_BROADCAST_WORKER BroadcastFunction,
  9037. IN ULONG_PTR Context);
  9038. NTKERNELAPI
  9039. KIRQL
  9040. FASTCALL
  9041. KeAcquireSpinLockForDpc(
  9042. IN OUT PKSPIN_LOCK SpinLock);
  9043. NTKERNELAPI
  9044. VOID
  9045. FASTCALL
  9046. KeReleaseSpinLockForDpc(
  9047. IN OUT PKSPIN_LOCK SpinLock,
  9048. IN KIRQL OldIrql);
  9049. NTKERNELAPI
  9050. BOOLEAN
  9051. FASTCALL
  9052. KeTestSpinLock(
  9053. IN PKSPIN_LOCK SpinLock);
  9054. #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
  9055. #if (NTDDI_VERSION >= NTDDI_WS03SP1)
  9056. NTKERNELAPI
  9057. BOOLEAN
  9058. FASTCALL
  9059. KeTryToAcquireSpinLockAtDpcLevel(
  9060. IN OUT PKSPIN_LOCK SpinLock);
  9061. NTKERNELAPI
  9062. BOOLEAN
  9063. NTAPI
  9064. KeAreAllApcsDisabled(VOID);
  9065. NTKERNELAPI
  9066. VOID
  9067. FASTCALL
  9068. KeAcquireGuardedMutex(
  9069. IN OUT PKGUARDED_MUTEX GuardedMutex);
  9070. NTKERNELAPI
  9071. VOID
  9072. FASTCALL
  9073. KeAcquireGuardedMutexUnsafe(
  9074. IN OUT PKGUARDED_MUTEX GuardedMutex);
  9075. NTKERNELAPI
  9076. VOID
  9077. NTAPI
  9078. KeEnterGuardedRegion(VOID);
  9079. NTKERNELAPI
  9080. VOID
  9081. NTAPI
  9082. KeLeaveGuardedRegion(VOID);
  9083. NTKERNELAPI
  9084. VOID
  9085. FASTCALL
  9086. KeInitializeGuardedMutex(
  9087. OUT PKGUARDED_MUTEX GuardedMutex);
  9088. NTKERNELAPI
  9089. VOID
  9090. FASTCALL
  9091. KeReleaseGuardedMutexUnsafe(
  9092. IN OUT PKGUARDED_MUTEX GuardedMutex);
  9093. NTKERNELAPI
  9094. VOID
  9095. FASTCALL
  9096. KeReleaseGuardedMutex(
  9097. IN OUT PKGUARDED_MUTEX GuardedMutex);
  9098. NTKERNELAPI
  9099. BOOLEAN
  9100. FASTCALL
  9101. KeTryToAcquireGuardedMutex(
  9102. IN OUT PKGUARDED_MUTEX GuardedMutex);
  9103. #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
  9104. #if (NTDDI_VERSION >= NTDDI_VISTA)
  9105. NTKERNELAPI
  9106. VOID
  9107. FASTCALL
  9108. KeAcquireInStackQueuedSpinLockForDpc(
  9109. IN OUT PKSPIN_LOCK SpinLock,
  9110. OUT PKLOCK_QUEUE_HANDLE LockHandle);
  9111. NTKERNELAPI
  9112. VOID
  9113. FASTCALL
  9114. KeReleaseInStackQueuedSpinLockForDpc(
  9115. IN PKLOCK_QUEUE_HANDLE LockHandle);
  9116. NTKERNELAPI
  9117. NTSTATUS
  9118. NTAPI
  9119. KeQueryDpcWatchdogInformation(
  9120. OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
  9121. #if defined(SINGLE_GROUP_LEGACY_API)
  9122. NTKERNELAPI
  9123. KAFFINITY
  9124. NTAPI
  9125. KeSetSystemAffinityThreadEx(
  9126. IN KAFFINITY Affinity);
  9127. NTKERNELAPI
  9128. VOID
  9129. NTAPI
  9130. KeRevertToUserAffinityThreadEx(
  9131. IN KAFFINITY Affinity);
  9132. NTKERNELAPI
  9133. ULONG
  9134. NTAPI
  9135. KeQueryActiveProcessorCount(
  9136. OUT PKAFFINITY ActiveProcessors OPTIONAL);
  9137. NTKERNELAPI
  9138. ULONG
  9139. NTAPI
  9140. KeQueryMaximumProcessorCount(VOID);
  9141. #endif /* SINGLE_GROUP_LEGACY_API */
  9142. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  9143. #if (NTDDI_VERSION >= NTDDI_WS08)
  9144. PVOID
  9145. KeRegisterProcessorChangeCallback(
  9146. IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
  9147. IN PVOID CallbackContext OPTIONAL,
  9148. IN ULONG Flags);
  9149. VOID
  9150. KeDeregisterProcessorChangeCallback(
  9151. IN PVOID CallbackHandle);
  9152. #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
  9153. #if (NTDDI_VERSION >= NTDDI_WIN7)
  9154. ULONG64
  9155. NTAPI
  9156. KeQueryTotalCycleTimeProcess(
  9157. IN OUT PKPROCESS Process,
  9158. OUT PULONG64 CycleTimeStamp);
  9159. ULONG64
  9160. NTAPI
  9161. KeQueryTotalCycleTimeThread(
  9162. IN OUT PKTHREAD Thread,
  9163. OUT PULONG64 CycleTimeStamp);
  9164. NTKERNELAPI
  9165. NTSTATUS
  9166. NTAPI
  9167. KeSetTargetProcessorDpcEx(
  9168. IN OUT PKDPC Dpc,
  9169. IN PPROCESSOR_NUMBER ProcNumber);
  9170. NTKERNELAPI
  9171. VOID
  9172. NTAPI
  9173. KeSetSystemGroupAffinityThread(
  9174. IN PGROUP_AFFINITY Affinity,
  9175. OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
  9176. NTKERNELAPI
  9177. VOID
  9178. NTAPI
  9179. KeRevertToUserGroupAffinityThread(
  9180. IN PGROUP_AFFINITY PreviousAffinity);
  9181. NTKERNELAPI
  9182. BOOLEAN
  9183. NTAPI
  9184. KeSetCoalescableTimer(
  9185. IN OUT PKTIMER Timer,
  9186. IN LARGE_INTEGER DueTime,
  9187. IN ULONG Period,
  9188. IN ULONG TolerableDelay,
  9189. IN PKDPC Dpc OPTIONAL);
  9190. NTKERNELAPI
  9191. ULONGLONG
  9192. NTAPI
  9193. KeQueryUnbiasedInterruptTime(VOID);
  9194. NTKERNELAPI
  9195. ULONG
  9196. NTAPI
  9197. KeQueryActiveProcessorCountEx(
  9198. IN USHORT GroupNumber);
  9199. NTKERNELAPI
  9200. ULONG
  9201. NTAPI
  9202. KeQueryMaximumProcessorCountEx(
  9203. IN USHORT GroupNumber);
  9204. NTKERNELAPI
  9205. USHORT
  9206. NTAPI
  9207. KeQueryActiveGroupCount(VOID);
  9208. NTKERNELAPI
  9209. USHORT
  9210. NTAPI
  9211. KeQueryMaximumGroupCount(VOID);
  9212. NTKERNELAPI
  9213. KAFFINITY
  9214. NTAPI
  9215. KeQueryGroupAffinity(
  9216. IN USHORT GroupNumber);
  9217. NTKERNELAPI
  9218. ULONG
  9219. NTAPI
  9220. KeGetCurrentProcessorNumberEx(
  9221. OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
  9222. NTKERNELAPI
  9223. VOID
  9224. NTAPI
  9225. KeQueryNodeActiveAffinity(
  9226. IN USHORT NodeNumber,
  9227. OUT PGROUP_AFFINITY Affinity OPTIONAL,
  9228. OUT PUSHORT Count OPTIONAL);
  9229. NTKERNELAPI
  9230. USHORT
  9231. NTAPI
  9232. KeQueryNodeMaximumProcessorCount(
  9233. IN USHORT NodeNumber);
  9234. NTKERNELAPI
  9235. USHORT
  9236. NTAPI
  9237. KeQueryHighestNodeNumber(VOID);
  9238. NTKERNELAPI
  9239. USHORT
  9240. NTAPI
  9241. KeGetCurrentNodeNumber(VOID);
  9242. NTKERNELAPI
  9243. NTSTATUS
  9244. NTAPI
  9245. KeQueryLogicalProcessorRelationship(
  9246. IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
  9247. IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
  9248. OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
  9249. IN OUT PULONG Length);
  9250. NTKERNELAPI
  9251. NTSTATUS
  9252. NTAPI
  9253. KeSaveExtendedProcessorState(
  9254. IN ULONG64 Mask,
  9255. OUT PXSTATE_SAVE XStateSave);
  9256. NTKERNELAPI
  9257. VOID
  9258. NTAPI
  9259. KeRestoreExtendedProcessorState(
  9260. IN PXSTATE_SAVE XStateSave);
  9261. NTSTATUS
  9262. NTAPI
  9263. KeGetProcessorNumberFromIndex(
  9264. IN ULONG ProcIndex,
  9265. OUT PPROCESSOR_NUMBER ProcNumber);
  9266. ULONG
  9267. NTAPI
  9268. KeGetProcessorIndexFromNumber(
  9269. IN PPROCESSOR_NUMBER ProcNumber);
  9270. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  9271. #if !defined(_IA64_)
  9272. NTHALAPI
  9273. VOID
  9274. NTAPI
  9275. KeFlushWriteBuffer(VOID);
  9276. #endif
  9277. /* VOID
  9278. * KeInitializeCallbackRecord(
  9279. * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
  9280. */
  9281. #define KeInitializeCallbackRecord(CallbackRecord) \
  9282. CallbackRecord->State = BufferEmpty;
  9283. #if DBG
  9284. #if (NTDDI_VERSION >= NTDDI_VISTA)
  9285. #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
  9286. #else
  9287. #define PAGED_ASSERT( exp ) ASSERT( exp )
  9288. #endif
  9289. #define PAGED_CODE() { \
  9290. if (KeGetCurrentIrql() > APC_LEVEL) { \
  9291. KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
  9292. PAGED_ASSERT(FALSE); \
  9293. } \
  9294. }
  9295. #else
  9296. #define PAGED_CODE()
  9297. #endif /* DBG */
  9298. #define PAGED_CODE_LOCKED() NOP_FUNCTION;
  9299. /******************************************************************************
  9300. * Memory manager Functions *
  9301. ******************************************************************************/
  9302. /* Alignment Macros */
  9303. #define ALIGN_DOWN_BY(size, align) \
  9304. ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
  9305. #define ALIGN_UP_BY(size, align) \
  9306. (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
  9307. #define ALIGN_DOWN_POINTER_BY(ptr, align) \
  9308. ((PVOID)ALIGN_DOWN_BY(ptr, align))
  9309. #define ALIGN_UP_POINTER_BY(ptr, align) \
  9310. ((PVOID)ALIGN_UP_BY(ptr, align))
  9311. #define ALIGN_DOWN(size, type) \
  9312. ALIGN_DOWN_BY(size, sizeof(type))
  9313. #define ALIGN_UP(size, type) \
  9314. ALIGN_UP_BY(size, sizeof(type))
  9315. #define ALIGN_DOWN_POINTER(ptr, type) \
  9316. ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
  9317. #define ALIGN_UP_POINTER(ptr, type) \
  9318. ALIGN_UP_POINTER_BY(ptr, sizeof(type))
  9319. #ifndef FIELD_OFFSET
  9320. #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
  9321. #endif
  9322. #ifndef FIELD_SIZE
  9323. #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
  9324. #endif
  9325. #define POOL_TAGGING 1
  9326. #if DBG
  9327. #define IF_DEBUG if (TRUE)
  9328. #else
  9329. #define IF_DEBUG if (FALSE)
  9330. #endif /* DBG */
  9331. /* ULONG
  9332. * BYTE_OFFSET(
  9333. * IN PVOID Va)
  9334. */
  9335. #define BYTE_OFFSET(Va) \
  9336. ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
  9337. /* ULONG
  9338. * BYTES_TO_PAGES(
  9339. * IN ULONG Size)
  9340. *
  9341. * Note: This needs to be like this to avoid overflows!
  9342. */
  9343. #define BYTES_TO_PAGES(Size) \
  9344. (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
  9345. /* PVOID
  9346. * PAGE_ALIGN(
  9347. * IN PVOID Va)
  9348. */
  9349. #define PAGE_ALIGN(Va) \
  9350. ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
  9351. /* ULONG_PTR
  9352. * ROUND_TO_PAGES(
  9353. * IN ULONG_PTR Size)
  9354. */
  9355. #define ROUND_TO_PAGES(Size) \
  9356. (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
  9357. /* ULONG
  9358. * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
  9359. * IN PVOID Va,
  9360. * IN ULONG Size)
  9361. */
  9362. #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
  9363. ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
  9364. + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
  9365. #define COMPUTE_PAGES_SPANNED(Va, Size) \
  9366. ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
  9367. /*
  9368. * ULONG
  9369. * MmGetMdlByteCount(
  9370. * IN PMDL Mdl)
  9371. */
  9372. #define MmGetMdlByteCount(_Mdl) \
  9373. ((_Mdl)->ByteCount)
  9374. /*
  9375. * ULONG
  9376. * MmGetMdlByteOffset(
  9377. * IN PMDL Mdl)
  9378. */
  9379. #define MmGetMdlByteOffset(_Mdl) \
  9380. ((_Mdl)->ByteOffset)
  9381. #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
  9382. /*
  9383. * PPFN_NUMBER
  9384. * MmGetMdlPfnArray(
  9385. * IN PMDL Mdl)
  9386. */
  9387. #define MmGetMdlPfnArray(_Mdl) \
  9388. ((PPFN_NUMBER) ((_Mdl) + 1))
  9389. /*
  9390. * PVOID
  9391. * MmGetMdlVirtualAddress(
  9392. * IN PMDL Mdl)
  9393. */
  9394. #define MmGetMdlVirtualAddress(_Mdl) \
  9395. ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
  9396. #define MmGetProcedureAddress(Address) (Address)
  9397. #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
  9398. /* PVOID MmGetSystemAddressForMdl(
  9399. * IN PMDL Mdl);
  9400. */
  9401. #define MmGetSystemAddressForMdl(Mdl) \
  9402. (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
  9403. MDL_SOURCE_IS_NONPAGED_POOL)) ? \
  9404. ((Mdl)->MappedSystemVa) : \
  9405. (MmMapLockedPages((Mdl), KernelMode)))
  9406. /* PVOID
  9407. * MmGetSystemAddressForMdlSafe(
  9408. * IN PMDL Mdl,
  9409. * IN MM_PAGE_PRIORITY Priority)
  9410. */
  9411. #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
  9412. (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
  9413. | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
  9414. (_Mdl)->MappedSystemVa : \
  9415. (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
  9416. KernelMode, MmCached, NULL, FALSE, (_Priority)))
  9417. /*
  9418. * VOID
  9419. * MmInitializeMdl(
  9420. * IN PMDL MemoryDescriptorList,
  9421. * IN PVOID BaseVa,
  9422. * IN SIZE_T Length)
  9423. */
  9424. #define MmInitializeMdl(_MemoryDescriptorList, \
  9425. _BaseVa, \
  9426. _Length) \
  9427. { \
  9428. (_MemoryDescriptorList)->Next = (PMDL) NULL; \
  9429. (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
  9430. (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
  9431. (_MemoryDescriptorList)->MdlFlags = 0; \
  9432. (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
  9433. (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
  9434. (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
  9435. }
  9436. /*
  9437. * VOID
  9438. * MmPrepareMdlForReuse(
  9439. * IN PMDL Mdl)
  9440. */
  9441. #define MmPrepareMdlForReuse(_Mdl) \
  9442. { \
  9443. if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
  9444. ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
  9445. MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
  9446. } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
  9447. ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
  9448. } \
  9449. }
  9450. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  9451. NTKERNELAPI
  9452. PVOID
  9453. NTAPI
  9454. MmAllocateContiguousMemory(
  9455. IN SIZE_T NumberOfBytes,
  9456. IN PHYSICAL_ADDRESS HighestAcceptableAddress);
  9457. NTKERNELAPI
  9458. PVOID
  9459. NTAPI
  9460. MmAllocateContiguousMemorySpecifyCache(
  9461. IN SIZE_T NumberOfBytes,
  9462. IN PHYSICAL_ADDRESS LowestAcceptableAddress,
  9463. IN PHYSICAL_ADDRESS HighestAcceptableAddress,
  9464. IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
  9465. IN MEMORY_CACHING_TYPE CacheType);
  9466. NTKERNELAPI
  9467. PMDL
  9468. NTAPI
  9469. MmAllocatePagesForMdl(
  9470. IN PHYSICAL_ADDRESS LowAddress,
  9471. IN PHYSICAL_ADDRESS HighAddress,
  9472. IN PHYSICAL_ADDRESS SkipBytes,
  9473. IN SIZE_T TotalBytes);
  9474. NTKERNELAPI
  9475. VOID
  9476. NTAPI
  9477. MmBuildMdlForNonPagedPool(
  9478. IN OUT PMDLX MemoryDescriptorList);
  9479. //DECLSPEC_DEPRECATED_DDK
  9480. NTKERNELAPI
  9481. PMDL
  9482. NTAPI
  9483. MmCreateMdl(
  9484. IN PMDL MemoryDescriptorList OPTIONAL,
  9485. IN PVOID Base,
  9486. IN SIZE_T Length);
  9487. NTKERNELAPI
  9488. VOID
  9489. NTAPI
  9490. MmFreeContiguousMemory(
  9491. IN PVOID BaseAddress);
  9492. NTKERNELAPI
  9493. VOID
  9494. NTAPI
  9495. MmFreeContiguousMemorySpecifyCache(
  9496. IN PVOID BaseAddress,
  9497. IN SIZE_T NumberOfBytes,
  9498. IN MEMORY_CACHING_TYPE CacheType);
  9499. NTKERNELAPI
  9500. VOID
  9501. NTAPI
  9502. MmFreePagesFromMdl(
  9503. IN PMDLX MemoryDescriptorList);
  9504. NTKERNELAPI
  9505. PVOID
  9506. NTAPI
  9507. MmGetSystemRoutineAddress(
  9508. IN PUNICODE_STRING SystemRoutineName);
  9509. NTKERNELAPI
  9510. LOGICAL
  9511. NTAPI
  9512. MmIsDriverVerifying(
  9513. IN struct _DRIVER_OBJECT *DriverObject);
  9514. NTKERNELAPI
  9515. PVOID
  9516. NTAPI
  9517. MmLockPagableDataSection(
  9518. IN PVOID AddressWithinSection);
  9519. NTKERNELAPI
  9520. PVOID
  9521. NTAPI
  9522. MmMapIoSpace(
  9523. IN PHYSICAL_ADDRESS PhysicalAddress,
  9524. IN SIZE_T NumberOfBytes,
  9525. IN MEMORY_CACHING_TYPE CacheEnable);
  9526. NTKERNELAPI
  9527. PVOID
  9528. NTAPI
  9529. MmMapLockedPages(
  9530. IN PMDL MemoryDescriptorList,
  9531. IN KPROCESSOR_MODE AccessMode);
  9532. NTKERNELAPI
  9533. PVOID
  9534. NTAPI
  9535. MmMapLockedPagesSpecifyCache(
  9536. IN PMDLX MemoryDescriptorList,
  9537. IN KPROCESSOR_MODE AccessMode,
  9538. IN MEMORY_CACHING_TYPE CacheType,
  9539. IN PVOID BaseAddress OPTIONAL,
  9540. IN ULONG BugCheckOnFailure,
  9541. IN MM_PAGE_PRIORITY Priority);
  9542. NTKERNELAPI
  9543. PVOID
  9544. NTAPI
  9545. MmPageEntireDriver(
  9546. IN PVOID AddressWithinSection);
  9547. NTKERNELAPI
  9548. VOID
  9549. NTAPI
  9550. MmProbeAndLockPages(
  9551. IN OUT PMDL MemoryDescriptorList,
  9552. IN KPROCESSOR_MODE AccessMode,
  9553. IN LOCK_OPERATION Operation);
  9554. NTKERNELAPI
  9555. MM_SYSTEMSIZE
  9556. NTAPI
  9557. MmQuerySystemSize(VOID);
  9558. NTKERNELAPI
  9559. VOID
  9560. NTAPI
  9561. MmResetDriverPaging(
  9562. IN PVOID AddressWithinSection);
  9563. NTKERNELAPI
  9564. SIZE_T
  9565. NTAPI
  9566. MmSizeOfMdl(
  9567. IN PVOID Base,
  9568. IN SIZE_T Length);
  9569. NTKERNELAPI
  9570. VOID
  9571. NTAPI
  9572. MmUnlockPagableImageSection(
  9573. IN PVOID ImageSectionHandle);
  9574. NTKERNELAPI
  9575. VOID
  9576. NTAPI
  9577. MmUnlockPages(
  9578. IN OUT PMDL MemoryDescriptorList);
  9579. NTKERNELAPI
  9580. VOID
  9581. NTAPI
  9582. MmUnmapIoSpace(
  9583. IN PVOID BaseAddress,
  9584. IN SIZE_T NumberOfBytes);
  9585. NTKERNELAPI
  9586. VOID
  9587. NTAPI
  9588. MmProbeAndLockProcessPages(
  9589. IN OUT PMDL MemoryDescriptorList,
  9590. IN PEPROCESS Process,
  9591. IN KPROCESSOR_MODE AccessMode,
  9592. IN LOCK_OPERATION Operation);
  9593. NTKERNELAPI
  9594. VOID
  9595. NTAPI
  9596. MmUnmapLockedPages(
  9597. IN PVOID BaseAddress,
  9598. IN PMDL MemoryDescriptorList);
  9599. NTKERNELAPI
  9600. PVOID
  9601. NTAPI
  9602. MmAllocateContiguousMemorySpecifyCacheNode(
  9603. IN SIZE_T NumberOfBytes,
  9604. IN PHYSICAL_ADDRESS LowestAcceptableAddress,
  9605. IN PHYSICAL_ADDRESS HighestAcceptableAddress,
  9606. IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
  9607. IN MEMORY_CACHING_TYPE CacheType,
  9608. IN NODE_REQUIREMENT PreferredNode);
  9609. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  9610. #if (NTDDI_VERSION >= NTDDI_WINXP)
  9611. NTKERNELAPI
  9612. NTSTATUS
  9613. NTAPI
  9614. MmAdvanceMdl(
  9615. IN OUT PMDL Mdl,
  9616. IN ULONG NumberOfBytes);
  9617. NTKERNELAPI
  9618. PVOID
  9619. NTAPI
  9620. MmAllocateMappingAddress(
  9621. IN SIZE_T NumberOfBytes,
  9622. IN ULONG PoolTag);
  9623. NTKERNELAPI
  9624. VOID
  9625. NTAPI
  9626. MmFreeMappingAddress(
  9627. IN PVOID BaseAddress,
  9628. IN ULONG PoolTag);
  9629. NTKERNELAPI
  9630. NTSTATUS
  9631. NTAPI
  9632. MmIsVerifierEnabled(
  9633. OUT PULONG VerifierFlags);
  9634. NTKERNELAPI
  9635. PVOID
  9636. NTAPI
  9637. MmMapLockedPagesWithReservedMapping(
  9638. IN PVOID MappingAddress,
  9639. IN ULONG PoolTag,
  9640. IN PMDL MemoryDescriptorList,
  9641. IN MEMORY_CACHING_TYPE CacheType);
  9642. NTKERNELAPI
  9643. NTSTATUS
  9644. NTAPI
  9645. MmProtectMdlSystemAddress(
  9646. IN PMDL MemoryDescriptorList,
  9647. IN ULONG NewProtect);
  9648. NTKERNELAPI
  9649. VOID
  9650. NTAPI
  9651. MmUnmapReservedMapping(
  9652. IN PVOID BaseAddress,
  9653. IN ULONG PoolTag,
  9654. IN PMDL MemoryDescriptorList);
  9655. NTKERNELAPI
  9656. NTSTATUS
  9657. NTAPI
  9658. MmAddVerifierThunks(
  9659. IN PVOID ThunkBuffer,
  9660. IN ULONG ThunkBufferSize);
  9661. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  9662. #if (NTDDI_VERSION >= NTDDI_WS03)
  9663. NTKERNELAPI
  9664. LOGICAL
  9665. NTAPI
  9666. MmIsIoSpaceActive(
  9667. IN PHYSICAL_ADDRESS StartAddress,
  9668. IN SIZE_T NumberOfBytes);
  9669. #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
  9670. #if (NTDDI_VERSION >= NTDDI_WS03SP1)
  9671. NTKERNELAPI
  9672. PMDL
  9673. NTAPI
  9674. MmAllocatePagesForMdlEx(
  9675. IN PHYSICAL_ADDRESS LowAddress,
  9676. IN PHYSICAL_ADDRESS HighAddress,
  9677. IN PHYSICAL_ADDRESS SkipBytes,
  9678. IN SIZE_T TotalBytes,
  9679. IN MEMORY_CACHING_TYPE CacheType,
  9680. IN ULONG Flags);
  9681. #endif
  9682. #if (NTDDI_VERSION >= NTDDI_VISTA)
  9683. NTKERNELAPI
  9684. LOGICAL
  9685. NTAPI
  9686. MmIsDriverVerifyingByAddress(
  9687. IN PVOID AddressWithinSection);
  9688. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  9689. /******************************************************************************
  9690. * Security Manager Functions *
  9691. ******************************************************************************/
  9692. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  9693. NTKERNELAPI
  9694. BOOLEAN
  9695. NTAPI
  9696. SeAccessCheck(
  9697. IN PSECURITY_DESCRIPTOR SecurityDescriptor,
  9698. IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
  9699. IN BOOLEAN SubjectContextLocked,
  9700. IN ACCESS_MASK DesiredAccess,
  9701. IN ACCESS_MASK PreviouslyGrantedAccess,
  9702. OUT PPRIVILEGE_SET *Privileges OPTIONAL,
  9703. IN PGENERIC_MAPPING GenericMapping,
  9704. IN KPROCESSOR_MODE AccessMode,
  9705. OUT PACCESS_MASK GrantedAccess,
  9706. OUT PNTSTATUS AccessStatus);
  9707. NTKERNELAPI
  9708. NTSTATUS
  9709. NTAPI
  9710. SeAssignSecurity(
  9711. IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
  9712. IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
  9713. OUT PSECURITY_DESCRIPTOR *NewDescriptor,
  9714. IN BOOLEAN IsDirectoryObject,
  9715. IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
  9716. IN PGENERIC_MAPPING GenericMapping,
  9717. IN POOL_TYPE PoolType);
  9718. NTKERNELAPI
  9719. NTSTATUS
  9720. NTAPI
  9721. SeAssignSecurityEx(
  9722. IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
  9723. IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
  9724. OUT PSECURITY_DESCRIPTOR *NewDescriptor,
  9725. IN GUID *ObjectType OPTIONAL,
  9726. IN BOOLEAN IsDirectoryObject,
  9727. IN ULONG AutoInheritFlags,
  9728. IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
  9729. IN PGENERIC_MAPPING GenericMapping,
  9730. IN POOL_TYPE PoolType);
  9731. NTKERNELAPI
  9732. NTSTATUS
  9733. NTAPI
  9734. SeDeassignSecurity(
  9735. IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
  9736. NTKERNELAPI
  9737. BOOLEAN
  9738. NTAPI
  9739. SeValidSecurityDescriptor(
  9740. IN ULONG Length,
  9741. IN PSECURITY_DESCRIPTOR SecurityDescriptor);
  9742. NTKERNELAPI
  9743. ULONG
  9744. NTAPI
  9745. SeObjectCreateSaclAccessBits(
  9746. IN PSECURITY_DESCRIPTOR SecurityDescriptor);
  9747. NTKERNELAPI
  9748. VOID
  9749. NTAPI
  9750. SeReleaseSubjectContext(
  9751. IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
  9752. NTKERNELAPI
  9753. VOID
  9754. NTAPI
  9755. SeUnlockSubjectContext(
  9756. IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
  9757. NTKERNELAPI
  9758. VOID
  9759. NTAPI
  9760. SeCaptureSubjectContext(
  9761. OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
  9762. NTKERNELAPI
  9763. VOID
  9764. NTAPI
  9765. SeLockSubjectContext(
  9766. IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
  9767. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  9768. #if (NTDDI_VERSION >= NTDDI_WS03SP1)
  9769. NTSTATUS
  9770. NTAPI
  9771. SeSetAuditParameter(
  9772. IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
  9773. IN SE_ADT_PARAMETER_TYPE Type,
  9774. IN ULONG Index,
  9775. IN PVOID Data);
  9776. NTSTATUS
  9777. NTAPI
  9778. SeReportSecurityEvent(
  9779. IN ULONG Flags,
  9780. IN PUNICODE_STRING SourceName,
  9781. IN PSID UserSid OPTIONAL,
  9782. IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
  9783. #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
  9784. #if (NTDDI_VERSION >= NTDDI_VISTA)
  9785. NTKERNELAPI
  9786. ULONG
  9787. NTAPI
  9788. SeComputeAutoInheritByObjectType(
  9789. IN PVOID ObjectType,
  9790. IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  9791. IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
  9792. #ifdef SE_NTFS_WORLD_CACHE
  9793. VOID
  9794. NTAPI
  9795. SeGetWorldRights(
  9796. IN PSECURITY_DESCRIPTOR SecurityDescriptor,
  9797. IN PGENERIC_MAPPING GenericMapping,
  9798. OUT PACCESS_MASK GrantedAccess);
  9799. #endif /* SE_NTFS_WORLD_CACHE */
  9800. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  9801. /******************************************************************************
  9802. * Configuration Manager Functions *
  9803. ******************************************************************************/
  9804. #if (NTDDI_VERSION >= NTDDI_WINXP)
  9805. NTKERNELAPI
  9806. NTSTATUS
  9807. NTAPI
  9808. CmRegisterCallback(
  9809. IN PEX_CALLBACK_FUNCTION Function,
  9810. IN PVOID Context OPTIONAL,
  9811. OUT PLARGE_INTEGER Cookie);
  9812. NTKERNELAPI
  9813. NTSTATUS
  9814. NTAPI
  9815. CmUnRegisterCallback(
  9816. IN LARGE_INTEGER Cookie);
  9817. #endif
  9818. #if (NTDDI_VERSION >= NTDDI_VISTA)
  9819. NTKERNELAPI
  9820. NTSTATUS
  9821. NTAPI
  9822. CmRegisterCallbackEx(
  9823. PEX_CALLBACK_FUNCTION Function,
  9824. PCUNICODE_STRING Altitude,
  9825. PVOID Driver,
  9826. PVOID Context,
  9827. PLARGE_INTEGER Cookie,
  9828. PVOID Reserved);
  9829. NTKERNELAPI
  9830. VOID
  9831. NTAPI
  9832. CmGetCallbackVersion(
  9833. OUT PULONG Major OPTIONAL,
  9834. OUT PULONG Minor OPTIONAL);
  9835. NTKERNELAPI
  9836. NTSTATUS
  9837. NTAPI
  9838. CmSetCallbackObjectContext(
  9839. IN OUT PVOID Object,
  9840. IN PLARGE_INTEGER Cookie,
  9841. IN PVOID NewContext,
  9842. OUT PVOID *OldContext OPTIONAL);
  9843. NTKERNELAPI
  9844. NTSTATUS
  9845. NTAPI
  9846. CmCallbackGetKeyObjectID(
  9847. IN PLARGE_INTEGER Cookie,
  9848. IN PVOID Object,
  9849. OUT PULONG_PTR ObjectID OPTIONAL,
  9850. OUT PCUNICODE_STRING *ObjectName OPTIONAL);
  9851. NTKERNELAPI
  9852. PVOID
  9853. NTAPI
  9854. CmGetBoundTransaction(
  9855. IN PLARGE_INTEGER Cookie,
  9856. IN PVOID Object);
  9857. #endif // NTDDI_VERSION >= NTDDI_VISTA
  9858. /******************************************************************************
  9859. * I/O Manager Functions *
  9860. ******************************************************************************/
  9861. /*
  9862. * NTSTATUS
  9863. * IoAcquireRemoveLock(
  9864. * IN PIO_REMOVE_LOCK RemoveLock,
  9865. * IN OPTIONAL PVOID Tag)
  9866. */
  9867. #if DBG
  9868. #define IoAcquireRemoveLock(RemoveLock, Tag) \
  9869. IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
  9870. #else
  9871. #define IoAcquireRemoveLock(RemoveLock, Tag) \
  9872. IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
  9873. #endif
  9874. /*
  9875. * VOID
  9876. * IoAdjustPagingPathCount(
  9877. * IN PLONG Count,
  9878. * IN BOOLEAN Increment)
  9879. */
  9880. #define IoAdjustPagingPathCount(_Count, \
  9881. _Increment) \
  9882. { \
  9883. if (_Increment) \
  9884. { \
  9885. InterlockedIncrement(_Count); \
  9886. } \
  9887. else \
  9888. { \
  9889. InterlockedDecrement(_Count); \
  9890. } \
  9891. }
  9892. #if !defined(_M_AMD64)
  9893. NTHALAPI
  9894. VOID
  9895. NTAPI
  9896. READ_PORT_BUFFER_UCHAR(
  9897. IN PUCHAR Port,
  9898. IN PUCHAR Buffer,
  9899. IN ULONG Count);
  9900. NTHALAPI
  9901. VOID
  9902. NTAPI
  9903. READ_PORT_BUFFER_ULONG(
  9904. IN PULONG Port,
  9905. IN PULONG Buffer,
  9906. IN ULONG Count);
  9907. NTHALAPI
  9908. VOID
  9909. NTAPI
  9910. READ_PORT_BUFFER_USHORT(
  9911. IN PUSHORT Port,
  9912. IN PUSHORT Buffer,
  9913. IN ULONG Count);
  9914. NTHALAPI
  9915. UCHAR
  9916. NTAPI
  9917. READ_PORT_UCHAR(
  9918. IN PUCHAR Port);
  9919. NTHALAPI
  9920. ULONG
  9921. NTAPI
  9922. READ_PORT_ULONG(
  9923. IN PULONG Port);
  9924. NTHALAPI
  9925. USHORT
  9926. NTAPI
  9927. READ_PORT_USHORT(
  9928. IN PUSHORT Port);
  9929. NTKERNELAPI
  9930. VOID
  9931. NTAPI
  9932. READ_REGISTER_BUFFER_UCHAR(
  9933. IN PUCHAR Register,
  9934. IN PUCHAR Buffer,
  9935. IN ULONG Count);
  9936. NTKERNELAPI
  9937. VOID
  9938. NTAPI
  9939. READ_REGISTER_BUFFER_ULONG(
  9940. IN PULONG Register,
  9941. IN PULONG Buffer,
  9942. IN ULONG Count);
  9943. NTKERNELAPI
  9944. VOID
  9945. NTAPI
  9946. READ_REGISTER_BUFFER_USHORT(
  9947. IN PUSHORT Register,
  9948. IN PUSHORT Buffer,
  9949. IN ULONG Count);
  9950. NTKERNELAPI
  9951. UCHAR
  9952. NTAPI
  9953. READ_REGISTER_UCHAR(
  9954. IN PUCHAR Register);
  9955. NTKERNELAPI
  9956. ULONG
  9957. NTAPI
  9958. READ_REGISTER_ULONG(
  9959. IN PULONG Register);
  9960. NTKERNELAPI
  9961. USHORT
  9962. NTAPI
  9963. READ_REGISTER_USHORT(
  9964. IN PUSHORT Register);
  9965. NTHALAPI
  9966. VOID
  9967. NTAPI
  9968. WRITE_PORT_BUFFER_UCHAR(
  9969. IN PUCHAR Port,
  9970. IN PUCHAR Buffer,
  9971. IN ULONG Count);
  9972. NTHALAPI
  9973. VOID
  9974. NTAPI
  9975. WRITE_PORT_BUFFER_ULONG(
  9976. IN PULONG Port,
  9977. IN PULONG Buffer,
  9978. IN ULONG Count);
  9979. NTHALAPI
  9980. VOID
  9981. NTAPI
  9982. WRITE_PORT_BUFFER_USHORT(
  9983. IN PUSHORT Port,
  9984. IN PUSHORT Buffer,
  9985. IN ULONG Count);
  9986. NTHALAPI
  9987. VOID
  9988. NTAPI
  9989. WRITE_PORT_UCHAR(
  9990. IN PUCHAR Port,
  9991. IN UCHAR Value);
  9992. NTHALAPI
  9993. VOID
  9994. NTAPI
  9995. WRITE_PORT_ULONG(
  9996. IN PULONG Port,
  9997. IN ULONG Value);
  9998. NTHALAPI
  9999. VOID
  10000. NTAPI
  10001. WRITE_PORT_USHORT(
  10002. IN PUSHORT Port,
  10003. IN USHORT Value);
  10004. NTKERNELAPI
  10005. VOID
  10006. NTAPI
  10007. WRITE_REGISTER_BUFFER_UCHAR(
  10008. IN PUCHAR Register,
  10009. IN PUCHAR Buffer,
  10010. IN ULONG Count);
  10011. NTKERNELAPI
  10012. VOID
  10013. NTAPI
  10014. WRITE_REGISTER_BUFFER_ULONG(
  10015. IN PULONG Register,
  10016. IN PULONG Buffer,
  10017. IN ULONG Count);
  10018. NTKERNELAPI
  10019. VOID
  10020. NTAPI
  10021. WRITE_REGISTER_BUFFER_USHORT(
  10022. IN PUSHORT Register,
  10023. IN PUSHORT Buffer,
  10024. IN ULONG Count);
  10025. NTKERNELAPI
  10026. VOID
  10027. NTAPI
  10028. WRITE_REGISTER_UCHAR(
  10029. IN PUCHAR Register,
  10030. IN UCHAR Value);
  10031. NTKERNELAPI
  10032. VOID
  10033. NTAPI
  10034. WRITE_REGISTER_ULONG(
  10035. IN PULONG Register,
  10036. IN ULONG Value);
  10037. NTKERNELAPI
  10038. VOID
  10039. NTAPI
  10040. WRITE_REGISTER_USHORT(
  10041. IN PUSHORT Register,
  10042. IN USHORT Value);
  10043. #else
  10044. FORCEINLINE
  10045. VOID
  10046. READ_PORT_BUFFER_UCHAR(
  10047. IN PUCHAR Port,
  10048. IN PUCHAR Buffer,
  10049. IN ULONG Count)
  10050. {
  10051. __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
  10052. }
  10053. FORCEINLINE
  10054. VOID
  10055. READ_PORT_BUFFER_ULONG(
  10056. IN PULONG Port,
  10057. IN PULONG Buffer,
  10058. IN ULONG Count)
  10059. {
  10060. __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
  10061. }
  10062. FORCEINLINE
  10063. VOID
  10064. READ_PORT_BUFFER_USHORT(
  10065. IN PUSHORT Port,
  10066. IN PUSHORT Buffer,
  10067. IN ULONG Count)
  10068. {
  10069. __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
  10070. }
  10071. FORCEINLINE
  10072. UCHAR
  10073. READ_PORT_UCHAR(
  10074. IN PUCHAR Port)
  10075. {
  10076. return __inbyte((USHORT)(ULONG_PTR)Port);
  10077. }
  10078. FORCEINLINE
  10079. ULONG
  10080. READ_PORT_ULONG(
  10081. IN PULONG Port)
  10082. {
  10083. return __indword((USHORT)(ULONG_PTR)Port);
  10084. }
  10085. FORCEINLINE
  10086. USHORT
  10087. READ_PORT_USHORT(
  10088. IN PUSHORT Port)
  10089. {
  10090. return __inword((USHORT)(ULONG_PTR)Port);
  10091. }
  10092. FORCEINLINE
  10093. VOID
  10094. READ_REGISTER_BUFFER_UCHAR(
  10095. IN PUCHAR Register,
  10096. IN PUCHAR Buffer,
  10097. IN ULONG Count)
  10098. {
  10099. __movsb(Register, Buffer, Count);
  10100. }
  10101. FORCEINLINE
  10102. VOID
  10103. READ_REGISTER_BUFFER_ULONG(
  10104. IN PULONG Register,
  10105. IN PULONG Buffer,
  10106. IN ULONG Count)
  10107. {
  10108. __movsd(Register, Buffer, Count);
  10109. }
  10110. FORCEINLINE
  10111. VOID
  10112. READ_REGISTER_BUFFER_USHORT(
  10113. IN PUSHORT Register,
  10114. IN PUSHORT Buffer,
  10115. IN ULONG Count)
  10116. {
  10117. __movsw(Register, Buffer, Count);
  10118. }
  10119. FORCEINLINE
  10120. UCHAR
  10121. READ_REGISTER_UCHAR(
  10122. IN volatile UCHAR *Register)
  10123. {
  10124. return *Register;
  10125. }
  10126. FORCEINLINE
  10127. ULONG
  10128. READ_REGISTER_ULONG(
  10129. IN volatile ULONG *Register)
  10130. {
  10131. return *Register;
  10132. }
  10133. FORCEINLINE
  10134. USHORT
  10135. READ_REGISTER_USHORT(
  10136. IN volatile USHORT *Register)
  10137. {
  10138. return *Register;
  10139. }
  10140. FORCEINLINE
  10141. VOID
  10142. WRITE_PORT_BUFFER_UCHAR(
  10143. IN PUCHAR Port,
  10144. IN PUCHAR Buffer,
  10145. IN ULONG Count)
  10146. {
  10147. __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
  10148. }
  10149. FORCEINLINE
  10150. VOID
  10151. WRITE_PORT_BUFFER_ULONG(
  10152. IN PULONG Port,
  10153. IN PULONG Buffer,
  10154. IN ULONG Count)
  10155. {
  10156. __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
  10157. }
  10158. FORCEINLINE
  10159. VOID
  10160. WRITE_PORT_BUFFER_USHORT(
  10161. IN PUSHORT Port,
  10162. IN PUSHORT Buffer,
  10163. IN ULONG Count)
  10164. {
  10165. __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
  10166. }
  10167. FORCEINLINE
  10168. VOID
  10169. WRITE_PORT_UCHAR(
  10170. IN PUCHAR Port,
  10171. IN UCHAR Value)
  10172. {
  10173. __outbyte((USHORT)(ULONG_PTR)Port, Value);
  10174. }
  10175. FORCEINLINE
  10176. VOID
  10177. WRITE_PORT_ULONG(
  10178. IN PULONG Port,
  10179. IN ULONG Value)
  10180. {
  10181. __outdword((USHORT)(ULONG_PTR)Port, Value);
  10182. }
  10183. FORCEINLINE
  10184. VOID
  10185. WRITE_PORT_USHORT(
  10186. IN PUSHORT Port,
  10187. IN USHORT Value)
  10188. {
  10189. __outword((USHORT)(ULONG_PTR)Port, Value);
  10190. }
  10191. FORCEINLINE
  10192. VOID
  10193. WRITE_REGISTER_BUFFER_UCHAR(
  10194. IN PUCHAR Register,
  10195. IN PUCHAR Buffer,
  10196. IN ULONG Count)
  10197. {
  10198. LONG Synch;
  10199. __movsb(Register, Buffer, Count);
  10200. InterlockedOr(&Synch, 1);
  10201. }
  10202. FORCEINLINE
  10203. VOID
  10204. WRITE_REGISTER_BUFFER_ULONG(
  10205. IN PULONG Register,
  10206. IN PULONG Buffer,
  10207. IN ULONG Count)
  10208. {
  10209. LONG Synch;
  10210. __movsd(Register, Buffer, Count);
  10211. InterlockedOr(&Synch, 1);
  10212. }
  10213. FORCEINLINE
  10214. VOID
  10215. WRITE_REGISTER_BUFFER_USHORT(
  10216. IN PUSHORT Register,
  10217. IN PUSHORT Buffer,
  10218. IN ULONG Count)
  10219. {
  10220. LONG Synch;
  10221. __movsw(Register, Buffer, Count);
  10222. InterlockedOr(&Synch, 1);
  10223. }
  10224. FORCEINLINE
  10225. VOID
  10226. WRITE_REGISTER_UCHAR(
  10227. IN volatile UCHAR *Register,
  10228. IN UCHAR Value)
  10229. {
  10230. LONG Synch;
  10231. *Register = Value;
  10232. InterlockedOr(&Synch, 1);
  10233. }
  10234. FORCEINLINE
  10235. VOID
  10236. WRITE_REGISTER_ULONG(
  10237. IN volatile ULONG *Register,
  10238. IN ULONG Value)
  10239. {
  10240. LONG Synch;
  10241. *Register = Value;
  10242. InterlockedOr(&Synch, 1);
  10243. }
  10244. FORCEINLINE
  10245. VOID
  10246. WRITE_REGISTER_USHORT(
  10247. IN volatile USHORT *Register,
  10248. IN USHORT Value)
  10249. {
  10250. LONG Sync;
  10251. *Register = Value;
  10252. InterlockedOr(&Sync, 1);
  10253. }
  10254. #endif
  10255. #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
  10256. (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
  10257. #define DMA_MACROS_DEFINED
  10258. FORCEINLINE
  10259. NTSTATUS
  10260. IoAllocateAdapterChannel(
  10261. IN PDMA_ADAPTER DmaAdapter,
  10262. IN PDEVICE_OBJECT DeviceObject,
  10263. IN ULONG NumberOfMapRegisters,
  10264. IN PDRIVER_CONTROL ExecutionRoutine,
  10265. IN PVOID Context)
  10266. {
  10267. PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
  10268. AllocateAdapterChannel =
  10269. *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
  10270. ASSERT(AllocateAdapterChannel);
  10271. return AllocateAdapterChannel(DmaAdapter,
  10272. DeviceObject,
  10273. NumberOfMapRegisters,
  10274. ExecutionRoutine,
  10275. Context );
  10276. }
  10277. FORCEINLINE
  10278. BOOLEAN
  10279. NTAPI
  10280. IoFlushAdapterBuffers(
  10281. IN PDMA_ADAPTER DmaAdapter,
  10282. IN PMDL Mdl,
  10283. IN PVOID MapRegisterBase,
  10284. IN PVOID CurrentVa,
  10285. IN ULONG Length,
  10286. IN BOOLEAN WriteToDevice)
  10287. {
  10288. PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
  10289. FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
  10290. ASSERT(FlushAdapterBuffers);
  10291. return FlushAdapterBuffers(DmaAdapter,
  10292. Mdl,
  10293. MapRegisterBase,
  10294. CurrentVa,
  10295. Length,
  10296. WriteToDevice);
  10297. }
  10298. FORCEINLINE
  10299. VOID
  10300. NTAPI
  10301. IoFreeAdapterChannel(
  10302. IN PDMA_ADAPTER DmaAdapter)
  10303. {
  10304. PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
  10305. FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
  10306. ASSERT(FreeAdapterChannel);
  10307. FreeAdapterChannel(DmaAdapter);
  10308. }
  10309. FORCEINLINE
  10310. VOID
  10311. NTAPI
  10312. IoFreeMapRegisters(
  10313. IN PDMA_ADAPTER DmaAdapter,
  10314. IN PVOID MapRegisterBase,
  10315. IN ULONG NumberOfMapRegisters)
  10316. {
  10317. PFREE_MAP_REGISTERS FreeMapRegisters;
  10318. FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
  10319. ASSERT(FreeMapRegisters);
  10320. FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
  10321. }
  10322. FORCEINLINE
  10323. PHYSICAL_ADDRESS
  10324. NTAPI
  10325. IoMapTransfer(
  10326. IN PDMA_ADAPTER DmaAdapter,
  10327. IN PMDL Mdl,
  10328. IN PVOID MapRegisterBase,
  10329. IN PVOID CurrentVa,
  10330. IN OUT PULONG Length,
  10331. IN BOOLEAN WriteToDevice)
  10332. {
  10333. PMAP_TRANSFER MapTransfer;
  10334. MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
  10335. ASSERT(MapTransfer);
  10336. return MapTransfer(DmaAdapter,
  10337. Mdl,
  10338. MapRegisterBase,
  10339. CurrentVa,
  10340. Length,
  10341. WriteToDevice);
  10342. }
  10343. #endif
  10344. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  10345. NTKERNELAPI
  10346. VOID
  10347. NTAPI
  10348. IoAcquireCancelSpinLock(
  10349. OUT PKIRQL Irql);
  10350. NTKERNELAPI
  10351. NTSTATUS
  10352. NTAPI
  10353. IoAcquireRemoveLockEx(
  10354. IN PIO_REMOVE_LOCK RemoveLock,
  10355. IN PVOID Tag OPTIONAL,
  10356. IN PCSTR File,
  10357. IN ULONG Line,
  10358. IN ULONG RemlockSize);
  10359. NTKERNELAPI
  10360. NTSTATUS
  10361. NTAPI
  10362. IoAllocateDriverObjectExtension(
  10363. IN PDRIVER_OBJECT DriverObject,
  10364. IN PVOID ClientIdentificationAddress,
  10365. IN ULONG DriverObjectExtensionSize,
  10366. OUT PVOID *DriverObjectExtension);
  10367. NTKERNELAPI
  10368. PVOID
  10369. NTAPI
  10370. IoAllocateErrorLogEntry(
  10371. IN PVOID IoObject,
  10372. IN UCHAR EntrySize);
  10373. NTKERNELAPI
  10374. PIRP
  10375. NTAPI
  10376. IoAllocateIrp(
  10377. IN CCHAR StackSize,
  10378. IN BOOLEAN ChargeQuota);
  10379. NTKERNELAPI
  10380. PMDL
  10381. NTAPI
  10382. IoAllocateMdl(
  10383. IN PVOID VirtualAddress OPTIONAL,
  10384. IN ULONG Length,
  10385. IN BOOLEAN SecondaryBuffer,
  10386. IN BOOLEAN ChargeQuota,
  10387. IN OUT PIRP Irp OPTIONAL);
  10388. NTKERNELAPI
  10389. PIO_WORKITEM
  10390. NTAPI
  10391. IoAllocateWorkItem(
  10392. IN PDEVICE_OBJECT DeviceObject);
  10393. NTKERNELAPI
  10394. NTSTATUS
  10395. NTAPI
  10396. IoAttachDevice(
  10397. IN PDEVICE_OBJECT SourceDevice,
  10398. IN PUNICODE_STRING TargetDevice,
  10399. OUT PDEVICE_OBJECT *AttachedDevice);
  10400. NTKERNELAPI
  10401. PDEVICE_OBJECT
  10402. NTAPI
  10403. IoAttachDeviceToDeviceStack(
  10404. IN PDEVICE_OBJECT SourceDevice,
  10405. IN PDEVICE_OBJECT TargetDevice);
  10406. NTKERNELAPI
  10407. PIRP
  10408. NTAPI
  10409. IoBuildAsynchronousFsdRequest(
  10410. IN ULONG MajorFunction,
  10411. IN PDEVICE_OBJECT DeviceObject,
  10412. IN OUT PVOID Buffer OPTIONAL,
  10413. IN ULONG Length OPTIONAL,
  10414. IN PLARGE_INTEGER StartingOffset OPTIONAL,
  10415. IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
  10416. NTKERNELAPI
  10417. PIRP
  10418. NTAPI
  10419. IoBuildDeviceIoControlRequest(
  10420. IN ULONG IoControlCode,
  10421. IN PDEVICE_OBJECT DeviceObject,
  10422. IN PVOID InputBuffer OPTIONAL,
  10423. IN ULONG InputBufferLength,
  10424. OUT PVOID OutputBuffer OPTIONAL,
  10425. IN ULONG OutputBufferLength,
  10426. IN BOOLEAN InternalDeviceIoControl,
  10427. IN PKEVENT Event,
  10428. OUT PIO_STATUS_BLOCK IoStatusBlock);
  10429. NTKERNELAPI
  10430. VOID
  10431. NTAPI
  10432. IoBuildPartialMdl(
  10433. IN PMDL SourceMdl,
  10434. IN OUT PMDL TargetMdl,
  10435. IN PVOID VirtualAddress,
  10436. IN ULONG Length);
  10437. NTKERNELAPI
  10438. PIRP
  10439. NTAPI
  10440. IoBuildSynchronousFsdRequest(
  10441. IN ULONG MajorFunction,
  10442. IN PDEVICE_OBJECT DeviceObject,
  10443. IN OUT PVOID Buffer OPTIONAL,
  10444. IN ULONG Length OPTIONAL,
  10445. IN PLARGE_INTEGER StartingOffset OPTIONAL,
  10446. IN PKEVENT Event,
  10447. OUT PIO_STATUS_BLOCK IoStatusBlock);
  10448. NTKERNELAPI
  10449. NTSTATUS
  10450. FASTCALL
  10451. IofCallDriver(
  10452. IN PDEVICE_OBJECT DeviceObject,
  10453. IN OUT PIRP Irp);
  10454. #define IoCallDriver IofCallDriver
  10455. NTKERNELAPI
  10456. VOID
  10457. FASTCALL
  10458. IofCompleteRequest(
  10459. IN PIRP Irp,
  10460. IN CCHAR PriorityBoost);
  10461. #define IoCompleteRequest IofCompleteRequest
  10462. NTKERNELAPI
  10463. BOOLEAN
  10464. NTAPI
  10465. IoCancelIrp(
  10466. IN PIRP Irp);
  10467. NTKERNELAPI
  10468. NTSTATUS
  10469. NTAPI
  10470. IoCheckShareAccess(
  10471. IN ACCESS_MASK DesiredAccess,
  10472. IN ULONG DesiredShareAccess,
  10473. IN OUT PFILE_OBJECT FileObject,
  10474. IN OUT PSHARE_ACCESS ShareAccess,
  10475. IN BOOLEAN Update);
  10476. NTKERNELAPI
  10477. VOID
  10478. FASTCALL
  10479. IofCompleteRequest(
  10480. IN PIRP Irp,
  10481. IN CCHAR PriorityBoost);
  10482. NTKERNELAPI
  10483. NTSTATUS
  10484. NTAPI
  10485. IoConnectInterrupt(
  10486. OUT PKINTERRUPT *InterruptObject,
  10487. IN PKSERVICE_ROUTINE ServiceRoutine,
  10488. IN PVOID ServiceContext OPTIONAL,
  10489. IN PKSPIN_LOCK SpinLock OPTIONAL,
  10490. IN ULONG Vector,
  10491. IN KIRQL Irql,
  10492. IN KIRQL SynchronizeIrql,
  10493. IN KINTERRUPT_MODE InterruptMode,
  10494. IN BOOLEAN ShareVector,
  10495. IN KAFFINITY ProcessorEnableMask,
  10496. IN BOOLEAN FloatingSave);
  10497. NTKERNELAPI
  10498. NTSTATUS
  10499. NTAPI
  10500. IoCreateDevice(
  10501. IN PDRIVER_OBJECT DriverObject,
  10502. IN ULONG DeviceExtensionSize,
  10503. IN PUNICODE_STRING DeviceName OPTIONAL,
  10504. IN DEVICE_TYPE DeviceType,
  10505. IN ULONG DeviceCharacteristics,
  10506. IN BOOLEAN Exclusive,
  10507. OUT PDEVICE_OBJECT *DeviceObject);
  10508. NTKERNELAPI
  10509. NTSTATUS
  10510. NTAPI
  10511. IoCreateFile(
  10512. OUT PHANDLE FileHandle,
  10513. IN ACCESS_MASK DesiredAccess,
  10514. IN POBJECT_ATTRIBUTES ObjectAttributes,
  10515. OUT PIO_STATUS_BLOCK IoStatusBlock,
  10516. IN PLARGE_INTEGER AllocationSize OPTIONAL,
  10517. IN ULONG FileAttributes,
  10518. IN ULONG ShareAccess,
  10519. IN ULONG Disposition,
  10520. IN ULONG CreateOptions,
  10521. IN PVOID EaBuffer OPTIONAL,
  10522. IN ULONG EaLength,
  10523. IN CREATE_FILE_TYPE CreateFileType,
  10524. IN PVOID InternalParameters OPTIONAL,
  10525. IN ULONG Options);
  10526. NTKERNELAPI
  10527. PKEVENT
  10528. NTAPI
  10529. IoCreateNotificationEvent(
  10530. IN PUNICODE_STRING EventName,
  10531. OUT PHANDLE EventHandle);
  10532. NTKERNELAPI
  10533. NTSTATUS
  10534. NTAPI
  10535. IoCreateSymbolicLink(
  10536. IN PUNICODE_STRING SymbolicLinkName,
  10537. IN PUNICODE_STRING DeviceName);
  10538. NTKERNELAPI
  10539. PKEVENT
  10540. NTAPI
  10541. IoCreateSynchronizationEvent(
  10542. IN PUNICODE_STRING EventName,
  10543. OUT PHANDLE EventHandle);
  10544. NTKERNELAPI
  10545. NTSTATUS
  10546. NTAPI
  10547. IoCreateUnprotectedSymbolicLink(
  10548. IN PUNICODE_STRING SymbolicLinkName,
  10549. IN PUNICODE_STRING DeviceName);
  10550. NTKERNELAPI
  10551. VOID
  10552. NTAPI
  10553. IoDeleteDevice(
  10554. IN PDEVICE_OBJECT DeviceObject);
  10555. NTKERNELAPI
  10556. NTSTATUS
  10557. NTAPI
  10558. IoDeleteSymbolicLink(
  10559. IN PUNICODE_STRING SymbolicLinkName);
  10560. NTKERNELAPI
  10561. VOID
  10562. NTAPI
  10563. IoDetachDevice(
  10564. IN OUT PDEVICE_OBJECT TargetDevice);
  10565. NTKERNELAPI
  10566. VOID
  10567. NTAPI
  10568. IoDisconnectInterrupt(
  10569. IN PKINTERRUPT InterruptObject);
  10570. NTKERNELAPI
  10571. VOID
  10572. NTAPI
  10573. IoFreeIrp(
  10574. IN PIRP Irp);
  10575. NTKERNELAPI
  10576. VOID
  10577. NTAPI
  10578. IoFreeMdl(
  10579. IN PMDL Mdl);
  10580. NTKERNELAPI
  10581. VOID
  10582. NTAPI
  10583. IoFreeWorkItem(
  10584. IN PIO_WORKITEM IoWorkItem);
  10585. NTKERNELAPI
  10586. PDEVICE_OBJECT
  10587. NTAPI
  10588. IoGetAttachedDevice(
  10589. IN PDEVICE_OBJECT DeviceObject);
  10590. NTKERNELAPI
  10591. PDEVICE_OBJECT
  10592. NTAPI
  10593. IoGetAttachedDeviceReference(
  10594. IN PDEVICE_OBJECT DeviceObject);
  10595. NTKERNELAPI
  10596. NTSTATUS
  10597. NTAPI
  10598. IoGetBootDiskInformation(
  10599. IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
  10600. IN ULONG Size);
  10601. NTKERNELAPI
  10602. NTSTATUS
  10603. NTAPI
  10604. IoGetDeviceInterfaceAlias(
  10605. IN PUNICODE_STRING SymbolicLinkName,
  10606. IN CONST GUID *AliasInterfaceClassGuid,
  10607. OUT PUNICODE_STRING AliasSymbolicLinkName);
  10608. NTKERNELAPI
  10609. PEPROCESS
  10610. NTAPI
  10611. IoGetCurrentProcess(VOID);
  10612. NTKERNELAPI
  10613. NTSTATUS
  10614. NTAPI
  10615. IoGetDeviceInterfaces(
  10616. IN CONST GUID *InterfaceClassGuid,
  10617. IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
  10618. IN ULONG Flags,
  10619. OUT PWSTR *SymbolicLinkList);
  10620. NTKERNELAPI
  10621. NTSTATUS
  10622. NTAPI
  10623. IoGetDeviceObjectPointer(
  10624. IN PUNICODE_STRING ObjectName,
  10625. IN ACCESS_MASK DesiredAccess,
  10626. OUT PFILE_OBJECT *FileObject,
  10627. OUT PDEVICE_OBJECT *DeviceObject);
  10628. NTKERNELAPI
  10629. NTSTATUS
  10630. NTAPI
  10631. IoGetDeviceProperty(
  10632. IN PDEVICE_OBJECT DeviceObject,
  10633. IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
  10634. IN ULONG BufferLength,
  10635. OUT PVOID PropertyBuffer,
  10636. OUT PULONG ResultLength);
  10637. NTKERNELAPI
  10638. PDMA_ADAPTER
  10639. NTAPI
  10640. IoGetDmaAdapter(
  10641. IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
  10642. IN PDEVICE_DESCRIPTION DeviceDescription,
  10643. IN OUT PULONG NumberOfMapRegisters);
  10644. NTKERNELAPI
  10645. PVOID
  10646. NTAPI
  10647. IoGetDriverObjectExtension(
  10648. IN PDRIVER_OBJECT DriverObject,
  10649. IN PVOID ClientIdentificationAddress);
  10650. NTKERNELAPI
  10651. PVOID
  10652. NTAPI
  10653. IoGetInitialStack(VOID);
  10654. NTKERNELAPI
  10655. PDEVICE_OBJECT
  10656. NTAPI
  10657. IoGetRelatedDeviceObject(
  10658. IN PFILE_OBJECT FileObject);
  10659. NTKERNELAPI
  10660. VOID
  10661. NTAPI
  10662. IoQueueWorkItem(
  10663. IN PIO_WORKITEM IoWorkItem,
  10664. IN PIO_WORKITEM_ROUTINE WorkerRoutine,
  10665. IN WORK_QUEUE_TYPE QueueType,
  10666. IN PVOID Context OPTIONAL);
  10667. NTKERNELAPI
  10668. VOID
  10669. NTAPI
  10670. IoInitializeIrp(
  10671. IN OUT PIRP Irp,
  10672. IN USHORT PacketSize,
  10673. IN CCHAR StackSize);
  10674. NTKERNELAPI
  10675. VOID
  10676. NTAPI
  10677. IoInitializeRemoveLockEx(
  10678. IN PIO_REMOVE_LOCK Lock,
  10679. IN ULONG AllocateTag,
  10680. IN ULONG MaxLockedMinutes,
  10681. IN ULONG HighWatermark,
  10682. IN ULONG RemlockSize);
  10683. NTKERNELAPI
  10684. NTSTATUS
  10685. NTAPI
  10686. IoInitializeTimer(
  10687. IN PDEVICE_OBJECT DeviceObject,
  10688. IN PIO_TIMER_ROUTINE TimerRoutine,
  10689. IN PVOID Context OPTIONAL);
  10690. NTKERNELAPI
  10691. VOID
  10692. NTAPI
  10693. IoInvalidateDeviceRelations(
  10694. IN PDEVICE_OBJECT DeviceObject,
  10695. IN DEVICE_RELATION_TYPE Type);
  10696. NTKERNELAPI
  10697. VOID
  10698. NTAPI
  10699. IoInvalidateDeviceState(
  10700. IN PDEVICE_OBJECT PhysicalDeviceObject);
  10701. NTKERNELAPI
  10702. BOOLEAN
  10703. NTAPI
  10704. IoIsWdmVersionAvailable(
  10705. IN UCHAR MajorVersion,
  10706. IN UCHAR MinorVersion);
  10707. NTKERNELAPI
  10708. NTSTATUS
  10709. NTAPI
  10710. IoOpenDeviceInterfaceRegistryKey(
  10711. IN PUNICODE_STRING SymbolicLinkName,
  10712. IN ACCESS_MASK DesiredAccess,
  10713. OUT PHANDLE DeviceInterfaceKey);
  10714. NTKERNELAPI
  10715. NTSTATUS
  10716. NTAPI
  10717. IoOpenDeviceRegistryKey(
  10718. IN PDEVICE_OBJECT DeviceObject,
  10719. IN ULONG DevInstKeyType,
  10720. IN ACCESS_MASK DesiredAccess,
  10721. OUT PHANDLE DevInstRegKey);
  10722. NTKERNELAPI
  10723. NTSTATUS
  10724. NTAPI
  10725. IoRegisterDeviceInterface(
  10726. IN PDEVICE_OBJECT PhysicalDeviceObject,
  10727. IN CONST GUID *InterfaceClassGuid,
  10728. IN PUNICODE_STRING ReferenceString OPTIONAL,
  10729. OUT PUNICODE_STRING SymbolicLinkName);
  10730. NTKERNELAPI
  10731. NTSTATUS
  10732. NTAPI
  10733. IoRegisterPlugPlayNotification(
  10734. IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
  10735. IN ULONG EventCategoryFlags,
  10736. IN PVOID EventCategoryData OPTIONAL,
  10737. IN PDRIVER_OBJECT DriverObject,
  10738. IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
  10739. IN OUT PVOID Context OPTIONAL,
  10740. OUT PVOID *NotificationEntry);
  10741. NTKERNELAPI
  10742. NTSTATUS
  10743. NTAPI
  10744. IoRegisterShutdownNotification(
  10745. IN PDEVICE_OBJECT DeviceObject);
  10746. NTKERNELAPI
  10747. VOID
  10748. NTAPI
  10749. IoReleaseCancelSpinLock(
  10750. IN KIRQL Irql);
  10751. NTKERNELAPI
  10752. VOID
  10753. NTAPI
  10754. IoReleaseRemoveLockAndWaitEx(
  10755. IN PIO_REMOVE_LOCK RemoveLock,
  10756. IN PVOID Tag OPTIONAL,
  10757. IN ULONG RemlockSize);
  10758. NTKERNELAPI
  10759. VOID
  10760. NTAPI
  10761. IoReleaseRemoveLockEx(
  10762. IN PIO_REMOVE_LOCK RemoveLock,
  10763. IN PVOID Tag OPTIONAL,
  10764. IN ULONG RemlockSize);
  10765. NTKERNELAPI
  10766. VOID
  10767. NTAPI
  10768. IoRemoveShareAccess(
  10769. IN PFILE_OBJECT FileObject,
  10770. IN OUT PSHARE_ACCESS ShareAccess);
  10771. NTKERNELAPI
  10772. NTSTATUS
  10773. NTAPI
  10774. IoReportTargetDeviceChange(
  10775. IN PDEVICE_OBJECT PhysicalDeviceObject,
  10776. IN PVOID NotificationStructure);
  10777. NTKERNELAPI
  10778. NTSTATUS
  10779. NTAPI
  10780. IoReportTargetDeviceChangeAsynchronous(
  10781. IN PDEVICE_OBJECT PhysicalDeviceObject,
  10782. IN PVOID NotificationStructure,
  10783. IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
  10784. IN PVOID Context OPTIONAL);
  10785. NTKERNELAPI
  10786. VOID
  10787. NTAPI
  10788. IoRequestDeviceEject(
  10789. IN PDEVICE_OBJECT PhysicalDeviceObject);
  10790. NTKERNELAPI
  10791. VOID
  10792. NTAPI
  10793. IoReuseIrp(
  10794. IN OUT PIRP Irp,
  10795. IN NTSTATUS Status);
  10796. NTKERNELAPI
  10797. NTSTATUS
  10798. NTAPI
  10799. IoSetDeviceInterfaceState(
  10800. IN PUNICODE_STRING SymbolicLinkName,
  10801. IN BOOLEAN Enable);
  10802. NTKERNELAPI
  10803. VOID
  10804. NTAPI
  10805. IoSetShareAccess(
  10806. IN ACCESS_MASK DesiredAccess,
  10807. IN ULONG DesiredShareAccess,
  10808. IN OUT PFILE_OBJECT FileObject,
  10809. OUT PSHARE_ACCESS ShareAccess);
  10810. NTKERNELAPI
  10811. VOID
  10812. NTAPI
  10813. IoStartNextPacket(
  10814. IN PDEVICE_OBJECT DeviceObject,
  10815. IN BOOLEAN Cancelable);
  10816. NTKERNELAPI
  10817. VOID
  10818. NTAPI
  10819. IoStartNextPacketByKey(
  10820. IN PDEVICE_OBJECT DeviceObject,
  10821. IN BOOLEAN Cancelable,
  10822. IN ULONG Key);
  10823. NTKERNELAPI
  10824. VOID
  10825. NTAPI
  10826. IoStartPacket(
  10827. IN PDEVICE_OBJECT DeviceObject,
  10828. IN PIRP Irp,
  10829. IN PULONG Key OPTIONAL,
  10830. IN PDRIVER_CANCEL CancelFunction OPTIONAL);
  10831. NTKERNELAPI
  10832. VOID
  10833. NTAPI
  10834. IoStartTimer(
  10835. IN PDEVICE_OBJECT DeviceObject);
  10836. NTKERNELAPI
  10837. VOID
  10838. NTAPI
  10839. IoStopTimer(
  10840. IN PDEVICE_OBJECT DeviceObject);
  10841. NTKERNELAPI
  10842. NTSTATUS
  10843. NTAPI
  10844. IoUnregisterPlugPlayNotification(
  10845. IN PVOID NotificationEntry);
  10846. NTKERNELAPI
  10847. VOID
  10848. NTAPI
  10849. IoUnregisterShutdownNotification(
  10850. IN PDEVICE_OBJECT DeviceObject);
  10851. NTKERNELAPI
  10852. VOID
  10853. NTAPI
  10854. IoUpdateShareAccess(
  10855. IN PFILE_OBJECT FileObject,
  10856. IN OUT PSHARE_ACCESS ShareAccess);
  10857. NTKERNELAPI
  10858. NTSTATUS
  10859. NTAPI
  10860. IoWMIAllocateInstanceIds(
  10861. IN GUID *Guid,
  10862. IN ULONG InstanceCount,
  10863. OUT ULONG *FirstInstanceId);
  10864. NTKERNELAPI
  10865. NTSTATUS
  10866. NTAPI
  10867. IoWMIQuerySingleInstanceMultiple(
  10868. IN PVOID *DataBlockObjectList,
  10869. IN PUNICODE_STRING InstanceNames,
  10870. IN ULONG ObjectCount,
  10871. IN OUT ULONG *InOutBufferSize,
  10872. OUT PVOID OutBuffer);
  10873. NTKERNELAPI
  10874. NTSTATUS
  10875. NTAPI
  10876. IoWMIRegistrationControl(
  10877. IN PDEVICE_OBJECT DeviceObject,
  10878. IN ULONG Action);
  10879. NTKERNELAPI
  10880. NTSTATUS
  10881. NTAPI
  10882. IoWMISuggestInstanceName(
  10883. IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
  10884. IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
  10885. IN BOOLEAN CombineNames,
  10886. OUT PUNICODE_STRING SuggestedInstanceName);
  10887. NTKERNELAPI
  10888. NTSTATUS
  10889. NTAPI
  10890. IoWMIWriteEvent(
  10891. IN OUT PVOID WnodeEventItem);
  10892. NTKERNELAPI
  10893. VOID
  10894. NTAPI
  10895. IoWriteErrorLogEntry(
  10896. IN PVOID ElEntry);
  10897. NTKERNELAPI
  10898. PIRP
  10899. NTAPI
  10900. IoGetTopLevelIrp(VOID);
  10901. NTKERNELAPI
  10902. NTSTATUS
  10903. NTAPI
  10904. IoRegisterLastChanceShutdownNotification(
  10905. IN PDEVICE_OBJECT DeviceObject);
  10906. NTKERNELAPI
  10907. VOID
  10908. NTAPI
  10909. IoSetTopLevelIrp(
  10910. IN PIRP Irp OPTIONAL);
  10911. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  10912. #if (NTDDI_VERSION >= NTDDI_WINXP)
  10913. NTKERNELAPI
  10914. NTSTATUS
  10915. NTAPI
  10916. IoCsqInitialize(
  10917. IN PIO_CSQ Csq,
  10918. IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
  10919. IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
  10920. IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
  10921. IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
  10922. IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
  10923. IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
  10924. NTKERNELAPI
  10925. VOID
  10926. NTAPI
  10927. IoCsqInsertIrp(
  10928. IN PIO_CSQ Csq,
  10929. IN PIRP Irp,
  10930. IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
  10931. NTKERNELAPI
  10932. PIRP
  10933. NTAPI
  10934. IoCsqRemoveIrp(
  10935. IN PIO_CSQ Csq,
  10936. IN PIO_CSQ_IRP_CONTEXT Context);
  10937. NTKERNELAPI
  10938. PIRP
  10939. NTAPI
  10940. IoCsqRemoveNextIrp(
  10941. IN PIO_CSQ Csq,
  10942. IN PVOID PeekContext OPTIONAL);
  10943. NTKERNELAPI
  10944. BOOLEAN
  10945. NTAPI
  10946. IoForwardIrpSynchronously(
  10947. IN PDEVICE_OBJECT DeviceObject,
  10948. IN PIRP Irp);
  10949. #define IoForwardAndCatchIrp IoForwardIrpSynchronously
  10950. NTKERNELAPI
  10951. VOID
  10952. NTAPI
  10953. IoFreeErrorLogEntry(
  10954. PVOID ElEntry);
  10955. NTKERNELAPI
  10956. NTSTATUS
  10957. NTAPI
  10958. IoSetCompletionRoutineEx(
  10959. IN PDEVICE_OBJECT DeviceObject,
  10960. IN PIRP Irp,
  10961. IN PIO_COMPLETION_ROUTINE CompletionRoutine,
  10962. IN PVOID Context,
  10963. IN BOOLEAN InvokeOnSuccess,
  10964. IN BOOLEAN InvokeOnError,
  10965. IN BOOLEAN InvokeOnCancel);
  10966. VOID
  10967. NTAPI
  10968. IoSetStartIoAttributes(
  10969. IN PDEVICE_OBJECT DeviceObject,
  10970. IN BOOLEAN DeferredStartIo,
  10971. IN BOOLEAN NonCancelable);
  10972. NTKERNELAPI
  10973. NTSTATUS
  10974. NTAPI
  10975. IoWMIDeviceObjectToInstanceName(
  10976. IN PVOID DataBlockObject,
  10977. IN PDEVICE_OBJECT DeviceObject,
  10978. OUT PUNICODE_STRING InstanceName);
  10979. NTKERNELAPI
  10980. NTSTATUS
  10981. NTAPI
  10982. IoWMIExecuteMethod(
  10983. IN PVOID DataBlockObject,
  10984. IN PUNICODE_STRING InstanceName,
  10985. IN ULONG MethodId,
  10986. IN ULONG InBufferSize,
  10987. IN OUT PULONG OutBufferSize,
  10988. IN OUT PUCHAR InOutBuffer);
  10989. NTKERNELAPI
  10990. NTSTATUS
  10991. NTAPI
  10992. IoWMIHandleToInstanceName(
  10993. IN PVOID DataBlockObject,
  10994. IN HANDLE FileHandle,
  10995. OUT PUNICODE_STRING InstanceName);
  10996. NTKERNELAPI
  10997. NTSTATUS
  10998. NTAPI
  10999. IoWMIOpenBlock(
  11000. IN GUID *DataBlockGuid,
  11001. IN ULONG DesiredAccess,
  11002. OUT PVOID *DataBlockObject);
  11003. NTKERNELAPI
  11004. NTSTATUS
  11005. NTAPI
  11006. IoWMIQueryAllData(
  11007. IN PVOID DataBlockObject,
  11008. IN OUT ULONG *InOutBufferSize,
  11009. OUT PVOID OutBuffer);
  11010. NTKERNELAPI
  11011. NTSTATUS
  11012. NTAPI
  11013. IoWMIQueryAllDataMultiple(
  11014. IN PVOID *DataBlockObjectList,
  11015. IN ULONG ObjectCount,
  11016. IN OUT ULONG *InOutBufferSize,
  11017. OUT PVOID OutBuffer);
  11018. NTKERNELAPI
  11019. NTSTATUS
  11020. NTAPI
  11021. IoWMIQuerySingleInstance(
  11022. IN PVOID DataBlockObject,
  11023. IN PUNICODE_STRING InstanceName,
  11024. IN OUT ULONG *InOutBufferSize,
  11025. OUT PVOID OutBuffer);
  11026. NTKERNELAPI
  11027. NTSTATUS
  11028. NTAPI
  11029. IoWMISetNotificationCallback(
  11030. IN OUT PVOID Object,
  11031. IN WMI_NOTIFICATION_CALLBACK Callback,
  11032. IN PVOID Context OPTIONAL);
  11033. NTKERNELAPI
  11034. NTSTATUS
  11035. NTAPI
  11036. IoWMISetSingleInstance(
  11037. IN PVOID DataBlockObject,
  11038. IN PUNICODE_STRING InstanceName,
  11039. IN ULONG Version,
  11040. IN ULONG ValueBufferSize,
  11041. IN PVOID ValueBuffer);
  11042. NTKERNELAPI
  11043. NTSTATUS
  11044. NTAPI
  11045. IoWMISetSingleItem(
  11046. IN PVOID DataBlockObject,
  11047. IN PUNICODE_STRING InstanceName,
  11048. IN ULONG DataItemId,
  11049. IN ULONG Version,
  11050. IN ULONG ValueBufferSize,
  11051. IN PVOID ValueBuffer);
  11052. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  11053. #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
  11054. NTKERNELAPI
  11055. NTSTATUS
  11056. NTAPI
  11057. IoValidateDeviceIoControlAccess(
  11058. IN PIRP Irp,
  11059. IN ULONG RequiredAccess);
  11060. #endif
  11061. #if (NTDDI_VERSION >= NTDDI_WS03)
  11062. NTKERNELAPI
  11063. NTSTATUS
  11064. NTAPI
  11065. IoCsqInitializeEx(
  11066. IN PIO_CSQ Csq,
  11067. IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
  11068. IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
  11069. IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
  11070. IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
  11071. IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
  11072. IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
  11073. NTKERNELAPI
  11074. NTSTATUS
  11075. NTAPI
  11076. IoCsqInsertIrpEx(
  11077. IN PIO_CSQ Csq,
  11078. IN PIRP Irp,
  11079. IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
  11080. IN PVOID InsertContext OPTIONAL);
  11081. #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
  11082. #if (NTDDI_VERSION >= NTDDI_VISTA)
  11083. NTKERNELAPI
  11084. NTSTATUS
  11085. NTAPI
  11086. IoGetBootDiskInformationLite(
  11087. OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
  11088. NTKERNELAPI
  11089. NTSTATUS
  11090. NTAPI
  11091. IoCheckShareAccessEx(
  11092. IN ACCESS_MASK DesiredAccess,
  11093. IN ULONG DesiredShareAccess,
  11094. IN OUT PFILE_OBJECT FileObject,
  11095. IN OUT PSHARE_ACCESS ShareAccess,
  11096. IN BOOLEAN Update,
  11097. IN PBOOLEAN WritePermission);
  11098. NTKERNELAPI
  11099. NTSTATUS
  11100. NTAPI
  11101. IoConnectInterruptEx(
  11102. IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
  11103. NTKERNELAPI
  11104. VOID
  11105. NTAPI
  11106. IoDisconnectInterruptEx(
  11107. IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
  11108. LOGICAL
  11109. NTAPI
  11110. IoWithinStackLimits(
  11111. IN ULONG_PTR RegionStart,
  11112. IN SIZE_T RegionSize);
  11113. NTKERNELAPI
  11114. VOID
  11115. NTAPI
  11116. IoSetShareAccessEx(
  11117. IN ACCESS_MASK DesiredAccess,
  11118. IN ULONG DesiredShareAccess,
  11119. IN OUT PFILE_OBJECT FileObject,
  11120. OUT PSHARE_ACCESS ShareAccess,
  11121. IN PBOOLEAN WritePermission);
  11122. ULONG
  11123. NTAPI
  11124. IoSizeofWorkItem(VOID);
  11125. VOID
  11126. NTAPI
  11127. IoInitializeWorkItem(
  11128. IN PVOID IoObject,
  11129. IN PIO_WORKITEM IoWorkItem);
  11130. VOID
  11131. NTAPI
  11132. IoUninitializeWorkItem(
  11133. IN PIO_WORKITEM IoWorkItem);
  11134. VOID
  11135. NTAPI
  11136. IoQueueWorkItemEx(
  11137. IN PIO_WORKITEM IoWorkItem,
  11138. IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
  11139. IN WORK_QUEUE_TYPE QueueType,
  11140. IN PVOID Context OPTIONAL);
  11141. IO_PRIORITY_HINT
  11142. NTAPI
  11143. IoGetIoPriorityHint(
  11144. IN PIRP Irp);
  11145. NTSTATUS
  11146. NTAPI
  11147. IoSetIoPriorityHint(
  11148. IN PIRP Irp,
  11149. IN IO_PRIORITY_HINT PriorityHint);
  11150. NTSTATUS
  11151. NTAPI
  11152. IoAllocateSfioStreamIdentifier(
  11153. IN PFILE_OBJECT FileObject,
  11154. IN ULONG Length,
  11155. IN PVOID Signature,
  11156. OUT PVOID *StreamIdentifier);
  11157. PVOID
  11158. NTAPI
  11159. IoGetSfioStreamIdentifier(
  11160. IN PFILE_OBJECT FileObject,
  11161. IN PVOID Signature);
  11162. NTSTATUS
  11163. NTAPI
  11164. IoFreeSfioStreamIdentifier(
  11165. IN PFILE_OBJECT FileObject,
  11166. IN PVOID Signature);
  11167. NTKERNELAPI
  11168. NTSTATUS
  11169. NTAPI
  11170. IoRequestDeviceEjectEx(
  11171. IN PDEVICE_OBJECT PhysicalDeviceObject,
  11172. IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL,
  11173. IN PVOID Context OPTIONAL,
  11174. IN PDRIVER_OBJECT DriverObject OPTIONAL);
  11175. NTKERNELAPI
  11176. NTSTATUS
  11177. NTAPI
  11178. IoSetDevicePropertyData(
  11179. IN PDEVICE_OBJECT Pdo,
  11180. IN CONST DEVPROPKEY *PropertyKey,
  11181. IN LCID Lcid,
  11182. IN ULONG Flags,
  11183. IN DEVPROPTYPE Type,
  11184. IN ULONG Size,
  11185. IN PVOID Data OPTIONAL);
  11186. NTKERNELAPI
  11187. NTSTATUS
  11188. NTAPI
  11189. IoGetDevicePropertyData(
  11190. PDEVICE_OBJECT Pdo,
  11191. CONST DEVPROPKEY *PropertyKey,
  11192. LCID Lcid,
  11193. ULONG Flags,
  11194. ULONG Size,
  11195. PVOID Data,
  11196. PULONG RequiredSize,
  11197. PDEVPROPTYPE Type);
  11198. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  11199. #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
  11200. #if (NTDDI_VERSION >= NTDDI_WS08)
  11201. NTKERNELAPI
  11202. NTSTATUS
  11203. NTAPI
  11204. IoReplacePartitionUnit(
  11205. IN PDEVICE_OBJECT TargetPdo,
  11206. IN PDEVICE_OBJECT SparePdo,
  11207. IN ULONG Flags);
  11208. #endif
  11209. #if (NTDDI_VERSION >= NTDDI_WIN7)
  11210. NTKERNELAPI
  11211. NTSTATUS
  11212. NTAPI
  11213. IoGetAffinityInterrupt(
  11214. IN PKINTERRUPT InterruptObject,
  11215. OUT PGROUP_AFFINITY GroupAffinity);
  11216. NTSTATUS
  11217. NTAPI
  11218. IoGetContainerInformation(
  11219. IN IO_CONTAINER_INFORMATION_CLASS InformationClass,
  11220. IN PVOID ContainerObject OPTIONAL,
  11221. IN OUT PVOID Buffer OPTIONAL,
  11222. IN ULONG BufferLength);
  11223. NTSTATUS
  11224. NTAPI
  11225. IoRegisterContainerNotification(
  11226. IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
  11227. IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
  11228. IN PVOID NotificationInformation OPTIONAL,
  11229. IN ULONG NotificationInformationLength,
  11230. OUT PVOID CallbackRegistration);
  11231. VOID
  11232. NTAPI
  11233. IoUnregisterContainerNotification(
  11234. IN PVOID CallbackRegistration);
  11235. NTKERNELAPI
  11236. NTSTATUS
  11237. NTAPI
  11238. IoUnregisterPlugPlayNotificationEx(
  11239. IN PVOID NotificationEntry);
  11240. NTKERNELAPI
  11241. NTSTATUS
  11242. NTAPI
  11243. IoGetDeviceNumaNode(
  11244. IN PDEVICE_OBJECT Pdo,
  11245. OUT PUSHORT NodeNumber);
  11246. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  11247. #if defined(_WIN64)
  11248. NTKERNELAPI
  11249. ULONG
  11250. NTAPI
  11251. IoWMIDeviceObjectToProviderId(
  11252. IN PDEVICE_OBJECT DeviceObject);
  11253. #else
  11254. #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
  11255. #endif
  11256. /*
  11257. * USHORT
  11258. * IoSizeOfIrp(
  11259. * IN CCHAR StackSize)
  11260. */
  11261. #define IoSizeOfIrp(_StackSize) \
  11262. ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
  11263. FORCEINLINE
  11264. VOID
  11265. IoSkipCurrentIrpStackLocation(
  11266. IN OUT PIRP Irp)
  11267. {
  11268. ASSERT(Irp->CurrentLocation <= Irp->StackCount);
  11269. Irp->CurrentLocation++;
  11270. #ifdef NONAMELESSUNION
  11271. Irp->Tail.Overlay.s.u.CurrentStackLocation++;
  11272. #else
  11273. Irp->Tail.Overlay.CurrentStackLocation++;
  11274. #endif
  11275. }
  11276. FORCEINLINE
  11277. VOID
  11278. IoSetNextIrpStackLocation(
  11279. IN OUT PIRP Irp)
  11280. {
  11281. ASSERT(Irp->CurrentLocation > 0);
  11282. Irp->CurrentLocation--;
  11283. #ifdef NONAMELESSUNION
  11284. Irp->Tail.Overlay.s.u.CurrentStackLocation--;
  11285. #else
  11286. Irp->Tail.Overlay.CurrentStackLocation--;
  11287. #endif
  11288. }
  11289. FORCEINLINE
  11290. PIO_STACK_LOCATION
  11291. IoGetNextIrpStackLocation(
  11292. IN PIRP Irp)
  11293. {
  11294. ASSERT(Irp->CurrentLocation > 0);
  11295. #ifdef NONAMELESSUNION
  11296. return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
  11297. #else
  11298. return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
  11299. #endif
  11300. }
  11301. FORCEINLINE
  11302. VOID
  11303. IoSetCompletionRoutine(
  11304. IN PIRP Irp,
  11305. IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
  11306. IN PVOID Context OPTIONAL,
  11307. IN BOOLEAN InvokeOnSuccess,
  11308. IN BOOLEAN InvokeOnError,
  11309. IN BOOLEAN InvokeOnCancel)
  11310. {
  11311. PIO_STACK_LOCATION irpSp;
  11312. ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
  11313. irpSp = IoGetNextIrpStackLocation(Irp);
  11314. irpSp->CompletionRoutine = CompletionRoutine;
  11315. irpSp->Context = Context;
  11316. irpSp->Control = 0;
  11317. if (InvokeOnSuccess) {
  11318. irpSp->Control = SL_INVOKE_ON_SUCCESS;
  11319. }
  11320. if (InvokeOnError) {
  11321. irpSp->Control |= SL_INVOKE_ON_ERROR;
  11322. }
  11323. if (InvokeOnCancel) {
  11324. irpSp->Control |= SL_INVOKE_ON_CANCEL;
  11325. }
  11326. }
  11327. /*
  11328. * PDRIVER_CANCEL
  11329. * IoSetCancelRoutine(
  11330. * IN PIRP Irp,
  11331. * IN PDRIVER_CANCEL CancelRoutine)
  11332. */
  11333. #define IoSetCancelRoutine(_Irp, \
  11334. _CancelRoutine) \
  11335. ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
  11336. (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
  11337. /*
  11338. * VOID
  11339. * IoRequestDpc(
  11340. * IN PDEVICE_OBJECT DeviceObject,
  11341. * IN PIRP Irp,
  11342. * IN PVOID Context);
  11343. */
  11344. #define IoRequestDpc(DeviceObject, Irp, Context)( \
  11345. KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
  11346. /*
  11347. * VOID
  11348. * IoReleaseRemoveLock(
  11349. * IN PIO_REMOVE_LOCK RemoveLock,
  11350. * IN PVOID Tag)
  11351. */
  11352. #define IoReleaseRemoveLock(_RemoveLock, \
  11353. _Tag) \
  11354. IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
  11355. /*
  11356. * VOID
  11357. * IoReleaseRemoveLockAndWait(
  11358. * IN PIO_REMOVE_LOCK RemoveLock,
  11359. * IN PVOID Tag)
  11360. */
  11361. #define IoReleaseRemoveLockAndWait(_RemoveLock, \
  11362. _Tag) \
  11363. IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
  11364. #if defined(_WIN64)
  11365. NTKERNELAPI
  11366. BOOLEAN
  11367. IoIs32bitProcess(
  11368. IN PIRP Irp OPTIONAL);
  11369. #endif
  11370. #define PLUGPLAY_REGKEY_DEVICE 1
  11371. #define PLUGPLAY_REGKEY_DRIVER 2
  11372. #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
  11373. FORCEINLINE
  11374. PIO_STACK_LOCATION
  11375. IoGetCurrentIrpStackLocation(
  11376. IN PIRP Irp)
  11377. {
  11378. ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
  11379. #ifdef NONAMELESSUNION
  11380. return Irp->Tail.Overlay.s.u.CurrentStackLocation;
  11381. #else
  11382. return Irp->Tail.Overlay.CurrentStackLocation;
  11383. #endif
  11384. }
  11385. FORCEINLINE
  11386. VOID
  11387. IoMarkIrpPending(
  11388. IN OUT PIRP Irp)
  11389. {
  11390. IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
  11391. }
  11392. /*
  11393. * BOOLEAN
  11394. * IoIsErrorUserInduced(
  11395. * IN NTSTATUS Status);
  11396. */
  11397. #define IoIsErrorUserInduced(Status) \
  11398. ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
  11399. ((Status) == STATUS_IO_TIMEOUT) || \
  11400. ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
  11401. ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
  11402. ((Status) == STATUS_VERIFY_REQUIRED) || \
  11403. ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
  11404. ((Status) == STATUS_WRONG_VOLUME)))
  11405. /* VOID
  11406. * IoInitializeRemoveLock(
  11407. * IN PIO_REMOVE_LOCK Lock,
  11408. * IN ULONG AllocateTag,
  11409. * IN ULONG MaxLockedMinutes,
  11410. * IN ULONG HighWatermark)
  11411. */
  11412. #define IoInitializeRemoveLock( \
  11413. Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
  11414. IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
  11415. HighWatermark, sizeof(IO_REMOVE_LOCK))
  11416. FORCEINLINE
  11417. VOID
  11418. IoInitializeDpcRequest(
  11419. IN PDEVICE_OBJECT DeviceObject,
  11420. IN PIO_DPC_ROUTINE DpcRoutine)
  11421. {
  11422. KeInitializeDpc( &DeviceObject->Dpc,
  11423. (PKDEFERRED_ROUTINE) DpcRoutine,
  11424. DeviceObject );
  11425. }
  11426. #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
  11427. /*
  11428. * ULONG
  11429. * IoGetFunctionCodeFromCtlCode(
  11430. * IN ULONG ControlCode)
  11431. */
  11432. #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
  11433. (((_ControlCode) >> 2) & 0x00000FFF)
  11434. FORCEINLINE
  11435. VOID
  11436. IoCopyCurrentIrpStackLocationToNext(
  11437. IN OUT PIRP Irp)
  11438. {
  11439. PIO_STACK_LOCATION irpSp;
  11440. PIO_STACK_LOCATION nextIrpSp;
  11441. irpSp = IoGetCurrentIrpStackLocation(Irp);
  11442. nextIrpSp = IoGetNextIrpStackLocation(Irp);
  11443. RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
  11444. nextIrpSp->Control = 0;
  11445. }
  11446. NTKERNELAPI
  11447. VOID
  11448. NTAPI
  11449. IoGetStackLimits(
  11450. OUT PULONG_PTR LowLimit,
  11451. OUT PULONG_PTR HighLimit);
  11452. FORCEINLINE
  11453. ULONG_PTR
  11454. IoGetRemainingStackSize(VOID)
  11455. {
  11456. ULONG_PTR End, Begin;
  11457. ULONG_PTR Result;
  11458. IoGetStackLimits(&Begin, &End);
  11459. Result = (ULONG_PTR)(&End) - Begin;
  11460. return Result;
  11461. }
  11462. #if (NTDDI_VERSION >= NTDDI_WS03)
  11463. FORCEINLINE
  11464. VOID
  11465. IoInitializeThreadedDpcRequest(
  11466. IN PDEVICE_OBJECT DeviceObject,
  11467. IN PIO_DPC_ROUTINE DpcRoutine)
  11468. {
  11469. KeInitializeThreadedDpc(&DeviceObject->Dpc,
  11470. (PKDEFERRED_ROUTINE) DpcRoutine,
  11471. DeviceObject );
  11472. }
  11473. #endif
  11474. /******************************************************************************
  11475. * Power Management Support Functions *
  11476. ******************************************************************************/
  11477. #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
  11478. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  11479. NTKERNELAPI
  11480. NTSTATUS
  11481. NTAPI
  11482. PoCallDriver(
  11483. IN struct _DEVICE_OBJECT *DeviceObject,
  11484. IN OUT struct _IRP *Irp);
  11485. NTKERNELAPI
  11486. PULONG
  11487. NTAPI
  11488. PoRegisterDeviceForIdleDetection(
  11489. IN struct _DEVICE_OBJECT *DeviceObject,
  11490. IN ULONG ConservationIdleTime,
  11491. IN ULONG PerformanceIdleTime,
  11492. IN DEVICE_POWER_STATE State);
  11493. NTKERNELAPI
  11494. PVOID
  11495. NTAPI
  11496. PoRegisterSystemState(
  11497. IN OUT PVOID StateHandle OPTIONAL,
  11498. IN EXECUTION_STATE Flags);
  11499. NTKERNELAPI
  11500. NTSTATUS
  11501. NTAPI
  11502. PoRequestPowerIrp(
  11503. IN struct _DEVICE_OBJECT *DeviceObject,
  11504. IN UCHAR MinorFunction,
  11505. IN POWER_STATE PowerState,
  11506. IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
  11507. IN PVOID Context OPTIONAL,
  11508. OUT struct _IRP **Irp OPTIONAL);
  11509. NTKERNELAPI
  11510. POWER_STATE
  11511. NTAPI
  11512. PoSetPowerState(
  11513. IN struct _DEVICE_OBJECT *DeviceObject,
  11514. IN POWER_STATE_TYPE Type,
  11515. IN POWER_STATE State);
  11516. NTKERNELAPI
  11517. VOID
  11518. NTAPI
  11519. PoSetSystemState(
  11520. IN EXECUTION_STATE Flags);
  11521. NTKERNELAPI
  11522. VOID
  11523. NTAPI
  11524. PoStartNextPowerIrp(
  11525. IN OUT struct _IRP *Irp);
  11526. NTKERNELAPI
  11527. VOID
  11528. NTAPI
  11529. PoUnregisterSystemState(
  11530. IN OUT PVOID StateHandle);
  11531. NTKERNELAPI
  11532. NTSTATUS
  11533. NTAPI
  11534. PoRequestShutdownEvent(
  11535. OUT PVOID *Event);
  11536. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  11537. #if (NTDDI_VERSION >= NTDDI_VISTA)
  11538. NTKERNELAPI
  11539. VOID
  11540. NTAPI
  11541. PoSetSystemWake(
  11542. IN OUT struct _IRP *Irp);
  11543. NTKERNELAPI
  11544. BOOLEAN
  11545. NTAPI
  11546. PoGetSystemWake(
  11547. IN struct _IRP *Irp);
  11548. NTKERNELAPI
  11549. NTSTATUS
  11550. NTAPI
  11551. PoRegisterPowerSettingCallback(
  11552. IN PDEVICE_OBJECT DeviceObject OPTIONAL,
  11553. IN LPCGUID SettingGuid,
  11554. IN PPOWER_SETTING_CALLBACK Callback,
  11555. IN PVOID Context OPTIONAL,
  11556. OUT PVOID *Handle OPTIONAL);
  11557. NTKERNELAPI
  11558. NTSTATUS
  11559. NTAPI
  11560. PoUnregisterPowerSettingCallback(
  11561. IN OUT PVOID Handle);
  11562. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  11563. #if (NTDDI_VERSION >= NTDDI_VISTASP1)
  11564. NTKERNELAPI
  11565. VOID
  11566. NTAPI
  11567. PoSetDeviceBusyEx(
  11568. IN OUT PULONG IdlePointer);
  11569. #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
  11570. #if (NTDDI_VERSION >= NTDDI_WIN7)
  11571. NTKERNELAPI
  11572. VOID
  11573. NTAPI
  11574. PoStartDeviceBusy(
  11575. IN OUT PULONG IdlePointer);
  11576. NTKERNELAPI
  11577. VOID
  11578. NTAPI
  11579. PoEndDeviceBusy(
  11580. IN OUT PULONG IdlePointer);
  11581. NTKERNELAPI
  11582. BOOLEAN
  11583. NTAPI
  11584. PoQueryWatchdogTime(
  11585. IN PDEVICE_OBJECT Pdo,
  11586. OUT PULONG SecondsRemaining);
  11587. NTKERNELAPI
  11588. VOID
  11589. NTAPI
  11590. PoDeletePowerRequest(
  11591. IN OUT PVOID PowerRequest);
  11592. NTKERNELAPI
  11593. NTSTATUS
  11594. NTAPI
  11595. PoSetPowerRequest(
  11596. IN OUT PVOID PowerRequest,
  11597. IN POWER_REQUEST_TYPE Type);
  11598. NTKERNELAPI
  11599. NTSTATUS
  11600. NTAPI
  11601. PoClearPowerRequest(
  11602. IN OUT PVOID PowerRequest,
  11603. IN POWER_REQUEST_TYPE Type);
  11604. NTKERNELAPI
  11605. NTSTATUS
  11606. NTAPI
  11607. PoCreatePowerRequest(
  11608. OUT PVOID *PowerRequest,
  11609. IN PDEVICE_OBJECT DeviceObject,
  11610. IN PCOUNTED_REASON_CONTEXT Context);
  11611. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  11612. /******************************************************************************
  11613. * Executive Functions *
  11614. ******************************************************************************/
  11615. #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
  11616. #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
  11617. #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
  11618. #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
  11619. #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
  11620. #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
  11621. #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
  11622. #define ExInitializeSListHead InitializeSListHead
  11623. #if defined(_NTHAL_) && defined(_X86_)
  11624. NTKERNELAPI
  11625. VOID
  11626. FASTCALL
  11627. ExiAcquireFastMutex(
  11628. IN OUT PFAST_MUTEX FastMutex);
  11629. NTKERNELAPI
  11630. VOID
  11631. FASTCALL
  11632. ExiReleaseFastMutex(
  11633. IN OUT PFAST_MUTEX FastMutex);
  11634. NTKERNELAPI
  11635. BOOLEAN
  11636. FASTCALL
  11637. ExiTryToAcquireFastMutex(
  11638. IN OUT PFAST_MUTEX FastMutex);
  11639. #define ExAcquireFastMutex ExiAcquireFastMutex
  11640. #define ExReleaseFastMutex ExiReleaseFastMutex
  11641. #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
  11642. #else
  11643. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  11644. NTKERNELAPI
  11645. VOID
  11646. FASTCALL
  11647. ExAcquireFastMutex(
  11648. IN OUT PFAST_MUTEX FastMutex);
  11649. NTKERNELAPI
  11650. VOID
  11651. FASTCALL
  11652. ExReleaseFastMutex(
  11653. IN OUT PFAST_MUTEX FastMutex);
  11654. NTKERNELAPI
  11655. BOOLEAN
  11656. FASTCALL
  11657. ExTryToAcquireFastMutex(
  11658. IN OUT PFAST_MUTEX FastMutex);
  11659. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  11660. #endif /* defined(_NTHAL_) && defined(_X86_) */
  11661. #if defined(_X86_)
  11662. #define ExInterlockedAddUlong ExfInterlockedAddUlong
  11663. #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
  11664. #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
  11665. #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
  11666. #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
  11667. #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
  11668. #endif /* defined(_X86_) */
  11669. #if defined(_WIN64)
  11670. #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
  11671. defined(_NTHAL_) || defined(_NTOSP_)
  11672. NTKERNELAPI
  11673. USHORT
  11674. ExQueryDepthSList(IN PSLIST_HEADER ListHead);
  11675. #else
  11676. FORCEINLINE
  11677. USHORT
  11678. ExQueryDepthSList(IN PSLIST_HEADER ListHead)
  11679. {
  11680. return (USHORT)(ListHead->Alignment & 0xffff);
  11681. }
  11682. #endif
  11683. NTKERNELAPI
  11684. PSLIST_ENTRY
  11685. ExpInterlockedFlushSList(
  11686. PSLIST_HEADER ListHead);
  11687. NTKERNELAPI
  11688. PSLIST_ENTRY
  11689. ExpInterlockedPopEntrySList(
  11690. PSLIST_HEADER ListHead);
  11691. NTKERNELAPI
  11692. PSLIST_ENTRY
  11693. ExpInterlockedPushEntrySList(
  11694. PSLIST_HEADER ListHead,
  11695. PSLIST_ENTRY ListEntry);
  11696. #define ExInterlockedFlushSList(Head) \
  11697. ExpInterlockedFlushSList(Head)
  11698. #define ExInterlockedPopEntrySList(Head, Lock) \
  11699. ExpInterlockedPopEntrySList(Head)
  11700. #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
  11701. ExpInterlockedPushEntrySList(Head, Entry)
  11702. #else /* !defined(_WIN64) */
  11703. #ifdef NONAMELESSUNION
  11704. #define ExQueryDepthSList(listhead) (listhead)->s.Depth
  11705. #else
  11706. #define ExQueryDepthSList(listhead) (listhead)->Depth
  11707. #endif
  11708. NTKERNELAPI
  11709. PSINGLE_LIST_ENTRY
  11710. FASTCALL
  11711. ExInterlockedFlushSList(
  11712. IN OUT PSLIST_HEADER ListHead);
  11713. #endif /* !defined(_WIN64) */
  11714. #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
  11715. NTKERNELAPI
  11716. PSINGLE_LIST_ENTRY
  11717. FASTCALL
  11718. ExInterlockedPopEntrySList(
  11719. IN PSLIST_HEADER ListHead,
  11720. IN PKSPIN_LOCK Lock);
  11721. NTKERNELAPI
  11722. PSINGLE_LIST_ENTRY
  11723. FASTCALL
  11724. ExInterlockedPushEntrySList(
  11725. IN PSLIST_HEADER ListHead,
  11726. IN PSINGLE_LIST_ENTRY ListEntry,
  11727. IN PKSPIN_LOCK Lock);
  11728. NTKERNELAPI
  11729. PVOID
  11730. NTAPI
  11731. ExAllocateFromPagedLookasideList(
  11732. IN OUT PPAGED_LOOKASIDE_LIST Lookaside);
  11733. NTKERNELAPI
  11734. VOID
  11735. NTAPI
  11736. ExFreeToPagedLookasideList(
  11737. IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
  11738. IN PVOID Entry);
  11739. #else /* !_WIN2K_COMPAT_SLIST_USAGE */
  11740. #if !defined(_WIN64)
  11741. #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
  11742. InterlockedPopEntrySList(_ListHead)
  11743. #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
  11744. InterlockedPushEntrySList(_ListHead, _ListEntry)
  11745. #endif
  11746. static __inline
  11747. PVOID
  11748. ExAllocateFromPagedLookasideList(
  11749. IN OUT PPAGED_LOOKASIDE_LIST Lookaside)
  11750. {
  11751. PVOID Entry;
  11752. Lookaside->L.TotalAllocates++;
  11753. #ifdef NONAMELESSUNION
  11754. Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
  11755. if (Entry == NULL) {
  11756. Lookaside->L.u2.AllocateMisses++;
  11757. Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
  11758. Lookaside->L.Size,
  11759. Lookaside->L.Tag);
  11760. }
  11761. #else /* NONAMELESSUNION */
  11762. Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
  11763. if (Entry == NULL) {
  11764. Lookaside->L.AllocateMisses++;
  11765. Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
  11766. Lookaside->L.Size,
  11767. Lookaside->L.Tag);
  11768. }
  11769. #endif /* NONAMELESSUNION */
  11770. return Entry;
  11771. }
  11772. static __inline
  11773. VOID
  11774. ExFreeToPagedLookasideList(
  11775. IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
  11776. IN PVOID Entry)
  11777. {
  11778. Lookaside->L.TotalFrees++;
  11779. #ifdef NONAMELESSUNION
  11780. if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
  11781. Lookaside->L.u3.FreeMisses++;
  11782. (Lookaside->L.u5.Free)(Entry);
  11783. } else {
  11784. InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
  11785. }
  11786. #else /* NONAMELESSUNION */
  11787. if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
  11788. Lookaside->L.FreeMisses++;
  11789. (Lookaside->L.Free)(Entry);
  11790. } else {
  11791. InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
  11792. }
  11793. #endif /* NONAMELESSUNION */
  11794. }
  11795. #endif /* _WIN2K_COMPAT_SLIST_USAGE */
  11796. /* ERESOURCE_THREAD
  11797. * ExGetCurrentResourceThread(
  11798. * VOID);
  11799. */
  11800. #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
  11801. #define ExReleaseResource(R) (ExReleaseResourceLite(R))
  11802. /* VOID
  11803. * ExInitializeWorkItem(
  11804. * IN PWORK_QUEUE_ITEM Item,
  11805. * IN PWORKER_THREAD_ROUTINE Routine,
  11806. * IN PVOID Context)
  11807. */
  11808. #define ExInitializeWorkItem(Item, Routine, Context) \
  11809. { \
  11810. (Item)->WorkerRoutine = Routine; \
  11811. (Item)->Parameter = Context; \
  11812. (Item)->List.Flink = NULL; \
  11813. }
  11814. FORCEINLINE
  11815. VOID
  11816. ExInitializeFastMutex(
  11817. OUT PFAST_MUTEX FastMutex)
  11818. {
  11819. FastMutex->Count = FM_LOCK_BIT;
  11820. FastMutex->Owner = NULL;
  11821. FastMutex->Contention = 0;
  11822. KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
  11823. return;
  11824. }
  11825. typedef void *PEXT_CANCEL_PARAMETERS;
  11826. typedef void (NTAPI EXT_DELETE_CALLBACK)(void *context);
  11827. typedef EXT_DELETE_CALLBACK *PEXT_DELETE_CALLBACK;
  11828. typedef struct _EXT_DELETE_PARAMETERS
  11829. {
  11830. ULONG Version;
  11831. ULONG Reserved;
  11832. PEXT_DELETE_CALLBACK DeleteCallback;
  11833. void *DeleteContext;
  11834. } EXT_DELETE_PARAMETERS, *PEXT_DELETE_PARAMETERS;
  11835. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  11836. typedef struct _EX_TIMER *PEX_TIMER;
  11837. typedef void (NTAPI EXT_CALLBACK)(PEX_TIMER, PVOID);
  11838. typedef EXT_CALLBACK *PEXT_CALLBACK;
  11839. NTKERNELAPI
  11840. VOID
  11841. FASTCALL
  11842. ExAcquireFastMutexUnsafe(
  11843. IN OUT PFAST_MUTEX FastMutex);
  11844. NTKERNELAPI
  11845. VOID
  11846. FASTCALL
  11847. ExReleaseFastMutexUnsafe(
  11848. IN OUT PFAST_MUTEX FastMutex);
  11849. NTKERNELAPI
  11850. BOOLEAN
  11851. NTAPI
  11852. ExAcquireResourceExclusiveLite(
  11853. IN OUT PERESOURCE Resource,
  11854. IN BOOLEAN Wait);
  11855. NTKERNELAPI
  11856. BOOLEAN
  11857. NTAPI
  11858. ExAcquireResourceSharedLite(
  11859. IN OUT PERESOURCE Resource,
  11860. IN BOOLEAN Wait);
  11861. NTKERNELAPI
  11862. BOOLEAN
  11863. NTAPI
  11864. ExAcquireSharedStarveExclusive(
  11865. IN OUT PERESOURCE Resource,
  11866. IN BOOLEAN Wait);
  11867. NTKERNELAPI
  11868. BOOLEAN
  11869. NTAPI
  11870. ExAcquireSharedWaitForExclusive(
  11871. IN OUT PERESOURCE Resource,
  11872. IN BOOLEAN Wait);
  11873. NTKERNELAPI
  11874. PVOID
  11875. NTAPI
  11876. ExAllocatePool(
  11877. IN POOL_TYPE PoolType,
  11878. IN SIZE_T NumberOfBytes);
  11879. NTKERNELAPI
  11880. PVOID
  11881. NTAPI
  11882. ExAllocatePoolWithQuota(
  11883. IN POOL_TYPE PoolType,
  11884. IN SIZE_T NumberOfBytes);
  11885. NTKERNELAPI
  11886. PVOID
  11887. NTAPI
  11888. ExAllocatePoolWithQuotaTag(
  11889. IN POOL_TYPE PoolType,
  11890. IN SIZE_T NumberOfBytes,
  11891. IN ULONG Tag);
  11892. #ifndef POOL_TAGGING
  11893. #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
  11894. #endif
  11895. NTKERNELAPI
  11896. PVOID
  11897. NTAPI
  11898. ExAllocatePoolWithTag(
  11899. IN POOL_TYPE PoolType,
  11900. IN SIZE_T NumberOfBytes,
  11901. IN ULONG Tag);
  11902. #ifndef POOL_TAGGING
  11903. #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
  11904. #endif
  11905. NTKERNELAPI
  11906. PVOID
  11907. NTAPI
  11908. ExAllocatePoolWithTagPriority(
  11909. IN POOL_TYPE PoolType,
  11910. IN SIZE_T NumberOfBytes,
  11911. IN ULONG Tag,
  11912. IN EX_POOL_PRIORITY Priority);
  11913. NTKERNELAPI
  11914. VOID
  11915. NTAPI
  11916. ExConvertExclusiveToSharedLite(
  11917. IN OUT PERESOURCE Resource);
  11918. NTKERNELAPI
  11919. NTSTATUS
  11920. NTAPI
  11921. ExCreateCallback(
  11922. OUT PCALLBACK_OBJECT *CallbackObject,
  11923. IN POBJECT_ATTRIBUTES ObjectAttributes,
  11924. IN BOOLEAN Create,
  11925. IN BOOLEAN AllowMultipleCallbacks);
  11926. NTKERNELAPI
  11927. VOID
  11928. NTAPI
  11929. ExDeleteNPagedLookasideList(
  11930. IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
  11931. NTKERNELAPI
  11932. VOID
  11933. NTAPI
  11934. ExDeletePagedLookasideList(
  11935. IN PPAGED_LOOKASIDE_LIST Lookaside);
  11936. NTKERNELAPI
  11937. NTSTATUS
  11938. NTAPI
  11939. ExDeleteResourceLite(
  11940. IN OUT PERESOURCE Resource);
  11941. NTKERNELAPI
  11942. VOID
  11943. NTAPI
  11944. ExFreePool(
  11945. IN PVOID P);
  11946. NTKERNELAPI
  11947. VOID
  11948. NTAPI
  11949. ExFreePoolWithTag(
  11950. IN PVOID P,
  11951. IN ULONG Tag);
  11952. NTKERNELAPI
  11953. ULONG
  11954. NTAPI
  11955. ExGetExclusiveWaiterCount(
  11956. IN PERESOURCE Resource);
  11957. NTKERNELAPI
  11958. KPROCESSOR_MODE
  11959. NTAPI
  11960. ExGetPreviousMode(VOID);
  11961. NTKERNELAPI
  11962. ULONG
  11963. NTAPI
  11964. ExGetSharedWaiterCount(
  11965. IN PERESOURCE Resource);
  11966. NTKERNELAPI
  11967. VOID
  11968. NTAPI
  11969. ExInitializeNPagedLookasideList(
  11970. IN PNPAGED_LOOKASIDE_LIST Lookaside,
  11971. IN PALLOCATE_FUNCTION Allocate OPTIONAL,
  11972. IN PFREE_FUNCTION Free OPTIONAL,
  11973. IN ULONG Flags,
  11974. IN SIZE_T Size,
  11975. IN ULONG Tag,
  11976. IN USHORT Depth);
  11977. NTKERNELAPI
  11978. VOID
  11979. NTAPI
  11980. ExInitializePagedLookasideList(
  11981. IN PPAGED_LOOKASIDE_LIST Lookaside,
  11982. IN PALLOCATE_FUNCTION Allocate OPTIONAL,
  11983. IN PFREE_FUNCTION Free OPTIONAL,
  11984. IN ULONG Flags,
  11985. IN SIZE_T Size,
  11986. IN ULONG Tag,
  11987. IN USHORT Depth);
  11988. NTKERNELAPI
  11989. NTSTATUS
  11990. NTAPI
  11991. ExInitializeResourceLite(
  11992. OUT PERESOURCE Resource);
  11993. NTKERNELAPI
  11994. LARGE_INTEGER
  11995. NTAPI
  11996. ExInterlockedAddLargeInteger(
  11997. IN PLARGE_INTEGER Addend,
  11998. IN LARGE_INTEGER Increment,
  11999. IN PKSPIN_LOCK Lock);
  12000. #if defined(_WIN64)
  12001. #define ExInterlockedAddLargeStatistic(Addend, Increment) \
  12002. (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
  12003. #else
  12004. #define ExInterlockedAddLargeStatistic(Addend, Increment) \
  12005. _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
  12006. #endif
  12007. NTKERNELAPI
  12008. ULONG
  12009. FASTCALL
  12010. ExInterlockedAddUlong(
  12011. IN PULONG Addend,
  12012. IN ULONG Increment,
  12013. IN OUT PKSPIN_LOCK Lock);
  12014. #if defined(_AMD64_) || defined(_IA64_)
  12015. #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
  12016. InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
  12017. #elif defined(_X86_)
  12018. NTKERNELAPI
  12019. LONGLONG
  12020. FASTCALL
  12021. ExfInterlockedCompareExchange64(
  12022. IN OUT LONGLONG volatile *Destination,
  12023. IN PLONGLONG Exchange,
  12024. IN PLONGLONG Comperand);
  12025. #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
  12026. ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
  12027. #else
  12028. NTKERNELAPI
  12029. LONGLONG
  12030. FASTCALL
  12031. ExInterlockedCompareExchange64(
  12032. IN OUT LONGLONG volatile *Destination,
  12033. IN PLONGLONG Exchange,
  12034. IN PLONGLONG Comparand,
  12035. IN PKSPIN_LOCK Lock);
  12036. #endif /* defined(_AMD64_) || defined(_IA64_) */
  12037. NTKERNELAPI
  12038. PLIST_ENTRY
  12039. FASTCALL
  12040. ExInterlockedInsertHeadList(
  12041. IN OUT PLIST_ENTRY ListHead,
  12042. IN OUT PLIST_ENTRY ListEntry,
  12043. IN OUT PKSPIN_LOCK Lock);
  12044. NTKERNELAPI
  12045. PLIST_ENTRY
  12046. FASTCALL
  12047. ExInterlockedInsertTailList(
  12048. IN OUT PLIST_ENTRY ListHead,
  12049. IN OUT PLIST_ENTRY ListEntry,
  12050. IN OUT PKSPIN_LOCK Lock);
  12051. NTKERNELAPI
  12052. PSINGLE_LIST_ENTRY
  12053. FASTCALL
  12054. ExInterlockedPopEntryList(
  12055. IN OUT PSINGLE_LIST_ENTRY ListHead,
  12056. IN OUT PKSPIN_LOCK Lock);
  12057. NTKERNELAPI
  12058. PSINGLE_LIST_ENTRY
  12059. FASTCALL
  12060. ExInterlockedPushEntryList(
  12061. IN OUT PSINGLE_LIST_ENTRY ListHead,
  12062. IN OUT PSINGLE_LIST_ENTRY ListEntry,
  12063. IN OUT PKSPIN_LOCK Lock);
  12064. NTKERNELAPI
  12065. PLIST_ENTRY
  12066. FASTCALL
  12067. ExInterlockedRemoveHeadList(
  12068. IN OUT PLIST_ENTRY ListHead,
  12069. IN OUT PKSPIN_LOCK Lock);
  12070. NTKERNELAPI
  12071. BOOLEAN
  12072. NTAPI
  12073. ExIsProcessorFeaturePresent(
  12074. IN ULONG ProcessorFeature);
  12075. NTKERNELAPI
  12076. BOOLEAN
  12077. NTAPI
  12078. ExIsResourceAcquiredExclusiveLite(
  12079. IN PERESOURCE Resource);
  12080. NTKERNELAPI
  12081. ULONG
  12082. NTAPI
  12083. ExIsResourceAcquiredSharedLite(
  12084. IN PERESOURCE Resource);
  12085. #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
  12086. NTKERNELAPI
  12087. VOID
  12088. NTAPI
  12089. ExLocalTimeToSystemTime(
  12090. IN PLARGE_INTEGER LocalTime,
  12091. OUT PLARGE_INTEGER SystemTime);
  12092. NTKERNELAPI
  12093. VOID
  12094. NTAPI
  12095. ExNotifyCallback(
  12096. IN PCALLBACK_OBJECT CallbackObject,
  12097. IN PVOID Argument1 OPTIONAL,
  12098. IN PVOID Argument2 OPTIONAL);
  12099. NTKERNELAPI
  12100. VOID
  12101. NTAPI
  12102. ExQueueWorkItem(
  12103. IN OUT PWORK_QUEUE_ITEM WorkItem,
  12104. IN WORK_QUEUE_TYPE QueueType);
  12105. NTKERNELAPI
  12106. DECLSPEC_NORETURN
  12107. VOID
  12108. NTAPI
  12109. ExRaiseStatus(
  12110. IN NTSTATUS Status);
  12111. NTKERNELAPI
  12112. PVOID
  12113. NTAPI
  12114. ExRegisterCallback(
  12115. IN PCALLBACK_OBJECT CallbackObject,
  12116. IN PCALLBACK_FUNCTION CallbackFunction,
  12117. IN PVOID CallbackContext OPTIONAL);
  12118. NTKERNELAPI
  12119. NTSTATUS
  12120. NTAPI
  12121. ExReinitializeResourceLite(
  12122. IN OUT PERESOURCE Resource);
  12123. NTKERNELAPI
  12124. VOID
  12125. NTAPI
  12126. ExReleaseResourceForThreadLite(
  12127. IN OUT PERESOURCE Resource,
  12128. IN ERESOURCE_THREAD ResourceThreadId);
  12129. NTKERNELAPI
  12130. VOID
  12131. FASTCALL
  12132. ExReleaseResourceLite(
  12133. IN OUT PERESOURCE Resource);
  12134. NTKERNELAPI
  12135. VOID
  12136. NTAPI
  12137. ExSetResourceOwnerPointer(
  12138. IN OUT PERESOURCE Resource,
  12139. IN PVOID OwnerPointer);
  12140. NTKERNELAPI
  12141. ULONG
  12142. NTAPI
  12143. ExSetTimerResolution(
  12144. IN ULONG DesiredTime,
  12145. IN BOOLEAN SetResolution);
  12146. NTKERNELAPI
  12147. VOID
  12148. NTAPI
  12149. ExSystemTimeToLocalTime(
  12150. IN PLARGE_INTEGER SystemTime,
  12151. OUT PLARGE_INTEGER LocalTime);
  12152. NTKERNELAPI
  12153. VOID
  12154. NTAPI
  12155. ExUnregisterCallback(
  12156. IN OUT PVOID CbRegistration);
  12157. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  12158. #if (NTDDI_VERSION >= NTDDI_WINXP)
  12159. NTKERNELAPI
  12160. BOOLEAN
  12161. FASTCALL
  12162. ExAcquireRundownProtection(
  12163. IN OUT PEX_RUNDOWN_REF RunRef);
  12164. NTKERNELAPI
  12165. VOID
  12166. FASTCALL
  12167. ExInitializeRundownProtection(
  12168. OUT PEX_RUNDOWN_REF RunRef);
  12169. NTKERNELAPI
  12170. VOID
  12171. FASTCALL
  12172. ExReInitializeRundownProtection(
  12173. IN OUT PEX_RUNDOWN_REF RunRef);
  12174. NTKERNELAPI
  12175. VOID
  12176. FASTCALL
  12177. ExReleaseRundownProtection(
  12178. IN OUT PEX_RUNDOWN_REF RunRef);
  12179. NTKERNELAPI
  12180. VOID
  12181. FASTCALL
  12182. ExRundownCompleted(
  12183. OUT PEX_RUNDOWN_REF RunRef);
  12184. NTKERNELAPI
  12185. BOOLEAN
  12186. NTAPI
  12187. ExVerifySuite(
  12188. IN SUITE_TYPE SuiteType);
  12189. NTKERNELAPI
  12190. VOID
  12191. FASTCALL
  12192. ExWaitForRundownProtectionRelease(
  12193. IN OUT PEX_RUNDOWN_REF RunRef);
  12194. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  12195. #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
  12196. NTKERNELAPI
  12197. BOOLEAN
  12198. FASTCALL
  12199. ExAcquireRundownProtectionEx(
  12200. IN OUT PEX_RUNDOWN_REF RunRef,
  12201. IN ULONG Count);
  12202. NTKERNELAPI
  12203. VOID
  12204. FASTCALL
  12205. ExReleaseRundownProtectionEx(
  12206. IN OUT PEX_RUNDOWN_REF RunRef,
  12207. IN ULONG Count);
  12208. #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
  12209. #if (NTDDI_VERSION >= NTDDI_WS03SP1)
  12210. NTKERNELAPI
  12211. PEX_RUNDOWN_REF_CACHE_AWARE
  12212. NTAPI
  12213. ExAllocateCacheAwareRundownProtection(
  12214. IN POOL_TYPE PoolType,
  12215. IN ULONG PoolTag);
  12216. NTKERNELAPI
  12217. SIZE_T
  12218. NTAPI
  12219. ExSizeOfRundownProtectionCacheAware(VOID);
  12220. NTKERNELAPI
  12221. PVOID
  12222. NTAPI
  12223. ExEnterCriticalRegionAndAcquireResourceShared(
  12224. IN OUT PERESOURCE Resource);
  12225. NTKERNELAPI
  12226. PVOID
  12227. NTAPI
  12228. ExEnterCriticalRegionAndAcquireResourceExclusive(
  12229. IN OUT PERESOURCE Resource);
  12230. NTKERNELAPI
  12231. PVOID
  12232. NTAPI
  12233. ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
  12234. IN OUT PERESOURCE Resource);
  12235. NTKERNELAPI
  12236. VOID
  12237. FASTCALL
  12238. ExReleaseResourceAndLeaveCriticalRegion(
  12239. IN OUT PERESOURCE Resource);
  12240. NTKERNELAPI
  12241. VOID
  12242. NTAPI
  12243. ExInitializeRundownProtectionCacheAware(
  12244. OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
  12245. IN SIZE_T RunRefSize);
  12246. NTKERNELAPI
  12247. VOID
  12248. NTAPI
  12249. ExFreeCacheAwareRundownProtection(
  12250. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
  12251. NTKERNELAPI
  12252. BOOLEAN
  12253. FASTCALL
  12254. ExAcquireRundownProtectionCacheAware(
  12255. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
  12256. NTKERNELAPI
  12257. VOID
  12258. FASTCALL
  12259. ExReleaseRundownProtectionCacheAware(
  12260. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
  12261. NTKERNELAPI
  12262. BOOLEAN
  12263. FASTCALL
  12264. ExAcquireRundownProtectionCacheAwareEx(
  12265. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
  12266. IN ULONG Count);
  12267. NTKERNELAPI
  12268. VOID
  12269. FASTCALL
  12270. ExReleaseRundownProtectionCacheAwareEx(
  12271. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
  12272. IN ULONG Count);
  12273. NTKERNELAPI
  12274. VOID
  12275. FASTCALL
  12276. ExWaitForRundownProtectionReleaseCacheAware(
  12277. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
  12278. NTKERNELAPI
  12279. VOID
  12280. FASTCALL
  12281. ExReInitializeRundownProtectionCacheAware(
  12282. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
  12283. NTKERNELAPI
  12284. VOID
  12285. FASTCALL
  12286. ExRundownCompletedCacheAware(
  12287. IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
  12288. #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
  12289. #if (NTDDI_VERSION >= NTDDI_VISTA)
  12290. NTKERNELAPI
  12291. NTSTATUS
  12292. NTAPI
  12293. ExInitializeLookasideListEx(
  12294. OUT PLOOKASIDE_LIST_EX Lookaside,
  12295. IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
  12296. IN PFREE_FUNCTION_EX Free OPTIONAL,
  12297. IN POOL_TYPE PoolType,
  12298. IN ULONG Flags,
  12299. IN SIZE_T Size,
  12300. IN ULONG Tag,
  12301. IN USHORT Depth);
  12302. NTKERNELAPI
  12303. VOID
  12304. NTAPI
  12305. ExDeleteLookasideListEx(
  12306. IN OUT PLOOKASIDE_LIST_EX Lookaside);
  12307. NTKERNELAPI
  12308. VOID
  12309. NTAPI
  12310. ExFlushLookasideListEx(
  12311. IN OUT PLOOKASIDE_LIST_EX Lookaside);
  12312. FORCEINLINE
  12313. PVOID
  12314. ExAllocateFromLookasideListEx(
  12315. IN OUT PLOOKASIDE_LIST_EX Lookaside)
  12316. {
  12317. PVOID Entry;
  12318. Lookaside->L.TotalAllocates += 1;
  12319. #ifdef NONAMELESSUNION
  12320. Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
  12321. if (Entry == NULL) {
  12322. Lookaside->L.u2.AllocateMisses += 1;
  12323. Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
  12324. Lookaside->L.Size,
  12325. Lookaside->L.Tag,
  12326. Lookaside);
  12327. }
  12328. #else /* NONAMELESSUNION */
  12329. Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
  12330. if (Entry == NULL) {
  12331. Lookaside->L.AllocateMisses += 1;
  12332. Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
  12333. Lookaside->L.Size,
  12334. Lookaside->L.Tag,
  12335. Lookaside);
  12336. }
  12337. #endif /* NONAMELESSUNION */
  12338. return Entry;
  12339. }
  12340. FORCEINLINE
  12341. VOID
  12342. ExFreeToLookasideListEx(
  12343. IN OUT PLOOKASIDE_LIST_EX Lookaside,
  12344. IN PVOID Entry)
  12345. {
  12346. Lookaside->L.TotalFrees += 1;
  12347. if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
  12348. Lookaside->L.FreeMisses += 1;
  12349. (Lookaside->L.FreeEx)(Entry, Lookaside);
  12350. } else {
  12351. InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
  12352. }
  12353. return;
  12354. }
  12355. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  12356. #if (NTDDI_VERSION >= NTDDI_WIN7)
  12357. typedef struct _EXT_SET_PARAMETERS_V0
  12358. {
  12359. ULONG Version;
  12360. ULONG Reserved;
  12361. LONGLONG NoWakeTolerance;
  12362. } EXT_SET_PARAMETERS, *PEXT_SET_PARAMETERS, KT2_SET_PARAMETERS, *PKT2_SET_PARAMETERS;
  12363. NTKERNELAPI
  12364. VOID
  12365. NTAPI
  12366. ExSetResourceOwnerPointerEx(
  12367. IN OUT PERESOURCE Resource,
  12368. IN PVOID OwnerPointer,
  12369. IN ULONG Flags);
  12370. #define FLAG_OWNER_POINTER_IS_THREAD 0x1
  12371. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  12372. #if NTDDI_VERSION >= NTDDI_WINBLUE
  12373. #define EX_TIMER_HIGH_RESOLUTION 4
  12374. #define EX_TIMER_NO_WAKE 8
  12375. #define EX_TIMER_UNLIMITED_TOLERANCE ((LONGLONG)-1)
  12376. #define EX_TIMER_NOTIFICATION (1ul << 31)
  12377. NTKERNELAPI PEX_TIMER NTAPI ExAllocateTimer(PEXT_CALLBACK callback, void *context, ULONG attr);
  12378. NTKERNELAPI BOOLEAN NTAPI ExCancelTimer(PEX_TIMER timer, PEXT_CANCEL_PARAMETERS params);
  12379. NTKERNELAPI BOOLEAN NTAPI ExDeleteTimer(PEX_TIMER timer, BOOLEAN cancel, BOOLEAN wait, PEXT_DELETE_PARAMETERS params);
  12380. NTKERNELAPI BOOLEAN NTAPI ExSetTimer(PEX_TIMER timer, LONGLONG due, LONGLONG period, EXT_SET_PARAMETERS *params);
  12381. FORCEINLINE void KeInitializeTimer2SetParameters(KT2_SET_PARAMETERS *params)
  12382. {
  12383. memset(params, 0, sizeof(*params));
  12384. }
  12385. FORCEINLINE void ExInitializeSetTimerParameters(EXT_SET_PARAMETERS *params)
  12386. {
  12387. KeInitializeTimer2SetParameters(params);
  12388. }
  12389. #endif
  12390. static __inline PVOID
  12391. ExAllocateFromNPagedLookasideList(
  12392. IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
  12393. {
  12394. PVOID Entry;
  12395. Lookaside->L.TotalAllocates++;
  12396. #ifdef NONAMELESSUNION
  12397. #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
  12398. Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
  12399. &Lookaside->Lock__ObsoleteButDoNotDelete);
  12400. #else
  12401. Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
  12402. #endif
  12403. if (Entry == NULL) {
  12404. Lookaside->L.u2.AllocateMisses++;
  12405. Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
  12406. Lookaside->L.Size,
  12407. Lookaside->L.Tag);
  12408. }
  12409. #else /* NONAMELESSUNION */
  12410. #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
  12411. Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
  12412. &Lookaside->Lock__ObsoleteButDoNotDelete);
  12413. #else
  12414. Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
  12415. #endif
  12416. if (Entry == NULL) {
  12417. Lookaside->L.AllocateMisses++;
  12418. Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
  12419. Lookaside->L.Size,
  12420. Lookaside->L.Tag);
  12421. }
  12422. #endif /* NONAMELESSUNION */
  12423. return Entry;
  12424. }
  12425. static __inline VOID
  12426. ExFreeToNPagedLookasideList(
  12427. IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
  12428. IN PVOID Entry)
  12429. {
  12430. Lookaside->L.TotalFrees++;
  12431. #ifdef NONAMELESSUNION
  12432. if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
  12433. Lookaside->L.u3.FreeMisses++;
  12434. (Lookaside->L.u5.Free)(Entry);
  12435. } else {
  12436. #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
  12437. ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
  12438. (PSLIST_ENTRY)Entry,
  12439. &Lookaside->Lock__ObsoleteButDoNotDelete);
  12440. #else
  12441. InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
  12442. #endif
  12443. }
  12444. #else /* NONAMELESSUNION */
  12445. if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
  12446. Lookaside->L.FreeMisses++;
  12447. (Lookaside->L.Free)(Entry);
  12448. } else {
  12449. #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
  12450. ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
  12451. (PSLIST_ENTRY)Entry,
  12452. &Lookaside->Lock__ObsoleteButDoNotDelete);
  12453. #else
  12454. InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
  12455. #endif
  12456. }
  12457. #endif /* NONAMELESSUNION */
  12458. }
  12459. /******************************************************************************
  12460. * Object Manager Functions *
  12461. ******************************************************************************/
  12462. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  12463. NTKERNELAPI
  12464. LONG_PTR
  12465. FASTCALL
  12466. ObfDereferenceObject(
  12467. IN PVOID Object);
  12468. #define ObDereferenceObject ObfDereferenceObject
  12469. NTKERNELAPI
  12470. NTSTATUS
  12471. NTAPI
  12472. ObGetObjectSecurity(
  12473. IN PVOID Object,
  12474. OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
  12475. OUT PBOOLEAN MemoryAllocated);
  12476. NTKERNELAPI
  12477. LONG_PTR
  12478. FASTCALL
  12479. ObfReferenceObject(
  12480. IN PVOID Object);
  12481. #define ObReferenceObject ObfReferenceObject
  12482. NTKERNELAPI
  12483. NTSTATUS
  12484. NTAPI
  12485. ObReferenceObjectByHandle(
  12486. IN HANDLE Handle,
  12487. IN ACCESS_MASK DesiredAccess,
  12488. IN POBJECT_TYPE ObjectType OPTIONAL,
  12489. IN KPROCESSOR_MODE AccessMode,
  12490. OUT PVOID *Object,
  12491. OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
  12492. NTKERNELAPI
  12493. NTSTATUS
  12494. NTAPI
  12495. ObReferenceObjectByPointer(
  12496. IN PVOID Object,
  12497. IN ACCESS_MASK DesiredAccess,
  12498. IN POBJECT_TYPE ObjectType OPTIONAL,
  12499. IN KPROCESSOR_MODE AccessMode);
  12500. NTKERNELAPI
  12501. VOID
  12502. NTAPI
  12503. ObReleaseObjectSecurity(
  12504. IN PSECURITY_DESCRIPTOR SecurityDescriptor,
  12505. IN BOOLEAN MemoryAllocated);
  12506. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  12507. #if (NTDDI_VERSION >= NTDDI_VISTA)
  12508. NTKERNELAPI
  12509. VOID
  12510. NTAPI
  12511. ObDereferenceObjectDeferDelete(
  12512. IN PVOID Object);
  12513. #endif
  12514. #if (NTDDI_VERSION >= NTDDI_VISTASP1)
  12515. NTKERNELAPI
  12516. NTSTATUS
  12517. NTAPI
  12518. ObRegisterCallbacks(
  12519. IN POB_CALLBACK_REGISTRATION CallbackRegistration,
  12520. OUT PVOID *RegistrationHandle);
  12521. NTKERNELAPI
  12522. VOID
  12523. NTAPI
  12524. ObUnRegisterCallbacks(
  12525. IN PVOID RegistrationHandle);
  12526. NTKERNELAPI
  12527. USHORT
  12528. NTAPI
  12529. ObGetFilterVersion(VOID);
  12530. #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
  12531. #if (NTDDI_VERSION >= NTDDI_WIN7)
  12532. NTKERNELAPI
  12533. NTSTATUS
  12534. NTAPI
  12535. ObReferenceObjectByHandleWithTag(
  12536. IN HANDLE Handle,
  12537. IN ACCESS_MASK DesiredAccess,
  12538. IN POBJECT_TYPE ObjectType OPTIONAL,
  12539. IN KPROCESSOR_MODE AccessMode,
  12540. IN ULONG Tag,
  12541. OUT PVOID *Object,
  12542. OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
  12543. NTKERNELAPI
  12544. LONG_PTR
  12545. FASTCALL
  12546. ObfReferenceObjectWithTag(
  12547. IN PVOID Object,
  12548. IN ULONG Tag);
  12549. NTKERNELAPI
  12550. NTSTATUS
  12551. NTAPI
  12552. ObReferenceObjectByPointerWithTag(
  12553. IN PVOID Object,
  12554. IN ACCESS_MASK DesiredAccess,
  12555. IN POBJECT_TYPE ObjectType OPTIONAL,
  12556. IN KPROCESSOR_MODE AccessMode,
  12557. IN ULONG Tag);
  12558. NTKERNELAPI
  12559. LONG_PTR
  12560. FASTCALL
  12561. ObfDereferenceObjectWithTag(
  12562. IN PVOID Object,
  12563. IN ULONG Tag);
  12564. NTKERNELAPI
  12565. VOID
  12566. NTAPI
  12567. ObDereferenceObjectDeferDeleteWithTag(
  12568. IN PVOID Object,
  12569. IN ULONG Tag);
  12570. #define ObDereferenceObject ObfDereferenceObject
  12571. #define ObReferenceObject ObfReferenceObject
  12572. #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
  12573. #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
  12574. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  12575. /******************************************************************************
  12576. * Process Manager Functions *
  12577. ******************************************************************************/
  12578. NTKERNELAPI
  12579. NTSTATUS
  12580. NTAPI
  12581. PsWrapApcWow64Thread(
  12582. IN OUT PVOID *ApcContext,
  12583. IN OUT PVOID *ApcRoutine);
  12584. /*
  12585. * PEPROCESS
  12586. * PsGetCurrentProcess(VOID)
  12587. */
  12588. #define PsGetCurrentProcess IoGetCurrentProcess
  12589. #if !defined(_PSGETCURRENTTHREAD_)
  12590. #define _PSGETCURRENTTHREAD_
  12591. FORCEINLINE
  12592. PETHREAD
  12593. NTAPI
  12594. PsGetCurrentThread(VOID)
  12595. {
  12596. return (PETHREAD)KeGetCurrentThread();
  12597. }
  12598. #endif /* !_PSGETCURRENTTHREAD_ */
  12599. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  12600. NTKERNELAPI
  12601. NTSTATUS
  12602. NTAPI
  12603. PsCreateSystemThread(
  12604. OUT PHANDLE ThreadHandle,
  12605. IN ULONG DesiredAccess,
  12606. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  12607. IN HANDLE ProcessHandle OPTIONAL,
  12608. OUT PCLIENT_ID ClientId OPTIONAL,
  12609. IN PKSTART_ROUTINE StartRoutine,
  12610. IN PVOID StartContext OPTIONAL);
  12611. NTKERNELAPI
  12612. NTSTATUS
  12613. NTAPI
  12614. PsTerminateSystemThread(
  12615. IN NTSTATUS ExitStatus);
  12616. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  12617. /******************************************************************************
  12618. * WMI Library Support Functions *
  12619. ******************************************************************************/
  12620. #ifdef RUN_WPP
  12621. #if (NTDDI_VERSION >= NTDDI_WINXP)
  12622. NTKERNELAPI
  12623. NTSTATUS
  12624. __cdecl
  12625. WmiTraceMessage(
  12626. IN TRACEHANDLE LoggerHandle,
  12627. IN ULONG MessageFlags,
  12628. IN LPGUID MessageGuid,
  12629. IN USHORT MessageNumber,
  12630. IN ...);
  12631. #endif
  12632. #endif /* RUN_WPP */
  12633. #if (NTDDI_VERSION >= NTDDI_WINXP)
  12634. NTKERNELAPI
  12635. NTSTATUS
  12636. NTAPI
  12637. WmiQueryTraceInformation(
  12638. IN TRACE_INFORMATION_CLASS TraceInformationClass,
  12639. OUT PVOID TraceInformation,
  12640. IN ULONG TraceInformationLength,
  12641. OUT PULONG RequiredLength OPTIONAL,
  12642. IN PVOID Buffer OPTIONAL);
  12643. #if 0
  12644. /* FIXME: Get va_list from where? */
  12645. NTKERNELAPI
  12646. NTSTATUS
  12647. NTAPI
  12648. WmiTraceMessageVa(
  12649. IN TRACEHANDLE LoggerHandle,
  12650. IN ULONG MessageFlags,
  12651. IN LPGUID MessageGuid,
  12652. IN USHORT MessageNumber,
  12653. IN va_list MessageArgList);
  12654. #endif
  12655. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  12656. #ifndef TRACE_INFORMATION_CLASS_DEFINE
  12657. #if (NTDDI_VERSION >= NTDDI_WINXP)
  12658. NTKERNELAPI
  12659. NTSTATUS
  12660. NTAPI
  12661. WmiQueryTraceInformation(
  12662. IN TRACE_INFORMATION_CLASS TraceInformationClass,
  12663. OUT PVOID TraceInformation,
  12664. IN ULONG TraceInformationLength,
  12665. OUT PULONG RequiredLength OPTIONAL,
  12666. IN PVOID Buffer OPTIONAL);
  12667. #endif
  12668. #define TRACE_INFORMATION_CLASS_DEFINE
  12669. #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
  12670. #if (NTDDI_VERSION >= NTDDI_VISTA)
  12671. NTSTATUS
  12672. NTKERNELAPI
  12673. NTAPI
  12674. EtwRegister(
  12675. IN LPCGUID ProviderId,
  12676. IN PETWENABLECALLBACK EnableCallback OPTIONAL,
  12677. IN PVOID CallbackContext OPTIONAL,
  12678. OUT PREGHANDLE RegHandle);
  12679. NTSTATUS
  12680. NTKERNELAPI
  12681. NTAPI
  12682. EtwUnregister(
  12683. IN REGHANDLE RegHandle);
  12684. BOOLEAN
  12685. NTKERNELAPI
  12686. NTAPI
  12687. EtwEventEnabled(
  12688. IN REGHANDLE RegHandle,
  12689. IN PCEVENT_DESCRIPTOR EventDescriptor);
  12690. BOOLEAN
  12691. NTKERNELAPI
  12692. NTAPI
  12693. EtwProviderEnabled(
  12694. IN REGHANDLE RegHandle,
  12695. IN UCHAR Level,
  12696. IN ULONGLONG Keyword);
  12697. NTSTATUS
  12698. NTKERNELAPI
  12699. NTAPI
  12700. EtwActivityIdControl(
  12701. IN ULONG ControlCode,
  12702. IN OUT LPGUID ActivityId);
  12703. NTSTATUS
  12704. NTKERNELAPI
  12705. NTAPI
  12706. EtwWrite(
  12707. IN REGHANDLE RegHandle,
  12708. IN PCEVENT_DESCRIPTOR EventDescriptor,
  12709. IN LPCGUID ActivityId OPTIONAL,
  12710. IN ULONG UserDataCount,
  12711. IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
  12712. NTSTATUS
  12713. NTKERNELAPI
  12714. NTAPI
  12715. EtwWriteTransfer(
  12716. IN REGHANDLE RegHandle,
  12717. IN PCEVENT_DESCRIPTOR EventDescriptor,
  12718. IN LPCGUID ActivityId OPTIONAL,
  12719. IN LPCGUID RelatedActivityId OPTIONAL,
  12720. IN ULONG UserDataCount,
  12721. IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
  12722. NTSTATUS
  12723. NTKERNELAPI
  12724. NTAPI
  12725. EtwWriteString(
  12726. IN REGHANDLE RegHandle,
  12727. IN UCHAR Level,
  12728. IN ULONGLONG Keyword,
  12729. IN LPCGUID ActivityId OPTIONAL,
  12730. IN PCWSTR String);
  12731. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  12732. #if (NTDDI_VERSION >= NTDDI_WIN7)
  12733. NTSTATUS
  12734. NTKERNELAPI
  12735. NTAPI
  12736. EtwWriteEx(
  12737. IN REGHANDLE RegHandle,
  12738. IN PCEVENT_DESCRIPTOR EventDescriptor,
  12739. IN ULONG64 Filter,
  12740. IN ULONG Flags,
  12741. IN LPCGUID ActivityId OPTIONAL,
  12742. IN LPCGUID RelatedActivityId OPTIONAL,
  12743. IN ULONG UserDataCount,
  12744. IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
  12745. #endif
  12746. /******************************************************************************
  12747. * Kernel Debugger Functions *
  12748. ******************************************************************************/
  12749. #ifndef _DBGNT_
  12750. ULONG
  12751. __cdecl
  12752. DbgPrint(
  12753. IN PCSTR Format,
  12754. IN ...);
  12755. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  12756. NTSYSAPI
  12757. ULONG
  12758. __cdecl
  12759. DbgPrintReturnControlC(
  12760. IN PCCH Format,
  12761. IN ...);
  12762. #endif
  12763. #if (NTDDI_VERSION >= NTDDI_WINXP)
  12764. NTSYSAPI
  12765. ULONG
  12766. __cdecl
  12767. DbgPrintEx(
  12768. IN ULONG ComponentId,
  12769. IN ULONG Level,
  12770. IN PCSTR Format,
  12771. IN ...);
  12772. #ifdef _VA_LIST_DEFINED
  12773. NTSYSAPI
  12774. ULONG
  12775. NTAPI
  12776. vDbgPrintEx(
  12777. IN ULONG ComponentId,
  12778. IN ULONG Level,
  12779. IN PCCH Format,
  12780. IN va_list ap);
  12781. NTSYSAPI
  12782. ULONG
  12783. NTAPI
  12784. vDbgPrintExWithPrefix(
  12785. IN PCCH Prefix,
  12786. IN ULONG ComponentId,
  12787. IN ULONG Level,
  12788. IN PCCH Format,
  12789. IN va_list ap);
  12790. #endif /* _VA_LIST_DEFINED */
  12791. NTSYSAPI
  12792. NTSTATUS
  12793. NTAPI
  12794. DbgQueryDebugFilterState(
  12795. IN ULONG ComponentId,
  12796. IN ULONG Level);
  12797. NTSYSAPI
  12798. NTSTATUS
  12799. NTAPI
  12800. DbgSetDebugFilterState(
  12801. IN ULONG ComponentId,
  12802. IN ULONG Level,
  12803. IN BOOLEAN State);
  12804. #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
  12805. #if (NTDDI_VERSION >= NTDDI_VISTA)
  12806. typedef VOID
  12807. (*PDEBUG_PRINT_CALLBACK)(
  12808. IN PSTRING Output,
  12809. IN ULONG ComponentId,
  12810. IN ULONG Level);
  12811. NTSYSAPI
  12812. NTSTATUS
  12813. NTAPI
  12814. DbgSetDebugPrintCallback(
  12815. IN PDEBUG_PRINT_CALLBACK DebugPrintCallback,
  12816. IN BOOLEAN Enable);
  12817. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  12818. #endif /* _DBGNT_ */
  12819. #if DBG
  12820. #define KdPrint(_x_) DbgPrint _x_
  12821. #define KdPrintEx(_x_) DbgPrintEx _x_
  12822. #define vKdPrintEx(_x_) vDbgPrintEx _x_
  12823. #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
  12824. #define KdBreakPoint() DbgBreakPoint()
  12825. #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
  12826. #else /* !DBG */
  12827. #define KdPrint(_x_)
  12828. #define KdPrintEx(_x_)
  12829. #define vKdPrintEx(_x_)
  12830. #define vKdPrintExWithPrefix(_x_)
  12831. #define KdBreakPoint()
  12832. #define KdBreakPointWithStatus(s)
  12833. #endif /* !DBG */
  12834. #if defined(__GNUC__)
  12835. extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
  12836. extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
  12837. #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
  12838. #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
  12839. #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
  12840. extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
  12841. extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
  12842. #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
  12843. #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
  12844. #else
  12845. extern BOOLEAN KdDebuggerNotPresent;
  12846. extern BOOLEAN KdDebuggerEnabled;
  12847. #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
  12848. #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
  12849. #endif
  12850. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  12851. NTKERNELAPI
  12852. NTSTATUS
  12853. NTAPI
  12854. KdDisableDebugger(VOID);
  12855. NTKERNELAPI
  12856. NTSTATUS
  12857. NTAPI
  12858. KdEnableDebugger(VOID);
  12859. #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
  12860. #define DbgBreakPoint __debugbreak
  12861. #else
  12862. VOID
  12863. NTAPI
  12864. DbgBreakPoint(VOID);
  12865. #endif
  12866. NTSYSAPI
  12867. VOID
  12868. NTAPI
  12869. DbgBreakPointWithStatus(
  12870. IN ULONG Status);
  12871. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  12872. #if (NTDDI_VERSION >= NTDDI_WS03)
  12873. NTKERNELAPI
  12874. BOOLEAN
  12875. NTAPI
  12876. KdRefreshDebuggerNotPresent(VOID);
  12877. #endif
  12878. #if (NTDDI_VERSION >= NTDDI_WS03SP1)
  12879. NTKERNELAPI
  12880. NTSTATUS
  12881. NTAPI
  12882. KdChangeOption(
  12883. IN KD_OPTION Option,
  12884. IN ULONG InBufferBytes OPTIONAL,
  12885. IN PVOID InBuffer,
  12886. IN ULONG OutBufferBytes OPTIONAL,
  12887. OUT PVOID OutBuffer,
  12888. OUT PULONG OutBufferNeeded OPTIONAL);
  12889. #endif
  12890. /* Hardware Abstraction Layer Functions */
  12891. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  12892. #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
  12893. FORCEINLINE
  12894. PVOID
  12895. NTAPI
  12896. HalAllocateCommonBuffer(
  12897. IN PDMA_ADAPTER DmaAdapter,
  12898. IN ULONG Length,
  12899. OUT PPHYSICAL_ADDRESS LogicalAddress,
  12900. IN BOOLEAN CacheEnabled)
  12901. {
  12902. PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
  12903. PVOID commonBuffer;
  12904. allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
  12905. ASSERT( allocateCommonBuffer != NULL );
  12906. commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
  12907. return commonBuffer;
  12908. }
  12909. FORCEINLINE
  12910. VOID
  12911. NTAPI
  12912. HalFreeCommonBuffer(
  12913. IN PDMA_ADAPTER DmaAdapter,
  12914. IN ULONG Length,
  12915. IN PHYSICAL_ADDRESS LogicalAddress,
  12916. IN PVOID VirtualAddress,
  12917. IN BOOLEAN CacheEnabled)
  12918. {
  12919. PFREE_COMMON_BUFFER freeCommonBuffer;
  12920. freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
  12921. ASSERT( freeCommonBuffer != NULL );
  12922. freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
  12923. }
  12924. FORCEINLINE
  12925. ULONG
  12926. NTAPI
  12927. HalReadDmaCounter(
  12928. IN PDMA_ADAPTER DmaAdapter)
  12929. {
  12930. PREAD_DMA_COUNTER readDmaCounter;
  12931. ULONG counter;
  12932. readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
  12933. ASSERT( readDmaCounter != NULL );
  12934. counter = readDmaCounter( DmaAdapter );
  12935. return counter;
  12936. }
  12937. FORCEINLINE
  12938. ULONG
  12939. HalGetDmaAlignment(
  12940. IN PDMA_ADAPTER DmaAdapter)
  12941. {
  12942. PGET_DMA_ALIGNMENT getDmaAlignment;
  12943. ULONG alignment;
  12944. getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
  12945. ASSERT( getDmaAlignment != NULL );
  12946. alignment = getDmaAlignment( DmaAdapter );
  12947. return alignment;
  12948. }
  12949. #endif /* USE_DMA_MACROS ... */
  12950. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  12951. #ifndef _NTTMAPI_
  12952. #define _NTTMAPI_
  12953. #include <ktmtypes.h>
  12954. #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
  12955. #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
  12956. #define TRANSACTIONMANAGER_RECOVER (0x0004)
  12957. #define TRANSACTIONMANAGER_RENAME (0x0008)
  12958. #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
  12959. #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
  12960. #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
  12961. TRANSACTIONMANAGER_QUERY_INFORMATION)
  12962. #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
  12963. TRANSACTIONMANAGER_SET_INFORMATION |\
  12964. TRANSACTIONMANAGER_RECOVER |\
  12965. TRANSACTIONMANAGER_RENAME |\
  12966. TRANSACTIONMANAGER_CREATE_RM)
  12967. #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
  12968. #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
  12969. TRANSACTIONMANAGER_GENERIC_READ |\
  12970. TRANSACTIONMANAGER_GENERIC_WRITE |\
  12971. TRANSACTIONMANAGER_GENERIC_EXECUTE |\
  12972. TRANSACTIONMANAGER_BIND_TRANSACTION)
  12973. #define TRANSACTION_QUERY_INFORMATION (0x0001)
  12974. #define TRANSACTION_SET_INFORMATION (0x0002)
  12975. #define TRANSACTION_ENLIST (0x0004)
  12976. #define TRANSACTION_COMMIT (0x0008)
  12977. #define TRANSACTION_ROLLBACK (0x0010)
  12978. #define TRANSACTION_PROPAGATE (0x0020)
  12979. #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
  12980. #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
  12981. TRANSACTION_QUERY_INFORMATION |\
  12982. SYNCHRONIZE)
  12983. #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
  12984. TRANSACTION_SET_INFORMATION |\
  12985. TRANSACTION_COMMIT |\
  12986. TRANSACTION_ENLIST |\
  12987. TRANSACTION_ROLLBACK |\
  12988. TRANSACTION_PROPAGATE |\
  12989. SYNCHRONIZE)
  12990. #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
  12991. TRANSACTION_COMMIT |\
  12992. TRANSACTION_ROLLBACK |\
  12993. SYNCHRONIZE)
  12994. #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
  12995. TRANSACTION_GENERIC_READ |\
  12996. TRANSACTION_GENERIC_WRITE |\
  12997. TRANSACTION_GENERIC_EXECUTE)
  12998. #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
  12999. STANDARD_RIGHTS_WRITE |\
  13000. TRANSACTION_SET_INFORMATION |\
  13001. TRANSACTION_ENLIST |\
  13002. TRANSACTION_ROLLBACK |\
  13003. TRANSACTION_PROPAGATE |\
  13004. SYNCHRONIZE)
  13005. #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
  13006. #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
  13007. #define RESOURCEMANAGER_RECOVER (0x0004)
  13008. #define RESOURCEMANAGER_ENLIST (0x0008)
  13009. #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
  13010. #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
  13011. #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
  13012. #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
  13013. RESOURCEMANAGER_QUERY_INFORMATION |\
  13014. SYNCHRONIZE)
  13015. #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
  13016. RESOURCEMANAGER_SET_INFORMATION |\
  13017. RESOURCEMANAGER_RECOVER |\
  13018. RESOURCEMANAGER_ENLIST |\
  13019. RESOURCEMANAGER_GET_NOTIFICATION |\
  13020. RESOURCEMANAGER_REGISTER_PROTOCOL |\
  13021. RESOURCEMANAGER_COMPLETE_PROPAGATION |\
  13022. SYNCHRONIZE)
  13023. #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
  13024. RESOURCEMANAGER_RECOVER |\
  13025. RESOURCEMANAGER_ENLIST |\
  13026. RESOURCEMANAGER_GET_NOTIFICATION |\
  13027. RESOURCEMANAGER_COMPLETE_PROPAGATION |\
  13028. SYNCHRONIZE)
  13029. #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
  13030. RESOURCEMANAGER_GENERIC_READ |\
  13031. RESOURCEMANAGER_GENERIC_WRITE |\
  13032. RESOURCEMANAGER_GENERIC_EXECUTE)
  13033. #define ENLISTMENT_QUERY_INFORMATION (0x0001)
  13034. #define ENLISTMENT_SET_INFORMATION (0x0002)
  13035. #define ENLISTMENT_RECOVER (0x0004)
  13036. #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
  13037. #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
  13038. #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
  13039. ENLISTMENT_QUERY_INFORMATION)
  13040. #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
  13041. ENLISTMENT_SET_INFORMATION |\
  13042. ENLISTMENT_RECOVER |\
  13043. ENLISTMENT_SUBORDINATE_RIGHTS |\
  13044. ENLISTMENT_SUPERIOR_RIGHTS)
  13045. #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
  13046. ENLISTMENT_RECOVER |\
  13047. ENLISTMENT_SUBORDINATE_RIGHTS |\
  13048. ENLISTMENT_SUPERIOR_RIGHTS)
  13049. #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
  13050. ENLISTMENT_GENERIC_READ |\
  13051. ENLISTMENT_GENERIC_WRITE |\
  13052. ENLISTMENT_GENERIC_EXECUTE)
  13053. typedef enum _TRANSACTION_OUTCOME {
  13054. TransactionOutcomeUndetermined = 1,
  13055. TransactionOutcomeCommitted,
  13056. TransactionOutcomeAborted,
  13057. } TRANSACTION_OUTCOME;
  13058. typedef enum _TRANSACTION_STATE {
  13059. TransactionStateNormal = 1,
  13060. TransactionStateIndoubt,
  13061. TransactionStateCommittedNotify,
  13062. } TRANSACTION_STATE;
  13063. typedef struct _TRANSACTION_BASIC_INFORMATION {
  13064. GUID TransactionId;
  13065. ULONG State;
  13066. ULONG Outcome;
  13067. } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
  13068. typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
  13069. GUID TmIdentity;
  13070. LARGE_INTEGER VirtualClock;
  13071. } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
  13072. typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
  13073. GUID LogIdentity;
  13074. } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
  13075. typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
  13076. ULONG LogPathLength;
  13077. WCHAR LogPath[1];
  13078. } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
  13079. typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
  13080. ULONGLONG LastRecoveredLsn;
  13081. } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
  13082. typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
  13083. ULONG IsolationLevel;
  13084. ULONG IsolationFlags;
  13085. LARGE_INTEGER Timeout;
  13086. ULONG Outcome;
  13087. ULONG DescriptionLength;
  13088. WCHAR Description[1];
  13089. } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
  13090. typedef struct _TRANSACTION_BIND_INFORMATION {
  13091. HANDLE TmHandle;
  13092. } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
  13093. typedef struct _TRANSACTION_ENLISTMENT_PAIR {
  13094. GUID EnlistmentId;
  13095. GUID ResourceManagerId;
  13096. } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
  13097. typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
  13098. ULONG NumberOfEnlistments;
  13099. TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
  13100. } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
  13101. typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
  13102. TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
  13103. } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
  13104. typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
  13105. GUID ResourceManagerId;
  13106. ULONG DescriptionLength;
  13107. WCHAR Description[1];
  13108. } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
  13109. typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
  13110. HANDLE IoCompletionPortHandle;
  13111. ULONG_PTR CompletionKey;
  13112. } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
  13113. typedef enum _KTMOBJECT_TYPE {
  13114. KTMOBJECT_TRANSACTION,
  13115. KTMOBJECT_TRANSACTION_MANAGER,
  13116. KTMOBJECT_RESOURCE_MANAGER,
  13117. KTMOBJECT_ENLISTMENT,
  13118. KTMOBJECT_INVALID
  13119. } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
  13120. typedef struct _KTMOBJECT_CURSOR {
  13121. GUID LastQuery;
  13122. ULONG ObjectIdCount;
  13123. GUID ObjectIds[1];
  13124. } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
  13125. typedef enum _TRANSACTION_INFORMATION_CLASS {
  13126. TransactionBasicInformation,
  13127. TransactionPropertiesInformation,
  13128. TransactionEnlistmentInformation,
  13129. TransactionSuperiorEnlistmentInformation
  13130. } TRANSACTION_INFORMATION_CLASS;
  13131. typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
  13132. TransactionManagerBasicInformation,
  13133. TransactionManagerLogInformation,
  13134. TransactionManagerLogPathInformation,
  13135. TransactionManagerRecoveryInformation = 4
  13136. } TRANSACTIONMANAGER_INFORMATION_CLASS;
  13137. typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
  13138. ResourceManagerBasicInformation,
  13139. ResourceManagerCompletionInformation,
  13140. } RESOURCEMANAGER_INFORMATION_CLASS;
  13141. typedef struct _ENLISTMENT_BASIC_INFORMATION {
  13142. GUID EnlistmentId;
  13143. GUID TransactionId;
  13144. GUID ResourceManagerId;
  13145. } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
  13146. typedef struct _ENLISTMENT_CRM_INFORMATION {
  13147. GUID CrmTransactionManagerId;
  13148. GUID CrmResourceManagerId;
  13149. GUID CrmEnlistmentId;
  13150. } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
  13151. typedef enum _ENLISTMENT_INFORMATION_CLASS {
  13152. EnlistmentBasicInformation,
  13153. EnlistmentRecoveryInformation,
  13154. EnlistmentCrmInformation
  13155. } ENLISTMENT_INFORMATION_CLASS;
  13156. typedef struct _TRANSACTION_LIST_ENTRY {
  13157. /* UOW is typedef'ed as GUID just above. Changed type of UOW
  13158. * member from UOW to GUID for C++ compat. Using ::UOW for C++
  13159. * works too but we were reported some problems in corner cases
  13160. */
  13161. GUID UOW;
  13162. } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
  13163. typedef struct _TRANSACTION_LIST_INFORMATION {
  13164. ULONG NumberOfTransactions;
  13165. TRANSACTION_LIST_ENTRY TransactionInformation[1];
  13166. } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
  13167. typedef NTSTATUS
  13168. (NTAPI *PFN_NT_CREATE_TRANSACTION)(
  13169. OUT PHANDLE TransactionHandle,
  13170. IN ACCESS_MASK DesiredAccess,
  13171. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13172. IN LPGUID Uow OPTIONAL,
  13173. IN HANDLE TmHandle OPTIONAL,
  13174. IN ULONG CreateOptions OPTIONAL,
  13175. IN ULONG IsolationLevel OPTIONAL,
  13176. IN ULONG IsolationFlags OPTIONAL,
  13177. IN PLARGE_INTEGER Timeout OPTIONAL,
  13178. IN PUNICODE_STRING Description OPTIONAL);
  13179. typedef NTSTATUS
  13180. (NTAPI *PFN_NT_OPEN_TRANSACTION)(
  13181. OUT PHANDLE TransactionHandle,
  13182. IN ACCESS_MASK DesiredAccess,
  13183. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13184. IN LPGUID Uow OPTIONAL,
  13185. IN HANDLE TmHandle OPTIONAL);
  13186. typedef NTSTATUS
  13187. (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
  13188. IN HANDLE TransactionHandle,
  13189. IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
  13190. OUT PVOID TransactionInformation,
  13191. IN ULONG TransactionInformationLength,
  13192. OUT PULONG ReturnLength OPTIONAL);
  13193. typedef NTSTATUS
  13194. (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
  13195. IN HANDLE TransactionHandle,
  13196. IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
  13197. IN PVOID TransactionInformation,
  13198. IN ULONG TransactionInformationLength);
  13199. typedef NTSTATUS
  13200. (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
  13201. IN HANDLE TransactionHandle,
  13202. IN BOOLEAN Wait);
  13203. typedef NTSTATUS
  13204. (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
  13205. IN HANDLE TransactionHandle,
  13206. IN BOOLEAN Wait);
  13207. #if (NTDDI_VERSION >= NTDDI_VISTA)
  13208. NTSYSCALLAPI
  13209. NTSTATUS
  13210. NTAPI
  13211. NtCreateTransactionManager(
  13212. OUT PHANDLE TmHandle,
  13213. IN ACCESS_MASK DesiredAccess,
  13214. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13215. IN PUNICODE_STRING LogFileName OPTIONAL,
  13216. IN ULONG CreateOptions OPTIONAL,
  13217. IN ULONG CommitStrength OPTIONAL);
  13218. NTSYSCALLAPI
  13219. NTSTATUS
  13220. NTAPI
  13221. NtOpenTransactionManager(
  13222. OUT PHANDLE TmHandle,
  13223. IN ACCESS_MASK DesiredAccess,
  13224. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13225. IN PUNICODE_STRING LogFileName OPTIONAL,
  13226. IN LPGUID TmIdentity OPTIONAL,
  13227. IN ULONG OpenOptions OPTIONAL);
  13228. NTSYSCALLAPI
  13229. NTSTATUS
  13230. NTAPI
  13231. NtRenameTransactionManager(
  13232. IN PUNICODE_STRING LogFileName,
  13233. IN LPGUID ExistingTransactionManagerGuid);
  13234. NTSYSCALLAPI
  13235. NTSTATUS
  13236. NTAPI
  13237. NtRollforwardTransactionManager(
  13238. IN HANDLE TransactionManagerHandle,
  13239. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13240. NTSYSCALLAPI
  13241. NTSTATUS
  13242. NTAPI
  13243. NtRecoverTransactionManager(
  13244. IN HANDLE TransactionManagerHandle);
  13245. NTSYSCALLAPI
  13246. NTSTATUS
  13247. NTAPI
  13248. NtQueryInformationTransactionManager(
  13249. IN HANDLE TransactionManagerHandle,
  13250. IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
  13251. OUT PVOID TransactionManagerInformation,
  13252. IN ULONG TransactionManagerInformationLength,
  13253. OUT PULONG ReturnLength);
  13254. NTSYSCALLAPI
  13255. NTSTATUS
  13256. NTAPI
  13257. NtSetInformationTransactionManager(
  13258. IN HANDLE TmHandle OPTIONAL,
  13259. IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
  13260. IN PVOID TransactionManagerInformation,
  13261. IN ULONG TransactionManagerInformationLength);
  13262. NTSYSCALLAPI
  13263. NTSTATUS
  13264. NTAPI
  13265. NtEnumerateTransactionObject(
  13266. IN HANDLE RootObjectHandle OPTIONAL,
  13267. IN KTMOBJECT_TYPE QueryType,
  13268. IN OUT PKTMOBJECT_CURSOR ObjectCursor,
  13269. IN ULONG ObjectCursorLength,
  13270. OUT PULONG ReturnLength);
  13271. NTSYSCALLAPI
  13272. NTSTATUS
  13273. NTAPI
  13274. NtCreateTransaction(
  13275. OUT PHANDLE TransactionHandle,
  13276. IN ACCESS_MASK DesiredAccess,
  13277. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13278. IN LPGUID Uow OPTIONAL,
  13279. IN HANDLE TmHandle OPTIONAL,
  13280. IN ULONG CreateOptions OPTIONAL,
  13281. IN ULONG IsolationLevel OPTIONAL,
  13282. IN ULONG IsolationFlags OPTIONAL,
  13283. IN PLARGE_INTEGER Timeout OPTIONAL,
  13284. IN PUNICODE_STRING Description OPTIONAL);
  13285. NTSYSCALLAPI
  13286. NTSTATUS
  13287. NTAPI
  13288. NtOpenTransaction(
  13289. OUT PHANDLE TransactionHandle,
  13290. IN ACCESS_MASK DesiredAccess,
  13291. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13292. IN LPGUID Uow,
  13293. IN HANDLE TmHandle OPTIONAL);
  13294. NTSYSCALLAPI
  13295. NTSTATUS
  13296. NTAPI
  13297. NtQueryInformationTransaction(
  13298. IN HANDLE TransactionHandle,
  13299. IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
  13300. OUT PVOID TransactionInformation,
  13301. IN ULONG TransactionInformationLength,
  13302. OUT PULONG ReturnLength OPTIONAL);
  13303. NTSYSCALLAPI
  13304. NTSTATUS
  13305. NTAPI
  13306. NtSetInformationTransaction(
  13307. IN HANDLE TransactionHandle,
  13308. IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
  13309. IN PVOID TransactionInformation,
  13310. IN ULONG TransactionInformationLength);
  13311. NTSYSCALLAPI
  13312. NTSTATUS
  13313. NTAPI
  13314. NtCommitTransaction(
  13315. IN HANDLE TransactionHandle,
  13316. IN BOOLEAN Wait);
  13317. NTSYSCALLAPI
  13318. NTSTATUS
  13319. NTAPI
  13320. NtRollbackTransaction(
  13321. IN HANDLE TransactionHandle,
  13322. IN BOOLEAN Wait);
  13323. NTSYSCALLAPI
  13324. NTSTATUS
  13325. NTAPI
  13326. NtCreateEnlistment(
  13327. OUT PHANDLE EnlistmentHandle,
  13328. IN ACCESS_MASK DesiredAccess,
  13329. IN HANDLE ResourceManagerHandle,
  13330. IN HANDLE TransactionHandle,
  13331. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13332. IN ULONG CreateOptions OPTIONAL,
  13333. IN NOTIFICATION_MASK NotificationMask,
  13334. IN PVOID EnlistmentKey OPTIONAL);
  13335. NTSYSCALLAPI
  13336. NTSTATUS
  13337. NTAPI
  13338. NtOpenEnlistment(
  13339. OUT PHANDLE EnlistmentHandle,
  13340. IN ACCESS_MASK DesiredAccess,
  13341. IN HANDLE ResourceManagerHandle,
  13342. IN LPGUID EnlistmentGuid,
  13343. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
  13344. NTSYSCALLAPI
  13345. NTSTATUS
  13346. NTAPI
  13347. NtQueryInformationEnlistment(
  13348. IN HANDLE EnlistmentHandle,
  13349. IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
  13350. OUT PVOID EnlistmentInformation,
  13351. IN ULONG EnlistmentInformationLength,
  13352. OUT PULONG ReturnLength);
  13353. NTSYSCALLAPI
  13354. NTSTATUS
  13355. NTAPI
  13356. NtSetInformationEnlistment(
  13357. IN HANDLE EnlistmentHandle OPTIONAL,
  13358. IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
  13359. IN PVOID EnlistmentInformation,
  13360. IN ULONG EnlistmentInformationLength);
  13361. NTSYSCALLAPI
  13362. NTSTATUS
  13363. NTAPI
  13364. NtRecoverEnlistment(
  13365. IN HANDLE EnlistmentHandle,
  13366. IN PVOID EnlistmentKey OPTIONAL);
  13367. NTSYSCALLAPI
  13368. NTSTATUS
  13369. NTAPI
  13370. NtPrePrepareEnlistment(
  13371. IN HANDLE EnlistmentHandle,
  13372. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13373. NTSYSCALLAPI
  13374. NTSTATUS
  13375. NTAPI
  13376. NtPrepareEnlistment(
  13377. IN HANDLE EnlistmentHandle,
  13378. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13379. NTSYSCALLAPI
  13380. NTSTATUS
  13381. NTAPI
  13382. NtCommitEnlistment(
  13383. IN HANDLE EnlistmentHandle,
  13384. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13385. NTSYSCALLAPI
  13386. NTSTATUS
  13387. NTAPI
  13388. NtRollbackEnlistment(
  13389. IN HANDLE EnlistmentHandle,
  13390. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13391. NTSYSCALLAPI
  13392. NTSTATUS
  13393. NTAPI
  13394. NtPrePrepareComplete(
  13395. IN HANDLE EnlistmentHandle,
  13396. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13397. NTSYSCALLAPI
  13398. NTSTATUS
  13399. NTAPI
  13400. NtPrepareComplete(
  13401. IN HANDLE EnlistmentHandle,
  13402. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13403. NTSYSCALLAPI
  13404. NTSTATUS
  13405. NTAPI
  13406. NtCommitComplete(
  13407. IN HANDLE EnlistmentHandle,
  13408. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13409. NTSYSCALLAPI
  13410. NTSTATUS
  13411. NTAPI
  13412. NtReadOnlyEnlistment(
  13413. IN HANDLE EnlistmentHandle,
  13414. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13415. NTSYSCALLAPI
  13416. NTSTATUS
  13417. NTAPI
  13418. NtRollbackComplete(
  13419. IN HANDLE EnlistmentHandle,
  13420. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13421. NTSYSCALLAPI
  13422. NTSTATUS
  13423. NTAPI
  13424. NtSinglePhaseReject(
  13425. IN HANDLE EnlistmentHandle,
  13426. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13427. NTSYSCALLAPI
  13428. NTSTATUS
  13429. NTAPI
  13430. NtCreateResourceManager(
  13431. OUT PHANDLE ResourceManagerHandle,
  13432. IN ACCESS_MASK DesiredAccess,
  13433. IN HANDLE TmHandle,
  13434. IN LPGUID RmGuid,
  13435. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13436. IN ULONG CreateOptions OPTIONAL,
  13437. IN PUNICODE_STRING Description OPTIONAL);
  13438. NTSYSCALLAPI
  13439. NTSTATUS
  13440. NTAPI
  13441. NtOpenResourceManager(
  13442. OUT PHANDLE ResourceManagerHandle,
  13443. IN ACCESS_MASK DesiredAccess,
  13444. IN HANDLE TmHandle,
  13445. IN LPGUID ResourceManagerGuid OPTIONAL,
  13446. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
  13447. NTSYSCALLAPI
  13448. NTSTATUS
  13449. NTAPI
  13450. NtRecoverResourceManager(
  13451. IN HANDLE ResourceManagerHandle);
  13452. NTSYSCALLAPI
  13453. NTSTATUS
  13454. NTAPI
  13455. NtGetNotificationResourceManager(
  13456. IN HANDLE ResourceManagerHandle,
  13457. OUT PTRANSACTION_NOTIFICATION TransactionNotification,
  13458. IN ULONG NotificationLength,
  13459. IN PLARGE_INTEGER Timeout OPTIONAL,
  13460. OUT PULONG ReturnLength OPTIONAL,
  13461. IN ULONG Asynchronous,
  13462. IN ULONG_PTR AsynchronousContext OPTIONAL);
  13463. NTSYSCALLAPI
  13464. NTSTATUS
  13465. NTAPI
  13466. NtQueryInformationResourceManager(
  13467. IN HANDLE ResourceManagerHandle,
  13468. IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
  13469. OUT PVOID ResourceManagerInformation,
  13470. IN ULONG ResourceManagerInformationLength,
  13471. OUT PULONG ReturnLength OPTIONAL);
  13472. NTSYSCALLAPI
  13473. NTSTATUS
  13474. NTAPI
  13475. NtSetInformationResourceManager(
  13476. IN HANDLE ResourceManagerHandle,
  13477. IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
  13478. IN PVOID ResourceManagerInformation,
  13479. IN ULONG ResourceManagerInformationLength);
  13480. NTSYSCALLAPI
  13481. NTSTATUS
  13482. NTAPI
  13483. NtRegisterProtocolAddressInformation(
  13484. IN HANDLE ResourceManager,
  13485. IN PCRM_PROTOCOL_ID ProtocolId,
  13486. IN ULONG ProtocolInformationSize,
  13487. IN PVOID ProtocolInformation,
  13488. IN ULONG CreateOptions OPTIONAL);
  13489. NTSYSCALLAPI
  13490. NTSTATUS
  13491. NTAPI
  13492. NtPropagationComplete(
  13493. IN HANDLE ResourceManagerHandle,
  13494. IN ULONG RequestCookie,
  13495. IN ULONG BufferLength,
  13496. IN PVOID Buffer);
  13497. NTSYSCALLAPI
  13498. NTSTATUS
  13499. NTAPI
  13500. NtPropagationFailed(
  13501. IN HANDLE ResourceManagerHandle,
  13502. IN ULONG RequestCookie,
  13503. IN NTSTATUS PropStatus);
  13504. #endif /* NTDDI_VERSION >= NTDDI_VISTA */
  13505. #endif /* !_NTTMAPI_ */
  13506. /******************************************************************************
  13507. * ZwXxx Functions *
  13508. ******************************************************************************/
  13509. /* Constants */
  13510. #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
  13511. #define ZwCurrentProcess() NtCurrentProcess()
  13512. #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
  13513. #define ZwCurrentThread() NtCurrentThread()
  13514. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  13515. NTSYSAPI
  13516. NTSTATUS
  13517. NTAPI
  13518. ZwClose(
  13519. IN HANDLE Handle);
  13520. NTSYSAPI
  13521. NTSTATUS
  13522. NTAPI
  13523. ZwCreateDirectoryObject(
  13524. OUT PHANDLE DirectoryHandle,
  13525. IN ACCESS_MASK DesiredAccess,
  13526. IN POBJECT_ATTRIBUTES ObjectAttributes);
  13527. NTSYSAPI
  13528. NTSTATUS
  13529. NTAPI
  13530. ZwCreateFile(
  13531. OUT PHANDLE FileHandle,
  13532. IN ACCESS_MASK DesiredAccess,
  13533. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13534. OUT PIO_STATUS_BLOCK IoStatusBlock,
  13535. IN PLARGE_INTEGER AllocationSize OPTIONAL,
  13536. IN ULONG FileAttributes,
  13537. IN ULONG ShareAccess,
  13538. IN ULONG CreateDisposition,
  13539. IN ULONG CreateOptions,
  13540. IN PVOID EaBuffer OPTIONAL,
  13541. IN ULONG EaLength);
  13542. NTSYSAPI
  13543. NTSTATUS
  13544. NTAPI
  13545. ZwCreateKey(
  13546. OUT PHANDLE KeyHandle,
  13547. IN ACCESS_MASK DesiredAccess,
  13548. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13549. IN ULONG TitleIndex,
  13550. IN PUNICODE_STRING Class OPTIONAL,
  13551. IN ULONG CreateOptions,
  13552. OUT PULONG Disposition OPTIONAL);
  13553. NTSYSAPI
  13554. NTSTATUS
  13555. NTAPI
  13556. ZwCreateSection(
  13557. OUT PHANDLE SectionHandle,
  13558. IN ACCESS_MASK DesiredAccess,
  13559. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13560. IN PLARGE_INTEGER MaximumSize OPTIONAL,
  13561. IN ULONG SectionPageProtection,
  13562. IN ULONG AllocationAttributes,
  13563. IN HANDLE FileHandle OPTIONAL);
  13564. NTSYSAPI
  13565. NTSTATUS
  13566. NTAPI
  13567. ZwDeleteKey(
  13568. IN HANDLE KeyHandle);
  13569. NTSYSAPI
  13570. NTSTATUS
  13571. NTAPI
  13572. ZwDeleteValueKey(
  13573. IN HANDLE KeyHandle,
  13574. IN PUNICODE_STRING ValueName);
  13575. NTSYSAPI
  13576. NTSTATUS
  13577. NTAPI
  13578. ZwEnumerateKey(
  13579. IN HANDLE KeyHandle,
  13580. IN ULONG Index,
  13581. IN KEY_INFORMATION_CLASS KeyInformationClass,
  13582. OUT PVOID KeyInformation OPTIONAL,
  13583. IN ULONG Length,
  13584. OUT PULONG ResultLength);
  13585. NTSYSAPI
  13586. NTSTATUS
  13587. NTAPI
  13588. ZwEnumerateValueKey(
  13589. IN HANDLE KeyHandle,
  13590. IN ULONG Index,
  13591. IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
  13592. OUT PVOID KeyValueInformation OPTIONAL,
  13593. IN ULONG Length,
  13594. OUT PULONG ResultLength);
  13595. NTSYSAPI
  13596. NTSTATUS
  13597. NTAPI
  13598. ZwFlushKey(
  13599. IN HANDLE KeyHandle);
  13600. NTSYSAPI
  13601. NTSTATUS
  13602. NTAPI
  13603. ZwLoadDriver(
  13604. IN PUNICODE_STRING DriverServiceName);
  13605. NTSYSAPI
  13606. NTSTATUS
  13607. NTAPI
  13608. ZwMakeTemporaryObject(
  13609. IN HANDLE Handle);
  13610. NTSYSAPI
  13611. NTSTATUS
  13612. NTAPI
  13613. ZwMapViewOfSection(
  13614. IN HANDLE SectionHandle,
  13615. IN HANDLE ProcessHandle,
  13616. IN OUT PVOID *BaseAddress,
  13617. IN ULONG_PTR ZeroBits,
  13618. IN SIZE_T CommitSize,
  13619. IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
  13620. IN OUT PSIZE_T ViewSize,
  13621. IN SECTION_INHERIT InheritDisposition,
  13622. IN ULONG AllocationType,
  13623. IN ULONG Protect);
  13624. NTSYSAPI
  13625. NTSTATUS
  13626. NTAPI
  13627. ZwOpenFile(
  13628. OUT PHANDLE FileHandle,
  13629. IN ACCESS_MASK DesiredAccess,
  13630. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13631. OUT PIO_STATUS_BLOCK IoStatusBlock,
  13632. IN ULONG ShareAccess,
  13633. IN ULONG OpenOptions);
  13634. NTSYSAPI
  13635. NTSTATUS
  13636. NTAPI
  13637. ZwOpenKey(
  13638. OUT PHANDLE KeyHandle,
  13639. IN ACCESS_MASK DesiredAccess,
  13640. IN POBJECT_ATTRIBUTES ObjectAttributes);
  13641. NTSYSAPI
  13642. NTSTATUS
  13643. NTAPI
  13644. ZwOpenSection(
  13645. OUT PHANDLE SectionHandle,
  13646. IN ACCESS_MASK DesiredAccess,
  13647. IN POBJECT_ATTRIBUTES ObjectAttributes);
  13648. NTSYSAPI
  13649. NTSTATUS
  13650. NTAPI
  13651. ZwOpenSymbolicLinkObject(
  13652. OUT PHANDLE LinkHandle,
  13653. IN ACCESS_MASK DesiredAccess,
  13654. IN POBJECT_ATTRIBUTES ObjectAttributes);
  13655. NTSYSAPI
  13656. NTSTATUS
  13657. NTAPI
  13658. ZwQueryInformationFile(
  13659. IN HANDLE FileHandle,
  13660. OUT PIO_STATUS_BLOCK IoStatusBlock,
  13661. OUT PVOID FileInformation,
  13662. IN ULONG Length,
  13663. IN FILE_INFORMATION_CLASS FileInformationClass);
  13664. NTSYSAPI
  13665. NTSTATUS
  13666. NTAPI
  13667. ZwQueryKey(
  13668. IN HANDLE KeyHandle,
  13669. IN KEY_INFORMATION_CLASS KeyInformationClass,
  13670. OUT PVOID KeyInformation OPTIONAL,
  13671. IN ULONG Length,
  13672. OUT PULONG ResultLength);
  13673. NTSYSAPI
  13674. NTSTATUS
  13675. NTAPI
  13676. ZwQuerySymbolicLinkObject(
  13677. IN HANDLE LinkHandle,
  13678. IN OUT PUNICODE_STRING LinkTarget,
  13679. OUT PULONG ReturnedLength OPTIONAL);
  13680. NTSYSAPI
  13681. NTSTATUS
  13682. NTAPI
  13683. ZwQueryValueKey(
  13684. IN HANDLE KeyHandle,
  13685. IN PUNICODE_STRING ValueName,
  13686. IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
  13687. OUT PVOID KeyValueInformation OPTIONAL,
  13688. IN ULONG Length,
  13689. OUT PULONG ResultLength);
  13690. NTSYSAPI
  13691. NTSTATUS
  13692. NTAPI
  13693. ZwReadFile(
  13694. IN HANDLE FileHandle,
  13695. IN HANDLE Event OPTIONAL,
  13696. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  13697. IN PVOID ApcContext OPTIONAL,
  13698. OUT PIO_STATUS_BLOCK IoStatusBlock,
  13699. OUT PVOID Buffer,
  13700. IN ULONG Length,
  13701. IN PLARGE_INTEGER ByteOffset OPTIONAL,
  13702. IN PULONG Key OPTIONAL);
  13703. NTSYSAPI
  13704. NTSTATUS
  13705. NTAPI
  13706. ZwSetInformationFile(
  13707. IN HANDLE FileHandle,
  13708. OUT PIO_STATUS_BLOCK IoStatusBlock,
  13709. IN PVOID FileInformation,
  13710. IN ULONG Length,
  13711. IN FILE_INFORMATION_CLASS FileInformationClass);
  13712. NTSYSAPI
  13713. NTSTATUS
  13714. NTAPI
  13715. ZwSetValueKey(
  13716. IN HANDLE KeyHandle,
  13717. IN PUNICODE_STRING ValueName,
  13718. IN ULONG TitleIndex OPTIONAL,
  13719. IN ULONG Type,
  13720. IN PVOID Data OPTIONAL,
  13721. IN ULONG DataSize);
  13722. NTSYSAPI
  13723. NTSTATUS
  13724. NTAPI
  13725. ZwUnloadDriver(
  13726. IN PUNICODE_STRING DriverServiceName);
  13727. NTSYSAPI
  13728. NTSTATUS
  13729. NTAPI
  13730. ZwUnmapViewOfSection(
  13731. IN HANDLE ProcessHandle,
  13732. IN PVOID BaseAddress OPTIONAL);
  13733. NTSYSAPI
  13734. NTSTATUS
  13735. NTAPI
  13736. ZwWriteFile(
  13737. IN HANDLE FileHandle,
  13738. IN HANDLE Event OPTIONAL,
  13739. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  13740. IN PVOID ApcContext OPTIONAL,
  13741. OUT PIO_STATUS_BLOCK IoStatusBlock,
  13742. IN PVOID Buffer,
  13743. IN ULONG Length,
  13744. IN PLARGE_INTEGER ByteOffset OPTIONAL,
  13745. IN PULONG Key OPTIONAL);
  13746. NTSYSAPI
  13747. NTSTATUS
  13748. NTAPI
  13749. ZwQueryFullAttributesFile(
  13750. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13751. OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
  13752. #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
  13753. #if (NTDDI_VERSION >= NTDDI_WS03)
  13754. NTSYSCALLAPI
  13755. NTSTATUS
  13756. NTAPI
  13757. ZwOpenEvent(
  13758. OUT PHANDLE EventHandle,
  13759. IN ACCESS_MASK DesiredAccess,
  13760. IN POBJECT_ATTRIBUTES ObjectAttributes);
  13761. #endif
  13762. #if (NTDDI_VERSION >= NTDDI_VISTA)
  13763. NTSYSAPI
  13764. NTSTATUS
  13765. ZwCreateKeyTransacted(
  13766. OUT PHANDLE KeyHandle,
  13767. IN ACCESS_MASK DesiredAccess,
  13768. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13769. IN ULONG TitleIndex,
  13770. IN PUNICODE_STRING Class OPTIONAL,
  13771. IN ULONG CreateOptions,
  13772. IN HANDLE TransactionHandle,
  13773. OUT PULONG Disposition OPTIONAL);
  13774. NTSYSAPI
  13775. NTSTATUS
  13776. NTAPI
  13777. ZwOpenKeyTransacted(
  13778. OUT PHANDLE KeyHandle,
  13779. IN ACCESS_MASK DesiredAccess,
  13780. IN POBJECT_ATTRIBUTES ObjectAttributes,
  13781. IN HANDLE TransactionHandle);
  13782. NTSYSCALLAPI
  13783. NTSTATUS
  13784. NTAPI
  13785. ZwCreateTransactionManager(
  13786. OUT PHANDLE TmHandle,
  13787. IN ACCESS_MASK DesiredAccess,
  13788. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13789. IN PUNICODE_STRING LogFileName OPTIONAL,
  13790. IN ULONG CreateOptions OPTIONAL,
  13791. IN ULONG CommitStrength OPTIONAL);
  13792. NTSYSCALLAPI
  13793. NTSTATUS
  13794. NTAPI
  13795. ZwOpenTransactionManager(
  13796. OUT PHANDLE TmHandle,
  13797. IN ACCESS_MASK DesiredAccess,
  13798. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13799. IN PUNICODE_STRING LogFileName OPTIONAL,
  13800. IN LPGUID TmIdentity OPTIONAL,
  13801. IN ULONG OpenOptions OPTIONAL);
  13802. NTSYSCALLAPI
  13803. NTSTATUS
  13804. NTAPI
  13805. ZwRollforwardTransactionManager(
  13806. IN HANDLE TransactionManagerHandle,
  13807. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13808. NTSYSCALLAPI
  13809. NTSTATUS
  13810. NTAPI
  13811. ZwRecoverTransactionManager(
  13812. IN HANDLE TransactionManagerHandle);
  13813. NTSYSCALLAPI
  13814. NTSTATUS
  13815. NTAPI
  13816. ZwQueryInformationTransactionManager(
  13817. IN HANDLE TransactionManagerHandle,
  13818. IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
  13819. OUT PVOID TransactionManagerInformation,
  13820. IN ULONG TransactionManagerInformationLength,
  13821. OUT PULONG ReturnLength OPTIONAL);
  13822. NTSYSCALLAPI
  13823. NTSTATUS
  13824. NTAPI
  13825. ZwSetInformationTransactionManager(
  13826. IN HANDLE TmHandle,
  13827. IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
  13828. IN PVOID TransactionManagerInformation,
  13829. IN ULONG TransactionManagerInformationLength);
  13830. NTSYSCALLAPI
  13831. NTSTATUS
  13832. NTAPI
  13833. ZwEnumerateTransactionObject(
  13834. IN HANDLE RootObjectHandle OPTIONAL,
  13835. IN KTMOBJECT_TYPE QueryType,
  13836. IN OUT PKTMOBJECT_CURSOR ObjectCursor,
  13837. IN ULONG ObjectCursorLength,
  13838. OUT PULONG ReturnLength);
  13839. NTSYSCALLAPI
  13840. NTSTATUS
  13841. NTAPI
  13842. ZwCreateTransaction(
  13843. OUT PHANDLE TransactionHandle,
  13844. IN ACCESS_MASK DesiredAccess,
  13845. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13846. IN LPGUID Uow OPTIONAL,
  13847. IN HANDLE TmHandle OPTIONAL,
  13848. IN ULONG CreateOptions OPTIONAL,
  13849. IN ULONG IsolationLevel OPTIONAL,
  13850. IN ULONG IsolationFlags OPTIONAL,
  13851. IN PLARGE_INTEGER Timeout OPTIONAL,
  13852. IN PUNICODE_STRING Description OPTIONAL);
  13853. NTSYSCALLAPI
  13854. NTSTATUS
  13855. NTAPI
  13856. ZwOpenTransaction(
  13857. OUT PHANDLE TransactionHandle,
  13858. IN ACCESS_MASK DesiredAccess,
  13859. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13860. IN LPGUID Uow,
  13861. IN HANDLE TmHandle OPTIONAL);
  13862. NTSYSCALLAPI
  13863. NTSTATUS
  13864. NTAPI
  13865. ZwQueryInformationTransaction(
  13866. IN HANDLE TransactionHandle,
  13867. IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
  13868. OUT PVOID TransactionInformation,
  13869. IN ULONG TransactionInformationLength,
  13870. OUT PULONG ReturnLength OPTIONAL);
  13871. NTSYSCALLAPI
  13872. NTSTATUS
  13873. NTAPI
  13874. ZwSetInformationTransaction(
  13875. IN HANDLE TransactionHandle,
  13876. IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
  13877. IN PVOID TransactionInformation,
  13878. IN ULONG TransactionInformationLength);
  13879. NTSYSCALLAPI
  13880. NTSTATUS
  13881. NTAPI
  13882. ZwCommitTransaction(
  13883. IN HANDLE TransactionHandle,
  13884. IN BOOLEAN Wait);
  13885. NTSYSCALLAPI
  13886. NTSTATUS
  13887. NTAPI
  13888. ZwRollbackTransaction(
  13889. IN HANDLE TransactionHandle,
  13890. IN BOOLEAN Wait);
  13891. NTSYSCALLAPI
  13892. NTSTATUS
  13893. NTAPI
  13894. ZwCreateResourceManager(
  13895. OUT PHANDLE ResourceManagerHandle,
  13896. IN ACCESS_MASK DesiredAccess,
  13897. IN HANDLE TmHandle,
  13898. IN LPGUID ResourceManagerGuid OPTIONAL,
  13899. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13900. IN ULONG CreateOptions OPTIONAL,
  13901. IN PUNICODE_STRING Description OPTIONAL);
  13902. NTSYSCALLAPI
  13903. NTSTATUS
  13904. NTAPI
  13905. ZwOpenResourceManager(
  13906. OUT PHANDLE ResourceManagerHandle,
  13907. IN ACCESS_MASK DesiredAccess,
  13908. IN HANDLE TmHandle,
  13909. IN LPGUID ResourceManagerGuid,
  13910. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
  13911. NTSYSCALLAPI
  13912. NTSTATUS
  13913. NTAPI
  13914. ZwRecoverResourceManager(
  13915. IN HANDLE ResourceManagerHandle);
  13916. NTSYSCALLAPI
  13917. NTSTATUS
  13918. NTAPI
  13919. ZwGetNotificationResourceManager(
  13920. IN HANDLE ResourceManagerHandle,
  13921. OUT PTRANSACTION_NOTIFICATION TransactionNotification,
  13922. IN ULONG NotificationLength,
  13923. IN PLARGE_INTEGER Timeout,
  13924. IN PULONG ReturnLength OPTIONAL,
  13925. IN ULONG Asynchronous,
  13926. IN ULONG_PTR AsynchronousContext OPTIONAL);
  13927. NTSYSCALLAPI
  13928. NTSTATUS
  13929. NTAPI
  13930. ZwQueryInformationResourceManager(
  13931. IN HANDLE ResourceManagerHandle,
  13932. IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
  13933. OUT PVOID ResourceManagerInformation,
  13934. IN ULONG ResourceManagerInformationLength,
  13935. IN PULONG ReturnLength OPTIONAL);
  13936. NTSYSCALLAPI
  13937. NTSTATUS
  13938. NTAPI
  13939. ZwSetInformationResourceManager(
  13940. IN HANDLE ResourceManagerHandle,
  13941. IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
  13942. IN PVOID ResourceManagerInformation,
  13943. IN ULONG ResourceManagerInformationLength);
  13944. NTSYSCALLAPI
  13945. NTSTATUS
  13946. NTAPI
  13947. ZwCreateEnlistment(
  13948. OUT PHANDLE EnlistmentHandle,
  13949. IN ACCESS_MASK DesiredAccess,
  13950. IN HANDLE ResourceManagerHandle,
  13951. IN HANDLE TransactionHandle,
  13952. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  13953. IN ULONG CreateOptions OPTIONAL,
  13954. IN NOTIFICATION_MASK NotificationMask,
  13955. IN PVOID EnlistmentKey OPTIONAL);
  13956. NTSYSCALLAPI
  13957. NTSTATUS
  13958. NTAPI
  13959. ZwOpenEnlistment(
  13960. OUT PHANDLE EnlistmentHandle,
  13961. IN ACCESS_MASK DesiredAccess,
  13962. IN HANDLE RmHandle,
  13963. IN LPGUID EnlistmentGuid,
  13964. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
  13965. NTSYSCALLAPI
  13966. NTSTATUS
  13967. NTAPI
  13968. ZwQueryInformationEnlistment(
  13969. IN HANDLE EnlistmentHandle,
  13970. IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
  13971. OUT PVOID EnlistmentInformation,
  13972. IN ULONG EnlistmentInformationLength,
  13973. IN PULONG ReturnLength OPTIONAL);
  13974. NTSYSCALLAPI
  13975. NTSTATUS
  13976. NTAPI
  13977. ZwSetInformationEnlistment(
  13978. IN HANDLE EnlistmentHandle,
  13979. IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
  13980. IN PVOID EnlistmentInformation,
  13981. IN ULONG EnlistmentInformationLength);
  13982. NTSYSCALLAPI
  13983. NTSTATUS
  13984. NTAPI
  13985. ZwRecoverEnlistment(
  13986. IN HANDLE EnlistmentHandle,
  13987. IN PVOID EnlistmentKey OPTIONAL);
  13988. NTSYSCALLAPI
  13989. NTSTATUS
  13990. NTAPI
  13991. ZwPrePrepareEnlistment(
  13992. IN HANDLE EnlistmentHandle,
  13993. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  13994. NTSYSCALLAPI
  13995. NTSTATUS
  13996. NTAPI
  13997. ZwPrepareEnlistment(
  13998. IN HANDLE EnlistmentHandle,
  13999. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14000. NTSYSCALLAPI
  14001. NTSTATUS
  14002. NTAPI
  14003. ZwCommitEnlistment(
  14004. IN HANDLE EnlistmentHandle,
  14005. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14006. NTSYSCALLAPI
  14007. NTSTATUS
  14008. NTAPI
  14009. ZwRollbackEnlistment(
  14010. IN HANDLE EnlistmentHandle,
  14011. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14012. NTSYSCALLAPI
  14013. NTSTATUS
  14014. NTAPI
  14015. ZwPrePrepareComplete(
  14016. IN HANDLE EnlistmentHandle,
  14017. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14018. NTSYSCALLAPI
  14019. NTSTATUS
  14020. NTAPI
  14021. ZwPrepareComplete(
  14022. IN HANDLE EnlistmentHandle,
  14023. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14024. NTSYSCALLAPI
  14025. NTSTATUS
  14026. NTAPI
  14027. ZwCommitComplete(
  14028. IN HANDLE EnlistmentHandle,
  14029. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14030. NTSYSCALLAPI
  14031. NTSTATUS
  14032. NTAPI
  14033. ZwReadOnlyEnlistment(
  14034. IN HANDLE EnlistmentHandle,
  14035. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14036. NTSYSCALLAPI
  14037. NTSTATUS
  14038. NTAPI
  14039. ZwRollbackComplete(
  14040. IN HANDLE EnlistmentHandle,
  14041. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14042. NTSYSCALLAPI
  14043. NTSTATUS
  14044. NTAPI
  14045. ZwSinglePhaseReject(
  14046. IN HANDLE EnlistmentHandle,
  14047. IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
  14048. #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
  14049. #if (NTDDI_VERSION >= NTDDI_WIN7)
  14050. NTSYSAPI
  14051. NTSTATUS
  14052. NTAPI
  14053. ZwOpenKeyEx(
  14054. OUT PHANDLE KeyHandle,
  14055. IN ACCESS_MASK DesiredAccess,
  14056. IN POBJECT_ATTRIBUTES ObjectAttributes,
  14057. IN ULONG OpenOptions);
  14058. NTSYSAPI
  14059. NTSTATUS
  14060. NTAPI
  14061. ZwOpenKeyTransactedEx(
  14062. OUT PHANDLE KeyHandle,
  14063. IN ACCESS_MASK DesiredAccess,
  14064. IN POBJECT_ATTRIBUTES ObjectAttributes,
  14065. IN ULONG OpenOptions,
  14066. IN HANDLE TransactionHandle);
  14067. NTSYSAPI
  14068. NTSTATUS
  14069. NTAPI
  14070. ZwNotifyChangeMultipleKeys(
  14071. IN HANDLE MasterKeyHandle,
  14072. IN ULONG Count OPTIONAL,
  14073. IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
  14074. IN HANDLE Event OPTIONAL,
  14075. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  14076. IN PVOID ApcContext OPTIONAL,
  14077. OUT PIO_STATUS_BLOCK IoStatusBlock,
  14078. IN ULONG CompletionFilter,
  14079. IN BOOLEAN WatchTree,
  14080. OUT PVOID Buffer OPTIONAL,
  14081. IN ULONG BufferSize,
  14082. IN BOOLEAN Asynchronous);
  14083. NTSYSAPI
  14084. NTSTATUS
  14085. NTAPI
  14086. ZwQueryMultipleValueKey(
  14087. IN HANDLE KeyHandle,
  14088. IN OUT PKEY_VALUE_ENTRY ValueEntries,
  14089. IN ULONG EntryCount,
  14090. OUT PVOID ValueBuffer,
  14091. IN OUT PULONG BufferLength,
  14092. OUT PULONG RequiredBufferLength OPTIONAL);
  14093. NTSYSAPI
  14094. NTSTATUS
  14095. NTAPI
  14096. ZwRenameKey(
  14097. IN HANDLE KeyHandle,
  14098. IN PUNICODE_STRING NewName);
  14099. NTSYSAPI
  14100. NTSTATUS
  14101. NTAPI
  14102. ZwSetInformationKey(
  14103. IN HANDLE KeyHandle,
  14104. IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
  14105. IN PVOID KeySetInformation,
  14106. IN ULONG KeySetInformationLength);
  14107. #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
  14108. #ifndef _CLFS_PUBLIC_H_
  14109. #define _CLFS_PUBLIC_H_
  14110. #ifndef CLFSUSER_API
  14111. #ifdef __CLFSUSER_EXPORTS__
  14112. #define CLFSUSER_API
  14113. #else
  14114. #define CLFSUSER_API __declspec(dllimport)
  14115. #endif
  14116. #endif
  14117. #if NTDDI_VERSION >= NTDDI_WS03SP1 || _WIN32_WINNT >= _WIN32_WINNT_WS03
  14118. #define FILE_ATTRIBUTE_DEDICATED FILE_ATTRIBUTE_TEMPORARY
  14119. #define EA_CONTAINER_NAME "ContainerName"
  14120. #define EA_CONTAINER_SIZE "ContainerSize"
  14121. #define CLFS_BASELOG_EXTENSION L".blf"
  14122. #define CLFS_FLAG_NO_FLAGS 0x00000000
  14123. #define CLFS_FLAG_FORCE_APPEND 0x00000001
  14124. #define CLFS_FLAG_FORCE_FLUSH 0x00000002
  14125. #define CLFS_FLAG_USE_RESERVATION 0x00000004
  14126. #define CLFS_FLAG_REENTRANT_FILE_SYSTEM 0x00000008
  14127. #define CLFS_FLAG_NON_REENTRANT_FILTER 0x00000010
  14128. #define CLFS_FLAG_REENTRANT_FILTER 0x00000020
  14129. #define CLFS_FLAG_IGNORE_SHARE_ACCESS 0x00000040
  14130. #define CLFS_FLAG_READ_IN_PROGRESS 0x00000080
  14131. #define CLFS_FLAG_MINIFILTER_LEVEL 0x00000100
  14132. #define CLFS_FLAG_HIDDEN_SYSTEM_LOG 0x00000200
  14133. #define CLFS_FLAG_FILTER_INTERMEDIATE_LEVEL CLFS_FLAG_NON_REENTRANT_FILTER
  14134. #define CLFS_FLAG_FILTER_TOP_LEVEL CLFS_FLAG_REENTRANT_FILTER
  14135. #define CLFS_MARSHALLING_FLAG_NONE 0x00000000
  14136. #define CLFS_MARSHALLING_FLAG_DISABLE_BUFF_INIT 0x00000001
  14137. typedef ULONG CLFS_CONTAINER_ID, *PCLFS_CONTAINER_ID, **PPCLFS_CONTAINER_ID;
  14138. typedef struct _CLS_LSN {
  14139. ULONGLONG Internal;
  14140. } CLS_LSN, *PCLS_LSN, **PPCLS_LSN;
  14141. typedef CLS_LSN CLFS_LSN, *PCLFS_LSN, **PPCLFS_LSN;
  14142. extern __declspec(dllimport) const CLFS_LSN CLFS_LSN_INVALID;
  14143. extern __declspec(dllimport) const CLFS_LSN CLFS_LSN_NULL;
  14144. #define ClfsNullRecord 0x00
  14145. #define ClfsDataRecord 0x01
  14146. #define ClfsRestartRecord 0x02
  14147. #define ClfsClientRecord (ClfsDataRecord | ClfsRestartRecord)
  14148. #define CLFS_CONTAINER_STREAM_PREFIX L"%BLF%:"
  14149. #define CLFS_CONTAINER_RELATIVE_PREFIX L"%BLF%\\"
  14150. typedef UCHAR CLS_RECORD_TYPE, *PCLS_RECORD_TYPE, **PPCLS_RECORD_TYPE;
  14151. typedef CLS_RECORD_TYPE CLFS_RECORD_TYPE, *PCLFS_RECORD_TYPE, **PPCLFS_RECORD_TYPE;
  14152. typedef enum _CLS_CONTEXT_MODE {
  14153. ClsContextNone,
  14154. ClsContextUndoNext,
  14155. ClsContextPrevious,
  14156. ClsContextForward
  14157. } CLS_CONTEXT_MODE, *PCLS_CONTEXT_MODE, **PPCLS_CONTEXT_MODE;
  14158. typedef enum _CLFS_CONTEXT_MODE {
  14159. ClfsContextNone,
  14160. ClfsContextUndoNext,
  14161. ClfsContextPrevious,
  14162. ClfsContextForward
  14163. } CLFS_CONTEXT_MODE, *PCLFS_CONTEXT_MODE, **PPCLFS_CONTEXT_MODE;
  14164. typedef struct _CLFS_NODE_ID {
  14165. ULONG cType;
  14166. ULONG cbNode;
  14167. } CLFS_NODE_ID, *PCLFS_NODE_ID;
  14168. typedef struct _CLS_WRITE_ENTRY {
  14169. PVOID Buffer;
  14170. ULONG ByteLength;
  14171. } CLS_WRITE_ENTRY, *PCLS_WRITE_ENTRY, **PPCLS_WRITE_ENTRY;
  14172. typedef CLS_WRITE_ENTRY CLFS_WRITE_ENTRY, *PCLFS_WRITE_ENTRY, **PPCLFS_WRITE_ENTRY;
  14173. typedef GUID CLFS_LOG_ID;
  14174. typedef struct _CLS_INFORMATION {
  14175. LONGLONG TotalAvailable;
  14176. LONGLONG CurrentAvailable;
  14177. LONGLONG TotalReservation;
  14178. ULONGLONG BaseFileSize;
  14179. ULONGLONG ContainerSize;
  14180. ULONG TotalContainers;
  14181. ULONG FreeContainers;
  14182. ULONG TotalClients;
  14183. ULONG Attributes;
  14184. ULONG FlushThreshold;
  14185. ULONG SectorSize;
  14186. CLS_LSN MinArchiveTailLsn;
  14187. CLS_LSN BaseLsn;
  14188. CLS_LSN LastFlushedLsn;
  14189. CLS_LSN LastLsn;
  14190. CLS_LSN RestartLsn;
  14191. GUID Identity;
  14192. } CLS_INFORMATION, *PCLS_INFORMATION, *PPCLS_INFORMATION;
  14193. typedef CLS_INFORMATION CLFS_INFORMATION, *PCLFS_INFORMATION, *PPCLFS_INFORMATION;
  14194. typedef struct _CLFS_LOG_NAME_INFORMATION {
  14195. USHORT NameLengthInBytes;
  14196. WCHAR Name[1];
  14197. } CLFS_LOG_NAME_INFORMATION, *PCLFS_LOG_NAME_INFORMATION, **PPCLFS_LOG_NAME_INFORMATION;
  14198. typedef struct _CLFS_STREAM_ID_INFORMATION {
  14199. UCHAR StreamIdentifier;
  14200. } CLFS_STREAM_ID_INFORMATION, *PCLFS_STREAM_ID_INFORMATION, **PPCLFS_STREAM_ID_INFORMATION;
  14201. typedef UINT32 CLS_CONTAINER_STATE, *PCLS_CONTAINER_STATE, *PPCLS_CONTAINER_STATE;
  14202. typedef CLS_CONTAINER_STATE CLFS_CONTAINER_STATE, *PCLFS_CONTAINER_STATE, *PPCLFS_CONTAINER_STATE;
  14203. #define ClsContainerInitializing 0x01
  14204. #define ClsContainerInactive 0x02
  14205. #define ClsContainerActive 0x04
  14206. #define ClsContainerActivePendingDelete 0x08
  14207. #define ClsContainerPendingArchive 0x10
  14208. #define ClsContainerPendingArchiveAndDelete 0x20
  14209. #define ClfsContainerInitializing 0x01
  14210. #define ClfsContainerInactive 0x02
  14211. #define ClfsContainerActive 0x04
  14212. #define ClfsContainerActivePendingDelete 0x08
  14213. #define ClfsContainerPendingArchive 0x10
  14214. #define ClfsContainerPendingArchiveAndDelete 0x20
  14215. #define CLFS_MAX_CONTAINER_INFO 256
  14216. typedef struct _CLS_CONTAINER_INFORMATION {
  14217. ULONG FileAttributes;
  14218. ULONGLONG CreationTime;
  14219. ULONGLONG LastAccessTime;
  14220. ULONGLONG LastWriteTime;
  14221. LONGLONG ContainerSize;
  14222. ULONG FileNameActualLength;
  14223. ULONG FileNameLength;
  14224. WCHAR FileName[CLFS_MAX_CONTAINER_INFO];
  14225. CLFS_CONTAINER_STATE State;
  14226. CLFS_CONTAINER_ID PhysicalContainerId;
  14227. CLFS_CONTAINER_ID LogicalContainerId;
  14228. } CLS_CONTAINER_INFORMATION, *PCLS_CONTAINER_INFORMATION, **PPCLS_CONTAINER_INFORMATION;
  14229. typedef CLS_CONTAINER_INFORMATION CLFS_CONTAINER_INFORMATION, *PCLFS_CONTAINER_INFORMATION, **PPCLFS_CONTAINER_INFORMATION;
  14230. typedef enum _CLS_LOG_INFORMATION_CLASS {
  14231. ClfsLogBasicInformation,
  14232. ClfsLogBasicInformationPhysical,
  14233. ClfsLogPhysicalNameInformation,
  14234. ClfsLogStreamIdentifierInformation,
  14235. #if NTDDI_VERSION >= NTDDI_VISTA || _WIN32_WINNT >= _WIN32_WINNT_VISTA
  14236. ClfsLogSystemMarkingInformation,
  14237. ClfsLogPhysicalLsnInformation
  14238. #endif
  14239. } CLS_LOG_INFORMATION_CLASS, *PCLS_LOG_INFORMATION_CLASS, **PPCLS_LOG_INFORMATION_CLASS;
  14240. typedef CLS_LOG_INFORMATION_CLASS CLFS_LOG_INFORMATION_CLASS, *PCLFS_LOG_INFORMATION_CLASS, **PPCLFS_LOG_INFORMATION_CLASS;
  14241. typedef enum _CLS_IOSTATS_CLASS {
  14242. ClsIoStatsDefault = 0x0000,
  14243. ClsIoStatsMax = 0xffff
  14244. } CLS_IOSTATS_CLASS, *PCLS_IOSTATS_CLASS, **PPCLS_IOSTATS_CLASS;
  14245. typedef enum _CLFS_IOSTATS_CLASS {
  14246. ClfsIoStatsDefault = 0x0000,
  14247. ClfsIoStatsMax = 0xffff
  14248. } CLFS_IOSTATS_CLASS, *PCLFS_IOSTATS_CLASS, **PPCLFS_IOSTATS_CLASS;
  14249. typedef struct _CLS_IO_STATISTICS_HEADER {
  14250. UCHAR ubMajorVersion;
  14251. UCHAR ubMinorVersion;
  14252. CLFS_IOSTATS_CLASS eStatsClass;
  14253. USHORT cbLength;
  14254. ULONG coffData;
  14255. } CLS_IO_STATISTICS_HEADER, *PCLS_IO_STATISTICS_HEADER, **PPCLS_IO_STATISTICS_HEADER;
  14256. typedef CLS_IO_STATISTICS_HEADER CLFS_IO_STATISTICS_HEADER, *PCLFS_IO_STATISTICS_HEADER, **PPCLFS_IO_STATISTICS_HEADER;
  14257. typedef struct _CLS_IO_STATISTICS {
  14258. CLS_IO_STATISTICS_HEADER hdrIoStats;
  14259. ULONGLONG cFlush;
  14260. ULONGLONG cbFlush;
  14261. ULONGLONG cMetaFlush;
  14262. ULONGLONG cbMetaFlush;
  14263. } CLS_IO_STATISTICS, *PCLS_IO_STATISTICS, **PPCLS_IO_STATISTICS;
  14264. typedef CLS_IO_STATISTICS CLFS_IO_STATISTICS, *PCLFS_IO_STATISTICS, **PPCLFS_IO_STATISTICS;
  14265. #define CLFS_SCAN_INIT 0x01
  14266. #define CLFS_SCAN_FORWARD 0x02
  14267. #define CLFS_SCAN_BACKWARD 0x04
  14268. #define CLFS_SCAN_CLOSE 0x08
  14269. #define CLFS_SCAN_INITIALIZED 0x10
  14270. #define CLFS_SCAN_BUFFERED 0x20
  14271. typedef UCHAR CLFS_SCAN_MODE, *PCLFS_SCAN_MODE;
  14272. typedef FILE_OBJECT LOG_FILE_OBJECT, *PLOG_FILE_OBJECT, **PPLOG_FILE_OBJECT;
  14273. typedef struct _CLS_SCAN_CONTEXT {
  14274. CLFS_NODE_ID cidNode;
  14275. PLOG_FILE_OBJECT plfoLog;
  14276. ULONG cIndex __attribute__((aligned(8)));
  14277. ULONG cContainers __attribute__((aligned(8)));
  14278. ULONG cContainersReturned __attribute__((aligned(8)));
  14279. CLFS_SCAN_MODE eScanMode __attribute__((aligned(8)));
  14280. PCLS_CONTAINER_INFORMATION pinfoContainer __attribute__((aligned(8)));
  14281. } CLS_SCAN_CONTEXT, *PCLS_SCAN_CONTEXT, **PPCLS_SCAN_CONTEXT;
  14282. typedef CLS_SCAN_CONTEXT CLFS_SCAN_CONTEXT, *PCLFS_SCAN_CONTEXT, **PPCLFS_SCAN_CONTEXT;
  14283. typedef struct _CLS_ARCHIVE_DESCRIPTOR {
  14284. ULONGLONG coffLow;
  14285. ULONGLONG coffHigh;
  14286. CLS_CONTAINER_INFORMATION infoContainer;
  14287. } CLS_ARCHIVE_DESCRIPTOR, *PCLS_ARCHIVE_DESCRIPTOR, **PPCLS_ARCHIVE_DESCRIPTOR;
  14288. typedef CLS_ARCHIVE_DESCRIPTOR CLFS_ARCHIVE_DESCRIPTOR, *PCLFS_ARCHIVE_DESCRIPTOR, **PPCLFS_ARCHIVE_DESCRIPTOR;
  14289. typedef PVOID (*CLFS_BLOCK_ALLOCATION)(ULONG cbBufferLength, PVOID pvUserContext);
  14290. typedef void (*CLFS_BLOCK_DEALLOCATION)(PVOID pvBuffer, PVOID pvUserContext);
  14291. typedef enum _CLFS_LOG_ARCHIVE_MODE {
  14292. ClfsLogArchiveEnabled = 1,
  14293. ClfsLogArchiveDisabled = 2
  14294. } CLFS_LOG_ARCHIVE_MODE, *PCLFS_LOG_ARCHIVE_MODE;
  14295. CLFSUSER_API
  14296. BOOLEAN
  14297. NTAPI
  14298. ClfsLsnEqual(
  14299. const CLFS_LSN* plsn1,
  14300. const CLFS_LSN* plsn2);
  14301. CLFSUSER_API
  14302. BOOLEAN
  14303. NTAPI
  14304. ClfsLsnLess(
  14305. const CLFS_LSN* plsn1,
  14306. const CLFS_LSN* plsn2);
  14307. CLFSUSER_API
  14308. BOOLEAN
  14309. NTAPI
  14310. ClfsLsnGreater(
  14311. const CLFS_LSN* plsn1,
  14312. const CLFS_LSN* plsn2);
  14313. CLFSUSER_API
  14314. BOOLEAN
  14315. NTAPI
  14316. ClfsLsnNull(
  14317. const CLFS_LSN* plsn);
  14318. CLFSUSER_API
  14319. CLFS_CONTAINER_ID
  14320. NTAPI
  14321. ClfsLsnContainer(
  14322. const CLFS_LSN* plsn);
  14323. CLFSUSER_API
  14324. CLFS_LSN
  14325. NTAPI
  14326. ClfsLsnCreate(
  14327. CLFS_CONTAINER_ID cidContainer,
  14328. ULONG offBlock,
  14329. ULONG cRecord);
  14330. CLFSUSER_API
  14331. ULONG
  14332. NTAPI
  14333. ClfsLsnBlockOffset(
  14334. const CLFS_LSN* plsn);
  14335. CLFSUSER_API
  14336. ULONG
  14337. NTAPI
  14338. ClfsLsnRecordSequence(
  14339. const CLFS_LSN* plsn);
  14340. CLFSUSER_API
  14341. BOOLEAN
  14342. NTAPI
  14343. ClfsLsnInvalid(
  14344. const CLFS_LSN* plsn);
  14345. CLFSUSER_API
  14346. CLFS_LSN
  14347. NTAPI
  14348. ClfsLsnIncrement(
  14349. PCLFS_LSN plsn);
  14350. #ifdef __cplusplus
  14351. #ifdef CLFS_OPERATORS
  14352. inline CLFS_LSN operator++(CLFS_LSN& refLsn) {
  14353. refLsn = ClfsLsnIncrement (&refLsn);
  14354. return refLsn;
  14355. }
  14356. inline BOOLEAN operator<(const CLFS_LSN& refLsn1, const CLFS_LSN& refLsn2) {
  14357. return ClfsLsnLess(&refLsn1, &refLsn2);
  14358. }
  14359. inline BOOLEAN operator>(const CLFS_LSN& refLsn1, const CLFS_LSN& refLsn2) {
  14360. return ClfsLsnGreater(&refLsn1, &refLsn2);
  14361. }
  14362. inline BOOLEAN operator==(const CLFS_LSN& refLsn1, const CLFS_LSN& refLsn2) {
  14363. return ClfsLsnEqual(&refLsn1, &refLsn2);
  14364. }
  14365. inline BOOLEAN operator!=(const CLFS_LSN& refLsn1, const CLFS_LSN& refLsn2) {
  14366. return !ClfsLsnEqual(&refLsn1, &refLsn2);
  14367. }
  14368. inline BOOLEAN operator<=(const CLFS_LSN& refLsn1, const CLFS_LSN& refLsn2) {
  14369. return !ClfsLsnGreater(&refLsn1, &refLsn2);
  14370. }
  14371. inline BOOLEAN operator>=(const CLFS_LSN& refLsn1, const CLFS_LSN& refLsn2) {
  14372. return !ClfsLsnLess(&refLsn1, &refLsn2);
  14373. }
  14374. #endif
  14375. #endif
  14376. #endif
  14377. #if NTDDI_VERSION >= NTDDI_VISTA || _WIN32_WINNT >= _WIN32_WINNT_VISTA
  14378. #pragma pack(push,8)
  14379. typedef struct _CLFS_PHYSICAL_LSN_INFORMATION {
  14380. UCHAR StreamIdentifier;
  14381. CLFS_LSN VirtualLsn;
  14382. CLFS_LSN PhysicalLsn;
  14383. } CLFS_PHYSICAL_LSN_INFORMATION, *PCLFS_PHYSICAL_LSN_INFORMATION;
  14384. #pragma pack(pop)
  14385. #endif
  14386. #endif /* _CLFS_PUBLIC_H_ */
  14387. #if NTDDI_VERSION >= NTDDI_WS03SP1 || _WIN32_WINNT >= _WIN32_WINNT_WS03
  14388. typedef enum _CLFS_MGMT_POLICY_TYPE {
  14389. ClfsMgmtPolicyMaximumSize,
  14390. ClfsMgmtPolicyMinimumSize,
  14391. ClfsMgmtPolicyNewContainerSize,
  14392. ClfsMgmtPolicyGrowthRate,
  14393. ClfsMgmtPolicyLogTail,
  14394. ClfsMgmtPolicyAutoShrink,
  14395. ClfsMgmtPolicyAutoGrow,
  14396. ClfsMgmtPolicyNewContainerPrefix,
  14397. ClfsMgmtPolicyNewContainerSuffix,
  14398. ClfsMgmtPolicyNewContainerExtension,
  14399. ClfsMgmtPolicyInvalid
  14400. } CLFS_MGMT_POLICY_TYPE, *PCLFS_MGMT_POLICY_TYPE;
  14401. #define CLFS_MGMT_NUM_POLICIES (ULONG)ClfsMgmtPolicyInvalid
  14402. #define CLFS_LOG_SIZE_MINIMUM (ULONGLONG)0
  14403. #define CLFS_LOG_SIZE_MAXIMUM (ULONGLONG)-1
  14404. #define CLFS_MGMT_POLICY_VERSION 1
  14405. #define LOG_POLICY_OVERWRITE 0x01
  14406. #define LOG_POLICY_PERSIST 0x02
  14407. typedef struct _CLFS_MGMT_POLICY {
  14408. ULONG Version;
  14409. ULONG LengthInBytes;
  14410. ULONG PolicyFlags;
  14411. CLFS_MGMT_POLICY_TYPE PolicyType;
  14412. union {
  14413. struct {
  14414. ULONG Containers;
  14415. } MaximumSize;
  14416. struct {
  14417. ULONG Containers;
  14418. } MinimumSize;
  14419. struct {
  14420. ULONG SizeInBytes;
  14421. } NewContainerSize;
  14422. struct {
  14423. ULONG AbsoluteGrowthInContainers;
  14424. ULONG RelativeGrowthPercentage;
  14425. } GrowthRate;
  14426. struct {
  14427. ULONG MinimumAvailablePercentage;
  14428. ULONG MinimumAvailableContainers;
  14429. } LogTail;
  14430. struct {
  14431. ULONG Percentage;
  14432. } AutoShrink;
  14433. struct {
  14434. ULONG Enabled;
  14435. } AutoGrow;
  14436. struct {
  14437. USHORT PrefixLengthInBytes;
  14438. WCHAR PrefixString[1];
  14439. } NewContainerPrefix;
  14440. struct {
  14441. ULONGLONG NextContainerSuffix;
  14442. } NewContainerSuffix;
  14443. struct {
  14444. USHORT ExtensionLengthInBytes;
  14445. WCHAR ExtensionString[1];
  14446. } NewContainerExtension;
  14447. } PolicyParameters;
  14448. } CLFS_MGMT_POLICY, *PCLFS_MGMT_POLICY;
  14449. typedef enum _CLFS_MGMT_NOTIFICATION_TYPE {
  14450. ClfsMgmtAdvanceTailNotification,
  14451. ClfsMgmtLogFullHandlerNotification,
  14452. ClfsMgmtLogUnpinnedNotification,
  14453. ClfsMgmtLogWriteNotification
  14454. } CLFS_MGMT_NOTIFICATION_TYPE, *PCLFS_MGMT_NOTIFICATION_TYPE;
  14455. typedef struct _CLFS_MGMT_NOTIFICATION {
  14456. CLFS_MGMT_NOTIFICATION_TYPE Notification;
  14457. CLFS_LSN Lsn;
  14458. USHORT LogIsPinned;
  14459. } CLFS_MGMT_NOTIFICATION, *PCLFS_MGMT_NOTIFICATION;
  14460. typedef NTSTATUS (*PCLFS_CLIENT_ADVANCE_TAIL_CALLBACK)(
  14461. PLOG_FILE_OBJECT LogFile,
  14462. PCLFS_LSN TargetLsn,
  14463. PVOID ClientData);
  14464. typedef VOID (*PCLFS_CLIENT_LFF_HANDLER_COMPLETE_CALLBACK)(
  14465. PLOG_FILE_OBJECT LogFile,
  14466. NTSTATUS OperationStatus,
  14467. BOOLEAN LogIsPinned,
  14468. PVOID ClientData);
  14469. typedef VOID (*PCLFS_CLIENT_LOG_UNPINNED_CALLBACK)(
  14470. PLOG_FILE_OBJECT LogFile,
  14471. PVOID ClientData);
  14472. typedef VOID (*PCLFS_SET_LOG_SIZE_COMPLETE_CALLBACK)(
  14473. PLOG_FILE_OBJECT LogFile,
  14474. NTSTATUS OperationStatus,
  14475. PVOID ClientData);
  14476. #define CLFS_MGMT_CLIENT_REGISTRATION_VERSION 1
  14477. typedef struct _CLFS_MGMT_CLIENT_REGISTRATION {
  14478. ULONG Version;
  14479. PCLFS_CLIENT_ADVANCE_TAIL_CALLBACK AdvanceTailCallback;
  14480. PVOID AdvanceTailCallbackData;
  14481. PCLFS_CLIENT_LFF_HANDLER_COMPLETE_CALLBACK LogGrowthCompleteCallback;
  14482. PVOID LogGrowthCompleteCallbackData;
  14483. PCLFS_CLIENT_LOG_UNPINNED_CALLBACK LogUnpinnedCallback;
  14484. PVOID LogUnpinnedCallbackData;
  14485. } CLFS_MGMT_CLIENT_REGISTRATION, *PCLFS_MGMT_CLIENT_REGISTRATION;
  14486. typedef PVOID CLFS_MGMT_CLIENT, *PCLFS_MGMT_CLIENT;
  14487. CLFSUSER_API
  14488. NTSTATUS
  14489. ClfsMgmtRegisterManagedClient(
  14490. PLOG_FILE_OBJECT LogFile,
  14491. PCLFS_MGMT_CLIENT_REGISTRATION RegistrationData,
  14492. PCLFS_MGMT_CLIENT ClientCookie);
  14493. CLFSUSER_API
  14494. NTSTATUS
  14495. ClfsMgmtDeregisterManagedClient(
  14496. CLFS_MGMT_CLIENT ClientCookie);
  14497. CLFSUSER_API
  14498. NTSTATUS
  14499. ClfsMgmtTailAdvanceFailure(
  14500. CLFS_MGMT_CLIENT Client,
  14501. NTSTATUS Reason);
  14502. CLFSUSER_API
  14503. NTSTATUS
  14504. ClfsMgmtHandleLogFileFull(
  14505. CLFS_MGMT_CLIENT Client);
  14506. CLFSUSER_API
  14507. NTSTATUS
  14508. ClfsMgmtInstallPolicy(
  14509. PLOG_FILE_OBJECT LogFile,
  14510. PCLFS_MGMT_POLICY Policy,
  14511. ULONG PolicyLength);
  14512. CLFSUSER_API
  14513. NTSTATUS
  14514. ClfsMgmtQueryPolicy(
  14515. PLOG_FILE_OBJECT LogFile,
  14516. CLFS_MGMT_POLICY_TYPE PolicyType,
  14517. PCLFS_MGMT_POLICY Policy,
  14518. PULONG PolicyLength);
  14519. CLFSUSER_API
  14520. NTSTATUS
  14521. ClfsMgmtRemovePolicy(
  14522. PLOG_FILE_OBJECT LogFile,
  14523. CLFS_MGMT_POLICY_TYPE PolicyType);
  14524. CLFSUSER_API
  14525. NTSTATUS
  14526. ClfsMgmtSetLogFileSize(
  14527. PLOG_FILE_OBJECT LogFile,
  14528. PULONGLONG NewSizeInContainers,
  14529. PULONGLONG ResultingSizeInContainers,
  14530. PCLFS_SET_LOG_SIZE_COMPLETE_CALLBACK CompletionRoutine,
  14531. PVOID CompletionRoutineData);
  14532. #endif
  14533. #if NTDDI_VERSION >= NTDDI_VISTA || _WIN32_WINNT >= _WIN32_WINNT_VISTA
  14534. CLFSUSER_API
  14535. NTSTATUS
  14536. ClfsMgmtSetLogFileSizeAsClient(
  14537. PLOG_FILE_OBJECT LogFile,
  14538. PCLFS_MGMT_CLIENT ClientCookie,
  14539. PULONGLONG NewSizeInContainers,
  14540. PULONGLONG ResultingSizeInContainers,
  14541. PCLFS_SET_LOG_SIZE_COMPLETE_CALLBACK CompletionRoutine,
  14542. PVOID CompletionRoutineData);
  14543. #endif
  14544. #ifndef __CLFSPROC_H__
  14545. #define __CLFSPROC_H__
  14546. #if NTDDI_VERSION >= NTDDI_WS03SP1
  14547. CLFSUSER_API NTSTATUS ClfsInitialize(void);
  14548. CLFSUSER_API void ClfsFinalize(void);
  14549. CLFSUSER_API
  14550. NTSTATUS
  14551. ClfsCreateLogFile(
  14552. PPLOG_FILE_OBJECT pplfoLog,
  14553. PUNICODE_STRING puszLogFileName,
  14554. ACCESS_MASK fDesiredAccess,
  14555. ULONG dwShareMode,
  14556. PSECURITY_DESCRIPTOR psdLogFile,
  14557. ULONG fCreateDisposition,
  14558. ULONG fCreateOptions,
  14559. ULONG fFlagsAndAttributes,
  14560. ULONG fLogOptionFlag,
  14561. PVOID pvContext,
  14562. ULONG cbContext);
  14563. CLFSUSER_API
  14564. NTSTATUS
  14565. ClfsDeleteLogByPointer(
  14566. PLOG_FILE_OBJECT plfoLog);
  14567. CLFSUSER_API
  14568. NTSTATUS
  14569. ClfsDeleteLogFile(
  14570. PUNICODE_STRING puszLogFileName,
  14571. PVOID pvReserved,
  14572. ULONG fLogOptionFlag,
  14573. PVOID pvContext,
  14574. ULONG cbContext);
  14575. CLFSUSER_API
  14576. NTSTATUS
  14577. ClfsAddLogContainer(
  14578. PLOG_FILE_OBJECT plfoLog,
  14579. PULONGLONG pcbContainer,
  14580. PUNICODE_STRING puszContainerPath);
  14581. CLFSUSER_API
  14582. NTSTATUS
  14583. ClfsAddLogContainerSet(
  14584. PLOG_FILE_OBJECT plfoLog,
  14585. USHORT cContainers,
  14586. PULONGLONG pcbContainer,
  14587. PUNICODE_STRING rguszContainerPath);
  14588. CLFSUSER_API
  14589. NTSTATUS
  14590. ClfsRemoveLogContainer(
  14591. PLOG_FILE_OBJECT plfoLog,
  14592. PUNICODE_STRING puszContainerPath,
  14593. BOOLEAN fForce);
  14594. CLFSUSER_API
  14595. NTSTATUS
  14596. ClfsRemoveLogContainerSet(
  14597. PLOG_FILE_OBJECT plfoLog,
  14598. USHORT cContainers,
  14599. PUNICODE_STRING rgwszContainerPath,
  14600. BOOLEAN fForce);
  14601. CLFSUSER_API
  14602. NTSTATUS
  14603. ClfsSetArchiveTail(
  14604. PLOG_FILE_OBJECT plfoLog,
  14605. PCLFS_LSN plsnArchiveTail);
  14606. CLFSUSER_API
  14607. NTSTATUS
  14608. ClfsSetEndOfLog(
  14609. PLOG_FILE_OBJECT plfoLog,
  14610. PCLFS_LSN plsnEnd);
  14611. CLFSUSER_API
  14612. NTSTATUS
  14613. ClfsCreateScanContext(
  14614. PLOG_FILE_OBJECT plfoLog,
  14615. ULONG cFromContainer,
  14616. ULONG cContainers,
  14617. CLFS_SCAN_MODE eScanMode,
  14618. PCLFS_SCAN_CONTEXT pcxScan);
  14619. CLFSUSER_API
  14620. NTSTATUS
  14621. ClfsScanLogContainers(
  14622. PCLFS_SCAN_CONTEXT pcxScan,
  14623. CLFS_SCAN_MODE eScanMode);
  14624. CLFSUSER_API
  14625. NTSTATUS
  14626. ClfsGetContainerName(
  14627. PLOG_FILE_OBJECT plfoLog,
  14628. CLFS_CONTAINER_ID cidLogicalContainer,
  14629. PUNICODE_STRING puszContainerName,
  14630. PULONG pcActualLenContainerName);
  14631. CLFSUSER_API
  14632. NTSTATUS
  14633. ClfsGetLogFileInformation(
  14634. PLOG_FILE_OBJECT plfoLog,
  14635. PCLFS_INFORMATION pinfoBuffer,
  14636. PULONG pcbInfoBuffer);
  14637. CLFSUSER_API
  14638. NTSTATUS
  14639. ClfsSetLogFileInformation(
  14640. PLOG_FILE_OBJECT plfoLog,
  14641. CLFS_LOG_INFORMATION_CLASS eInformationClass,
  14642. PVOID pinfoBuffer,
  14643. ULONG cbBuffer);
  14644. CLFSUSER_API
  14645. NTSTATUS
  14646. ClfsReadRestartArea(
  14647. PVOID pvMarshalContext,
  14648. PVOID* ppvRestartBuffer,
  14649. PULONG pcbRestartBuffer,
  14650. PCLFS_LSN plsn,
  14651. PVOID* ppvReadContext);
  14652. CLFSUSER_API
  14653. NTSTATUS
  14654. ClfsReadPreviousRestartArea(
  14655. PVOID pvReadContext,
  14656. PVOID* ppvRestartBuffer,
  14657. PULONG pcbRestartBuffer,
  14658. PCLFS_LSN plsnRestart);
  14659. CLFSUSER_API
  14660. NTSTATUS
  14661. ClfsWriteRestartArea(
  14662. PVOID pvMarshalContext,
  14663. PVOID pvRestartBuffer,
  14664. ULONG cbRestartBuffer,
  14665. PCLFS_LSN plsnBase,
  14666. ULONG fFlags,
  14667. PULONG pcbWritten,
  14668. PCLFS_LSN plsnNext);
  14669. CLFSUSER_API
  14670. NTSTATUS
  14671. ClfsAdvanceLogBase(
  14672. PVOID pvMarshalContext,
  14673. PCLFS_LSN plsnBase,
  14674. ULONG fFlags);
  14675. CLFSUSER_API
  14676. NTSTATUS
  14677. ClfsCloseAndResetLogFile(
  14678. PLOG_FILE_OBJECT plfoLog);
  14679. CLFSUSER_API
  14680. NTSTATUS
  14681. ClfsCloseLogFileObject(
  14682. PLOG_FILE_OBJECT plfoLog);
  14683. CLFSUSER_API
  14684. NTSTATUS
  14685. ClfsCreateMarshallingArea(
  14686. PLOG_FILE_OBJECT plfoLog,
  14687. POOL_TYPE ePoolType,
  14688. PALLOCATE_FUNCTION pfnAllocBuffer,
  14689. PFREE_FUNCTION pfnFreeBuffer,
  14690. ULONG cbMarshallingBuffer,
  14691. ULONG cMaxWriteBuffers,
  14692. ULONG cMaxReadBuffers,
  14693. PVOID* ppvMarshalContext);
  14694. CLFSUSER_API
  14695. NTSTATUS
  14696. ClfsDeleteMarshallingArea(
  14697. PVOID pvMarshalContext);
  14698. CLFSUSER_API
  14699. NTSTATUS
  14700. ClfsReserveAndAppendLog(
  14701. PVOID pvMarshalContext,
  14702. PCLFS_WRITE_ENTRY rgWriteEntries,
  14703. ULONG cWriteEntries,
  14704. PCLFS_LSN plsnUndoNext,
  14705. PCLFS_LSN plsnPrevious,
  14706. ULONG cReserveRecords,
  14707. PLONGLONG rgcbReservation,
  14708. ULONG fFlags,
  14709. PCLFS_LSN plsn);
  14710. CLFSUSER_API
  14711. NTSTATUS
  14712. ClfsReserveAndAppendLogAligned(
  14713. PVOID pvMarshalContext,
  14714. PCLFS_WRITE_ENTRY rgWriteEntries,
  14715. ULONG cWriteEntries,
  14716. ULONG cbEntryAlignment,
  14717. PCLFS_LSN plsnUndoNext,
  14718. PCLFS_LSN plsnPrevious,
  14719. ULONG cReserveRecords,
  14720. PLONGLONG rgcbReservation,
  14721. ULONG fFlags,
  14722. PCLFS_LSN plsn);
  14723. CLFSUSER_API
  14724. NTSTATUS
  14725. ClfsAlignReservedLog(
  14726. PVOID pvMarshalContext,
  14727. ULONG cRecords,
  14728. LONGLONG rgcbReservation[],
  14729. PLONGLONG pcbAlignReservation);
  14730. CLFSUSER_API
  14731. NTSTATUS
  14732. ClfsAllocReservedLog(
  14733. PVOID pvMarshalContext,
  14734. ULONG cRecords,
  14735. PLONGLONG pcbAdjustment);
  14736. CLFSUSER_API
  14737. NTSTATUS
  14738. ClfsFreeReservedLog(
  14739. PVOID pvMarshalContext,
  14740. ULONG cRecords,
  14741. PLONGLONG pcbAdjustment);
  14742. CLFSUSER_API
  14743. NTSTATUS
  14744. ClfsFlushBuffers(
  14745. PVOID pvMarshalContext);
  14746. CLFSUSER_API
  14747. NTSTATUS
  14748. ClfsFlushToLsn(
  14749. PVOID pvMarshalContext,
  14750. PCLFS_LSN plsnFlush,
  14751. PCLFS_LSN plsnLastFlushed);
  14752. CLFSUSER_API
  14753. NTSTATUS
  14754. ClfsReadLogRecord(
  14755. PVOID pvMarshalContext,
  14756. PCLFS_LSN plsnFirst,
  14757. CLFS_CONTEXT_MODE peContextMode,
  14758. PVOID* ppvReadBuffer,
  14759. PULONG pcbReadBuffer,
  14760. PCLFS_RECORD_TYPE peRecordType,
  14761. PCLFS_LSN plsnUndoNext,
  14762. PCLFS_LSN plsnPrevious,
  14763. PVOID* ppvReadContext);
  14764. CLFSUSER_API
  14765. NTSTATUS
  14766. ClfsReadNextLogRecord(
  14767. PVOID pvReadContext,
  14768. PVOID* ppvBuffer,
  14769. PULONG pcbBuffer,
  14770. PCLFS_RECORD_TYPE peRecordType,
  14771. PCLFS_LSN plsnUser,
  14772. PCLFS_LSN plsnUndoNext,
  14773. PCLFS_LSN plsnPrevious,
  14774. PCLFS_LSN plsnRecord);
  14775. CLFSUSER_API
  14776. NTSTATUS
  14777. ClfsTerminateReadLog(
  14778. PVOID pvCursorContext);
  14779. CLFSUSER_API
  14780. NTSTATUS
  14781. ClfsGetLastLsn(
  14782. PLOG_FILE_OBJECT plfoLog,
  14783. PCLFS_LSN plsnLast);
  14784. CLFSUSER_API
  14785. NTSTATUS
  14786. ClfsGetIoStatistics(
  14787. PLOG_FILE_OBJECT plfoLog,
  14788. PVOID pvStatsBuffer,
  14789. ULONG cbStatsBuffer,
  14790. CLFS_IOSTATS_CLASS eStatsClass,
  14791. PULONG pcbStatsWritten);
  14792. CLFSUSER_API
  14793. CLFS_LSN
  14794. ClfsLaterLsn(
  14795. PCLFS_LSN plsn);
  14796. CLFSUSER_API
  14797. CLFS_LSN
  14798. ClfsEarlierLsn(
  14799. PCLFS_LSN plsn);
  14800. CLFSUSER_API
  14801. NTSTATUS
  14802. ClfsLsnDifference(
  14803. PCLFS_LSN plsnStart,
  14804. PCLFS_LSN plsnFinish,
  14805. ULONG cbContainer,
  14806. ULONG cbMaxBlock,
  14807. PLONGLONG pcbDifference);
  14808. #endif
  14809. #if NTDDI_VERSION >= NTDDI_VISTA
  14810. CLFSUSER_API
  14811. BOOLEAN
  14812. ClfsValidTopLevelContext(
  14813. PIRP pirpTopLevelContext);
  14814. CLFSUSER_API
  14815. NTSTATUS
  14816. ClfsQueryLogFileInformation(
  14817. PLOG_FILE_OBJECT plfoLog,
  14818. CLFS_LOG_INFORMATION_CLASS eInformationClass,
  14819. PVOID pinfoInputBuffer,
  14820. ULONG cbinfoInputBuffer,
  14821. PVOID pinfoBuffer,
  14822. PULONG pcbInfoBuffer);
  14823. #endif
  14824. #if NTDDI_VERSION >= NTDDI_WIN8
  14825. CLFSUSER_API
  14826. NTSTATUS
  14827. ClfsCreateMarshallingAreaEx(
  14828. PLOG_FILE_OBJECT plfoLog,
  14829. POOL_TYPE ePoolType,
  14830. PALLOCATE_FUNCTION pfnAllocBuffer,
  14831. PFREE_FUNCTION pfnFreeBuffer,
  14832. ULONG cbMarshallingBuffer,
  14833. ULONG cMaxWriteBuffers,
  14834. ULONG cMaxReadBuffers,
  14835. ULONG cAlignmentSize,
  14836. ULONGLONG fFlags,
  14837. PVOID* ppvMarshalContext);
  14838. #endif
  14839. #endif /* __CLFSPROC_H__ */
  14840. #ifdef __cplusplus
  14841. }
  14842. #endif
  14843. #endif /* !_WDMDDK_ */