WinNT.h 289 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791
  1. /*++ BUILD Version: 0082 Increment this if a change has global effects
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. winnt.h
  5. Abstract:
  6. This module defines the 32-Bit Windows types and constants that are
  7. defined by NT, but exposed through the Win32 API.
  8. Revision History:
  9. --*/
  10. #ifndef _WINNT_
  11. #define _WINNT_
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. #include <ctype.h>
  16. #define ANYSIZE_ARRAY 1
  17. #include <specstrings.h>
  18. #if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)
  19. #define RESTRICTED_POINTER __restrict
  20. #else
  21. #define RESTRICTED_POINTER
  22. #endif
  23. #if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64)
  24. #define UNALIGNED __unaligned
  25. #if defined(_WIN64)
  26. #define UNALIGNED64 __unaligned
  27. #else
  28. #define UNALIGNED64
  29. #endif
  30. #else
  31. #define UNALIGNED
  32. #define UNALIGNED64
  33. #endif
  34. #if defined(_WIN64) || defined(_M_ALPHA)
  35. #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
  36. #define MEMORY_ALLOCATION_ALIGNMENT 16
  37. #else
  38. #define MAX_NATURAL_ALIGNMENT sizeof(DWORD)
  39. #define MEMORY_ALLOCATION_ALIGNMENT 8
  40. #endif
  41. //
  42. // TYPE_ALIGNMENT will return the alignment requirements of a given type for
  43. // the current platform.
  44. //
  45. #ifdef __cplusplus
  46. #if _MSC_VER >= 1300
  47. #define TYPE_ALIGNMENT( t ) __alignof(t)
  48. #endif
  49. #else
  50. #define TYPE_ALIGNMENT( t ) \
  51. FIELD_OFFSET( struct { char x; t test; }, test )
  52. #endif
  53. #if defined(_WIN64)
  54. #define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
  55. TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))
  56. #define PROBE_ALIGNMENT32( _s ) TYPE_ALIGNMENT( DWORD )
  57. #else
  58. #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
  59. #endif
  60. //
  61. // C_ASSERT() can be used to perform many compile-time assertions:
  62. // type sizes, field offsets, etc.
  63. //
  64. // An assertion failure results in error C2118: negative subscript.
  65. //
  66. #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
  67. #if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
  68. #define POINTER_64 __ptr64
  69. typedef unsigned __int64 POINTER_64_INT;
  70. #if defined(_WIN64)
  71. #define POINTER_32 __ptr32
  72. #else
  73. #define POINTER_32
  74. #endif
  75. #else
  76. #if defined(_MAC) && defined(_MAC_INT_64)
  77. #define POINTER_64 __ptr64
  78. typedef unsigned __int64 POINTER_64_INT;
  79. #else
  80. #define POINTER_64
  81. typedef unsigned long POINTER_64_INT;
  82. #endif
  83. #define POINTER_32
  84. #endif
  85. #if defined(_IA64_) || defined(_AMD64_)
  86. #define FIRMWARE_PTR
  87. #else
  88. #define FIRMWARE_PTR POINTER_32
  89. #endif
  90. #include <basetsd.h>
  91. #if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)
  92. #define DECLSPEC_IMPORT __declspec(dllimport)
  93. #else
  94. #define DECLSPEC_IMPORT
  95. #endif
  96. #ifndef DECLSPEC_NORETURN
  97. #if (_MSC_VER >= 1200) && !defined(MIDL_PASS)
  98. #define DECLSPEC_NORETURN __declspec(noreturn)
  99. #else
  100. #define DECLSPEC_NORETURN
  101. #endif
  102. #endif
  103. #ifndef DECLSPEC_ALIGN
  104. #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
  105. #define DECLSPEC_ALIGN(x) __declspec(align(x))
  106. #else
  107. #define DECLSPEC_ALIGN(x)
  108. #endif
  109. #endif
  110. #ifndef DECLSPEC_CACHEALIGN
  111. #define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(128)
  112. #endif
  113. #ifndef DECLSPEC_UUID
  114. #if (_MSC_VER >= 1100) && defined (__cplusplus)
  115. #define DECLSPEC_UUID(x) __declspec(uuid(x))
  116. #else
  117. #define DECLSPEC_UUID(x)
  118. #endif
  119. #endif
  120. #ifndef DECLSPEC_NOVTABLE
  121. #if (_MSC_VER >= 1100) && defined(__cplusplus)
  122. #define DECLSPEC_NOVTABLE __declspec(novtable)
  123. #else
  124. #define DECLSPEC_NOVTABLE
  125. #endif
  126. #endif
  127. #ifndef DECLSPEC_SELECTANY
  128. #if (_MSC_VER >= 1100)
  129. #define DECLSPEC_SELECTANY __declspec(selectany)
  130. #else
  131. #define DECLSPEC_SELECTANY
  132. #endif
  133. #endif
  134. #ifndef NOP_FUNCTION
  135. #if (_MSC_VER >= 1210)
  136. #define NOP_FUNCTION __noop
  137. #else
  138. #define NOP_FUNCTION (void)0
  139. #endif
  140. #endif
  141. #ifndef DECLSPEC_ADDRSAFE
  142. #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
  143. #define DECLSPEC_ADDRSAFE __declspec(address_safe)
  144. #else
  145. #define DECLSPEC_ADDRSAFE
  146. #endif
  147. #endif
  148. #ifndef FORCEINLINE
  149. #if (_MSC_VER >= 1200)
  150. #define FORCEINLINE __forceinline
  151. #else
  152. #define FORCEINLINE __inline
  153. #endif
  154. #endif
  155. #ifndef DECLSPEC_DEPRECATED
  156. #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
  157. #define DECLSPEC_DEPRECATED __declspec(deprecated)
  158. #define DEPRECATE_SUPPORTED
  159. #else
  160. #define DECLSPEC_DEPRECATED
  161. #undef DEPRECATE_SUPPORTED
  162. #endif
  163. #endif
  164. typedef void *PVOID;
  165. typedef void * POINTER_64 PVOID64;
  166. #if ((_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)) && !defined(_M_AMD64)
  167. #define NTAPI __stdcall
  168. #else
  169. #define _cdecl
  170. #define NTAPI
  171. #endif
  172. //
  173. // Define API decoration for direct importing system DLL references.
  174. //
  175. #if !defined(_NTSYSTEM_)
  176. #define NTSYSAPI DECLSPEC_IMPORT
  177. #define NTSYSCALLAPI DECLSPEC_IMPORT
  178. #else
  179. #define NTSYSAPI
  180. #if defined(_NTDLLBUILD_)
  181. #define NTSYSCALLAPI
  182. #else
  183. #define NTSYSCALLAPI DECLSPEC_ADDRSAFE
  184. #endif
  185. #endif
  186. //
  187. // Basics
  188. //
  189. #ifndef VOID
  190. #define VOID void
  191. typedef char CHAR;
  192. typedef short SHORT;
  193. typedef long LONG;
  194. #endif
  195. //
  196. // UNICODE (Wide Character) types
  197. //
  198. #ifndef _MAC
  199. typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
  200. #else
  201. // some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
  202. typedef unsigned short WCHAR; // wc, 16-bit UNICODE character
  203. #endif
  204. typedef WCHAR *PWCHAR;
  205. typedef WCHAR *LPWCH, *PWCH;
  206. typedef CONST WCHAR *LPCWCH, *PCWCH;
  207. typedef WCHAR *NWPSTR;
  208. typedef WCHAR *LPWSTR, *PWSTR;
  209. typedef WCHAR UNALIGNED *LPUWSTR, *PUWSTR;
  210. typedef CONST WCHAR *LPCWSTR, *PCWSTR;
  211. typedef CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR;
  212. //
  213. // ANSI (Multi-byte Character) types
  214. //
  215. typedef CHAR *PCHAR;
  216. typedef CHAR *LPCH, *PCH;
  217. typedef CONST CHAR *LPCCH, *PCCH;
  218. typedef CHAR *NPSTR;
  219. typedef CHAR *LPSTR, *PSTR;
  220. typedef CONST CHAR *LPCSTR, *PCSTR;
  221. //
  222. // Neutral ANSI/UNICODE types and macros
  223. //
  224. #ifdef UNICODE // r_winnt
  225. #ifndef _TCHAR_DEFINED
  226. typedef WCHAR TCHAR, *PTCHAR;
  227. typedef WCHAR TBYTE , *PTBYTE ;
  228. #define _TCHAR_DEFINED
  229. #endif /* !_TCHAR_DEFINED */
  230. typedef LPWSTR LPTCH, PTCH;
  231. typedef LPWSTR PTSTR, LPTSTR;
  232. typedef LPCWSTR PCTSTR, LPCTSTR;
  233. typedef LPUWSTR PUTSTR, LPUTSTR;
  234. typedef LPCUWSTR PCUTSTR, LPCUTSTR;
  235. typedef LPWSTR LP;
  236. #define __TEXT(quote) L##quote // r_winnt
  237. #else /* UNICODE */ // r_winnt
  238. #ifndef _TCHAR_DEFINED
  239. typedef char TCHAR, *PTCHAR;
  240. typedef unsigned char TBYTE , *PTBYTE ;
  241. #define _TCHAR_DEFINED
  242. #endif /* !_TCHAR_DEFINED */
  243. typedef LPSTR LPTCH, PTCH;
  244. typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
  245. typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
  246. #define __TEXT(quote) quote // r_winnt
  247. #endif /* UNICODE */ // r_winnt
  248. #define TEXT(quote) __TEXT(quote) // r_winnt
  249. typedef SHORT *PSHORT;
  250. typedef LONG *PLONG;
  251. #ifdef STRICT
  252. typedef void *HANDLE;
  253. #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
  254. #else
  255. typedef PVOID HANDLE;
  256. #define DECLARE_HANDLE(name) typedef HANDLE name
  257. #endif
  258. typedef HANDLE *PHANDLE;
  259. //
  260. // Flag (bit) fields
  261. //
  262. typedef BYTE FCHAR;
  263. typedef WORD FSHORT;
  264. typedef DWORD FLONG;
  265. // Component Object Model defines, and macros
  266. #ifndef _HRESULT_DEFINED
  267. #define _HRESULT_DEFINED
  268. typedef LONG HRESULT;
  269. #endif // !_HRESULT_DEFINED
  270. #ifdef __cplusplus
  271. #define EXTERN_C extern "C"
  272. #else
  273. #define EXTERN_C extern
  274. #endif
  275. #if defined(_WIN32) || defined(_MPPC_)
  276. // Win32 doesn't support __export
  277. #ifdef _68K_
  278. #define STDMETHODCALLTYPE __cdecl
  279. #else
  280. #define STDMETHODCALLTYPE __stdcall
  281. #endif
  282. #define STDMETHODVCALLTYPE __cdecl
  283. #define STDAPICALLTYPE __stdcall
  284. #define STDAPIVCALLTYPE __cdecl
  285. #else
  286. #define STDMETHODCALLTYPE __export __stdcall
  287. #define STDMETHODVCALLTYPE __export __cdecl
  288. #define STDAPICALLTYPE __export __stdcall
  289. #define STDAPIVCALLTYPE __export __cdecl
  290. #endif
  291. #define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
  292. #define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
  293. #define STDMETHODIMP HRESULT STDMETHODCALLTYPE
  294. #define STDMETHODIMP_(type) type STDMETHODCALLTYPE
  295. // The 'V' versions allow Variable Argument lists.
  296. #define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
  297. #define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE
  298. #define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
  299. #define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
  300. typedef char CCHAR;
  301. typedef DWORD LCID;
  302. typedef PDWORD PLCID;
  303. typedef WORD LANGID;
  304. #define APPLICATION_ERROR_MASK 0x20000000
  305. #define ERROR_SEVERITY_SUCCESS 0x00000000
  306. #define ERROR_SEVERITY_INFORMATIONAL 0x40000000
  307. #define ERROR_SEVERITY_WARNING 0x80000000
  308. #define ERROR_SEVERITY_ERROR 0xC0000000
  309. //
  310. // _M_IX86 included so that EM CONTEXT structure compiles with
  311. // x86 programs. *** TBD should this be for all architectures?
  312. //
  313. //
  314. // 16 byte aligned type for 128 bit floats
  315. //
  316. //
  317. // For we define a 128 bit structure and use __declspec(align(16)) pragma to
  318. // align to 128 bits.
  319. //
  320. #if defined(_M_IA64) && !defined(MIDL_PASS)
  321. __declspec(align(16))
  322. #endif
  323. typedef struct _FLOAT128 {
  324. __int64 LowPart;
  325. __int64 HighPart;
  326. } FLOAT128;
  327. typedef FLOAT128 *PFLOAT128;
  328. //
  329. // __int64 is only supported by 2.0 and later midl.
  330. // __midl is set by the 2.0 midl and not by 1.0 midl.
  331. //
  332. #define _ULONGLONG_
  333. #if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
  334. typedef __int64 LONGLONG;
  335. typedef unsigned __int64 ULONGLONG;
  336. #define MAXLONGLONG (0x7fffffffffffffff)
  337. #else
  338. #if defined(_MAC) && defined(_MAC_INT_64)
  339. typedef __int64 LONGLONG;
  340. typedef unsigned __int64 ULONGLONG;
  341. #define MAXLONGLONG (0x7fffffffffffffff)
  342. #else
  343. typedef double LONGLONG;
  344. typedef double ULONGLONG;
  345. #endif //_MAC and int64
  346. #endif
  347. typedef LONGLONG *PLONGLONG;
  348. typedef ULONGLONG *PULONGLONG;
  349. // Update Sequence Number
  350. typedef LONGLONG USN;
  351. #if defined(MIDL_PASS)
  352. typedef struct _LARGE_INTEGER {
  353. #else // MIDL_PASS
  354. typedef union _LARGE_INTEGER {
  355. struct {
  356. DWORD LowPart;
  357. LONG HighPart;
  358. };
  359. struct {
  360. DWORD LowPart;
  361. LONG HighPart;
  362. } u;
  363. #endif //MIDL_PASS
  364. LONGLONG QuadPart;
  365. } LARGE_INTEGER;
  366. typedef LARGE_INTEGER *PLARGE_INTEGER;
  367. #if defined(MIDL_PASS)
  368. typedef struct _ULARGE_INTEGER {
  369. #else // MIDL_PASS
  370. typedef union _ULARGE_INTEGER {
  371. struct {
  372. DWORD LowPart;
  373. DWORD HighPart;
  374. };
  375. struct {
  376. DWORD LowPart;
  377. DWORD HighPart;
  378. } u;
  379. #endif //MIDL_PASS
  380. ULONGLONG QuadPart;
  381. } ULARGE_INTEGER;
  382. typedef ULARGE_INTEGER *PULARGE_INTEGER;
  383. // end_ntminiport end_ntndis end_ntminitape
  384. //
  385. // Locally Unique Identifier
  386. //
  387. typedef struct _LUID {
  388. DWORD LowPart;
  389. LONG HighPart;
  390. } LUID, *PLUID;
  391. #define _DWORDLONG_
  392. typedef ULONGLONG DWORDLONG;
  393. typedef DWORDLONG *PDWORDLONG;
  394. //
  395. // Define operations to logically shift an int64 by 0..31 bits and to multiply
  396. // 32-bits by 32-bits to form a 64-bit product.
  397. //
  398. #if defined(MIDL_PASS) || defined(RC_INVOKED)
  399. //
  400. // Midl does not understand inline assembler. Therefore, the Rtl functions
  401. // are used for shifts by 0.31 and multiplies of 32-bits times 32-bits to
  402. // form a 64-bit product.
  403. //
  404. #define Int32x32To64(a, b) ((LONGLONG)((LONG)(a)) * (LONGLONG)((LONG)(b)))
  405. #define UInt32x32To64(a, b) ((ULONGLONG)((DWORD)(a)) * (ULONGLONG)((DWORD)(b)))
  406. #define Int64ShllMod32(a, b) ((ULONGLONG)(a) << (b))
  407. #define Int64ShraMod32(a, b) ((LONGLONG)(a) >> (b))
  408. #define Int64ShrlMod32(a, b) ((ULONGLONG)(a) >> (b))
  409. #elif defined(_M_MRX000)
  410. //
  411. // MIPS uses intrinsic functions to perform shifts by 0..31 and multiplies of
  412. // 32-bits times 32-bits to 64-bits.
  413. //
  414. #define Int32x32To64 __emul
  415. #define UInt32x32To64 __emulu
  416. #define Int64ShllMod32 __ll_lshift
  417. #define Int64ShraMod32 __ll_rshift
  418. #define Int64ShrlMod32 __ull_rshift
  419. #if defined (__cplusplus)
  420. extern "C" {
  421. #endif
  422. LONGLONG
  423. NTAPI
  424. Int32x32To64 (
  425. LONG Multiplier,
  426. LONG Multiplicand
  427. );
  428. ULONGLONG
  429. NTAPI
  430. UInt32x32To64 (
  431. DWORD Multiplier,
  432. DWORD Multiplicand
  433. );
  434. ULONGLONG
  435. NTAPI
  436. Int64ShllMod32 (
  437. ULONGLONG Value,
  438. DWORD ShiftCount
  439. );
  440. LONGLONG
  441. NTAPI
  442. Int64ShraMod32 (
  443. LONGLONG Value,
  444. DWORD ShiftCount
  445. );
  446. ULONGLONG
  447. NTAPI
  448. Int64ShrlMod32 (
  449. ULONGLONG Value,
  450. DWORD ShiftCount
  451. );
  452. #if defined (__cplusplus)
  453. };
  454. #endif
  455. #pragma intrinsic(__emul)
  456. #pragma intrinsic(__emulu)
  457. #pragma intrinsic(__ll_lshift)
  458. #pragma intrinsic(__ll_rshift)
  459. #pragma intrinsic(__ull_rshift)
  460. #elif defined(_M_IX86)
  461. //
  462. // The x86 C compiler understands inline assembler. Therefore, inline functions
  463. // that employ inline assembler are used for shifts of 0..31. The multiplies
  464. // rely on the compiler recognizing the cast of the multiplicand to int64 to
  465. // generate the optimal code inline.
  466. //
  467. #define Int32x32To64( a, b ) (LONGLONG)((LONGLONG)(LONG)(a) * (LONG)(b))
  468. #define UInt32x32To64( a, b ) (ULONGLONG)((ULONGLONG)(DWORD)(a) * (DWORD)(b))
  469. ULONGLONG
  470. NTAPI
  471. Int64ShllMod32 (
  472. ULONGLONG Value,
  473. DWORD ShiftCount
  474. );
  475. LONGLONG
  476. NTAPI
  477. Int64ShraMod32 (
  478. LONGLONG Value,
  479. DWORD ShiftCount
  480. );
  481. ULONGLONG
  482. NTAPI
  483. Int64ShrlMod32 (
  484. ULONGLONG Value,
  485. DWORD ShiftCount
  486. );
  487. #if _MSC_VER >= 1200
  488. #pragma warning(push)
  489. #endif
  490. #pragma warning(disable:4035) // re-enable below
  491. __inline ULONGLONG
  492. NTAPI
  493. Int64ShllMod32 (
  494. ULONGLONG Value,
  495. DWORD ShiftCount
  496. )
  497. {
  498. __asm {
  499. mov ecx, ShiftCount
  500. mov eax, dword ptr [Value]
  501. mov edx, dword ptr [Value+4]
  502. shld edx, eax, cl
  503. shl eax, cl
  504. }
  505. }
  506. __inline LONGLONG
  507. NTAPI
  508. Int64ShraMod32 (
  509. LONGLONG Value,
  510. DWORD ShiftCount
  511. )
  512. {
  513. __asm {
  514. mov ecx, ShiftCount
  515. mov eax, dword ptr [Value]
  516. mov edx, dword ptr [Value+4]
  517. shrd eax, edx, cl
  518. sar edx, cl
  519. }
  520. }
  521. __inline ULONGLONG
  522. NTAPI
  523. Int64ShrlMod32 (
  524. ULONGLONG Value,
  525. DWORD ShiftCount
  526. )
  527. {
  528. __asm {
  529. mov ecx, ShiftCount
  530. mov eax, dword ptr [Value]
  531. mov edx, dword ptr [Value+4]
  532. shrd eax, edx, cl
  533. shr edx, cl
  534. }
  535. }
  536. #if _MSC_VER >= 1200
  537. #pragma warning(pop)
  538. #else
  539. #pragma warning(default:4035)
  540. #endif
  541. #elif defined(_M_ALPHA)
  542. //
  543. // Alpha has native 64-bit operations that are just as fast as their 32-bit
  544. // counter parts. Therefore, the int64 data type is used directly to form
  545. // shifts of 0..31 and multiplies of 32-bits times 32-bits to form a 64-bit
  546. // product.
  547. //
  548. #define Int32x32To64(a, b) ((LONGLONG)((LONG)(a)) * (LONGLONG)((LONG)(b)))
  549. #define UInt32x32To64(a, b) ((ULONGLONG)((DWORD)(a)) * (ULONGLONG)((DWORD)(b)))
  550. #define Int64ShllMod32(a, b) ((ULONGLONG)(a) << (b))
  551. #define Int64ShraMod32(a, b) ((LONGLONG)(a) >> (b))
  552. #define Int64ShrlMod32(a, b) ((ULONGLONG)(a) >> (b))
  553. #elif defined(_M_PPC)
  554. #define Int32x32To64(a, b) ((LONGLONG)((LONG)(a)) * (LONGLONG)((LONG)(b)))
  555. #define UInt32x32To64(a, b) ((ULONGLONG)((DWORD)(a)) * (ULONGLONG)((DWORD)(b)))
  556. #define Int64ShllMod32(a, b) ((ULONGLONG)(a) << (b))
  557. #define Int64ShraMod32(a, b) ((LONGLONG)(a) >> (b))
  558. #define Int64ShrlMod32(a, b) ((ULONGLONG)(a) >> (b))
  559. #elif defined(_68K_) || defined(_MPPC_)
  560. //
  561. // The Macintosh 68K and PowerPC compilers do not currently support int64.
  562. //
  563. #define Int32x32To64(a, b) ((LONGLONG)((LONG)(a)) * (LONGLONG)((LONG)(b)))
  564. #define UInt32x32To64(a, b) ((DWORDLONG)((DWORD)(a)) * (DWORDLONG)((DWORD)(b)))
  565. #define Int64ShllMod32(a, b) ((DWORDLONG)(a) << (b))
  566. #define Int64ShraMod32(a, b) ((LONGLONG)(a) >> (b))
  567. #define Int64ShrlMod32(a, b) ((DWORDLONG)(a) >> (b))
  568. #elif defined(_M_IA64) || defined(_M_AMD64)
  569. //
  570. // IA64 has native 64-bit operations that are just as fast as their 32-bit
  571. // counter parts. Therefore, the int64 data type is used directly to form
  572. // shifts of 0..31 and multiplies of 32-bits times 32-bits to form a 64-bit
  573. // product.
  574. //
  575. #define Int32x32To64(a, b) ((LONGLONG)((LONG)(a)) * (LONGLONG)((LONG)(b)))
  576. #define UInt32x32To64(a, b) ((ULONGLONG)((DWORD)(a)) * (ULONGLONG)((DWORD)(b)))
  577. #define Int64ShllMod32(a, b) ((ULONGLONG)(a) << (b))
  578. #define Int64ShraMod32(a, b) ((LONGLONG)(a) >> (b))
  579. #define Int64ShrlMod32(a, b) ((ULONGLONG)(a) >> (b))
  580. #else
  581. #error Must define a target architecture.
  582. #endif
  583. #define ANSI_NULL ((CHAR)0)
  584. #define UNICODE_NULL ((WCHAR)0)
  585. #define UNICODE_STRING_MAX_BYTES ((WORD ) 65534)
  586. #define UNICODE_STRING_MAX_CHARS (32767)
  587. typedef BYTE BOOLEAN;
  588. typedef BOOLEAN *PBOOLEAN;
  589. //
  590. // Doubly linked list structure. Can be used as either a list head, or
  591. // as link words.
  592. //
  593. typedef struct _LIST_ENTRY {
  594. struct _LIST_ENTRY *Flink;
  595. struct _LIST_ENTRY *Blink;
  596. } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
  597. //
  598. // Singly linked list structure. Can be used as either a list head, or
  599. // as link words.
  600. //
  601. typedef struct _SINGLE_LIST_ENTRY {
  602. struct _SINGLE_LIST_ENTRY *Next;
  603. } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
  604. //
  605. // These are needed for portable debugger support.
  606. //
  607. typedef struct LIST_ENTRY32 {
  608. DWORD Flink;
  609. DWORD Blink;
  610. } LIST_ENTRY32;
  611. typedef LIST_ENTRY32 *PLIST_ENTRY32;
  612. typedef struct LIST_ENTRY64 {
  613. ULONGLONG Flink;
  614. ULONGLONG Blink;
  615. } LIST_ENTRY64;
  616. typedef LIST_ENTRY64 *PLIST_ENTRY64;
  617. #include <guiddef.h>
  618. #ifndef __OBJECTID_DEFINED
  619. #define __OBJECTID_DEFINED
  620. typedef struct _OBJECTID { // size is 20
  621. GUID Lineage;
  622. DWORD Uniquifier;
  623. } OBJECTID;
  624. #endif // !_OBJECTID_DEFINED
  625. #define MINCHAR 0x80
  626. #define MAXCHAR 0x7f
  627. #define MINSHORT 0x8000
  628. #define MAXSHORT 0x7fff
  629. #define MINLONG 0x80000000
  630. #define MAXLONG 0x7fffffff
  631. #define MAXBYTE 0xff
  632. #define MAXWORD 0xffff
  633. #define MAXDWORD 0xffffffff
  634. //
  635. // Calculate the byte offset of a field in a structure of type type.
  636. //
  637. #define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))
  638. #if(_WIN32_WINNT > 0x0500)
  639. //
  640. // Calculate the size of a field in a structure of type type, without
  641. // knowing or stating the type of the field.
  642. //
  643. #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
  644. //
  645. // Calculate the size of a structure of type type up through and
  646. // including a field.
  647. //
  648. #define RTL_SIZEOF_THROUGH_FIELD(type, field) \
  649. (FIELD_OFFSET(type, field) + RTL_FIELD_SIZE(type, field))
  650. //
  651. // RTL_CONTAINS_FIELD usage:
  652. //
  653. // if (RTL_CONTAINS_FIELD(pBlock, pBlock->cbSize, dwMumble)) { // safe to use pBlock->dwMumble
  654. //
  655. #define RTL_CONTAINS_FIELD(Struct, Size, Field) \
  656. ( (((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)) )
  657. //
  658. // Return the number of elements in a statically sized array.
  659. // DWORD Buffer[100];
  660. // RTL_NUMBER_OF(Buffer) == 100
  661. // This is also popularly known as: NUMBER_OF, ARRSIZE, _countof, NELEM, etc.
  662. //
  663. #define RTL_NUMBER_OF(A) (sizeof(A)/sizeof((A)[0]))
  664. //
  665. // An expression that yields the type of a field in a struct.
  666. //
  667. #define RTL_FIELD_TYPE(type, field) (((type*)0)->field)
  668. // RTL_ to avoid collisions in the global namespace.
  669. //
  670. // Given typedef struct _FOO { BYTE Bar[123]; } FOO;
  671. // RTL_NUMBER_OF_FIELD(FOO, Bar) == 123
  672. //
  673. #define RTL_NUMBER_OF_FIELD(type, field) (RTL_NUMBER_OF(RTL_FIELD_TYPE(type, field)))
  674. //
  675. // eg:
  676. // typedef struct FOO {
  677. // DWORD Integer;
  678. // PVOID Pointer;
  679. // } FOO;
  680. //
  681. // RTL_PADDING_BETWEEN_FIELDS(FOO, Integer, Pointer) == 0 for Win32, 4 for Win64
  682. //
  683. #define RTL_PADDING_BETWEEN_FIELDS(T, F1, F2) \
  684. ((FIELD_OFFSET(T, F2) > FIELD_OFFSET(T, F1)) \
  685. ? (FIELD_OFFSET(T, F2) - FIELD_OFFSET(T, F1) - RTL_FIELD_SIZE(T, F1)) \
  686. : (FIELD_OFFSET(T, F1) - FIELD_OFFSET(T, F2) - RTL_FIELD_SIZE(T, F2)))
  687. // RTL_ to avoid collisions in the global namespace.
  688. #if defined(__cplusplus)
  689. #define RTL_CONST_CAST(type) const_cast<type>
  690. #else
  691. #define RTL_CONST_CAST(type) (type)
  692. #endif
  693. // like sizeof
  694. // usually this would be * CHAR_BIT, but we don't necessarily have #include <limits.h>
  695. #define RTL_BITS_OF(sizeOfArg) (sizeof(sizeOfArg) * 8)
  696. #define RTL_BITS_OF_FIELD(type, field) (RTL_BITS_OF(RTL_FIELD_TYPE(type, field)))
  697. #endif /* _WIN32_WINNT > 0x0500 */
  698. //
  699. // Calculate the address of the base of the structure given its type, and an
  700. // address of a field within the structure.
  701. //
  702. #define CONTAINING_RECORD(address, type, field) ((type *)( \
  703. (PCHAR)(address) - \
  704. (ULONG_PTR)(&((type *)0)->field)))
  705. #define VER_SERVER_NT 0x80000000
  706. #define VER_WORKSTATION_NT 0x40000000
  707. #define VER_SUITE_SMALLBUSINESS 0x00000001
  708. #define VER_SUITE_ENTERPRISE 0x00000002
  709. #define VER_SUITE_BACKOFFICE 0x00000004
  710. #define VER_SUITE_COMMUNICATIONS 0x00000008
  711. #define VER_SUITE_TERMINAL 0x00000010
  712. #define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
  713. #define VER_SUITE_EMBEDDEDNT 0x00000040
  714. #define VER_SUITE_DATACENTER 0x00000080
  715. #define VER_SUITE_SINGLEUSERTS 0x00000100
  716. #define VER_SUITE_PERSONAL 0x00000200
  717. #define VER_SUITE_BLADE 0x00000400
  718. //
  719. // Language IDs.
  720. //
  721. // The following two combinations of primary language ID and
  722. // sublanguage ID have special semantics:
  723. //
  724. // Primary Language ID Sublanguage ID Result
  725. // ------------------- --------------- ------------------------
  726. // LANG_NEUTRAL SUBLANG_NEUTRAL Language neutral
  727. // LANG_NEUTRAL SUBLANG_DEFAULT User default language
  728. // LANG_NEUTRAL SUBLANG_SYS_DEFAULT System default language
  729. // LANG_INVARIANT SUBLANG_NEUTRAL Invariant locale
  730. //
  731. //
  732. // Primary language IDs.
  733. //
  734. #define LANG_NEUTRAL 0x00
  735. #define LANG_INVARIANT 0x7f
  736. #define LANG_AFRIKAANS 0x36
  737. #define LANG_ALBANIAN 0x1c
  738. #define LANG_ARABIC 0x01
  739. #define LANG_ARMENIAN 0x2b
  740. #define LANG_ASSAMESE 0x4d
  741. #define LANG_AZERI 0x2c
  742. #define LANG_BASQUE 0x2d
  743. #define LANG_BELARUSIAN 0x23
  744. #define LANG_BENGALI 0x45
  745. #define LANG_BOSNIAN 0x1a
  746. #define LANG_BULGARIAN 0x02
  747. #define LANG_CATALAN 0x03
  748. #define LANG_CHINESE 0x04
  749. #define LANG_CROATIAN 0x1a
  750. #define LANG_CZECH 0x05
  751. #define LANG_DANISH 0x06
  752. #define LANG_DIVEHI 0x65
  753. #define LANG_DUTCH 0x13
  754. #define LANG_ENGLISH 0x09
  755. #define LANG_ESTONIAN 0x25
  756. #define LANG_FAEROESE 0x38
  757. #define LANG_FARSI 0x29
  758. #define LANG_FINNISH 0x0b
  759. #define LANG_FRENCH 0x0c
  760. #define LANG_GALICIAN 0x56
  761. #define LANG_GEORGIAN 0x37
  762. #define LANG_GERMAN 0x07
  763. #define LANG_GREEK 0x08
  764. #define LANG_GUJARATI 0x47
  765. #define LANG_HEBREW 0x0d
  766. #define LANG_HINDI 0x39
  767. #define LANG_HUNGARIAN 0x0e
  768. #define LANG_ICELANDIC 0x0f
  769. #define LANG_INDONESIAN 0x21
  770. #define LANG_ITALIAN 0x10
  771. #define LANG_JAPANESE 0x11
  772. #define LANG_KANNADA 0x4b
  773. #define LANG_KASHMIRI 0x60
  774. #define LANG_KAZAK 0x3f
  775. #define LANG_KONKANI 0x57
  776. #define LANG_KOREAN 0x12
  777. #define LANG_KYRGYZ 0x40
  778. #define LANG_LATVIAN 0x26
  779. #define LANG_LITHUANIAN 0x27
  780. #define LANG_MACEDONIAN 0x2f // the Former Yugoslav Republic of Macedonia
  781. #define LANG_MALAY 0x3e
  782. #define LANG_MALAYALAM 0x4c
  783. #define LANG_MALTESE 0x3a
  784. #define LANG_MANIPURI 0x58
  785. #define LANG_MAORI 0x81
  786. #define LANG_MARATHI 0x4e
  787. #define LANG_MONGOLIAN 0x50
  788. #define LANG_NEPALI 0x61
  789. #define LANG_NORWEGIAN 0x14
  790. #define LANG_ORIYA 0x48
  791. #define LANG_POLISH 0x15
  792. #define LANG_PORTUGUESE 0x16
  793. #define LANG_PUNJABI 0x46
  794. #define LANG_QUECHUA 0x6b
  795. #define LANG_ROMANIAN 0x18
  796. #define LANG_RUSSIAN 0x19
  797. #define LANG_SAMI 0x3b
  798. #define LANG_SANSKRIT 0x4f
  799. #define LANG_SERBIAN 0x1a
  800. #define LANG_SINDHI 0x59
  801. #define LANG_SLOVAK 0x1b
  802. #define LANG_SLOVENIAN 0x24
  803. #define LANG_SOTHO 0x6c
  804. #define LANG_SPANISH 0x0a
  805. #define LANG_SWAHILI 0x41
  806. #define LANG_SWEDISH 0x1d
  807. #define LANG_SYRIAC 0x5a
  808. #define LANG_TAMIL 0x49
  809. #define LANG_TATAR 0x44
  810. #define LANG_TELUGU 0x4a
  811. #define LANG_THAI 0x1e
  812. #define LANG_TSWANA 0x32
  813. #define LANG_TURKISH 0x1f
  814. #define LANG_UKRAINIAN 0x22
  815. #define LANG_URDU 0x20
  816. #define LANG_UZBEK 0x43
  817. #define LANG_VIETNAMESE 0x2a
  818. #define LANG_WELSH 0x52
  819. #define LANG_XHOSA 0x34
  820. #define LANG_ZULU 0x35
  821. //
  822. // Sublanguage IDs.
  823. //
  824. // The name immediately following SUBLANG_ dictates which primary
  825. // language ID that sublanguage ID can be combined with to form a
  826. // valid language ID.
  827. //
  828. #define SUBLANG_NEUTRAL 0x00 // language neutral
  829. #define SUBLANG_DEFAULT 0x01 // user default
  830. #define SUBLANG_SYS_DEFAULT 0x02 // system default
  831. #define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 // Arabic (Saudi Arabia)
  832. #define SUBLANG_ARABIC_IRAQ 0x02 // Arabic (Iraq)
  833. #define SUBLANG_ARABIC_EGYPT 0x03 // Arabic (Egypt)
  834. #define SUBLANG_ARABIC_LIBYA 0x04 // Arabic (Libya)
  835. #define SUBLANG_ARABIC_ALGERIA 0x05 // Arabic (Algeria)
  836. #define SUBLANG_ARABIC_MOROCCO 0x06 // Arabic (Morocco)
  837. #define SUBLANG_ARABIC_TUNISIA 0x07 // Arabic (Tunisia)
  838. #define SUBLANG_ARABIC_OMAN 0x08 // Arabic (Oman)
  839. #define SUBLANG_ARABIC_YEMEN 0x09 // Arabic (Yemen)
  840. #define SUBLANG_ARABIC_SYRIA 0x0a // Arabic (Syria)
  841. #define SUBLANG_ARABIC_JORDAN 0x0b // Arabic (Jordan)
  842. #define SUBLANG_ARABIC_LEBANON 0x0c // Arabic (Lebanon)
  843. #define SUBLANG_ARABIC_KUWAIT 0x0d // Arabic (Kuwait)
  844. #define SUBLANG_ARABIC_UAE 0x0e // Arabic (U.A.E)
  845. #define SUBLANG_ARABIC_BAHRAIN 0x0f // Arabic (Bahrain)
  846. #define SUBLANG_ARABIC_QATAR 0x10 // Arabic (Qatar)
  847. #define SUBLANG_AZERI_LATIN 0x01 // Azeri (Latin)
  848. #define SUBLANG_AZERI_CYRILLIC 0x02 // Azeri (Cyrillic)
  849. #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 // Bosnian (Bosnia and Herzegovina - Latin)
  850. #define SUBLANG_CHINESE_TRADITIONAL 0x01 // Chinese (Taiwan)
  851. #define SUBLANG_CHINESE_SIMPLIFIED 0x02 // Chinese (PR China)
  852. #define SUBLANG_CHINESE_HONGKONG 0x03 // Chinese (Hong Kong S.A.R., P.R.C.)
  853. #define SUBLANG_CHINESE_SINGAPORE 0x04 // Chinese (Singapore)
  854. #define SUBLANG_CHINESE_MACAU 0x05 // Chinese (Macau S.A.R.)
  855. #define SUBLANG_CROATIAN_CROATIA 0x01 // Croatian (Croatia)
  856. #define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 // Croatian (Bosnia and Herzegovina - Latin)
  857. #define SUBLANG_DUTCH 0x01 // Dutch
  858. #define SUBLANG_DUTCH_BELGIAN 0x02 // Dutch (Belgian)
  859. #define SUBLANG_ENGLISH_US 0x01 // English (USA)
  860. #define SUBLANG_ENGLISH_UK 0x02 // English (UK)
  861. #define SUBLANG_ENGLISH_AUS 0x03 // English (Australian)
  862. #define SUBLANG_ENGLISH_CAN 0x04 // English (Canadian)
  863. #define SUBLANG_ENGLISH_NZ 0x05 // English (New Zealand)
  864. #define SUBLANG_ENGLISH_EIRE 0x06 // English (Irish)
  865. #define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 // English (South Africa)
  866. #define SUBLANG_ENGLISH_JAMAICA 0x08 // English (Jamaica)
  867. #define SUBLANG_ENGLISH_CARIBBEAN 0x09 // English (Caribbean)
  868. #define SUBLANG_ENGLISH_BELIZE 0x0a // English (Belize)
  869. #define SUBLANG_ENGLISH_TRINIDAD 0x0b // English (Trinidad)
  870. #define SUBLANG_ENGLISH_ZIMBABWE 0x0c // English (Zimbabwe)
  871. #define SUBLANG_ENGLISH_PHILIPPINES 0x0d // English (Philippines)
  872. #define SUBLANG_FRENCH 0x01 // French
  873. #define SUBLANG_FRENCH_BELGIAN 0x02 // French (Belgian)
  874. #define SUBLANG_FRENCH_CANADIAN 0x03 // French (Canadian)
  875. #define SUBLANG_FRENCH_SWISS 0x04 // French (Swiss)
  876. #define SUBLANG_FRENCH_LUXEMBOURG 0x05 // French (Luxembourg)
  877. #define SUBLANG_FRENCH_MONACO 0x06 // French (Monaco)
  878. #define SUBLANG_GERMAN 0x01 // German
  879. #define SUBLANG_GERMAN_SWISS 0x02 // German (Swiss)
  880. #define SUBLANG_GERMAN_AUSTRIAN 0x03 // German (Austrian)
  881. #define SUBLANG_GERMAN_LUXEMBOURG 0x04 // German (Luxembourg)
  882. #define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 // German (Liechtenstein)
  883. #define SUBLANG_ITALIAN 0x01 // Italian
  884. #define SUBLANG_ITALIAN_SWISS 0x02 // Italian (Swiss)
  885. #define SUBLANG_KASHMIRI_SASIA 0x02 // Kashmiri (South Asia)
  886. #define SUBLANG_KASHMIRI_INDIA 0x02 // For app compatibility only
  887. #define SUBLANG_KOREAN 0x01 // Korean (Extended Wansung)
  888. #define SUBLANG_LITHUANIAN 0x01 // Lithuanian
  889. #define SUBLANG_MALAY_MALAYSIA 0x01 // Malay (Malaysia)
  890. #define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 // Malay (Brunei Darussalam)
  891. #define SUBLANG_NEPALI_INDIA 0x02 // Nepali (India)
  892. #define SUBLANG_NORWEGIAN_BOKMAL 0x01 // Norwegian (Bokmal)
  893. #define SUBLANG_NORWEGIAN_NYNORSK 0x02 // Norwegian (Nynorsk)
  894. #define SUBLANG_PORTUGUESE 0x02 // Portuguese
  895. #define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 // Portuguese (Brazilian)
  896. #define SUBLANG_QUECHUA_BOLIVIA 0x01 // Quechua (Bolivia)
  897. #define SUBLANG_QUECHUA_ECUADOR 0x02 // Quechua (Ecuador)
  898. #define SUBLANG_QUECHUA_PERU 0x03 // Quechua (Peru)
  899. #define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 // Northern Sami (Norway)
  900. #define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 // Northern Sami (Sweden)
  901. #define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 // Northern Sami (Finland)
  902. #define SUBLANG_SAMI_LULE_NORWAY 0x04 // Lule Sami (Norway)
  903. #define SUBLANG_SAMI_LULE_SWEDEN 0x05 // Lule Sami (Sweden)
  904. #define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 // Southern Sami (Norway)
  905. #define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 // Southern Sami (Sweden)
  906. #define SUBLANG_SAMI_SKOLT_FINLAND 0x08 // Skolt Sami (Finland)
  907. #define SUBLANG_SAMI_INARI_FINLAND 0x09 // Inari Sami (Finland)
  908. #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 // Serbian (Bosnia and Herzegovina - Latin)
  909. #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 // Serbian (Bosnia and Herzegovina - Cyrillic)
  910. #define SUBLANG_SERBIAN_LATIN 0x02 // Serbian (Latin)
  911. #define SUBLANG_SERBIAN_CYRILLIC 0x03 // Serbian (Cyrillic)
  912. #define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 // Northern Sotho (South Africa)
  913. #define SUBLANG_SPANISH 0x01 // Spanish (Castilian)
  914. #define SUBLANG_SPANISH_MEXICAN 0x02 // Spanish (Mexican)
  915. #define SUBLANG_SPANISH_MODERN 0x03 // Spanish (Modern)
  916. #define SUBLANG_SPANISH_GUATEMALA 0x04 // Spanish (Guatemala)
  917. #define SUBLANG_SPANISH_COSTA_RICA 0x05 // Spanish (Costa Rica)
  918. #define SUBLANG_SPANISH_PANAMA 0x06 // Spanish (Panama)
  919. #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 // Spanish (Dominican Republic)
  920. #define SUBLANG_SPANISH_VENEZUELA 0x08 // Spanish (Venezuela)
  921. #define SUBLANG_SPANISH_COLOMBIA 0x09 // Spanish (Colombia)
  922. #define SUBLANG_SPANISH_PERU 0x0a // Spanish (Peru)
  923. #define SUBLANG_SPANISH_ARGENTINA 0x0b // Spanish (Argentina)
  924. #define SUBLANG_SPANISH_ECUADOR 0x0c // Spanish (Ecuador)
  925. #define SUBLANG_SPANISH_CHILE 0x0d // Spanish (Chile)
  926. #define SUBLANG_SPANISH_URUGUAY 0x0e // Spanish (Uruguay)
  927. #define SUBLANG_SPANISH_PARAGUAY 0x0f // Spanish (Paraguay)
  928. #define SUBLANG_SPANISH_BOLIVIA 0x10 // Spanish (Bolivia)
  929. #define SUBLANG_SPANISH_EL_SALVADOR 0x11 // Spanish (El Salvador)
  930. #define SUBLANG_SPANISH_HONDURAS 0x12 // Spanish (Honduras)
  931. #define SUBLANG_SPANISH_NICARAGUA 0x13 // Spanish (Nicaragua)
  932. #define SUBLANG_SPANISH_PUERTO_RICO 0x14 // Spanish (Puerto Rico)
  933. #define SUBLANG_SWEDISH 0x01 // Swedish
  934. #define SUBLANG_SWEDISH_FINLAND 0x02 // Swedish (Finland)
  935. #define SUBLANG_URDU_PAKISTAN 0x01 // Urdu (Pakistan)
  936. #define SUBLANG_URDU_INDIA 0x02 // Urdu (India)
  937. #define SUBLANG_UZBEK_LATIN 0x01 // Uzbek (Latin)
  938. #define SUBLANG_UZBEK_CYRILLIC 0x02 // Uzbek (Cyrillic)
  939. //
  940. // Sorting IDs.
  941. //
  942. #define SORT_DEFAULT 0x0 // sorting default
  943. #define SORT_JAPANESE_XJIS 0x0 // Japanese XJIS order
  944. #define SORT_JAPANESE_UNICODE 0x1 // Japanese Unicode order
  945. #define SORT_CHINESE_BIG5 0x0 // Chinese BIG5 order
  946. #define SORT_CHINESE_PRCP 0x0 // PRC Chinese Phonetic order
  947. #define SORT_CHINESE_UNICODE 0x1 // Chinese Unicode order
  948. #define SORT_CHINESE_PRC 0x2 // PRC Chinese Stroke Count order
  949. #define SORT_CHINESE_BOPOMOFO 0x3 // Traditional Chinese Bopomofo order
  950. #define SORT_KOREAN_KSC 0x0 // Korean KSC order
  951. #define SORT_KOREAN_UNICODE 0x1 // Korean Unicode order
  952. #define SORT_GERMAN_PHONE_BOOK 0x1 // German Phone Book order
  953. #define SORT_HUNGARIAN_DEFAULT 0x0 // Hungarian Default order
  954. #define SORT_HUNGARIAN_TECHNICAL 0x1 // Hungarian Technical order
  955. #define SORT_GEORGIAN_TRADITIONAL 0x0 // Georgian Traditional order
  956. #define SORT_GEORGIAN_MODERN 0x1 // Georgian Modern order
  957. // end_r_winnt
  958. //
  959. // A language ID is a 16 bit value which is the combination of a
  960. // primary language ID and a secondary language ID. The bits are
  961. // allocated as follows:
  962. //
  963. // +-----------------------+-------------------------+
  964. // | Sublanguage ID | Primary Language ID |
  965. // +-----------------------+-------------------------+
  966. // 15 10 9 0 bit
  967. //
  968. //
  969. // Language ID creation/extraction macros:
  970. //
  971. // MAKELANGID - construct language id from a primary language id and
  972. // a sublanguage id.
  973. // PRIMARYLANGID - extract primary language id from a language id.
  974. // SUBLANGID - extract sublanguage id from a language id.
  975. //
  976. #define MAKELANGID(p, s) ((((WORD )(s)) << 10) | (WORD )(p))
  977. #define PRIMARYLANGID(lgid) ((WORD )(lgid) & 0x3ff)
  978. #define SUBLANGID(lgid) ((WORD )(lgid) >> 10)
  979. //
  980. // A locale ID is a 32 bit value which is the combination of a
  981. // language ID, a sort ID, and a reserved area. The bits are
  982. // allocated as follows:
  983. //
  984. // +-------------+---------+-------------------------+
  985. // | Reserved | Sort ID | Language ID |
  986. // +-------------+---------+-------------------------+
  987. // 31 20 19 16 15 0 bit
  988. //
  989. //
  990. // Locale ID creation/extraction macros:
  991. //
  992. // MAKELCID - construct the locale id from a language id and a sort id.
  993. // MAKESORTLCID - construct the locale id from a language id, sort id, and sort version.
  994. // LANGIDFROMLCID - extract the language id from a locale id.
  995. // SORTIDFROMLCID - extract the sort id from a locale id.
  996. // SORTVERSIONFROMLCID - extract the sort version from a locale id.
  997. //
  998. #define NLS_VALID_LOCALE_MASK 0x000fffff
  999. #define MAKELCID(lgid, srtid) ((DWORD)((((DWORD)((WORD )(srtid))) << 16) | \
  1000. ((DWORD)((WORD )(lgid)))))
  1001. #define MAKESORTLCID(lgid, srtid, ver) \
  1002. ((DWORD)((MAKELCID(lgid, srtid)) | \
  1003. (((DWORD)((WORD )(ver))) << 20)))
  1004. #define LANGIDFROMLCID(lcid) ((WORD )(lcid))
  1005. #define SORTIDFROMLCID(lcid) ((WORD )((((DWORD)(lcid)) >> 16) & 0xf))
  1006. #define SORTVERSIONFROMLCID(lcid) ((WORD )((((DWORD)(lcid)) >> 20) & 0xf))
  1007. //
  1008. // Default System and User IDs for language and locale.
  1009. //
  1010. #define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
  1011. #define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
  1012. #define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
  1013. #define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT))
  1014. #define LOCALE_NEUTRAL \
  1015. (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT))
  1016. #define LOCALE_INVARIANT \
  1017. (MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT))
  1018. // begin_ntminiport begin_ntndis begin_ntminitape
  1019. //
  1020. // Macros used to eliminate compiler warning generated when formal
  1021. // parameters or local variables are not declared.
  1022. //
  1023. // Use DBG_UNREFERENCED_PARAMETER() when a parameter is not yet
  1024. // referenced but will be once the module is completely developed.
  1025. //
  1026. // Use DBG_UNREFERENCED_LOCAL_VARIABLE() when a local variable is not yet
  1027. // referenced but will be once the module is completely developed.
  1028. //
  1029. // Use UNREFERENCED_PARAMETER() if a parameter will never be referenced.
  1030. //
  1031. // DBG_UNREFERENCED_PARAMETER and DBG_UNREFERENCED_LOCAL_VARIABLE will
  1032. // eventually be made into a null macro to help determine whether there
  1033. // is unfinished work.
  1034. //
  1035. #if ! defined(lint)
  1036. #define UNREFERENCED_PARAMETER(P) (P)
  1037. #define DBG_UNREFERENCED_PARAMETER(P) (P)
  1038. #define DBG_UNREFERENCED_LOCAL_VARIABLE(V) (V)
  1039. #else // lint
  1040. // Note: lint -e530 says don't complain about uninitialized variables for
  1041. // this varible. Error 527 has to do with unreachable code.
  1042. // -restore restores checking to the -save state
  1043. #define UNREFERENCED_PARAMETER(P) \
  1044. /*lint -save -e527 -e530 */ \
  1045. { \
  1046. (P) = (P); \
  1047. } \
  1048. /*lint -restore */
  1049. #define DBG_UNREFERENCED_PARAMETER(P) \
  1050. /*lint -save -e527 -e530 */ \
  1051. { \
  1052. (P) = (P); \
  1053. } \
  1054. /*lint -restore */
  1055. #define DBG_UNREFERENCED_LOCAL_VARIABLE(V) \
  1056. /*lint -save -e527 -e530 */ \
  1057. { \
  1058. (V) = (V); \
  1059. } \
  1060. /*lint -restore */
  1061. #endif // lint
  1062. //
  1063. // Macro used to eliminate compiler warning 4715 within a switch statement
  1064. // when all possible cases have already been accounted for.
  1065. //
  1066. // switch (a & 3) {
  1067. // case 0: return 1;
  1068. // case 1: return Foo();
  1069. // case 2: return Bar();
  1070. // case 3: return 1;
  1071. // DEFAULT_UNREACHABLE;
  1072. //
  1073. #if (_MSC_VER > 1200)
  1074. #define DEFAULT_UNREACHABLE default: __assume(0)
  1075. #else
  1076. //
  1077. // Older compilers do not support __assume(), and there is no other free
  1078. // method of eliminating the warning.
  1079. //
  1080. #define DEFAULT_UNREACHABLE
  1081. #endif
  1082. #ifndef WIN32_NO_STATUS
  1083. /*lint -save -e767 */
  1084. #define STATUS_WAIT_0 ((DWORD )0x00000000L)
  1085. #define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L)
  1086. #define STATUS_USER_APC ((DWORD )0x000000C0L)
  1087. #define STATUS_TIMEOUT ((DWORD )0x00000102L)
  1088. #define STATUS_PENDING ((DWORD )0x00000103L)
  1089. #define DBG_EXCEPTION_HANDLED ((DWORD )0x00010001L)
  1090. #define DBG_CONTINUE ((DWORD )0x00010002L)
  1091. #define STATUS_SEGMENT_NOTIFICATION ((DWORD )0x40000005L)
  1092. #define DBG_TERMINATE_THREAD ((DWORD )0x40010003L)
  1093. #define DBG_TERMINATE_PROCESS ((DWORD )0x40010004L)
  1094. #define DBG_CONTROL_C ((DWORD )0x40010005L)
  1095. #define DBG_CONTROL_BREAK ((DWORD )0x40010008L)
  1096. #define STATUS_GUARD_PAGE_VIOLATION ((DWORD )0x80000001L)
  1097. #define STATUS_DATATYPE_MISALIGNMENT ((DWORD )0x80000002L)
  1098. #define STATUS_BREAKPOINT ((DWORD )0x80000003L)
  1099. #define STATUS_SINGLE_STEP ((DWORD )0x80000004L)
  1100. #define DBG_EXCEPTION_NOT_HANDLED ((DWORD )0x80010001L)
  1101. #define STATUS_ACCESS_VIOLATION ((DWORD )0xC0000005L)
  1102. #define STATUS_IN_PAGE_ERROR ((DWORD )0xC0000006L)
  1103. #define STATUS_INVALID_HANDLE ((DWORD )0xC0000008L)
  1104. #define STATUS_NO_MEMORY ((DWORD )0xC0000017L)
  1105. #define STATUS_ILLEGAL_INSTRUCTION ((DWORD )0xC000001DL)
  1106. #define STATUS_NONCONTINUABLE_EXCEPTION ((DWORD )0xC0000025L)
  1107. #define STATUS_INVALID_DISPOSITION ((DWORD )0xC0000026L)
  1108. #define STATUS_ARRAY_BOUNDS_EXCEEDED ((DWORD )0xC000008CL)
  1109. #define STATUS_FLOAT_DENORMAL_OPERAND ((DWORD )0xC000008DL)
  1110. #define STATUS_FLOAT_DIVIDE_BY_ZERO ((DWORD )0xC000008EL)
  1111. #define STATUS_FLOAT_INEXACT_RESULT ((DWORD )0xC000008FL)
  1112. #define STATUS_FLOAT_INVALID_OPERATION ((DWORD )0xC0000090L)
  1113. #define STATUS_FLOAT_OVERFLOW ((DWORD )0xC0000091L)
  1114. #define STATUS_FLOAT_STACK_CHECK ((DWORD )0xC0000092L)
  1115. #define STATUS_FLOAT_UNDERFLOW ((DWORD )0xC0000093L)
  1116. #define STATUS_INTEGER_DIVIDE_BY_ZERO ((DWORD )0xC0000094L)
  1117. #define STATUS_INTEGER_OVERFLOW ((DWORD )0xC0000095L)
  1118. #define STATUS_PRIVILEGED_INSTRUCTION ((DWORD )0xC0000096L)
  1119. #define STATUS_STACK_OVERFLOW ((DWORD )0xC00000FDL)
  1120. #define STATUS_CONTROL_C_EXIT ((DWORD )0xC000013AL)
  1121. #define STATUS_FLOAT_MULTIPLE_FAULTS ((DWORD )0xC00002B4L)
  1122. #define STATUS_FLOAT_MULTIPLE_TRAPS ((DWORD )0xC00002B5L)
  1123. #define STATUS_REG_NAT_CONSUMPTION ((DWORD )0xC00002C9L)
  1124. #if defined(STATUS_SUCCESS) || (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100)
  1125. #define STATUS_SXS_EARLY_DEACTIVATION ((DWORD )0xC015000FL)
  1126. #define STATUS_SXS_INVALID_DEACTIVATION ((DWORD )0xC0150010L)
  1127. #endif
  1128. /*lint -restore */
  1129. #endif
  1130. #define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects
  1131. #define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended
  1132. typedef ULONG_PTR KSPIN_LOCK;
  1133. typedef KSPIN_LOCK *PKSPIN_LOCK;
  1134. #if defined(_AMD64_)
  1135. #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
  1136. //
  1137. // Define function to get the caller's EFLAGs value.
  1138. //
  1139. #define GetCallersEflags() __getcallerseflags()
  1140. unsigned __int32
  1141. __getcallerseflags (
  1142. VOID
  1143. );
  1144. #pragma intrinsic(__getcallerseflags)
  1145. //
  1146. // Define function to read the value of the time stamp counter
  1147. //
  1148. #define ReadTimeStampCounter() __rdtsc()
  1149. DWORD64
  1150. __rdtsc (
  1151. VOID
  1152. );
  1153. #pragma intrinsic(__rdtsc)
  1154. //
  1155. // Define functions to move strings or bytes, words, dwords, and qwords.
  1156. //
  1157. VOID
  1158. __movsb (
  1159. IN PBYTE Destination,
  1160. IN PBYTE Source,
  1161. IN DWORD Count
  1162. );
  1163. VOID
  1164. __movsw (
  1165. IN PWORD Destination,
  1166. IN PWORD Source,
  1167. IN DWORD Count
  1168. );
  1169. VOID
  1170. __movsd (
  1171. IN PDWORD Destination,
  1172. IN PDWORD Source,
  1173. IN DWORD Count
  1174. );
  1175. VOID
  1176. __movsq (
  1177. IN PULONGLONG Destination,
  1178. IN PULONGLONG Source,
  1179. IN DWORD Count
  1180. );
  1181. #pragma intrinsic(__movsb)
  1182. #pragma intrinsic(__movsw)
  1183. #pragma intrinsic(__movsd)
  1184. #pragma intrinsic(__movsq)
  1185. //
  1186. // Define functions to capture the high 64-bits of a 128-bit multiply.
  1187. //
  1188. #define MultiplyHigh __mulh
  1189. #define UnsignedMultiplyHigh __umulh
  1190. LONGLONG
  1191. MultiplyHigh (
  1192. IN LONGLONG Multiplier,
  1193. IN LONGLONG Multiplicand
  1194. );
  1195. ULONGLONG
  1196. UnsignedMultiplyHigh (
  1197. IN ULONGLONG Multiplier,
  1198. IN ULONGLONG Multiplicand
  1199. );
  1200. #pragma intrinsic(__mulh)
  1201. #pragma intrinsic(__umulh)
  1202. //
  1203. // Define functions to read and write the uer TEB and the system PCR/PRCB.
  1204. //
  1205. BYTE
  1206. __readgsbyte (
  1207. IN DWORD Offset
  1208. );
  1209. WORD
  1210. __readgsword (
  1211. IN DWORD Offset
  1212. );
  1213. DWORD
  1214. __readgsdword (
  1215. IN DWORD Offset
  1216. );
  1217. DWORD64
  1218. __readgsqword (
  1219. IN DWORD Offset
  1220. );
  1221. VOID
  1222. __writegsbyte (
  1223. IN DWORD Offset,
  1224. IN BYTE Data
  1225. );
  1226. VOID
  1227. __writegsword (
  1228. IN DWORD Offset,
  1229. IN WORD Data
  1230. );
  1231. VOID
  1232. __writegsdword (
  1233. IN DWORD Offset,
  1234. IN DWORD Data
  1235. );
  1236. VOID
  1237. __writegsqword (
  1238. IN DWORD Offset,
  1239. IN DWORD64 Data
  1240. );
  1241. #pragma intrinsic(__readgsbyte)
  1242. #pragma intrinsic(__readgsword)
  1243. #pragma intrinsic(__readgsdword)
  1244. #pragma intrinsic(__readgsqword)
  1245. #pragma intrinsic(__writegsbyte)
  1246. #pragma intrinsic(__writegsword)
  1247. #pragma intrinsic(__writegsdword)
  1248. #pragma intrinsic(__writegsqword)
  1249. #endif // defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
  1250. //
  1251. // The following flags control the contents of the CONTEXT structure.
  1252. //
  1253. #if !defined(RC_INVOKED)
  1254. #define CONTEXT_AMD64 0x100000
  1255. // end_wx86
  1256. #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
  1257. #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
  1258. #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
  1259. #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
  1260. #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
  1261. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
  1262. // begin_wx86
  1263. #endif // !defined(RC_INVOKED)
  1264. //
  1265. // Define 128-bit 16-byte aligned xmm register type.
  1266. //
  1267. typedef struct DECLSPEC_ALIGN(16) _M128 {
  1268. ULONGLONG Low;
  1269. LONGLONG High;
  1270. } M128, *PM128;
  1271. //
  1272. // Format of data for fnsave/frstor instructions.
  1273. //
  1274. // This structure is used to store the legacy floating point state.
  1275. //
  1276. typedef struct _LEGACY_SAVE_AREA {
  1277. WORD ControlWord;
  1278. WORD Reserved0;
  1279. WORD StatusWord;
  1280. WORD Reserved1;
  1281. WORD TagWord;
  1282. WORD Reserved2;
  1283. DWORD ErrorOffset;
  1284. WORD ErrorSelector;
  1285. WORD ErrorOpcode;
  1286. DWORD DataOffset;
  1287. WORD DataSelector;
  1288. WORD Reserved3;
  1289. BYTE FloatRegisters[8 * 10];
  1290. } LEGACY_SAVE_AREA, *PLEGACY_SAVE_AREA;
  1291. #define LEGACY_SAVE_AREA_LENGTH ((sizeof(LEGACY_SAVE_AREA) + 15) & ~15)
  1292. //
  1293. // Context Frame
  1294. //
  1295. // This frame has a several purposes: 1) it is used as an argument to
  1296. // NtContinue, 2) is is used to constuct a call frame for APC delivery,
  1297. // and 3) it is used in the user level thread creation routines.
  1298. //
  1299. //
  1300. // The flags field within this record controls the contents of a CONTEXT
  1301. // record.
  1302. //
  1303. // If the context record is used as an input parameter, then for each
  1304. // portion of the context record controlled by a flag whose value is
  1305. // set, it is assumed that that portion of the context record contains
  1306. // valid context. If the context record is being used to modify a threads
  1307. // context, then only that portion of the threads context is modified.
  1308. //
  1309. // If the context record is used as an output parameter to capture the
  1310. // context of a thread, then only those portions of the thread's context
  1311. // corresponding to set flags will be returned.
  1312. //
  1313. // CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags.
  1314. //
  1315. // CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15.
  1316. //
  1317. // CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs.
  1318. //
  1319. // CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7.
  1320. //
  1321. // CONTEXT_MMX_REGISTERS specifies the floating point and extended registers
  1322. // Mm0/St0-Mm7/St7 and Xmm0-Xmm15).
  1323. //
  1324. typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
  1325. //
  1326. // Register parameter home addresses.
  1327. //
  1328. DWORD64 P1Home;
  1329. DWORD64 P2Home;
  1330. DWORD64 P3Home;
  1331. DWORD64 P4Home;
  1332. DWORD64 P5Home;
  1333. DWORD64 P6Home;
  1334. //
  1335. // Control flags.
  1336. //
  1337. DWORD ContextFlags;
  1338. DWORD MxCsr;
  1339. //
  1340. // Segment Registers and processor flags.
  1341. //
  1342. WORD SegCs;
  1343. WORD SegDs;
  1344. WORD SegEs;
  1345. WORD SegFs;
  1346. WORD SegGs;
  1347. WORD SegSs;
  1348. DWORD EFlags;
  1349. //
  1350. // Debug registers
  1351. //
  1352. DWORD64 Dr0;
  1353. DWORD64 Dr1;
  1354. DWORD64 Dr2;
  1355. DWORD64 Dr3;
  1356. DWORD64 Dr6;
  1357. DWORD64 Dr7;
  1358. //
  1359. // Integer registers.
  1360. //
  1361. DWORD64 Rax;
  1362. DWORD64 Rcx;
  1363. DWORD64 Rdx;
  1364. DWORD64 Rbx;
  1365. DWORD64 Rsp;
  1366. DWORD64 Rbp;
  1367. DWORD64 Rsi;
  1368. DWORD64 Rdi;
  1369. DWORD64 R8;
  1370. DWORD64 R9;
  1371. DWORD64 R10;
  1372. DWORD64 R11;
  1373. DWORD64 R12;
  1374. DWORD64 R13;
  1375. DWORD64 R14;
  1376. DWORD64 R15;
  1377. //
  1378. // Program counter.
  1379. //
  1380. DWORD64 Rip;
  1381. //
  1382. // MMX/floating point state.
  1383. //
  1384. M128 Xmm0;
  1385. M128 Xmm1;
  1386. M128 Xmm2;
  1387. M128 Xmm3;
  1388. M128 Xmm4;
  1389. M128 Xmm5;
  1390. M128 Xmm6;
  1391. M128 Xmm7;
  1392. M128 Xmm8;
  1393. M128 Xmm9;
  1394. M128 Xmm10;
  1395. M128 Xmm11;
  1396. M128 Xmm12;
  1397. M128 Xmm13;
  1398. M128 Xmm14;
  1399. M128 Xmm15;
  1400. //
  1401. // Legacy floating point state.
  1402. //
  1403. LEGACY_SAVE_AREA FltSave;
  1404. DWORD Fill;
  1405. } CONTEXT, *PCONTEXT;
  1406. #endif // _AMD64_
  1407. //
  1408. // Define function to return the current Thread Environment Block
  1409. //
  1410. #ifdef _ALPHA_ // winnt
  1411. void *_rdteb(void); // winnt
  1412. #if defined(_M_ALPHA) // winnt
  1413. #pragma intrinsic(_rdteb) // winnt
  1414. #endif // winnt
  1415. #endif // winnt
  1416. #if defined(_M_ALPHA)
  1417. #define NtCurrentTeb() ((struct _TEB *)_rdteb())
  1418. #else
  1419. struct _TEB *
  1420. NtCurrentTeb(void);
  1421. #endif
  1422. //
  1423. // Define functions to get the address of the current fiber and the
  1424. // current fiber data.
  1425. //
  1426. #ifdef _ALPHA_
  1427. #define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
  1428. #define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
  1429. // begin_ntddk begin_nthal
  1430. //
  1431. // The following flags control the contents of the CONTEXT structure.
  1432. //
  1433. #if !defined(RC_INVOKED)
  1434. #define CONTEXT_ALPHA 0x00020000
  1435. #define CONTEXT_CONTROL (CONTEXT_ALPHA | 0x00000001L)
  1436. #define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002L)
  1437. #define CONTEXT_INTEGER (CONTEXT_ALPHA | 0x00000004L)
  1438. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  1439. #endif
  1440. #ifndef _PORTABLE_32BIT_CONTEXT
  1441. //
  1442. // Context Frame
  1443. //
  1444. // This frame has a several purposes: 1) it is used as an argument to
  1445. // NtContinue, 2) it is used to construct a call frame for APC delivery,
  1446. // 3) it is used to construct a call frame for exception dispatching
  1447. // in user mode, 4) it is used in the user level thread creation
  1448. // routines, and 5) it is used to to pass thread state to debuggers.
  1449. //
  1450. // N.B. Because this record is used as a call frame, it must be EXACTLY
  1451. // a multiple of 16 bytes in length.
  1452. //
  1453. // There are two variations of the context structure. This is the real one.
  1454. //
  1455. typedef struct _CONTEXT {
  1456. //
  1457. // This section is specified/returned if the ContextFlags word contains
  1458. // the flag CONTEXT_FLOATING_POINT.
  1459. //
  1460. ULONGLONG FltF0;
  1461. ULONGLONG FltF1;
  1462. ULONGLONG FltF2;
  1463. ULONGLONG FltF3;
  1464. ULONGLONG FltF4;
  1465. ULONGLONG FltF5;
  1466. ULONGLONG FltF6;
  1467. ULONGLONG FltF7;
  1468. ULONGLONG FltF8;
  1469. ULONGLONG FltF9;
  1470. ULONGLONG FltF10;
  1471. ULONGLONG FltF11;
  1472. ULONGLONG FltF12;
  1473. ULONGLONG FltF13;
  1474. ULONGLONG FltF14;
  1475. ULONGLONG FltF15;
  1476. ULONGLONG FltF16;
  1477. ULONGLONG FltF17;
  1478. ULONGLONG FltF18;
  1479. ULONGLONG FltF19;
  1480. ULONGLONG FltF20;
  1481. ULONGLONG FltF21;
  1482. ULONGLONG FltF22;
  1483. ULONGLONG FltF23;
  1484. ULONGLONG FltF24;
  1485. ULONGLONG FltF25;
  1486. ULONGLONG FltF26;
  1487. ULONGLONG FltF27;
  1488. ULONGLONG FltF28;
  1489. ULONGLONG FltF29;
  1490. ULONGLONG FltF30;
  1491. ULONGLONG FltF31;
  1492. //
  1493. // This section is specified/returned if the ContextFlags word contains
  1494. // the flag CONTEXT_INTEGER.
  1495. //
  1496. // N.B. The registers gp, sp, and ra are defined in this section, but are
  1497. // considered part of the control context rather than part of the integer
  1498. // context.
  1499. //
  1500. ULONGLONG IntV0; // $0: return value register, v0
  1501. ULONGLONG IntT0; // $1: temporary registers, t0 - t7
  1502. ULONGLONG IntT1; // $2:
  1503. ULONGLONG IntT2; // $3:
  1504. ULONGLONG IntT3; // $4:
  1505. ULONGLONG IntT4; // $5:
  1506. ULONGLONG IntT5; // $6:
  1507. ULONGLONG IntT6; // $7:
  1508. ULONGLONG IntT7; // $8:
  1509. ULONGLONG IntS0; // $9: nonvolatile registers, s0 - s5
  1510. ULONGLONG IntS1; // $10:
  1511. ULONGLONG IntS2; // $11:
  1512. ULONGLONG IntS3; // $12:
  1513. ULONGLONG IntS4; // $13:
  1514. ULONGLONG IntS5; // $14:
  1515. ULONGLONG IntFp; // $15: frame pointer register, fp/s6
  1516. ULONGLONG IntA0; // $16: argument registers, a0 - a5
  1517. ULONGLONG IntA1; // $17:
  1518. ULONGLONG IntA2; // $18:
  1519. ULONGLONG IntA3; // $19:
  1520. ULONGLONG IntA4; // $20:
  1521. ULONGLONG IntA5; // $21:
  1522. ULONGLONG IntT8; // $22: temporary registers, t8 - t11
  1523. ULONGLONG IntT9; // $23:
  1524. ULONGLONG IntT10; // $24:
  1525. ULONGLONG IntT11; // $25:
  1526. ULONGLONG IntRa; // $26: return address register, ra
  1527. ULONGLONG IntT12; // $27: temporary register, t12
  1528. ULONGLONG IntAt; // $28: assembler temp register, at
  1529. ULONGLONG IntGp; // $29: global pointer register, gp
  1530. ULONGLONG IntSp; // $30: stack pointer register, sp
  1531. ULONGLONG IntZero; // $31: zero register, zero
  1532. //
  1533. // This section is specified/returned if the ContextFlags word contains
  1534. // the flag CONTEXT_FLOATING_POINT.
  1535. //
  1536. ULONGLONG Fpcr; // floating point control register
  1537. ULONGLONG SoftFpcr; // software extension to FPCR
  1538. //
  1539. // This section is specified/returned if the ContextFlags word contains
  1540. // the flag CONTEXT_CONTROL.
  1541. //
  1542. // N.B. The registers gp, sp, and ra are defined in the integer section,
  1543. // but are considered part of the control context rather than part of
  1544. // the integer context.
  1545. //
  1546. ULONGLONG Fir; // (fault instruction) continuation address
  1547. DWORD Psr; // processor status
  1548. //
  1549. // The flags values within this flag control the contents of
  1550. // a CONTEXT record.
  1551. //
  1552. // If the context record is used as an input parameter, then
  1553. // for each portion of the context record controlled by a flag
  1554. // whose value is set, it is assumed that that portion of the
  1555. // context record contains valid context. If the context record
  1556. // is being used to modify a thread's context, then only that
  1557. // portion of the threads context will be modified.
  1558. //
  1559. // If the context record is used as an IN OUT parameter to capture
  1560. // the context of a thread, then only those portions of the thread's
  1561. // context corresponding to set flags will be returned.
  1562. //
  1563. // The context record is never used as an OUT only parameter.
  1564. //
  1565. DWORD ContextFlags;
  1566. DWORD Fill[4]; // padding for 16-byte stack frame alignment
  1567. } CONTEXT, *PCONTEXT;
  1568. #else
  1569. #error _PORTABLE_32BIT_CONTEXT no longer supported on Alpha.
  1570. #endif // _PORTABLE_32BIT_CONTEXT
  1571. // end_ntddk end_nthal
  1572. #endif // _ALPHA_
  1573. #ifdef _ALPHA_
  1574. VOID
  1575. __jump_unwind (
  1576. PVOID VirtualFramePointer,
  1577. PVOID TargetPc
  1578. );
  1579. #endif // _ALPHA_
  1580. #ifdef _X86_
  1581. //
  1582. // Disable these two pragmas that evaluate to "sti" "cli" on x86 so that driver
  1583. // writers to not leave them inadvertantly in their code.
  1584. //
  1585. #if !defined(MIDL_PASS)
  1586. #if !defined(RC_INVOKED)
  1587. #if _MSC_VER >= 1200
  1588. #pragma warning(push)
  1589. #endif
  1590. #pragma warning(disable:4164) // disable C4164 warning so that apps that
  1591. // build with /Od don't get weird errors !
  1592. #ifdef _M_IX86
  1593. #pragma function(_enable)
  1594. #pragma function(_disable)
  1595. #endif
  1596. #if _MSC_VER >= 1200
  1597. #pragma warning(pop)
  1598. #else
  1599. #pragma warning(default:4164) // reenable C4164 warning
  1600. #endif
  1601. #endif
  1602. #endif
  1603. #if !defined(MIDL_PASS) && defined(_M_IX86)
  1604. #if _MSC_VER >= 1200
  1605. #pragma warning(push)
  1606. #endif
  1607. #pragma warning (disable:4035) // disable 4035 (function must return something)
  1608. _inline PVOID GetFiberData( void ) { __asm {
  1609. mov eax, fs:[0x10]
  1610. mov eax,[eax]
  1611. }
  1612. }
  1613. _inline PVOID GetCurrentFiber( void ) { __asm mov eax, fs:[0x10] }
  1614. #if _MSC_VER >= 1200
  1615. #pragma warning(pop)
  1616. #else
  1617. #pragma warning (default:4035) // Reenable it
  1618. #endif
  1619. #endif
  1620. // begin_ntddk begin_wx86
  1621. //
  1622. // Define the size of the 80387 save area, which is in the context frame.
  1623. //
  1624. #define SIZE_OF_80387_REGISTERS 80
  1625. //
  1626. // The following flags control the contents of the CONTEXT structure.
  1627. //
  1628. #if !defined(RC_INVOKED)
  1629. #define CONTEXT_i386 0x00010000 // this assumes that i386 and
  1630. #define CONTEXT_i486 0x00010000 // i486 have identical context records
  1631. // end_wx86
  1632. #define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
  1633. #define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
  1634. #define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
  1635. #define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state
  1636. #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
  1637. #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L) // cpu specific extensions
  1638. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\
  1639. CONTEXT_SEGMENTS)
  1640. // begin_wx86
  1641. #endif
  1642. #define MAXIMUM_SUPPORTED_EXTENSION 512
  1643. typedef struct _FLOATING_SAVE_AREA {
  1644. DWORD ControlWord;
  1645. DWORD StatusWord;
  1646. DWORD TagWord;
  1647. DWORD ErrorOffset;
  1648. DWORD ErrorSelector;
  1649. DWORD DataOffset;
  1650. DWORD DataSelector;
  1651. BYTE RegisterArea[SIZE_OF_80387_REGISTERS];
  1652. DWORD Cr0NpxState;
  1653. } FLOATING_SAVE_AREA;
  1654. typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
  1655. //
  1656. // Context Frame
  1657. //
  1658. // This frame has a several purposes: 1) it is used as an argument to
  1659. // NtContinue, 2) is is used to constuct a call frame for APC delivery,
  1660. // and 3) it is used in the user level thread creation routines.
  1661. //
  1662. // The layout of the record conforms to a standard call frame.
  1663. //
  1664. typedef struct _CONTEXT {
  1665. //
  1666. // The flags values within this flag control the contents of
  1667. // a CONTEXT record.
  1668. //
  1669. // If the context record is used as an input parameter, then
  1670. // for each portion of the context record controlled by a flag
  1671. // whose value is set, it is assumed that that portion of the
  1672. // context record contains valid context. If the context record
  1673. // is being used to modify a threads context, then only that
  1674. // portion of the threads context will be modified.
  1675. //
  1676. // If the context record is used as an IN OUT parameter to capture
  1677. // the context of a thread, then only those portions of the thread's
  1678. // context corresponding to set flags will be returned.
  1679. //
  1680. // The context record is never used as an OUT only parameter.
  1681. //
  1682. DWORD ContextFlags;
  1683. //
  1684. // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
  1685. // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
  1686. // included in CONTEXT_FULL.
  1687. //
  1688. DWORD Dr0;
  1689. DWORD Dr1;
  1690. DWORD Dr2;
  1691. DWORD Dr3;
  1692. DWORD Dr6;
  1693. DWORD Dr7;
  1694. //
  1695. // This section is specified/returned if the
  1696. // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
  1697. //
  1698. FLOATING_SAVE_AREA FloatSave;
  1699. //
  1700. // This section is specified/returned if the
  1701. // ContextFlags word contians the flag CONTEXT_SEGMENTS.
  1702. //
  1703. DWORD SegGs;
  1704. DWORD SegFs;
  1705. DWORD SegEs;
  1706. DWORD SegDs;
  1707. //
  1708. // This section is specified/returned if the
  1709. // ContextFlags word contians the flag CONTEXT_INTEGER.
  1710. //
  1711. DWORD Edi;
  1712. DWORD Esi;
  1713. DWORD Ebx;
  1714. DWORD Edx;
  1715. DWORD Ecx;
  1716. DWORD Eax;
  1717. //
  1718. // This section is specified/returned if the
  1719. // ContextFlags word contians the flag CONTEXT_CONTROL.
  1720. //
  1721. DWORD Ebp;
  1722. DWORD Eip;
  1723. DWORD SegCs; // MUST BE SANITIZED
  1724. DWORD EFlags; // MUST BE SANITIZED
  1725. DWORD Esp;
  1726. DWORD SegSs;
  1727. //
  1728. // This section is specified/returned if the ContextFlags word
  1729. // contains the flag CONTEXT_EXTENDED_REGISTERS.
  1730. // The format and contexts are processor specific
  1731. //
  1732. BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
  1733. } CONTEXT;
  1734. typedef CONTEXT *PCONTEXT;
  1735. // begin_ntminiport
  1736. #endif //_X86_
  1737. #ifndef _LDT_ENTRY_DEFINED
  1738. #define _LDT_ENTRY_DEFINED
  1739. typedef struct _LDT_ENTRY {
  1740. WORD LimitLow;
  1741. WORD BaseLow;
  1742. union {
  1743. struct {
  1744. BYTE BaseMid;
  1745. BYTE Flags1; // Declare as bytes to avoid alignment
  1746. BYTE Flags2; // Problems.
  1747. BYTE BaseHi;
  1748. } Bytes;
  1749. struct {
  1750. DWORD BaseMid : 8;
  1751. DWORD Type : 5;
  1752. DWORD Dpl : 2;
  1753. DWORD Pres : 1;
  1754. DWORD LimitHi : 4;
  1755. DWORD Sys : 1;
  1756. DWORD Reserved_0 : 1;
  1757. DWORD Default_Big : 1;
  1758. DWORD Granularity : 1;
  1759. DWORD BaseHi : 8;
  1760. } Bits;
  1761. } HighWord;
  1762. } LDT_ENTRY, *PLDT_ENTRY;
  1763. #endif
  1764. #if defined(_MIPS_)
  1765. //
  1766. // Define functions to get the address of the current fiber and the
  1767. // current fiber data.
  1768. //
  1769. #define GetCurrentFiber() ((*(PNT_TIB *)0x7ffff4a8)->FiberData)
  1770. #define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
  1771. // begin_ntddk begin_nthal
  1772. //
  1773. // The following flags control the contents of the CONTEXT structure.
  1774. //
  1775. #if !defined(RC_INVOKED)
  1776. #define CONTEXT_R4000 0x00010000 // r4000 context
  1777. #define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001)
  1778. #define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002)
  1779. #define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004)
  1780. #define CONTEXT_EXTENDED_FLOAT (CONTEXT_FLOATING_POINT | 0x00000008)
  1781. #define CONTEXT_EXTENDED_INTEGER (CONTEXT_INTEGER | 0x00000010)
  1782. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | \
  1783. CONTEXT_INTEGER | CONTEXT_EXTENDED_INTEGER)
  1784. #endif
  1785. //
  1786. // Context Frame
  1787. //
  1788. // N.B. This frame must be exactly a multiple of 16 bytes in length.
  1789. //
  1790. // This frame has a several purposes: 1) it is used as an argument to
  1791. // NtContinue, 2) it is used to constuct a call frame for APC delivery,
  1792. // 3) it is used to construct a call frame for exception dispatching
  1793. // in user mode, and 4) it is used in the user level thread creation
  1794. // routines.
  1795. //
  1796. // The layout of the record conforms to a standard call frame.
  1797. //
  1798. typedef struct _CONTEXT {
  1799. //
  1800. // This section is always present and is used as an argument build
  1801. // area.
  1802. //
  1803. // N.B. Context records are 0 mod 8 aligned starting with NT 4.0.
  1804. //
  1805. union {
  1806. DWORD Argument[4];
  1807. ULONGLONG Alignment;
  1808. };
  1809. //
  1810. // The following union defines the 32-bit and 64-bit register context.
  1811. //
  1812. union {
  1813. //
  1814. // 32-bit context.
  1815. //
  1816. struct {
  1817. //
  1818. // This section is specified/returned if the ContextFlags contains
  1819. // the flag CONTEXT_FLOATING_POINT.
  1820. //
  1821. // N.B. This section contains the 16 double floating registers f0,
  1822. // f2, ..., f30.
  1823. //
  1824. DWORD FltF0;
  1825. DWORD FltF1;
  1826. DWORD FltF2;
  1827. DWORD FltF3;
  1828. DWORD FltF4;
  1829. DWORD FltF5;
  1830. DWORD FltF6;
  1831. DWORD FltF7;
  1832. DWORD FltF8;
  1833. DWORD FltF9;
  1834. DWORD FltF10;
  1835. DWORD FltF11;
  1836. DWORD FltF12;
  1837. DWORD FltF13;
  1838. DWORD FltF14;
  1839. DWORD FltF15;
  1840. DWORD FltF16;
  1841. DWORD FltF17;
  1842. DWORD FltF18;
  1843. DWORD FltF19;
  1844. DWORD FltF20;
  1845. DWORD FltF21;
  1846. DWORD FltF22;
  1847. DWORD FltF23;
  1848. DWORD FltF24;
  1849. DWORD FltF25;
  1850. DWORD FltF26;
  1851. DWORD FltF27;
  1852. DWORD FltF28;
  1853. DWORD FltF29;
  1854. DWORD FltF30;
  1855. DWORD FltF31;
  1856. //
  1857. // This section is specified/returned if the ContextFlags contains
  1858. // the flag CONTEXT_INTEGER.
  1859. //
  1860. // N.B. The registers gp, sp, and ra are defined in this section,
  1861. // but are considered part of the control context rather than
  1862. // part of the integer context.
  1863. //
  1864. // N.B. Register zero is not stored in the frame.
  1865. //
  1866. DWORD IntZero;
  1867. DWORD IntAt;
  1868. DWORD IntV0;
  1869. DWORD IntV1;
  1870. DWORD IntA0;
  1871. DWORD IntA1;
  1872. DWORD IntA2;
  1873. DWORD IntA3;
  1874. DWORD IntT0;
  1875. DWORD IntT1;
  1876. DWORD IntT2;
  1877. DWORD IntT3;
  1878. DWORD IntT4;
  1879. DWORD IntT5;
  1880. DWORD IntT6;
  1881. DWORD IntT7;
  1882. DWORD IntS0;
  1883. DWORD IntS1;
  1884. DWORD IntS2;
  1885. DWORD IntS3;
  1886. DWORD IntS4;
  1887. DWORD IntS5;
  1888. DWORD IntS6;
  1889. DWORD IntS7;
  1890. DWORD IntT8;
  1891. DWORD IntT9;
  1892. DWORD IntK0;
  1893. DWORD IntK1;
  1894. DWORD IntGp;
  1895. DWORD IntSp;
  1896. DWORD IntS8;
  1897. DWORD IntRa;
  1898. DWORD IntLo;
  1899. DWORD IntHi;
  1900. //
  1901. // This section is specified/returned if the ContextFlags word contains
  1902. // the flag CONTEXT_FLOATING_POINT.
  1903. //
  1904. DWORD Fsr;
  1905. //
  1906. // This section is specified/returned if the ContextFlags word contains
  1907. // the flag CONTEXT_CONTROL.
  1908. //
  1909. // N.B. The registers gp, sp, and ra are defined in the integer section,
  1910. // but are considered part of the control context rather than part of
  1911. // the integer context.
  1912. //
  1913. DWORD Fir;
  1914. DWORD Psr;
  1915. //
  1916. // The flags values within this flag control the contents of
  1917. // a CONTEXT record.
  1918. //
  1919. // If the context record is used as an input parameter, then
  1920. // for each portion of the context record controlled by a flag
  1921. // whose value is set, it is assumed that that portion of the
  1922. // context record contains valid context. If the context record
  1923. // is being used to modify a thread's context, then only that
  1924. // portion of the threads context will be modified.
  1925. //
  1926. // If the context record is used as an IN OUT parameter to capture
  1927. // the context of a thread, then only those portions of the thread's
  1928. // context corresponding to set flags will be returned.
  1929. //
  1930. // The context record is never used as an OUT only parameter.
  1931. //
  1932. DWORD ContextFlags;
  1933. };
  1934. //
  1935. // 64-bit context.
  1936. //
  1937. struct {
  1938. //
  1939. // This section is specified/returned if the ContextFlags contains
  1940. // the flag CONTEXT_EXTENDED_FLOAT.
  1941. //
  1942. // N.B. This section contains the 32 double floating registers f0,
  1943. // f1, ..., f31.
  1944. //
  1945. ULONGLONG XFltF0;
  1946. ULONGLONG XFltF1;
  1947. ULONGLONG XFltF2;
  1948. ULONGLONG XFltF3;
  1949. ULONGLONG XFltF4;
  1950. ULONGLONG XFltF5;
  1951. ULONGLONG XFltF6;
  1952. ULONGLONG XFltF7;
  1953. ULONGLONG XFltF8;
  1954. ULONGLONG XFltF9;
  1955. ULONGLONG XFltF10;
  1956. ULONGLONG XFltF11;
  1957. ULONGLONG XFltF12;
  1958. ULONGLONG XFltF13;
  1959. ULONGLONG XFltF14;
  1960. ULONGLONG XFltF15;
  1961. ULONGLONG XFltF16;
  1962. ULONGLONG XFltF17;
  1963. ULONGLONG XFltF18;
  1964. ULONGLONG XFltF19;
  1965. ULONGLONG XFltF20;
  1966. ULONGLONG XFltF21;
  1967. ULONGLONG XFltF22;
  1968. ULONGLONG XFltF23;
  1969. ULONGLONG XFltF24;
  1970. ULONGLONG XFltF25;
  1971. ULONGLONG XFltF26;
  1972. ULONGLONG XFltF27;
  1973. ULONGLONG XFltF28;
  1974. ULONGLONG XFltF29;
  1975. ULONGLONG XFltF30;
  1976. ULONGLONG XFltF31;
  1977. //
  1978. // The following sections must exactly overlay the 32-bit context.
  1979. //
  1980. DWORD Fill1;
  1981. DWORD Fill2;
  1982. //
  1983. // This section is specified/returned if the ContextFlags contains
  1984. // the flag CONTEXT_FLOATING_POINT.
  1985. //
  1986. DWORD XFsr;
  1987. //
  1988. // This section is specified/returned if the ContextFlags contains
  1989. // the flag CONTEXT_CONTROL.
  1990. //
  1991. // N.B. The registers gp, sp, and ra are defined in the integer
  1992. // section, but are considered part of the control context
  1993. // rather than part of the integer context.
  1994. //
  1995. DWORD XFir;
  1996. DWORD XPsr;
  1997. //
  1998. // The flags values within this flag control the contents of
  1999. // a CONTEXT record.
  2000. //
  2001. // If the context record is used as an input parameter, then
  2002. // for each portion of the context record controlled by a flag
  2003. // whose value is set, it is assumed that that portion of the
  2004. // context record contains valid context. If the context record
  2005. // is being used to modify a thread's context, then only that
  2006. // portion of the threads context will be modified.
  2007. //
  2008. // If the context record is used as an IN OUT parameter to capture
  2009. // the context of a thread, then only those portions of the thread's
  2010. // context corresponding to set flags will be returned.
  2011. //
  2012. // The context record is never used as an OUT only parameter.
  2013. //
  2014. DWORD XContextFlags;
  2015. //
  2016. // This section is specified/returned if the ContextFlags contains
  2017. // the flag CONTEXT_EXTENDED_INTEGER.
  2018. //
  2019. // N.B. The registers gp, sp, and ra are defined in this section,
  2020. // but are considered part of the control context rather than
  2021. // part of the integer context.
  2022. //
  2023. // N.B. Register zero is not stored in the frame.
  2024. //
  2025. ULONGLONG XIntZero;
  2026. ULONGLONG XIntAt;
  2027. ULONGLONG XIntV0;
  2028. ULONGLONG XIntV1;
  2029. ULONGLONG XIntA0;
  2030. ULONGLONG XIntA1;
  2031. ULONGLONG XIntA2;
  2032. ULONGLONG XIntA3;
  2033. ULONGLONG XIntT0;
  2034. ULONGLONG XIntT1;
  2035. ULONGLONG XIntT2;
  2036. ULONGLONG XIntT3;
  2037. ULONGLONG XIntT4;
  2038. ULONGLONG XIntT5;
  2039. ULONGLONG XIntT6;
  2040. ULONGLONG XIntT7;
  2041. ULONGLONG XIntS0;
  2042. ULONGLONG XIntS1;
  2043. ULONGLONG XIntS2;
  2044. ULONGLONG XIntS3;
  2045. ULONGLONG XIntS4;
  2046. ULONGLONG XIntS5;
  2047. ULONGLONG XIntS6;
  2048. ULONGLONG XIntS7;
  2049. ULONGLONG XIntT8;
  2050. ULONGLONG XIntT9;
  2051. ULONGLONG XIntK0;
  2052. ULONGLONG XIntK1;
  2053. ULONGLONG XIntGp;
  2054. ULONGLONG XIntSp;
  2055. ULONGLONG XIntS8;
  2056. ULONGLONG XIntRa;
  2057. ULONGLONG XIntLo;
  2058. ULONGLONG XIntHi;
  2059. };
  2060. };
  2061. } CONTEXT, *PCONTEXT;
  2062. // end_ntddk end_nthal
  2063. #define CONTEXT32_LENGTH 0x130 // The original 32-bit Context length (pre NT 4.0)
  2064. #endif // MIPS
  2065. #if defined(_MIPS_)
  2066. VOID
  2067. __jump_unwind (
  2068. PVOID Fp,
  2069. PVOID TargetPc
  2070. );
  2071. #endif // MIPS
  2072. #if defined(_PPC_)
  2073. //
  2074. // The address of the TEB is placed into GPR 13 at context switch time
  2075. // and should never be destroyed. To get the address of the TEB use
  2076. // the compiler intrinsic to access it directly from GPR 13.
  2077. //
  2078. #if defined(_M_PPC) && defined(_MSC_VER) && (_MSC_VER>=1000)
  2079. unsigned __gregister_get( unsigned const regnum );
  2080. #define NtCurrentTeb() ((struct _TEB *)__gregister_get(13))
  2081. #elif defined(_M_PPC)
  2082. struct _TEB * __builtin_get_gpr13(VOID);
  2083. #define NtCurrentTeb() ((struct _TEB *)__builtin_get_gpr13())
  2084. #endif
  2085. //
  2086. // Define functions to get the address of the current fiber and the
  2087. // current fiber data.
  2088. //
  2089. #define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
  2090. #define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
  2091. // begin_ntddk begin_nthal
  2092. //
  2093. // The following flags control the contents of the CONTEXT structure.
  2094. //
  2095. #if !defined(RC_INVOKED)
  2096. #define CONTEXT_CONTROL 0x00000001L
  2097. #define CONTEXT_FLOATING_POINT 0x00000002L
  2098. #define CONTEXT_INTEGER 0x00000004L
  2099. #define CONTEXT_DEBUG_REGISTERS 0x00000008L
  2100. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  2101. #endif
  2102. //
  2103. // Context Frame
  2104. //
  2105. // N.B. This frame must be exactly a multiple of 16 bytes in length.
  2106. //
  2107. // This frame has a several purposes: 1) it is used as an argument to
  2108. // NtContinue, 2) it is used to constuct a call frame for APC delivery,
  2109. // 3) it is used to construct a call frame for exception dispatching
  2110. // in user mode, and 4) it is used in the user level thread creation
  2111. // routines.
  2112. //
  2113. // Requires at least 8-byte alignment (double)
  2114. //
  2115. typedef struct _CONTEXT {
  2116. //
  2117. // This section is specified/returned if the ContextFlags word contains
  2118. // the flag CONTEXT_FLOATING_POINT.
  2119. //
  2120. double Fpr0; // Floating registers 0..31
  2121. double Fpr1;
  2122. double Fpr2;
  2123. double Fpr3;
  2124. double Fpr4;
  2125. double Fpr5;
  2126. double Fpr6;
  2127. double Fpr7;
  2128. double Fpr8;
  2129. double Fpr9;
  2130. double Fpr10;
  2131. double Fpr11;
  2132. double Fpr12;
  2133. double Fpr13;
  2134. double Fpr14;
  2135. double Fpr15;
  2136. double Fpr16;
  2137. double Fpr17;
  2138. double Fpr18;
  2139. double Fpr19;
  2140. double Fpr20;
  2141. double Fpr21;
  2142. double Fpr22;
  2143. double Fpr23;
  2144. double Fpr24;
  2145. double Fpr25;
  2146. double Fpr26;
  2147. double Fpr27;
  2148. double Fpr28;
  2149. double Fpr29;
  2150. double Fpr30;
  2151. double Fpr31;
  2152. double Fpscr; // Floating point status/control reg
  2153. //
  2154. // This section is specified/returned if the ContextFlags word contains
  2155. // the flag CONTEXT_INTEGER.
  2156. //
  2157. DWORD Gpr0; // General registers 0..31
  2158. DWORD Gpr1;
  2159. DWORD Gpr2;
  2160. DWORD Gpr3;
  2161. DWORD Gpr4;
  2162. DWORD Gpr5;
  2163. DWORD Gpr6;
  2164. DWORD Gpr7;
  2165. DWORD Gpr8;
  2166. DWORD Gpr9;
  2167. DWORD Gpr10;
  2168. DWORD Gpr11;
  2169. DWORD Gpr12;
  2170. DWORD Gpr13;
  2171. DWORD Gpr14;
  2172. DWORD Gpr15;
  2173. DWORD Gpr16;
  2174. DWORD Gpr17;
  2175. DWORD Gpr18;
  2176. DWORD Gpr19;
  2177. DWORD Gpr20;
  2178. DWORD Gpr21;
  2179. DWORD Gpr22;
  2180. DWORD Gpr23;
  2181. DWORD Gpr24;
  2182. DWORD Gpr25;
  2183. DWORD Gpr26;
  2184. DWORD Gpr27;
  2185. DWORD Gpr28;
  2186. DWORD Gpr29;
  2187. DWORD Gpr30;
  2188. DWORD Gpr31;
  2189. DWORD Cr; // Condition register
  2190. DWORD Xer; // Fixed point exception register
  2191. //
  2192. // This section is specified/returned if the ContextFlags word contains
  2193. // the flag CONTEXT_CONTROL.
  2194. //
  2195. DWORD Msr; // Machine status register
  2196. DWORD Iar; // Instruction address register
  2197. DWORD Lr; // Link register
  2198. DWORD Ctr; // Count register
  2199. //
  2200. // The flags values within this flag control the contents of
  2201. // a CONTEXT record.
  2202. //
  2203. // If the context record is used as an input parameter, then
  2204. // for each portion of the context record controlled by a flag
  2205. // whose value is set, it is assumed that that portion of the
  2206. // context record contains valid context. If the context record
  2207. // is being used to modify a thread's context, then only that
  2208. // portion of the threads context will be modified.
  2209. //
  2210. // If the context record is used as an IN OUT parameter to capture
  2211. // the context of a thread, then only those portions of the thread's
  2212. // context corresponding to set flags will be returned.
  2213. //
  2214. // The context record is never used as an OUT only parameter.
  2215. //
  2216. DWORD ContextFlags;
  2217. DWORD Fill[3]; // Pad out to multiple of 16 bytes
  2218. //
  2219. // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
  2220. // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
  2221. // included in CONTEXT_FULL.
  2222. //
  2223. DWORD Dr0; // Breakpoint Register 1
  2224. DWORD Dr1; // Breakpoint Register 2
  2225. DWORD Dr2; // Breakpoint Register 3
  2226. DWORD Dr3; // Breakpoint Register 4
  2227. DWORD Dr4; // Breakpoint Register 5
  2228. DWORD Dr5; // Breakpoint Register 6
  2229. DWORD Dr6; // Debug Status Register
  2230. DWORD Dr7; // Debug Control Register
  2231. } CONTEXT, *PCONTEXT;
  2232. // end_ntddk end_nthal
  2233. //
  2234. // Stack frame header
  2235. //
  2236. // Order of appearance in stack frame:
  2237. // Header (six words)
  2238. // Parameters (at least eight words)
  2239. // Local variables
  2240. // Saved GPRs
  2241. // Saved FPRs
  2242. //
  2243. // Minimum alignment is 8 bytes
  2244. typedef struct _STACK_FRAME_HEADER { // GPR 1 points here
  2245. DWORD BackChain; // Addr of previous frame
  2246. DWORD GlueSaved1; // Used by glue code
  2247. DWORD GlueSaved2;
  2248. DWORD Reserved1; // Reserved
  2249. DWORD Spare1; // Used by tracing, profiling, ...
  2250. DWORD Spare2;
  2251. DWORD Parameter0; // First 8 parameter words are
  2252. DWORD Parameter1; // always present
  2253. DWORD Parameter2;
  2254. DWORD Parameter3;
  2255. DWORD Parameter4;
  2256. DWORD Parameter5;
  2257. DWORD Parameter6;
  2258. DWORD Parameter7;
  2259. } STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
  2260. VOID
  2261. __jump_unwind (
  2262. PVOID Fp,
  2263. PVOID TargetPc
  2264. );
  2265. #endif // defined(_PPC_)
  2266. #if defined(_MPPC_)
  2267. //
  2268. // The address of the TEB is placed into GPR 13 at context switch time
  2269. // and should never be destroyed. To get the address of the TEB use
  2270. // the compiler intrinsic to access it directly from GPR 13.
  2271. //
  2272. #if defined(_M_PPC) && defined(_MSC_VER) && (_MSC_VER>=1000)
  2273. unsigned __gregister_get( unsigned const regnum );
  2274. #define NtCurrentTeb() ((struct _TEB *)__gregister_get(13))
  2275. #elif defined(_M_PPC)
  2276. struct _TEB * __builtin_get_gpr13(VOID);
  2277. #define NtCurrentTeb() ((struct _TEB *)__builtin_get_gpr13())
  2278. #endif
  2279. //
  2280. // Define functions to get the address of the current fiber and the
  2281. // current fiber data.
  2282. //
  2283. #define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
  2284. #define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
  2285. // begin_ntddk begin_nthal
  2286. //
  2287. // The following flags control the contents of the CONTEXT structure.
  2288. //
  2289. #if !defined(RC_INVOKED)
  2290. #define CONTEXT_CONTROL 0x00000001L
  2291. #define CONTEXT_FLOATING_POINT 0x00000002L
  2292. #define CONTEXT_INTEGER 0x00000004L
  2293. #define CONTEXT_DEBUG_REGISTERS 0x00000008L
  2294. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
  2295. #endif
  2296. //
  2297. // Context Frame
  2298. //
  2299. // N.B. This frame must be exactly a multiple of 16 bytes in length.
  2300. //
  2301. // This frame has a several purposes: 1) it is used as an argument to
  2302. // NtContinue, 2) it is used to constuct a call frame for APC delivery,
  2303. // 3) it is used to construct a call frame for exception dispatching
  2304. // in user mode, and 4) it is used in the user level thread creation
  2305. // routines.
  2306. //
  2307. // Requires at least 8-byte alignment (double)
  2308. //
  2309. typedef struct _CONTEXT {
  2310. //
  2311. // This section is specified/returned if the ContextFlags word contains
  2312. // the flag CONTEXT_FLOATING_POINT.
  2313. //
  2314. double Fpr0; // Floating registers 0..31
  2315. double Fpr1;
  2316. double Fpr2;
  2317. double Fpr3;
  2318. double Fpr4;
  2319. double Fpr5;
  2320. double Fpr6;
  2321. double Fpr7;
  2322. double Fpr8;
  2323. double Fpr9;
  2324. double Fpr10;
  2325. double Fpr11;
  2326. double Fpr12;
  2327. double Fpr13;
  2328. double Fpr14;
  2329. double Fpr15;
  2330. double Fpr16;
  2331. double Fpr17;
  2332. double Fpr18;
  2333. double Fpr19;
  2334. double Fpr20;
  2335. double Fpr21;
  2336. double Fpr22;
  2337. double Fpr23;
  2338. double Fpr24;
  2339. double Fpr25;
  2340. double Fpr26;
  2341. double Fpr27;
  2342. double Fpr28;
  2343. double Fpr29;
  2344. double Fpr30;
  2345. double Fpr31;
  2346. double Fpscr; // Floating point status/control reg
  2347. //
  2348. // This section is specified/returned if the ContextFlags word contains
  2349. // the flag CONTEXT_INTEGER.
  2350. //
  2351. DWORD Gpr0; // General registers 0..31
  2352. DWORD Gpr1;
  2353. DWORD Gpr2;
  2354. DWORD Gpr3;
  2355. DWORD Gpr4;
  2356. DWORD Gpr5;
  2357. DWORD Gpr6;
  2358. DWORD Gpr7;
  2359. DWORD Gpr8;
  2360. DWORD Gpr9;
  2361. DWORD Gpr10;
  2362. DWORD Gpr11;
  2363. DWORD Gpr12;
  2364. DWORD Gpr13;
  2365. DWORD Gpr14;
  2366. DWORD Gpr15;
  2367. DWORD Gpr16;
  2368. DWORD Gpr17;
  2369. DWORD Gpr18;
  2370. DWORD Gpr19;
  2371. DWORD Gpr20;
  2372. DWORD Gpr21;
  2373. DWORD Gpr22;
  2374. DWORD Gpr23;
  2375. DWORD Gpr24;
  2376. DWORD Gpr25;
  2377. DWORD Gpr26;
  2378. DWORD Gpr27;
  2379. DWORD Gpr28;
  2380. DWORD Gpr29;
  2381. DWORD Gpr30;
  2382. DWORD Gpr31;
  2383. DWORD Cr; // Condition register
  2384. DWORD Xer; // Fixed point exception register
  2385. //
  2386. // This section is specified/returned if the ContextFlags word contains
  2387. // the flag CONTEXT_CONTROL.
  2388. //
  2389. DWORD Msr; // Machine status register
  2390. DWORD Iar; // Instruction address register
  2391. DWORD Lr; // Link register
  2392. DWORD Ctr; // Count register
  2393. //
  2394. // The flags values within this flag control the contents of
  2395. // a CONTEXT record.
  2396. //
  2397. // If the context record is used as an input parameter, then
  2398. // for each portion of the context record controlled by a flag
  2399. // whose value is set, it is assumed that that portion of the
  2400. // context record contains valid context. If the context record
  2401. // is being used to modify a thread's context, then only that
  2402. // portion of the threads context will be modified.
  2403. //
  2404. // If the context record is used as an IN OUT parameter to capture
  2405. // the context of a thread, then only those portions of the thread's
  2406. // context corresponding to set flags will be returned.
  2407. //
  2408. // The context record is never used as an OUT only parameter.
  2409. //
  2410. DWORD ContextFlags;
  2411. DWORD Fill[3]; // Pad out to multiple of 16 bytes
  2412. //
  2413. // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
  2414. // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
  2415. // included in CONTEXT_FULL.
  2416. //
  2417. DWORD Dr0; // Breakpoint Register 1
  2418. DWORD Dr1; // Breakpoint Register 2
  2419. DWORD Dr2; // Breakpoint Register 3
  2420. DWORD Dr3; // Breakpoint Register 4
  2421. DWORD Dr4; // Breakpoint Register 5
  2422. DWORD Dr5; // Breakpoint Register 6
  2423. DWORD Dr6; // Debug Status Register
  2424. DWORD Dr7; // Debug Control Register
  2425. } CONTEXT, *PCONTEXT;
  2426. // end_ntddk end_nthal
  2427. //
  2428. // Stack frame header
  2429. //
  2430. // Order of appearance in stack frame:
  2431. // Header (six words)
  2432. // Parameters (at least eight words)
  2433. // Local variables
  2434. // Saved GPRs
  2435. // Saved FPRs
  2436. //
  2437. // Minimum alignment is 8 bytes
  2438. typedef struct _STACK_FRAME_HEADER { // GPR 1 points here
  2439. DWORD BackChain; // Addr of previous frame
  2440. DWORD GlueSaved1; // Used by glue code
  2441. DWORD GlueSaved2;
  2442. DWORD Reserved1; // Reserved
  2443. DWORD Spare1; // Used by tracing, profiling, ...
  2444. DWORD Spare2;
  2445. DWORD Parameter0; // First 8 parameter words are
  2446. DWORD Parameter1; // always present
  2447. DWORD Parameter2;
  2448. DWORD Parameter3;
  2449. DWORD Parameter4;
  2450. DWORD Parameter5;
  2451. DWORD Parameter6;
  2452. DWORD Parameter7;
  2453. } STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
  2454. VOID
  2455. __jump_unwind (
  2456. PVOID Fp,
  2457. PVOID TargetPc
  2458. );
  2459. #endif // defined(_MPPC_)
  2460. #if !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_IA64_)
  2461. void * _cdecl _rdteb(void);
  2462. #if defined(_M_IA64) // winnt
  2463. #pragma intrinsic(_rdteb) // winnt
  2464. #endif // winnt
  2465. #if defined(_M_IA64)
  2466. #define NtCurrentTeb() ((struct _TEB *)_rdteb())
  2467. #else
  2468. struct _TEB *
  2469. NtCurrentTeb(void);
  2470. #endif
  2471. //
  2472. // Define functions to get the address of the current fiber and the
  2473. // current fiber data.
  2474. //
  2475. #define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
  2476. #define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
  2477. #endif // !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_M_IA64)
  2478. #ifdef _IA64_
  2479. // begin_ntddk begin_nthal
  2480. //
  2481. // The following flags control the contents of the CONTEXT structure.
  2482. //
  2483. #if !defined(RC_INVOKED)
  2484. #define CONTEXT_IA64 0x00080000
  2485. #define CONTEXT_CONTROL (CONTEXT_IA64 | 0x00000001L)
  2486. #define CONTEXT_LOWER_FLOATING_POINT (CONTEXT_IA64 | 0x00000002L)
  2487. #define CONTEXT_HIGHER_FLOATING_POINT (CONTEXT_IA64 | 0x00000004L)
  2488. #define CONTEXT_INTEGER (CONTEXT_IA64 | 0x00000008L)
  2489. #define CONTEXT_DEBUG (CONTEXT_IA64 | 0x00000010L)
  2490. #define CONTEXT_IA32_CONTROL (CONTEXT_IA64 | 0x00000020L) // Includes StIPSR
  2491. #define CONTEXT_FLOATING_POINT (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT)
  2492. #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL)
  2493. #endif // !defined(RC_INVOKED)
  2494. //
  2495. // Context Frame
  2496. //
  2497. // This frame has a several purposes: 1) it is used as an argument to
  2498. // NtContinue, 2) it is used to construct a call frame for APC delivery,
  2499. // 3) it is used to construct a call frame for exception dispatching
  2500. // in user mode, 4) it is used in the user level thread creation
  2501. // routines, and 5) it is used to to pass thread state to debuggers.
  2502. //
  2503. // N.B. Because this record is used as a call frame, it must be EXACTLY
  2504. // a multiple of 16 bytes in length and aligned on a 16-byte boundary.
  2505. //
  2506. typedef struct _CONTEXT {
  2507. //
  2508. // The flags values within this flag control the contents of
  2509. // a CONTEXT record.
  2510. //
  2511. // If the context record is used as an input parameter, then
  2512. // for each portion of the context record controlled by a flag
  2513. // whose value is set, it is assumed that that portion of the
  2514. // context record contains valid context. If the context record
  2515. // is being used to modify a thread's context, then only that
  2516. // portion of the threads context will be modified.
  2517. //
  2518. // If the context record is used as an IN OUT parameter to capture
  2519. // the context of a thread, then only those portions of the thread's
  2520. // context corresponding to set flags will be returned.
  2521. //
  2522. // The context record is never used as an OUT only parameter.
  2523. //
  2524. DWORD ContextFlags;
  2525. DWORD Fill1[3]; // for alignment of following on 16-byte boundary
  2526. //
  2527. // This section is specified/returned if the ContextFlags word contains
  2528. // the flag CONTEXT_DEBUG.
  2529. //
  2530. // N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL.
  2531. //
  2532. ULONGLONG DbI0;
  2533. ULONGLONG DbI1;
  2534. ULONGLONG DbI2;
  2535. ULONGLONG DbI3;
  2536. ULONGLONG DbI4;
  2537. ULONGLONG DbI5;
  2538. ULONGLONG DbI6;
  2539. ULONGLONG DbI7;
  2540. ULONGLONG DbD0;
  2541. ULONGLONG DbD1;
  2542. ULONGLONG DbD2;
  2543. ULONGLONG DbD3;
  2544. ULONGLONG DbD4;
  2545. ULONGLONG DbD5;
  2546. ULONGLONG DbD6;
  2547. ULONGLONG DbD7;
  2548. //
  2549. // This section is specified/returned if the ContextFlags word contains
  2550. // the flag CONTEXT_LOWER_FLOATING_POINT.
  2551. //
  2552. FLOAT128 FltS0;
  2553. FLOAT128 FltS1;
  2554. FLOAT128 FltS2;
  2555. FLOAT128 FltS3;
  2556. FLOAT128 FltT0;
  2557. FLOAT128 FltT1;
  2558. FLOAT128 FltT2;
  2559. FLOAT128 FltT3;
  2560. FLOAT128 FltT4;
  2561. FLOAT128 FltT5;
  2562. FLOAT128 FltT6;
  2563. FLOAT128 FltT7;
  2564. FLOAT128 FltT8;
  2565. FLOAT128 FltT9;
  2566. //
  2567. // This section is specified/returned if the ContextFlags word contains
  2568. // the flag CONTEXT_HIGHER_FLOATING_POINT.
  2569. //
  2570. FLOAT128 FltS4;
  2571. FLOAT128 FltS5;
  2572. FLOAT128 FltS6;
  2573. FLOAT128 FltS7;
  2574. FLOAT128 FltS8;
  2575. FLOAT128 FltS9;
  2576. FLOAT128 FltS10;
  2577. FLOAT128 FltS11;
  2578. FLOAT128 FltS12;
  2579. FLOAT128 FltS13;
  2580. FLOAT128 FltS14;
  2581. FLOAT128 FltS15;
  2582. FLOAT128 FltS16;
  2583. FLOAT128 FltS17;
  2584. FLOAT128 FltS18;
  2585. FLOAT128 FltS19;
  2586. FLOAT128 FltF32;
  2587. FLOAT128 FltF33;
  2588. FLOAT128 FltF34;
  2589. FLOAT128 FltF35;
  2590. FLOAT128 FltF36;
  2591. FLOAT128 FltF37;
  2592. FLOAT128 FltF38;
  2593. FLOAT128 FltF39;
  2594. FLOAT128 FltF40;
  2595. FLOAT128 FltF41;
  2596. FLOAT128 FltF42;
  2597. FLOAT128 FltF43;
  2598. FLOAT128 FltF44;
  2599. FLOAT128 FltF45;
  2600. FLOAT128 FltF46;
  2601. FLOAT128 FltF47;
  2602. FLOAT128 FltF48;
  2603. FLOAT128 FltF49;
  2604. FLOAT128 FltF50;
  2605. FLOAT128 FltF51;
  2606. FLOAT128 FltF52;
  2607. FLOAT128 FltF53;
  2608. FLOAT128 FltF54;
  2609. FLOAT128 FltF55;
  2610. FLOAT128 FltF56;
  2611. FLOAT128 FltF57;
  2612. FLOAT128 FltF58;
  2613. FLOAT128 FltF59;
  2614. FLOAT128 FltF60;
  2615. FLOAT128 FltF61;
  2616. FLOAT128 FltF62;
  2617. FLOAT128 FltF63;
  2618. FLOAT128 FltF64;
  2619. FLOAT128 FltF65;
  2620. FLOAT128 FltF66;
  2621. FLOAT128 FltF67;
  2622. FLOAT128 FltF68;
  2623. FLOAT128 FltF69;
  2624. FLOAT128 FltF70;
  2625. FLOAT128 FltF71;
  2626. FLOAT128 FltF72;
  2627. FLOAT128 FltF73;
  2628. FLOAT128 FltF74;
  2629. FLOAT128 FltF75;
  2630. FLOAT128 FltF76;
  2631. FLOAT128 FltF77;
  2632. FLOAT128 FltF78;
  2633. FLOAT128 FltF79;
  2634. FLOAT128 FltF80;
  2635. FLOAT128 FltF81;
  2636. FLOAT128 FltF82;
  2637. FLOAT128 FltF83;
  2638. FLOAT128 FltF84;
  2639. FLOAT128 FltF85;
  2640. FLOAT128 FltF86;
  2641. FLOAT128 FltF87;
  2642. FLOAT128 FltF88;
  2643. FLOAT128 FltF89;
  2644. FLOAT128 FltF90;
  2645. FLOAT128 FltF91;
  2646. FLOAT128 FltF92;
  2647. FLOAT128 FltF93;
  2648. FLOAT128 FltF94;
  2649. FLOAT128 FltF95;
  2650. FLOAT128 FltF96;
  2651. FLOAT128 FltF97;
  2652. FLOAT128 FltF98;
  2653. FLOAT128 FltF99;
  2654. FLOAT128 FltF100;
  2655. FLOAT128 FltF101;
  2656. FLOAT128 FltF102;
  2657. FLOAT128 FltF103;
  2658. FLOAT128 FltF104;
  2659. FLOAT128 FltF105;
  2660. FLOAT128 FltF106;
  2661. FLOAT128 FltF107;
  2662. FLOAT128 FltF108;
  2663. FLOAT128 FltF109;
  2664. FLOAT128 FltF110;
  2665. FLOAT128 FltF111;
  2666. FLOAT128 FltF112;
  2667. FLOAT128 FltF113;
  2668. FLOAT128 FltF114;
  2669. FLOAT128 FltF115;
  2670. FLOAT128 FltF116;
  2671. FLOAT128 FltF117;
  2672. FLOAT128 FltF118;
  2673. FLOAT128 FltF119;
  2674. FLOAT128 FltF120;
  2675. FLOAT128 FltF121;
  2676. FLOAT128 FltF122;
  2677. FLOAT128 FltF123;
  2678. FLOAT128 FltF124;
  2679. FLOAT128 FltF125;
  2680. FLOAT128 FltF126;
  2681. FLOAT128 FltF127;
  2682. //
  2683. // This section is specified/returned if the ContextFlags word contains
  2684. // the flag CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT | CONTEXT_CONTROL.
  2685. //
  2686. ULONGLONG StFPSR; // FP status
  2687. //
  2688. // This section is specified/returned if the ContextFlags word contains
  2689. // the flag CONTEXT_INTEGER.
  2690. //
  2691. // N.B. The registers gp, sp, rp are part of the control context
  2692. //
  2693. ULONGLONG IntGp; // r1, volatile
  2694. ULONGLONG IntT0; // r2-r3, volatile
  2695. ULONGLONG IntT1; //
  2696. ULONGLONG IntS0; // r4-r7, preserved
  2697. ULONGLONG IntS1;
  2698. ULONGLONG IntS2;
  2699. ULONGLONG IntS3;
  2700. ULONGLONG IntV0; // r8, volatile
  2701. ULONGLONG IntT2; // r9-r11, volatile
  2702. ULONGLONG IntT3;
  2703. ULONGLONG IntT4;
  2704. ULONGLONG IntSp; // stack pointer (r12), special
  2705. ULONGLONG IntTeb; // teb (r13), special
  2706. ULONGLONG IntT5; // r14-r31, volatile
  2707. ULONGLONG IntT6;
  2708. ULONGLONG IntT7;
  2709. ULONGLONG IntT8;
  2710. ULONGLONG IntT9;
  2711. ULONGLONG IntT10;
  2712. ULONGLONG IntT11;
  2713. ULONGLONG IntT12;
  2714. ULONGLONG IntT13;
  2715. ULONGLONG IntT14;
  2716. ULONGLONG IntT15;
  2717. ULONGLONG IntT16;
  2718. ULONGLONG IntT17;
  2719. ULONGLONG IntT18;
  2720. ULONGLONG IntT19;
  2721. ULONGLONG IntT20;
  2722. ULONGLONG IntT21;
  2723. ULONGLONG IntT22;
  2724. ULONGLONG IntNats; // Nat bits for r1-r31
  2725. // r1-r31 in bits 1 thru 31.
  2726. ULONGLONG Preds; // predicates, preserved
  2727. ULONGLONG BrRp; // return pointer, b0, preserved
  2728. ULONGLONG BrS0; // b1-b5, preserved
  2729. ULONGLONG BrS1;
  2730. ULONGLONG BrS2;
  2731. ULONGLONG BrS3;
  2732. ULONGLONG BrS4;
  2733. ULONGLONG BrT0; // b6-b7, volatile
  2734. ULONGLONG BrT1;
  2735. //
  2736. // This section is specified/returned if the ContextFlags word contains
  2737. // the flag CONTEXT_CONTROL.
  2738. //
  2739. // Other application registers
  2740. ULONGLONG ApUNAT; // User Nat collection register, preserved
  2741. ULONGLONG ApLC; // Loop counter register, preserved
  2742. ULONGLONG ApEC; // Epilog counter register, preserved
  2743. ULONGLONG ApCCV; // CMPXCHG value register, volatile
  2744. ULONGLONG ApDCR; // Default control register (TBD)
  2745. // Register stack info
  2746. ULONGLONG RsPFS; // Previous function state, preserved
  2747. ULONGLONG RsBSP; // Backing store pointer, preserved
  2748. ULONGLONG RsBSPSTORE;
  2749. ULONGLONG RsRSC; // RSE configuration, volatile
  2750. ULONGLONG RsRNAT; // RSE Nat collection register, preserved
  2751. // Trap Status Information
  2752. ULONGLONG StIPSR; // Interruption Processor Status
  2753. ULONGLONG StIIP; // Interruption IP
  2754. ULONGLONG StIFS; // Interruption Function State
  2755. // iA32 related control registers
  2756. ULONGLONG StFCR; // copy of Ar21
  2757. ULONGLONG Eflag; // Eflag copy of Ar24
  2758. ULONGLONG SegCSD; // iA32 CSDescriptor (Ar25)
  2759. ULONGLONG SegSSD; // iA32 SSDescriptor (Ar26)
  2760. ULONGLONG Cflag; // Cr0+Cr4 copy of Ar27
  2761. ULONGLONG StFSR; // x86 FP status (copy of AR28)
  2762. ULONGLONG StFIR; // x86 FP status (copy of AR29)
  2763. ULONGLONG StFDR; // x86 FP status (copy of AR30)
  2764. ULONGLONG UNUSEDPACK; // added to pack StFDR to 16-bytes
  2765. } CONTEXT, *PCONTEXT;
  2766. // begin_winnt
  2767. //
  2768. // Plabel descriptor structure definition
  2769. //
  2770. typedef struct _PLABEL_DESCRIPTOR {
  2771. ULONGLONG EntryPoint;
  2772. ULONGLONG GlobalPointer;
  2773. } PLABEL_DESCRIPTOR, *PPLABEL_DESCRIPTOR;
  2774. #endif // _IA64_
  2775. #ifdef _IA64_
  2776. VOID
  2777. __jump_unwind (
  2778. ULONGLONG TargetMsFrame,
  2779. ULONGLONG TargetBsFrame,
  2780. ULONGLONG TargetPc
  2781. );
  2782. #endif // _IA64_
  2783. #define EXCEPTION_NONCONTINUABLE 0x1 // Noncontinuable exception
  2784. #define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
  2785. //
  2786. // Exception record definition.
  2787. //
  2788. typedef struct _EXCEPTION_RECORD {
  2789. DWORD ExceptionCode;
  2790. DWORD ExceptionFlags;
  2791. struct _EXCEPTION_RECORD *ExceptionRecord;
  2792. PVOID ExceptionAddress;
  2793. DWORD NumberParameters;
  2794. ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  2795. } EXCEPTION_RECORD;
  2796. typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
  2797. typedef struct _EXCEPTION_RECORD32 {
  2798. DWORD ExceptionCode;
  2799. DWORD ExceptionFlags;
  2800. DWORD ExceptionRecord;
  2801. DWORD ExceptionAddress;
  2802. DWORD NumberParameters;
  2803. DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  2804. } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
  2805. typedef struct _EXCEPTION_RECORD64 {
  2806. DWORD ExceptionCode;
  2807. DWORD ExceptionFlags;
  2808. DWORD64 ExceptionRecord;
  2809. DWORD64 ExceptionAddress;
  2810. DWORD NumberParameters;
  2811. DWORD __unusedAlignment;
  2812. DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  2813. } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
  2814. //
  2815. // Typedef for pointer returned by exception_info()
  2816. //
  2817. typedef struct _EXCEPTION_POINTERS {
  2818. PEXCEPTION_RECORD ExceptionRecord;
  2819. PCONTEXT ContextRecord;
  2820. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
  2821. typedef PVOID PACCESS_TOKEN;
  2822. typedef PVOID PSECURITY_DESCRIPTOR;
  2823. typedef PVOID PSID;
  2824. ////////////////////////////////////////////////////////////////////////
  2825. // //
  2826. // ACCESS MASK //
  2827. // //
  2828. ////////////////////////////////////////////////////////////////////////
  2829. //
  2830. // Define the access mask as a longword sized structure divided up as
  2831. // follows:
  2832. //
  2833. // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  2834. // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  2835. // +---------------+---------------+-------------------------------+
  2836. // |G|G|G|G|Res'd|A| StandardRights| SpecificRights |
  2837. // |R|W|E|A| |S| | |
  2838. // +-+-------------+---------------+-------------------------------+
  2839. //
  2840. // typedef struct _ACCESS_MASK {
  2841. // WORD SpecificRights;
  2842. // BYTE StandardRights;
  2843. // BYTE AccessSystemAcl : 1;
  2844. // BYTE Reserved : 3;
  2845. // BYTE GenericAll : 1;
  2846. // BYTE GenericExecute : 1;
  2847. // BYTE GenericWrite : 1;
  2848. // BYTE GenericRead : 1;
  2849. // } ACCESS_MASK;
  2850. // typedef ACCESS_MASK *PACCESS_MASK;
  2851. //
  2852. // but to make life simple for programmer's we'll allow them to specify
  2853. // a desired access mask by simply OR'ing together mulitple single rights
  2854. // and treat an access mask as a DWORD. For example
  2855. //
  2856. // DesiredAccess = DELETE | READ_CONTROL
  2857. //
  2858. // So we'll declare ACCESS_MASK as DWORD
  2859. //
  2860. // begin_ntddk begin_wdm begin_nthal begin_ntifs
  2861. typedef DWORD ACCESS_MASK;
  2862. typedef ACCESS_MASK *PACCESS_MASK;
  2863. ////////////////////////////////////////////////////////////////////////
  2864. // //
  2865. // ACCESS TYPES //
  2866. // //
  2867. ////////////////////////////////////////////////////////////////////////
  2868. // begin_ntddk begin_wdm begin_nthal begin_ntifs
  2869. //
  2870. // The following are masks for the predefined standard access types
  2871. //
  2872. #define DELETE (0x00010000L)
  2873. #define READ_CONTROL (0x00020000L)
  2874. #define WRITE_DAC (0x00040000L)
  2875. #define WRITE_OWNER (0x00080000L)
  2876. #define SYNCHRONIZE (0x00100000L)
  2877. #define STANDARD_RIGHTS_REQUIRED (0x000F0000L)
  2878. #define STANDARD_RIGHTS_READ (READ_CONTROL)
  2879. #define STANDARD_RIGHTS_WRITE (READ_CONTROL)
  2880. #define STANDARD_RIGHTS_EXECUTE (READ_CONTROL)
  2881. #define STANDARD_RIGHTS_ALL (0x001F0000L)
  2882. #define SPECIFIC_RIGHTS_ALL (0x0000FFFFL)
  2883. //
  2884. // AccessSystemAcl access type
  2885. //
  2886. #define ACCESS_SYSTEM_SECURITY (0x01000000L)
  2887. //
  2888. // MaximumAllowed access type
  2889. //
  2890. #define MAXIMUM_ALLOWED (0x02000000L)
  2891. //
  2892. // These are the generic rights.
  2893. //
  2894. #define GENERIC_READ (0x80000000L)
  2895. #define GENERIC_WRITE (0x40000000L)
  2896. #define GENERIC_EXECUTE (0x20000000L)
  2897. #define GENERIC_ALL (0x10000000L)
  2898. //
  2899. // Define the generic mapping array. This is used to denote the
  2900. // mapping of each generic access right to a specific access mask.
  2901. //
  2902. typedef struct _GENERIC_MAPPING {
  2903. ACCESS_MASK GenericRead;
  2904. ACCESS_MASK GenericWrite;
  2905. ACCESS_MASK GenericExecute;
  2906. ACCESS_MASK GenericAll;
  2907. } GENERIC_MAPPING;
  2908. typedef GENERIC_MAPPING *PGENERIC_MAPPING;
  2909. ////////////////////////////////////////////////////////////////////////
  2910. // //
  2911. // LUID_AND_ATTRIBUTES //
  2912. // //
  2913. ////////////////////////////////////////////////////////////////////////
  2914. //
  2915. //
  2916. #include <pshpack4.h>
  2917. typedef struct _LUID_AND_ATTRIBUTES {
  2918. LUID Luid;
  2919. DWORD Attributes;
  2920. } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
  2921. typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
  2922. typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
  2923. #include <poppack.h>
  2924. ////////////////////////////////////////////////////////////////////////
  2925. // //
  2926. // Security Id (SID) //
  2927. // //
  2928. ////////////////////////////////////////////////////////////////////////
  2929. //
  2930. //
  2931. // Pictorially the structure of an SID is as follows:
  2932. //
  2933. // 1 1 1 1 1 1
  2934. // 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  2935. // +---------------------------------------------------------------+
  2936. // | SubAuthorityCount |Reserved1 (SBZ)| Revision |
  2937. // +---------------------------------------------------------------+
  2938. // | IdentifierAuthority[0] |
  2939. // +---------------------------------------------------------------+
  2940. // | IdentifierAuthority[1] |
  2941. // +---------------------------------------------------------------+
  2942. // | IdentifierAuthority[2] |
  2943. // +---------------------------------------------------------------+
  2944. // | |
  2945. // +- - - - - - - - SubAuthority[] - - - - - - - - -+
  2946. // | |
  2947. // +---------------------------------------------------------------+
  2948. //
  2949. //
  2950. // begin_ntifs
  2951. #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
  2952. #define SID_IDENTIFIER_AUTHORITY_DEFINED
  2953. typedef struct _SID_IDENTIFIER_AUTHORITY {
  2954. BYTE Value[6];
  2955. } SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
  2956. #endif
  2957. #ifndef SID_DEFINED
  2958. #define SID_DEFINED
  2959. typedef struct _SID {
  2960. BYTE Revision;
  2961. BYTE SubAuthorityCount;
  2962. SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
  2963. #ifdef MIDL_PASS
  2964. [size_is(SubAuthorityCount)] DWORD SubAuthority[*];
  2965. #else // MIDL_PASS
  2966. DWORD SubAuthority[ANYSIZE_ARRAY];
  2967. #endif // MIDL_PASS
  2968. } SID, *PISID;
  2969. #endif
  2970. #define SID_REVISION (1) // Current revision level
  2971. #define SID_MAX_SUB_AUTHORITIES (15)
  2972. #define SID_RECOMMENDED_SUB_AUTHORITIES (1) // Will change to around 6
  2973. // in a future release.
  2974. #ifndef MIDL_PASS
  2975. #define SECURITY_MAX_SID_SIZE \
  2976. (sizeof(SID) - sizeof(DWORD) + (SID_MAX_SUB_AUTHORITIES * sizeof(DWORD)))
  2977. #endif // MIDL_PASS
  2978. typedef enum _SID_NAME_USE {
  2979. SidTypeUser = 1,
  2980. SidTypeGroup,
  2981. SidTypeDomain,
  2982. SidTypeAlias,
  2983. SidTypeWellKnownGroup,
  2984. SidTypeDeletedAccount,
  2985. SidTypeInvalid,
  2986. SidTypeUnknown,
  2987. SidTypeComputer
  2988. } SID_NAME_USE, *PSID_NAME_USE;
  2989. typedef struct _SID_AND_ATTRIBUTES {
  2990. PSID Sid;
  2991. DWORD Attributes;
  2992. } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;
  2993. typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
  2994. typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
  2995. /////////////////////////////////////////////////////////////////////////////
  2996. // //
  2997. // Universal well-known SIDs //
  2998. // //
  2999. // Null SID S-1-0-0 //
  3000. // World S-1-1-0 //
  3001. // Local S-1-2-0 //
  3002. // Creator Owner ID S-1-3-0 //
  3003. // Creator Group ID S-1-3-1 //
  3004. // Creator Owner Server ID S-1-3-2 //
  3005. // Creator Group Server ID S-1-3-3 //
  3006. // //
  3007. // (Non-unique IDs) S-1-4 //
  3008. // //
  3009. /////////////////////////////////////////////////////////////////////////////
  3010. #define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0}
  3011. #define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1}
  3012. #define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}
  3013. #define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3}
  3014. #define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4}
  3015. #define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
  3016. #define SECURITY_NULL_RID (0x00000000L)
  3017. #define SECURITY_WORLD_RID (0x00000000L)
  3018. #define SECURITY_LOCAL_RID (0x00000000L)
  3019. #define SECURITY_CREATOR_OWNER_RID (0x00000000L)
  3020. #define SECURITY_CREATOR_GROUP_RID (0x00000001L)
  3021. #define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
  3022. #define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
  3023. /////////////////////////////////////////////////////////////////////////////
  3024. // //
  3025. // NT well-known SIDs //
  3026. // //
  3027. // NT Authority S-1-5 //
  3028. // Dialup S-1-5-1 //
  3029. // //
  3030. // Network S-1-5-2 //
  3031. // Batch S-1-5-3 //
  3032. // Interactive S-1-5-4 //
  3033. // Service S-1-5-6 //
  3034. // AnonymousLogon S-1-5-7 (aka null logon session) //
  3035. // Proxy S-1-5-8 //
  3036. // ServerLogon S-1-5-9 (aka domain controller account) //
  3037. // Self S-1-5-10 (self RID) //
  3038. // Authenticated User S-1-5-11 (Authenticated user somewhere) //
  3039. // Restricted Code S-1-5-12 (Running restricted code) //
  3040. // Terminal Server S-1-5-13 (Running on Terminal Server) //
  3041. // Remote Logon S-1-5-14 (Remote Interactive Logon) //
  3042. // //
  3043. // (Logon IDs) S-1-5-5-X-Y //
  3044. // //
  3045. // (NT non-unique IDs) S-1-5-0x15-... //
  3046. // //
  3047. // (Built-in domain) s-1-5-0x20 //
  3048. // //
  3049. /////////////////////////////////////////////////////////////////////////////
  3050. #define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} // ntifs
  3051. #define SECURITY_DIALUP_RID (0x00000001L)
  3052. #define SECURITY_NETWORK_RID (0x00000002L)
  3053. #define SECURITY_BATCH_RID (0x00000003L)
  3054. #define SECURITY_INTERACTIVE_RID (0x00000004L)
  3055. #define SECURITY_SERVICE_RID (0x00000006L)
  3056. #define SECURITY_ANONYMOUS_LOGON_RID (0x00000007L)
  3057. #define SECURITY_PROXY_RID (0x00000008L)
  3058. #define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
  3059. #define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID
  3060. #define SECURITY_PRINCIPAL_SELF_RID (0x0000000AL)
  3061. #define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
  3062. #define SECURITY_RESTRICTED_CODE_RID (0x0000000CL)
  3063. #define SECURITY_TERMINAL_SERVER_RID (0x0000000DL)
  3064. #define SECURITY_REMOTE_LOGON_RID (0x0000000EL)
  3065. #define SECURITY_LOGON_IDS_RID (0x00000005L)
  3066. #define SECURITY_LOGON_IDS_RID_COUNT (3L)
  3067. #define SECURITY_LOCAL_SYSTEM_RID (0x00000012L)
  3068. #define SECURITY_LOCAL_SERVICE_RID (0x00000013L)
  3069. #define SECURITY_NETWORK_SERVICE_RID (0x00000014L)
  3070. #define SECURITY_NT_NON_UNIQUE (0x00000015L)
  3071. #define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT (3L)
  3072. #define SECURITY_BUILTIN_DOMAIN_RID (0x00000020L)
  3073. /////////////////////////////////////////////////////////////////////////////
  3074. // //
  3075. // well-known domain relative sub-authority values (RIDs)... //
  3076. // //
  3077. /////////////////////////////////////////////////////////////////////////////
  3078. // Well-known users ...
  3079. #define DOMAIN_USER_RID_ADMIN (0x000001F4L)
  3080. #define DOMAIN_USER_RID_GUEST (0x000001F5L)
  3081. #define DOMAIN_USER_RID_KRBTGT (0x000001F6L)
  3082. // well-known groups ...
  3083. #define DOMAIN_GROUP_RID_ADMINS (0x00000200L)
  3084. #define DOMAIN_GROUP_RID_USERS (0x00000201L)
  3085. #define DOMAIN_GROUP_RID_GUESTS (0x00000202L)
  3086. #define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L)
  3087. #define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L)
  3088. #define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L)
  3089. #define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
  3090. #define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
  3091. #define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
  3092. // well-known aliases ...
  3093. #define DOMAIN_ALIAS_RID_ADMINS (0x00000220L)
  3094. #define DOMAIN_ALIAS_RID_USERS (0x00000221L)
  3095. #define DOMAIN_ALIAS_RID_GUESTS (0x00000222L)
  3096. #define DOMAIN_ALIAS_RID_POWER_USERS (0x00000223L)
  3097. #define DOMAIN_ALIAS_RID_ACCOUNT_OPS (0x00000224L)
  3098. #define DOMAIN_ALIAS_RID_SYSTEM_OPS (0x00000225L)
  3099. #define DOMAIN_ALIAS_RID_PRINT_OPS (0x00000226L)
  3100. #define DOMAIN_ALIAS_RID_BACKUP_OPS (0x00000227L)
  3101. #define DOMAIN_ALIAS_RID_REPLICATOR (0x00000228L)
  3102. #define DOMAIN_ALIAS_RID_RAS_SERVERS (0x00000229L)
  3103. #define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS (0x0000022AL)
  3104. #define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS (0x0000022BL)
  3105. #define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS (0x0000022CL)
  3106. //
  3107. // Allocate the System Luid. The first 1000 LUIDs are reserved.
  3108. // Use #999 here (0x3E7 = 999)
  3109. //
  3110. #define SYSTEM_LUID { 0x3E7, 0x0 }
  3111. #define ANONYMOUS_LOGON_LUID { 0x3e6, 0x0 }
  3112. #define LOCALSERVICE_LUID { 0x3e5, 0x0 }
  3113. #define NETWORKSERVICE_LUID { 0x3e4, 0x0 }
  3114. // end_ntifs
  3115. ////////////////////////////////////////////////////////////////////////
  3116. // //
  3117. // User and Group related SID attributes //
  3118. // //
  3119. ////////////////////////////////////////////////////////////////////////
  3120. //
  3121. // Group attributes
  3122. //
  3123. #define SE_GROUP_MANDATORY (0x00000001L)
  3124. #define SE_GROUP_ENABLED_BY_DEFAULT (0x00000002L)
  3125. #define SE_GROUP_ENABLED (0x00000004L)
  3126. #define SE_GROUP_OWNER (0x00000008L)
  3127. #define SE_GROUP_USE_FOR_DENY_ONLY (0x00000010L)
  3128. #define SE_GROUP_LOGON_ID (0xC0000000L)
  3129. #define SE_GROUP_RESOURCE (0x20000000L)
  3130. //
  3131. // User attributes
  3132. //
  3133. // (None yet defined.)
  3134. ////////////////////////////////////////////////////////////////////////
  3135. // //
  3136. // ACL and ACE //
  3137. // //
  3138. ////////////////////////////////////////////////////////////////////////
  3139. //
  3140. // Define an ACL and the ACE format. The structure of an ACL header
  3141. // followed by one or more ACEs. Pictorally the structure of an ACL header
  3142. // is as follows:
  3143. //
  3144. // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  3145. // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  3146. // +-------------------------------+---------------+---------------+
  3147. // | AclSize | Sbz1 | AclRevision |
  3148. // +-------------------------------+---------------+---------------+
  3149. // | Sbz2 | AceCount |
  3150. // +-------------------------------+-------------------------------+
  3151. //
  3152. // The current AclRevision is defined to be ACL_REVISION.
  3153. //
  3154. // AclSize is the size, in bytes, allocated for the ACL. This includes
  3155. // the ACL header, ACES, and remaining free space in the buffer.
  3156. //
  3157. // AceCount is the number of ACES in the ACL.
  3158. //
  3159. // begin_ntddk begin_wdm begin_ntifs
  3160. // This is the *current* ACL revision
  3161. #define ACL_REVISION (2)
  3162. #define ACL_REVISION_DS (4)
  3163. // This is the history of ACL revisions. Add a new one whenever
  3164. // ACL_REVISION is updated
  3165. #define ACL_REVISION1 (1)
  3166. #define MIN_ACL_REVISION ACL_REVISION2
  3167. #define ACL_REVISION2 (2)
  3168. #define ACL_REVISION3 (3)
  3169. #define ACL_REVISION4 (4)
  3170. #define MAX_ACL_REVISION ACL_REVISION4
  3171. typedef struct _ACL {
  3172. BYTE AclRevision;
  3173. BYTE Sbz1;
  3174. WORD AclSize;
  3175. WORD AceCount;
  3176. WORD Sbz2;
  3177. } ACL;
  3178. typedef ACL *PACL;
  3179. // end_ntddk end_wdm
  3180. //
  3181. // The structure of an ACE is a common ace header followed by ace type
  3182. // specific data. Pictorally the structure of the common ace header is
  3183. // as follows:
  3184. //
  3185. // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  3186. // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  3187. // +---------------+-------+-------+---------------+---------------+
  3188. // | AceSize | AceFlags | AceType |
  3189. // +---------------+-------+-------+---------------+---------------+
  3190. //
  3191. // AceType denotes the type of the ace, there are some predefined ace
  3192. // types
  3193. //
  3194. // AceSize is the size, in bytes, of ace.
  3195. //
  3196. // AceFlags are the Ace flags for audit and inheritance, defined shortly.
  3197. typedef struct _ACE_HEADER {
  3198. BYTE AceType;
  3199. BYTE AceFlags;
  3200. WORD AceSize;
  3201. } ACE_HEADER;
  3202. typedef ACE_HEADER *PACE_HEADER;
  3203. //
  3204. // The following are the predefined ace types that go into the AceType
  3205. // field of an Ace header.
  3206. //
  3207. #define ACCESS_MIN_MS_ACE_TYPE (0x0)
  3208. #define ACCESS_ALLOWED_ACE_TYPE (0x0)
  3209. #define ACCESS_DENIED_ACE_TYPE (0x1)
  3210. #define SYSTEM_AUDIT_ACE_TYPE (0x2)
  3211. #define SYSTEM_ALARM_ACE_TYPE (0x3)
  3212. #define ACCESS_MAX_MS_V2_ACE_TYPE (0x3)
  3213. #define ACCESS_ALLOWED_COMPOUND_ACE_TYPE (0x4)
  3214. #define ACCESS_MAX_MS_V3_ACE_TYPE (0x4)
  3215. #define ACCESS_MIN_MS_OBJECT_ACE_TYPE (0x5)
  3216. #define ACCESS_ALLOWED_OBJECT_ACE_TYPE (0x5)
  3217. #define ACCESS_DENIED_OBJECT_ACE_TYPE (0x6)
  3218. #define SYSTEM_AUDIT_OBJECT_ACE_TYPE (0x7)
  3219. #define SYSTEM_ALARM_OBJECT_ACE_TYPE (0x8)
  3220. #define ACCESS_MAX_MS_OBJECT_ACE_TYPE (0x8)
  3221. #define ACCESS_MAX_MS_V4_ACE_TYPE (0x8)
  3222. #define ACCESS_MAX_MS_ACE_TYPE (0x8)
  3223. #define ACCESS_ALLOWED_CALLBACK_ACE_TYPE (0x9)
  3224. #define ACCESS_DENIED_CALLBACK_ACE_TYPE (0xA)
  3225. #define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
  3226. #define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE (0xC)
  3227. #define SYSTEM_AUDIT_CALLBACK_ACE_TYPE (0xD)
  3228. #define SYSTEM_ALARM_CALLBACK_ACE_TYPE (0xE)
  3229. #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE (0xF)
  3230. #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE (0x10)
  3231. #define ACCESS_MAX_MS_V5_ACE_TYPE (0x10)
  3232. //
  3233. // The following are the inherit flags that go into the AceFlags field
  3234. // of an Ace header.
  3235. //
  3236. #define OBJECT_INHERIT_ACE (0x1)
  3237. #define CONTAINER_INHERIT_ACE (0x2)
  3238. #define NO_PROPAGATE_INHERIT_ACE (0x4)
  3239. #define INHERIT_ONLY_ACE (0x8)
  3240. #define INHERITED_ACE (0x10)
  3241. #define VALID_INHERIT_FLAGS (0x1F)
  3242. // The following are the currently defined ACE flags that go into the
  3243. // AceFlags field of an ACE header. Each ACE type has its own set of
  3244. // AceFlags.
  3245. //
  3246. // SUCCESSFUL_ACCESS_ACE_FLAG - used only with system audit and alarm ACE
  3247. // types to indicate that a message is generated for successful accesses.
  3248. //
  3249. // FAILED_ACCESS_ACE_FLAG - used only with system audit and alarm ACE types
  3250. // to indicate that a message is generated for failed accesses.
  3251. //
  3252. //
  3253. // SYSTEM_AUDIT and SYSTEM_ALARM AceFlags
  3254. //
  3255. // These control the signaling of audit and alarms for success or failure.
  3256. //
  3257. #define SUCCESSFUL_ACCESS_ACE_FLAG (0x40)
  3258. #define FAILED_ACCESS_ACE_FLAG (0x80)
  3259. //
  3260. // We'll define the structure of the predefined ACE types. Pictorally
  3261. // the structure of the predefined ACE's is as follows:
  3262. //
  3263. // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  3264. // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  3265. // +---------------+-------+-------+---------------+---------------+
  3266. // | AceFlags | Resd |Inherit| AceSize | AceType |
  3267. // +---------------+-------+-------+---------------+---------------+
  3268. // | Mask |
  3269. // +---------------------------------------------------------------+
  3270. // | |
  3271. // + +
  3272. // | |
  3273. // + Sid +
  3274. // | |
  3275. // + +
  3276. // | |
  3277. // +---------------------------------------------------------------+
  3278. //
  3279. // Mask is the access mask associated with the ACE. This is either the
  3280. // access allowed, access denied, audit, or alarm mask.
  3281. //
  3282. // Sid is the Sid associated with the ACE.
  3283. //
  3284. // The following are the four predefined ACE types.
  3285. // Examine the AceType field in the Header to determine
  3286. // which structure is appropriate to use for casting.
  3287. typedef struct _ACCESS_ALLOWED_ACE {
  3288. ACE_HEADER Header;
  3289. ACCESS_MASK Mask;
  3290. DWORD SidStart;
  3291. } ACCESS_ALLOWED_ACE;
  3292. typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;
  3293. typedef struct _ACCESS_DENIED_ACE {
  3294. ACE_HEADER Header;
  3295. ACCESS_MASK Mask;
  3296. DWORD SidStart;
  3297. } ACCESS_DENIED_ACE;
  3298. typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;
  3299. typedef struct _SYSTEM_AUDIT_ACE {
  3300. ACE_HEADER Header;
  3301. ACCESS_MASK Mask;
  3302. DWORD SidStart;
  3303. } SYSTEM_AUDIT_ACE;
  3304. typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
  3305. typedef struct _SYSTEM_ALARM_ACE {
  3306. ACE_HEADER Header;
  3307. ACCESS_MASK Mask;
  3308. DWORD SidStart;
  3309. } SYSTEM_ALARM_ACE;
  3310. typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;
  3311. // end_ntifs
  3312. typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
  3313. ACE_HEADER Header;
  3314. ACCESS_MASK Mask;
  3315. DWORD Flags;
  3316. GUID ObjectType;
  3317. GUID InheritedObjectType;
  3318. DWORD SidStart;
  3319. } ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;
  3320. typedef struct _ACCESS_DENIED_OBJECT_ACE {
  3321. ACE_HEADER Header;
  3322. ACCESS_MASK Mask;
  3323. DWORD Flags;
  3324. GUID ObjectType;
  3325. GUID InheritedObjectType;
  3326. DWORD SidStart;
  3327. } ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;
  3328. typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
  3329. ACE_HEADER Header;
  3330. ACCESS_MASK Mask;
  3331. DWORD Flags;
  3332. GUID ObjectType;
  3333. GUID InheritedObjectType;
  3334. DWORD SidStart;
  3335. } SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;
  3336. typedef struct _SYSTEM_ALARM_OBJECT_ACE {
  3337. ACE_HEADER Header;
  3338. ACCESS_MASK Mask;
  3339. DWORD Flags;
  3340. GUID ObjectType;
  3341. GUID InheritedObjectType;
  3342. DWORD SidStart;
  3343. } SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;
  3344. //
  3345. // Callback ace support in post Win2000.
  3346. // Resource managers can put their own data after Sidstart + Length of the sid
  3347. //
  3348. typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
  3349. ACE_HEADER Header;
  3350. ACCESS_MASK Mask;
  3351. DWORD SidStart;
  3352. // Opaque resouce manager specific data
  3353. } ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
  3354. typedef struct _ACCESS_DENIED_CALLBACK_ACE {
  3355. ACE_HEADER Header;
  3356. ACCESS_MASK Mask;
  3357. DWORD SidStart;
  3358. // Opaque resouce manager specific data
  3359. } ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
  3360. typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
  3361. ACE_HEADER Header;
  3362. ACCESS_MASK Mask;
  3363. DWORD SidStart;
  3364. // Opaque resouce manager specific data
  3365. } SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
  3366. typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
  3367. ACE_HEADER Header;
  3368. ACCESS_MASK Mask;
  3369. DWORD SidStart;
  3370. // Opaque resouce manager specific data
  3371. } SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
  3372. typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
  3373. ACE_HEADER Header;
  3374. ACCESS_MASK Mask;
  3375. DWORD Flags;
  3376. GUID ObjectType;
  3377. GUID InheritedObjectType;
  3378. DWORD SidStart;
  3379. // Opaque resouce manager specific data
  3380. } ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
  3381. typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
  3382. ACE_HEADER Header;
  3383. ACCESS_MASK Mask;
  3384. DWORD Flags;
  3385. GUID ObjectType;
  3386. GUID InheritedObjectType;
  3387. DWORD SidStart;
  3388. // Opaque resouce manager specific data
  3389. } ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
  3390. typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
  3391. ACE_HEADER Header;
  3392. ACCESS_MASK Mask;
  3393. DWORD Flags;
  3394. GUID ObjectType;
  3395. GUID InheritedObjectType;
  3396. DWORD SidStart;
  3397. // Opaque resouce manager specific data
  3398. } SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
  3399. typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
  3400. ACE_HEADER Header;
  3401. ACCESS_MASK Mask;
  3402. DWORD Flags;
  3403. GUID ObjectType;
  3404. GUID InheritedObjectType;
  3405. DWORD SidStart;
  3406. // Opaque resouce manager specific data
  3407. } SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
  3408. //
  3409. // Currently define Flags for "OBJECT" ACE types.
  3410. //
  3411. #define ACE_OBJECT_TYPE_PRESENT 0x1
  3412. #define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x2
  3413. //
  3414. // The following declarations are used for setting and querying information
  3415. // about and ACL. First are the various information classes available to
  3416. // the user.
  3417. //
  3418. typedef enum _ACL_INFORMATION_CLASS {
  3419. AclRevisionInformation = 1,
  3420. AclSizeInformation
  3421. } ACL_INFORMATION_CLASS;
  3422. //
  3423. // This record is returned/sent if the user is requesting/setting the
  3424. // AclRevisionInformation
  3425. //
  3426. typedef struct _ACL_REVISION_INFORMATION {
  3427. DWORD AclRevision;
  3428. } ACL_REVISION_INFORMATION;
  3429. typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;
  3430. //
  3431. // This record is returned if the user is requesting AclSizeInformation
  3432. //
  3433. typedef struct _ACL_SIZE_INFORMATION {
  3434. DWORD AceCount;
  3435. DWORD AclBytesInUse;
  3436. DWORD AclBytesFree;
  3437. } ACL_SIZE_INFORMATION;
  3438. typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;
  3439. ////////////////////////////////////////////////////////////////////////
  3440. // //
  3441. // SECURITY_DESCRIPTOR //
  3442. // //
  3443. ////////////////////////////////////////////////////////////////////////
  3444. //
  3445. // Define the Security Descriptor and related data types.
  3446. // This is an opaque data structure.
  3447. //
  3448. // begin_wdm begin_ntddk begin_ntifs
  3449. //
  3450. // Current security descriptor revision value
  3451. //
  3452. #define SECURITY_DESCRIPTOR_REVISION (1)
  3453. #define SECURITY_DESCRIPTOR_REVISION1 (1)
  3454. // end_wdm end_ntddk
  3455. #define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR))
  3456. typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
  3457. #define SE_OWNER_DEFAULTED (0x0001)
  3458. #define SE_GROUP_DEFAULTED (0x0002)
  3459. #define SE_DACL_PRESENT (0x0004)
  3460. #define SE_DACL_DEFAULTED (0x0008)
  3461. #define SE_SACL_PRESENT (0x0010)
  3462. #define SE_SACL_DEFAULTED (0x0020)
  3463. #define SE_DACL_AUTO_INHERIT_REQ (0x0100)
  3464. #define SE_SACL_AUTO_INHERIT_REQ (0x0200)
  3465. #define SE_DACL_AUTO_INHERITED (0x0400)
  3466. #define SE_SACL_AUTO_INHERITED (0x0800)
  3467. #define SE_DACL_PROTECTED (0x1000)
  3468. #define SE_SACL_PROTECTED (0x2000)
  3469. #define SE_RM_CONTROL_VALID (0x4000)
  3470. #define SE_SELF_RELATIVE (0x8000)
  3471. //
  3472. // Where:
  3473. //
  3474. // SE_OWNER_DEFAULTED - This boolean flag, when set, indicates that the
  3475. // SID pointed to by the Owner field was provided by a
  3476. // defaulting mechanism rather than explicitly provided by the
  3477. // original provider of the security descriptor. This may
  3478. // affect the treatment of the SID with respect to inheritence
  3479. // of an owner.
  3480. //
  3481. // SE_GROUP_DEFAULTED - This boolean flag, when set, indicates that the
  3482. // SID in the Group field was provided by a defaulting mechanism
  3483. // rather than explicitly provided by the original provider of
  3484. // the security descriptor. This may affect the treatment of
  3485. // the SID with respect to inheritence of a primary group.
  3486. //
  3487. // SE_DACL_PRESENT - This boolean flag, when set, indicates that the
  3488. // security descriptor contains a discretionary ACL. If this
  3489. // flag is set and the Dacl field of the SECURITY_DESCRIPTOR is
  3490. // null, then a null ACL is explicitly being specified.
  3491. //
  3492. // SE_DACL_DEFAULTED - This boolean flag, when set, indicates that the
  3493. // ACL pointed to by the Dacl field was provided by a defaulting
  3494. // mechanism rather than explicitly provided by the original
  3495. // provider of the security descriptor. This may affect the
  3496. // treatment of the ACL with respect to inheritence of an ACL.
  3497. // This flag is ignored if the DaclPresent flag is not set.
  3498. //
  3499. // SE_SACL_PRESENT - This boolean flag, when set, indicates that the
  3500. // security descriptor contains a system ACL pointed to by the
  3501. // Sacl field. If this flag is set and the Sacl field of the
  3502. // SECURITY_DESCRIPTOR is null, then an empty (but present)
  3503. // ACL is being specified.
  3504. //
  3505. // SE_SACL_DEFAULTED - This boolean flag, when set, indicates that the
  3506. // ACL pointed to by the Sacl field was provided by a defaulting
  3507. // mechanism rather than explicitly provided by the original
  3508. // provider of the security descriptor. This may affect the
  3509. // treatment of the ACL with respect to inheritence of an ACL.
  3510. // This flag is ignored if the SaclPresent flag is not set.
  3511. //
  3512. // SE_SELF_RELATIVE - This boolean flag, when set, indicates that the
  3513. // security descriptor is in self-relative form. In this form,
  3514. // all fields of the security descriptor are contiguous in memory
  3515. // and all pointer fields are expressed as offsets from the
  3516. // beginning of the security descriptor. This form is useful
  3517. // for treating security descriptors as opaque data structures
  3518. // for transmission in communication protocol or for storage on
  3519. // secondary media.
  3520. //
  3521. //
  3522. //
  3523. // Pictorially the structure of a security descriptor is as follows:
  3524. //
  3525. // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  3526. // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  3527. // +---------------------------------------------------------------+
  3528. // | Control |Reserved1 (SBZ)| Revision |
  3529. // +---------------------------------------------------------------+
  3530. // | Owner |
  3531. // +---------------------------------------------------------------+
  3532. // | Group |
  3533. // +---------------------------------------------------------------+
  3534. // | Sacl |
  3535. // +---------------------------------------------------------------+
  3536. // | Dacl |
  3537. // +---------------------------------------------------------------+
  3538. //
  3539. // In general, this data structure should be treated opaquely to ensure future
  3540. // compatibility.
  3541. //
  3542. //
  3543. typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
  3544. BYTE Revision;
  3545. BYTE Sbz1;
  3546. SECURITY_DESCRIPTOR_CONTROL Control;
  3547. DWORD Owner;
  3548. DWORD Group;
  3549. DWORD Sacl;
  3550. DWORD Dacl;
  3551. } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
  3552. typedef struct _SECURITY_DESCRIPTOR {
  3553. BYTE Revision;
  3554. BYTE Sbz1;
  3555. SECURITY_DESCRIPTOR_CONTROL Control;
  3556. PSID Owner;
  3557. PSID Group;
  3558. PACL Sacl;
  3559. PACL Dacl;
  3560. } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
  3561. // end_ntifs
  3562. // Where:
  3563. //
  3564. // Revision - Contains the revision level of the security
  3565. // descriptor. This allows this structure to be passed between
  3566. // systems or stored on disk even though it is expected to
  3567. // change in the future.
  3568. //
  3569. // Control - A set of flags which qualify the meaning of the
  3570. // security descriptor or individual fields of the security
  3571. // descriptor.
  3572. //
  3573. // Owner - is a pointer to an SID representing an object's owner.
  3574. // If this field is null, then no owner SID is present in the
  3575. // security descriptor. If the security descriptor is in
  3576. // self-relative form, then this field contains an offset to
  3577. // the SID, rather than a pointer.
  3578. //
  3579. // Group - is a pointer to an SID representing an object's primary
  3580. // group. If this field is null, then no primary group SID is
  3581. // present in the security descriptor. If the security descriptor
  3582. // is in self-relative form, then this field contains an offset to
  3583. // the SID, rather than a pointer.
  3584. //
  3585. // Sacl - is a pointer to a system ACL. This field value is only
  3586. // valid if the DaclPresent control flag is set. If the
  3587. // SaclPresent flag is set and this field is null, then a null
  3588. // ACL is specified. If the security descriptor is in
  3589. // self-relative form, then this field contains an offset to
  3590. // the ACL, rather than a pointer.
  3591. //
  3592. // Dacl - is a pointer to a discretionary ACL. This field value is
  3593. // only valid if the DaclPresent control flag is set. If the
  3594. // DaclPresent flag is set and this field is null, then a null
  3595. // ACL (unconditionally granting access) is specified. If the
  3596. // security descriptor is in self-relative form, then this field
  3597. // contains an offset to the ACL, rather than a pointer.
  3598. //
  3599. ////////////////////////////////////////////////////////////////////////
  3600. // //
  3601. // Object Type list for AccessCheckByType //
  3602. // //
  3603. ////////////////////////////////////////////////////////////////////////
  3604. typedef struct _OBJECT_TYPE_LIST {
  3605. WORD Level;
  3606. WORD Sbz;
  3607. GUID *ObjectType;
  3608. } OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
  3609. //
  3610. // DS values for Level
  3611. //
  3612. #define ACCESS_OBJECT_GUID 0
  3613. #define ACCESS_PROPERTY_SET_GUID 1
  3614. #define ACCESS_PROPERTY_GUID 2
  3615. #define ACCESS_MAX_LEVEL 4
  3616. //
  3617. // Parameters to NtAccessCheckByTypeAndAditAlarm
  3618. //
  3619. typedef enum _AUDIT_EVENT_TYPE {
  3620. AuditEventObjectAccess,
  3621. AuditEventDirectoryServiceAccess
  3622. } AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
  3623. #define AUDIT_ALLOW_NO_PRIVILEGE 0x1
  3624. //
  3625. // DS values for Source and ObjectTypeName
  3626. //
  3627. #define ACCESS_DS_SOURCE_A "DS"
  3628. #define ACCESS_DS_SOURCE_W L"DS"
  3629. #define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
  3630. #define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
  3631. ////////////////////////////////////////////////////////////////////////
  3632. // //
  3633. // Privilege Related Data Structures //
  3634. // //
  3635. ////////////////////////////////////////////////////////////////////////
  3636. // begin_wdm begin_ntddk begin_nthal
  3637. //
  3638. // Privilege attributes
  3639. //
  3640. #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
  3641. #define SE_PRIVILEGE_ENABLED (0x00000002L)
  3642. #define SE_PRIVILEGE_REMOVED (0X00000004L)
  3643. #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
  3644. //
  3645. // Privilege Set Control flags
  3646. //
  3647. #define PRIVILEGE_SET_ALL_NECESSARY (1)
  3648. //
  3649. // Privilege Set - This is defined for a privilege set of one.
  3650. // If more than one privilege is needed, then this structure
  3651. // will need to be allocated with more space.
  3652. //
  3653. // Note: don't change this structure without fixing the INITIAL_PRIVILEGE_SET
  3654. // structure (defined in se.h)
  3655. //
  3656. typedef struct _PRIVILEGE_SET {
  3657. DWORD PrivilegeCount;
  3658. DWORD Control;
  3659. LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
  3660. } PRIVILEGE_SET, * PPRIVILEGE_SET;
  3661. ////////////////////////////////////////////////////////////////////////
  3662. // //
  3663. // NT Defined Privileges //
  3664. // //
  3665. ////////////////////////////////////////////////////////////////////////
  3666. #define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")
  3667. #define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege")
  3668. #define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege")
  3669. #define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege")
  3670. #define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege")
  3671. #define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege")
  3672. #define SE_TCB_NAME TEXT("SeTcbPrivilege")
  3673. #define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")
  3674. #define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege")
  3675. #define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege")
  3676. #define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege")
  3677. #define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege")
  3678. #define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege")
  3679. #define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege")
  3680. #define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege")
  3681. #define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege")
  3682. #define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
  3683. #define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
  3684. #define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
  3685. #define SE_DEBUG_NAME TEXT("SeDebugPrivilege")
  3686. #define SE_AUDIT_NAME TEXT("SeAuditPrivilege")
  3687. #define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege")
  3688. #define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege")
  3689. #define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege")
  3690. #define SE_UNDOCK_NAME TEXT("SeUndockPrivilege")
  3691. #define SE_SYNC_AGENT_NAME TEXT("SeSyncAgentPrivilege")
  3692. #define SE_ENABLE_DELEGATION_NAME TEXT("SeEnableDelegationPrivilege")
  3693. #define SE_MANAGE_VOLUME_NAME TEXT("SeManageVolumePrivilege")
  3694. #define SE_IMPERSONATE_NAME TEXT("SeImpersonatePrivilege")
  3695. #define SE_CREATE_GLOBAL_NAME TEXT("SeCreateGlobalPrivilege")
  3696. ////////////////////////////////////////////////////////////////////
  3697. // //
  3698. // Security Quality Of Service //
  3699. // //
  3700. // //
  3701. ////////////////////////////////////////////////////////////////////
  3702. // begin_wdm begin_ntddk begin_nthal begin_ntifs
  3703. //
  3704. // Impersonation Level
  3705. //
  3706. // Impersonation level is represented by a pair of bits in Windows.
  3707. // If a new impersonation level is added or lowest value is changed from
  3708. // 0 to something else, fix the Windows CreateFile call.
  3709. //
  3710. typedef enum _SECURITY_IMPERSONATION_LEVEL {
  3711. SecurityAnonymous,
  3712. SecurityIdentification,
  3713. SecurityImpersonation,
  3714. SecurityDelegation
  3715. } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
  3716. #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
  3717. #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
  3718. #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
  3719. #define VALID_IMPERSONATION_LEVEL(L) (((L) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((L) <= SECURITY_MAX_IMPERSONATION_LEVEL))
  3720. ////////////////////////////////////////////////////////////////////
  3721. // //
  3722. // Token Object Definitions //
  3723. // //
  3724. // //
  3725. ////////////////////////////////////////////////////////////////////
  3726. //
  3727. // Token Specific Access Rights.
  3728. //
  3729. #define TOKEN_ASSIGN_PRIMARY (0x0001)
  3730. #define TOKEN_DUPLICATE (0x0002)
  3731. #define TOKEN_IMPERSONATE (0x0004)
  3732. #define TOKEN_QUERY (0x0008)
  3733. #define TOKEN_QUERY_SOURCE (0x0010)
  3734. #define TOKEN_ADJUST_PRIVILEGES (0x0020)
  3735. #define TOKEN_ADJUST_GROUPS (0x0040)
  3736. #define TOKEN_ADJUST_DEFAULT (0x0080)
  3737. #define TOKEN_ADJUST_SESSIONID (0x0100)
  3738. #define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED |\
  3739. TOKEN_ASSIGN_PRIMARY |\
  3740. TOKEN_DUPLICATE |\
  3741. TOKEN_IMPERSONATE |\
  3742. TOKEN_QUERY |\
  3743. TOKEN_QUERY_SOURCE |\
  3744. TOKEN_ADJUST_PRIVILEGES |\
  3745. TOKEN_ADJUST_GROUPS |\
  3746. TOKEN_ADJUST_DEFAULT )
  3747. #if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
  3748. #define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P |\
  3749. TOKEN_ADJUST_SESSIONID )
  3750. #else
  3751. #define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P)
  3752. #endif
  3753. #define TOKEN_READ (STANDARD_RIGHTS_READ |\
  3754. TOKEN_QUERY)
  3755. #define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\
  3756. TOKEN_ADJUST_PRIVILEGES |\
  3757. TOKEN_ADJUST_GROUPS |\
  3758. TOKEN_ADJUST_DEFAULT)
  3759. #define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE)
  3760. //
  3761. //
  3762. // Token Types
  3763. //
  3764. typedef enum _TOKEN_TYPE {
  3765. TokenPrimary = 1,
  3766. TokenImpersonation
  3767. } TOKEN_TYPE;
  3768. typedef TOKEN_TYPE *PTOKEN_TYPE;
  3769. //
  3770. // Token Information Classes.
  3771. //
  3772. typedef enum _TOKEN_INFORMATION_CLASS {
  3773. TokenUser = 1,
  3774. TokenGroups,
  3775. TokenPrivileges,
  3776. TokenOwner,
  3777. TokenPrimaryGroup,
  3778. TokenDefaultDacl,
  3779. TokenSource,
  3780. TokenType,
  3781. TokenImpersonationLevel,
  3782. TokenStatistics,
  3783. TokenRestrictedSids,
  3784. TokenSessionId,
  3785. TokenGroupsAndPrivileges,
  3786. TokenSessionReference,
  3787. TokenSandBoxInert,
  3788. TokenAuditPolicy,
  3789. TokenOrigin
  3790. } TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
  3791. //
  3792. // Token information class structures
  3793. //
  3794. typedef struct _TOKEN_USER {
  3795. SID_AND_ATTRIBUTES User;
  3796. } TOKEN_USER, *PTOKEN_USER;
  3797. typedef struct _TOKEN_GROUPS {
  3798. DWORD GroupCount;
  3799. SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
  3800. } TOKEN_GROUPS, *PTOKEN_GROUPS;
  3801. typedef struct _TOKEN_PRIVILEGES {
  3802. DWORD PrivilegeCount;
  3803. LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
  3804. } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
  3805. typedef struct _TOKEN_OWNER {
  3806. PSID Owner;
  3807. } TOKEN_OWNER, *PTOKEN_OWNER;
  3808. typedef struct _TOKEN_PRIMARY_GROUP {
  3809. PSID PrimaryGroup;
  3810. } TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;
  3811. typedef struct _TOKEN_DEFAULT_DACL {
  3812. PACL DefaultDacl;
  3813. } TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;
  3814. typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
  3815. DWORD SidCount;
  3816. DWORD SidLength;
  3817. PSID_AND_ATTRIBUTES Sids;
  3818. DWORD RestrictedSidCount;
  3819. DWORD RestrictedSidLength;
  3820. PSID_AND_ATTRIBUTES RestrictedSids;
  3821. DWORD PrivilegeCount;
  3822. DWORD PrivilegeLength;
  3823. PLUID_AND_ATTRIBUTES Privileges;
  3824. LUID AuthenticationId;
  3825. } TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
  3826. //
  3827. // Valid bits for each TOKEN_AUDIT_POLICY policy mask field.
  3828. //
  3829. #define TOKEN_AUDIT_SUCCESS_INCLUDE 0x1
  3830. #define TOKEN_AUDIT_SUCCESS_EXCLUDE 0x2
  3831. #define TOKEN_AUDIT_FAILURE_INCLUDE 0x4
  3832. #define TOKEN_AUDIT_FAILURE_EXCLUDE 0x8
  3833. #define VALID_AUDIT_POLICY_BITS (TOKEN_AUDIT_SUCCESS_INCLUDE | \
  3834. TOKEN_AUDIT_SUCCESS_EXCLUDE | \
  3835. TOKEN_AUDIT_FAILURE_INCLUDE | \
  3836. TOKEN_AUDIT_FAILURE_EXCLUDE)
  3837. #define VALID_TOKEN_AUDIT_POLICY_ELEMENT(P) ((((P).PolicyMask & ~VALID_AUDIT_POLICY_BITS) == 0) && \
  3838. ((P).Category <= AuditEventMaxType))
  3839. typedef struct _TOKEN_AUDIT_POLICY_ELEMENT {
  3840. DWORD Category;
  3841. DWORD PolicyMask;
  3842. } TOKEN_AUDIT_POLICY_ELEMENT, *PTOKEN_AUDIT_POLICY_ELEMENT;
  3843. typedef struct _TOKEN_AUDIT_POLICY {
  3844. DWORD PolicyCount;
  3845. TOKEN_AUDIT_POLICY_ELEMENT Policy[ANYSIZE_ARRAY];
  3846. } TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
  3847. #define PER_USER_AUDITING_POLICY_SIZE(p) \
  3848. ( sizeof(TOKEN_AUDIT_POLICY) + (((p)->PolicyCount > ANYSIZE_ARRAY) ? (sizeof(TOKEN_AUDIT_POLICY_ELEMENT) * ((p)->PolicyCount - ANYSIZE_ARRAY)) : 0) )
  3849. #define PER_USER_AUDITING_POLICY_SIZE_BY_COUNT(C) \
  3850. ( sizeof(TOKEN_AUDIT_POLICY) + (((C) > ANYSIZE_ARRAY) ? (sizeof(TOKEN_AUDIT_POLICY_ELEMENT) * ((C) - ANYSIZE_ARRAY)) : 0) )
  3851. #define TOKEN_SOURCE_LENGTH 8
  3852. typedef struct _TOKEN_SOURCE {
  3853. CHAR SourceName[TOKEN_SOURCE_LENGTH];
  3854. LUID SourceIdentifier;
  3855. } TOKEN_SOURCE, *PTOKEN_SOURCE;
  3856. typedef struct _TOKEN_STATISTICS {
  3857. LUID TokenId;
  3858. LUID AuthenticationId;
  3859. LARGE_INTEGER ExpirationTime;
  3860. TOKEN_TYPE TokenType;
  3861. SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  3862. DWORD DynamicCharged;
  3863. DWORD DynamicAvailable;
  3864. DWORD GroupCount;
  3865. DWORD PrivilegeCount;
  3866. LUID ModifiedId;
  3867. } TOKEN_STATISTICS, *PTOKEN_STATISTICS;
  3868. typedef struct _TOKEN_CONTROL {
  3869. LUID TokenId;
  3870. LUID AuthenticationId;
  3871. LUID ModifiedId;
  3872. TOKEN_SOURCE TokenSource;
  3873. } TOKEN_CONTROL, *PTOKEN_CONTROL;
  3874. typedef struct _TOKEN_ORIGIN {
  3875. LUID OriginatingLogonSession ;
  3876. } TOKEN_ORIGIN, * PTOKEN_ORIGIN ;
  3877. //
  3878. // Security Tracking Mode
  3879. //
  3880. #define SECURITY_DYNAMIC_TRACKING (TRUE)
  3881. #define SECURITY_STATIC_TRACKING (FALSE)
  3882. typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
  3883. * PSECURITY_CONTEXT_TRACKING_MODE;
  3884. //
  3885. // Quality Of Service
  3886. //
  3887. typedef struct _SECURITY_QUALITY_OF_SERVICE {
  3888. DWORD Length;
  3889. SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  3890. SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
  3891. BOOLEAN EffectiveOnly;
  3892. } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
  3893. //
  3894. // Used to represent information related to a thread impersonation
  3895. //
  3896. typedef struct _SE_IMPERSONATION_STATE {
  3897. PACCESS_TOKEN Token;
  3898. BOOLEAN CopyOnOpen;
  3899. BOOLEAN EffectiveOnly;
  3900. SECURITY_IMPERSONATION_LEVEL Level;
  3901. } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
  3902. #define DISABLE_MAX_PRIVILEGE 0x1
  3903. #define SANDBOX_INERT 0x2
  3904. #define WRITE_RESTRICTED 0x4
  3905. typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
  3906. #define OWNER_SECURITY_INFORMATION (0x00000001L)
  3907. #define GROUP_SECURITY_INFORMATION (0x00000002L)
  3908. #define DACL_SECURITY_INFORMATION (0x00000004L)
  3909. #define SACL_SECURITY_INFORMATION (0x00000008L)
  3910. #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
  3911. #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
  3912. #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
  3913. #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
  3914. #define PROCESS_TERMINATE (0x0001)
  3915. #define PROCESS_CREATE_THREAD (0x0002)
  3916. #define PROCESS_SET_SESSIONID (0x0004)
  3917. #define PROCESS_VM_OPERATION (0x0008)
  3918. #define PROCESS_VM_READ (0x0010)
  3919. #define PROCESS_VM_WRITE (0x0020)
  3920. #define PROCESS_DUP_HANDLE (0x0040)
  3921. #define PROCESS_CREATE_PROCESS (0x0080)
  3922. #define PROCESS_SET_QUOTA (0x0100)
  3923. #define PROCESS_SET_INFORMATION (0x0200)
  3924. #define PROCESS_QUERY_INFORMATION (0x0400)
  3925. #define PROCESS_SUSPEND_RESUME (0x0800)
  3926. #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  3927. 0xFFF)
  3928. // begin_nthal
  3929. #if defined(_WIN64)
  3930. #define MAXIMUM_PROCESSORS 64
  3931. #else
  3932. #define MAXIMUM_PROCESSORS 32
  3933. #endif
  3934. // end_nthal
  3935. #define THREAD_TERMINATE (0x0001)
  3936. #define THREAD_SUSPEND_RESUME (0x0002)
  3937. #define THREAD_GET_CONTEXT (0x0008)
  3938. #define THREAD_SET_CONTEXT (0x0010)
  3939. #define THREAD_SET_INFORMATION (0x0020)
  3940. #define THREAD_QUERY_INFORMATION (0x0040)
  3941. #define THREAD_SET_THREAD_TOKEN (0x0080)
  3942. #define THREAD_IMPERSONATE (0x0100)
  3943. #define THREAD_DIRECT_IMPERSONATION (0x0200)
  3944. // begin_ntddk begin_wdm begin_ntifs
  3945. #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  3946. 0x3FF)
  3947. // end_ntddk end_wdm end_ntifs
  3948. #define JOB_OBJECT_ASSIGN_PROCESS (0x0001)
  3949. #define JOB_OBJECT_SET_ATTRIBUTES (0x0002)
  3950. #define JOB_OBJECT_QUERY (0x0004)
  3951. #define JOB_OBJECT_TERMINATE (0x0008)
  3952. #define JOB_OBJECT_SET_SECURITY_ATTRIBUTES (0x0010)
  3953. #define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  3954. 0x1F )
  3955. typedef struct _JOB_SET_ARRAY {
  3956. HANDLE JobHandle; // Handle to job object to insert
  3957. DWORD MemberLevel; // Level of this job in the set. Must be > 0. Can be sparse.
  3958. DWORD Flags; // Unused. Must be zero
  3959. } JOB_SET_ARRAY, *PJOB_SET_ARRAY;
  3960. #define TLS_MINIMUM_AVAILABLE 64
  3961. typedef struct _NT_TIB {
  3962. struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
  3963. PVOID StackBase;
  3964. PVOID StackLimit;
  3965. PVOID SubSystemTib;
  3966. union {
  3967. PVOID FiberData;
  3968. DWORD Version;
  3969. };
  3970. PVOID ArbitraryUserPointer;
  3971. struct _NT_TIB *Self;
  3972. } NT_TIB;
  3973. typedef NT_TIB *PNT_TIB;
  3974. //
  3975. // 32 and 64 bit specific version for wow64 and the debugger
  3976. //
  3977. typedef struct _NT_TIB32 {
  3978. DWORD ExceptionList;
  3979. DWORD StackBase;
  3980. DWORD StackLimit;
  3981. DWORD SubSystemTib;
  3982. union {
  3983. DWORD FiberData;
  3984. DWORD Version;
  3985. };
  3986. DWORD ArbitraryUserPointer;
  3987. DWORD Self;
  3988. } NT_TIB32, *PNT_TIB32;
  3989. typedef struct _NT_TIB64 {
  3990. DWORD64 ExceptionList;
  3991. DWORD64 StackBase;
  3992. DWORD64 StackLimit;
  3993. DWORD64 SubSystemTib;
  3994. union {
  3995. DWORD64 FiberData;
  3996. DWORD Version;
  3997. };
  3998. DWORD64 ArbitraryUserPointer;
  3999. DWORD64 Self;
  4000. } NT_TIB64, *PNT_TIB64;
  4001. #if !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_)
  4002. #define WX86
  4003. #endif
  4004. #define THREAD_BASE_PRIORITY_LOWRT 15 // value that gets a thread to LowRealtime-1
  4005. #define THREAD_BASE_PRIORITY_MAX 2 // maximum thread base priority boost
  4006. #define THREAD_BASE_PRIORITY_MIN (-2) // minimum thread base priority boost
  4007. #define THREAD_BASE_PRIORITY_IDLE (-15) // value that gets a thread to idle
  4008. typedef struct _QUOTA_LIMITS {
  4009. SIZE_T PagedPoolLimit;
  4010. SIZE_T NonPagedPoolLimit;
  4011. SIZE_T MinimumWorkingSetSize;
  4012. SIZE_T MaximumWorkingSetSize;
  4013. SIZE_T PagefileLimit;
  4014. LARGE_INTEGER TimeLimit;
  4015. } QUOTA_LIMITS;
  4016. typedef QUOTA_LIMITS *PQUOTA_LIMITS;
  4017. typedef struct _IO_COUNTERS {
  4018. ULONGLONG ReadOperationCount;
  4019. ULONGLONG WriteOperationCount;
  4020. ULONGLONG OtherOperationCount;
  4021. ULONGLONG ReadTransferCount;
  4022. ULONGLONG WriteTransferCount;
  4023. ULONGLONG OtherTransferCount;
  4024. } IO_COUNTERS;
  4025. typedef IO_COUNTERS *PIO_COUNTERS;
  4026. typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
  4027. LARGE_INTEGER TotalUserTime;
  4028. LARGE_INTEGER TotalKernelTime;
  4029. LARGE_INTEGER ThisPeriodTotalUserTime;
  4030. LARGE_INTEGER ThisPeriodTotalKernelTime;
  4031. DWORD TotalPageFaultCount;
  4032. DWORD TotalProcesses;
  4033. DWORD ActiveProcesses;
  4034. DWORD TotalTerminatedProcesses;
  4035. } JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
  4036. typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  4037. LARGE_INTEGER PerProcessUserTimeLimit;
  4038. LARGE_INTEGER PerJobUserTimeLimit;
  4039. DWORD LimitFlags;
  4040. SIZE_T MinimumWorkingSetSize;
  4041. SIZE_T MaximumWorkingSetSize;
  4042. DWORD ActiveProcessLimit;
  4043. ULONG_PTR Affinity;
  4044. DWORD PriorityClass;
  4045. DWORD SchedulingClass;
  4046. } JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
  4047. typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
  4048. JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
  4049. IO_COUNTERS IoInfo;
  4050. SIZE_T ProcessMemoryLimit;
  4051. SIZE_T JobMemoryLimit;
  4052. SIZE_T PeakProcessMemoryUsed;
  4053. SIZE_T PeakJobMemoryUsed;
  4054. } JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
  4055. typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
  4056. DWORD NumberOfAssignedProcesses;
  4057. DWORD NumberOfProcessIdsInList;
  4058. ULONG_PTR ProcessIdList[1];
  4059. } JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
  4060. typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
  4061. DWORD UIRestrictionsClass;
  4062. } JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
  4063. typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
  4064. DWORD SecurityLimitFlags ;
  4065. HANDLE JobToken ;
  4066. PTOKEN_GROUPS SidsToDisable ;
  4067. PTOKEN_PRIVILEGES PrivilegesToDelete ;
  4068. PTOKEN_GROUPS RestrictedSids ;
  4069. } JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;
  4070. typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
  4071. DWORD EndOfJobTimeAction;
  4072. } JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
  4073. typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
  4074. PVOID CompletionKey;
  4075. HANDLE CompletionPort;
  4076. } JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
  4077. typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
  4078. JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
  4079. IO_COUNTERS IoInfo;
  4080. } JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
  4081. typedef struct _JOBOBJECT_JOBSET_INFORMATION {
  4082. DWORD MemberLevel;
  4083. } JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;
  4084. #define JOB_OBJECT_TERMINATE_AT_END_OF_JOB 0
  4085. #define JOB_OBJECT_POST_AT_END_OF_JOB 1
  4086. //
  4087. // Completion Port Messages for job objects
  4088. //
  4089. // These values are returned via the lpNumberOfBytesTransferred parameter
  4090. //
  4091. #define JOB_OBJECT_MSG_END_OF_JOB_TIME 1
  4092. #define JOB_OBJECT_MSG_END_OF_PROCESS_TIME 2
  4093. #define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT 3
  4094. #define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO 4
  4095. #define JOB_OBJECT_MSG_NEW_PROCESS 6
  4096. #define JOB_OBJECT_MSG_EXIT_PROCESS 7
  4097. #define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS 8
  4098. #define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT 9
  4099. #define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 10
  4100. //
  4101. // Basic Limits
  4102. //
  4103. #define JOB_OBJECT_LIMIT_WORKINGSET 0x00000001
  4104. #define JOB_OBJECT_LIMIT_PROCESS_TIME 0x00000002
  4105. #define JOB_OBJECT_LIMIT_JOB_TIME 0x00000004
  4106. #define JOB_OBJECT_LIMIT_ACTIVE_PROCESS 0x00000008
  4107. #define JOB_OBJECT_LIMIT_AFFINITY 0x00000010
  4108. #define JOB_OBJECT_LIMIT_PRIORITY_CLASS 0x00000020
  4109. #define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME 0x00000040
  4110. #define JOB_OBJECT_LIMIT_SCHEDULING_CLASS 0x00000080
  4111. //
  4112. // Extended Limits
  4113. //
  4114. #define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100
  4115. #define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200
  4116. #define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400
  4117. #define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800
  4118. #define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000
  4119. #define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000
  4120. #define JOB_OBJECT_LIMIT_RESERVED2 0x00004000
  4121. #define JOB_OBJECT_LIMIT_RESERVED3 0x00008000
  4122. #define JOB_OBJECT_LIMIT_RESERVED4 0x00010000
  4123. #define JOB_OBJECT_LIMIT_RESERVED5 0x00020000
  4124. #define JOB_OBJECT_LIMIT_RESERVED6 0x00040000
  4125. #define JOB_OBJECT_LIMIT_VALID_FLAGS 0x0007ffff
  4126. #define JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS 0x000000ff
  4127. #define JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS 0x00003fff
  4128. #define JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS 0x0007ffff
  4129. //
  4130. // UI restrictions for jobs
  4131. //
  4132. #define JOB_OBJECT_UILIMIT_NONE 0x00000000
  4133. #define JOB_OBJECT_UILIMIT_HANDLES 0x00000001
  4134. #define JOB_OBJECT_UILIMIT_READCLIPBOARD 0x00000002
  4135. #define JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x00000004
  4136. #define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008
  4137. #define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x00000010
  4138. #define JOB_OBJECT_UILIMIT_GLOBALATOMS 0x00000020
  4139. #define JOB_OBJECT_UILIMIT_DESKTOP 0x00000040
  4140. #define JOB_OBJECT_UILIMIT_EXITWINDOWS 0x00000080
  4141. #define JOB_OBJECT_UILIMIT_ALL 0x000000FF
  4142. #define JOB_OBJECT_UI_VALID_FLAGS 0x000000FF
  4143. #define JOB_OBJECT_SECURITY_NO_ADMIN 0x00000001
  4144. #define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN 0x00000002
  4145. #define JOB_OBJECT_SECURITY_ONLY_TOKEN 0x00000004
  4146. #define JOB_OBJECT_SECURITY_FILTER_TOKENS 0x00000008
  4147. #define JOB_OBJECT_SECURITY_VALID_FLAGS 0x0000000f
  4148. typedef enum _JOBOBJECTINFOCLASS {
  4149. JobObjectBasicAccountingInformation = 1,
  4150. JobObjectBasicLimitInformation,
  4151. JobObjectBasicProcessIdList,
  4152. JobObjectBasicUIRestrictions,
  4153. JobObjectSecurityLimitInformation,
  4154. JobObjectEndOfJobTimeInformation,
  4155. JobObjectAssociateCompletionPortInformation,
  4156. JobObjectBasicAndIoAccountingInformation,
  4157. JobObjectExtendedLimitInformation,
  4158. JobObjectJobSetInformation,
  4159. MaxJobObjectInfoClass
  4160. } JOBOBJECTINFOCLASS;
  4161. //
  4162. #define EVENT_MODIFY_STATE 0x0002
  4163. #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
  4164. #define MUTANT_QUERY_STATE 0x0001
  4165. #define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\
  4166. MUTANT_QUERY_STATE)
  4167. #define SEMAPHORE_MODIFY_STATE 0x0002
  4168. #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
  4169. //
  4170. // Timer Specific Access Rights.
  4171. //
  4172. #define TIMER_QUERY_STATE 0x0001
  4173. #define TIMER_MODIFY_STATE 0x0002
  4174. #define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\
  4175. TIMER_QUERY_STATE|TIMER_MODIFY_STATE)
  4176. #define TIME_ZONE_ID_UNKNOWN 0
  4177. #define TIME_ZONE_ID_STANDARD 1
  4178. #define TIME_ZONE_ID_DAYLIGHT 2
  4179. #define MAXIMUM_NUMA_NODES 16
  4180. typedef struct _SYSTEM_NUMA_INFORMATION {
  4181. DWORD HighestNodeNumber;
  4182. DWORD Reserved;
  4183. union {
  4184. ULONGLONG ActiveProcessorsAffinityMask[MAXIMUM_NUMA_NODES];
  4185. ULONGLONG AvailableMemory[MAXIMUM_NUMA_NODES];
  4186. };
  4187. } SYSTEM_NUMA_INFORMATION, *PSYSTEM_NUMA_INFORMATION;
  4188. #define PROCESSOR_INTEL_386 386
  4189. #define PROCESSOR_INTEL_486 486
  4190. #define PROCESSOR_INTEL_PENTIUM 586
  4191. #define PROCESSOR_INTEL_IA64 2200
  4192. #define PROCESSOR_AMD_X8664 8664
  4193. #define PROCESSOR_MIPS_R4000 4000 // incl R4101 & R3910 for Windows CE
  4194. #define PROCESSOR_ALPHA_21064 21064
  4195. #define PROCESSOR_PPC_601 601
  4196. #define PROCESSOR_PPC_603 603
  4197. #define PROCESSOR_PPC_604 604
  4198. #define PROCESSOR_PPC_620 620
  4199. #define PROCESSOR_HITACHI_SH3 10003 // Windows CE
  4200. #define PROCESSOR_HITACHI_SH3E 10004 // Windows CE
  4201. #define PROCESSOR_HITACHI_SH4 10005 // Windows CE
  4202. #define PROCESSOR_MOTOROLA_821 821 // Windows CE
  4203. #define PROCESSOR_SHx_SH3 103 // Windows CE
  4204. #define PROCESSOR_SHx_SH4 104 // Windows CE
  4205. #define PROCESSOR_STRONGARM 2577 // Windows CE - 0xA11
  4206. #define PROCESSOR_ARM720 1824 // Windows CE - 0x720
  4207. #define PROCESSOR_ARM820 2080 // Windows CE - 0x820
  4208. #define PROCESSOR_ARM920 2336 // Windows CE - 0x920
  4209. #define PROCESSOR_ARM_7TDMI 70001 // Windows CE
  4210. #define PROCESSOR_OPTIL 0x494f // MSIL
  4211. #define PROCESSOR_ARCHITECTURE_INTEL 0
  4212. #define PROCESSOR_ARCHITECTURE_MIPS 1
  4213. #define PROCESSOR_ARCHITECTURE_ALPHA 2
  4214. #define PROCESSOR_ARCHITECTURE_PPC 3
  4215. #define PROCESSOR_ARCHITECTURE_SHX 4
  4216. #define PROCESSOR_ARCHITECTURE_ARM 5
  4217. #define PROCESSOR_ARCHITECTURE_IA64 6
  4218. #define PROCESSOR_ARCHITECTURE_ALPHA64 7
  4219. #define PROCESSOR_ARCHITECTURE_MSIL 8
  4220. #define PROCESSOR_ARCHITECTURE_AMD64 9
  4221. #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
  4222. #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
  4223. #define PF_FLOATING_POINT_PRECISION_ERRATA 0
  4224. #define PF_FLOATING_POINT_EMULATED 1
  4225. #define PF_COMPARE_EXCHANGE_DOUBLE 2
  4226. #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
  4227. #define PF_PPC_MOVEMEM_64BIT_OK 4
  4228. #define PF_ALPHA_BYTE_INSTRUCTIONS 5
  4229. #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
  4230. #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
  4231. #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
  4232. #define PF_PAE_ENABLED 9
  4233. #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
  4234. #define PF_SSE_DAZ_MODE_AVAILABLE 11
  4235. #define PF_NX_ENABLED 12
  4236. typedef struct _MEMORY_BASIC_INFORMATION {
  4237. PVOID BaseAddress;
  4238. PVOID AllocationBase;
  4239. DWORD AllocationProtect;
  4240. SIZE_T RegionSize;
  4241. DWORD State;
  4242. DWORD Protect;
  4243. DWORD Type;
  4244. } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
  4245. typedef struct _MEMORY_BASIC_INFORMATION32 {
  4246. DWORD BaseAddress;
  4247. DWORD AllocationBase;
  4248. DWORD AllocationProtect;
  4249. DWORD RegionSize;
  4250. DWORD State;
  4251. DWORD Protect;
  4252. DWORD Type;
  4253. } MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;
  4254. typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {
  4255. ULONGLONG BaseAddress;
  4256. ULONGLONG AllocationBase;
  4257. DWORD AllocationProtect;
  4258. DWORD __alignment1;
  4259. ULONGLONG RegionSize;
  4260. DWORD State;
  4261. DWORD Protect;
  4262. DWORD Type;
  4263. DWORD __alignment2;
  4264. } MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;
  4265. #define SECTION_QUERY 0x0001
  4266. #define SECTION_MAP_WRITE 0x0002
  4267. #define SECTION_MAP_READ 0x0004
  4268. #define SECTION_MAP_EXECUTE 0x0008
  4269. #define SECTION_EXTEND_SIZE 0x0010
  4270. #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 // not included in SECTION_ALL_ACCESS
  4271. #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
  4272. SECTION_MAP_WRITE | \
  4273. SECTION_MAP_READ | \
  4274. SECTION_MAP_EXECUTE | \
  4275. SECTION_EXTEND_SIZE)
  4276. #define PAGE_NOACCESS 0x01
  4277. #define PAGE_READONLY 0x02
  4278. #define PAGE_READWRITE 0x04
  4279. #define PAGE_WRITECOPY 0x08
  4280. #define PAGE_EXECUTE 0x10
  4281. #define PAGE_EXECUTE_READ 0x20
  4282. #define PAGE_EXECUTE_READWRITE 0x40
  4283. #define PAGE_EXECUTE_WRITECOPY 0x80
  4284. #define PAGE_GUARD 0x100
  4285. #define PAGE_NOCACHE 0x200
  4286. #define PAGE_WRITECOMBINE 0x400
  4287. #define MEM_COMMIT 0x1000
  4288. #define MEM_RESERVE 0x2000
  4289. #define MEM_DECOMMIT 0x4000
  4290. #define MEM_RELEASE 0x8000
  4291. #define MEM_FREE 0x10000
  4292. #define MEM_PRIVATE 0x20000
  4293. #define MEM_MAPPED 0x40000
  4294. #define MEM_RESET 0x80000
  4295. #define MEM_TOP_DOWN 0x100000
  4296. #define MEM_WRITE_WATCH 0x200000
  4297. #define MEM_PHYSICAL 0x400000
  4298. #define MEM_4MB_PAGES 0x80000000
  4299. #define SEC_FILE 0x800000
  4300. #define SEC_IMAGE 0x1000000
  4301. #define SEC_RESERVE 0x4000000
  4302. #define SEC_COMMIT 0x8000000
  4303. #define SEC_NOCACHE 0x10000000
  4304. #define MEM_IMAGE SEC_IMAGE
  4305. #define WRITE_WATCH_FLAG_RESET 0x01
  4306. //
  4307. // Define access rights to files and directories
  4308. //
  4309. //
  4310. // The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
  4311. // devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
  4312. // constants *MUST* always be in sync.
  4313. // The values are redefined in devioctl.h because they must be available to
  4314. // both DOS and NT.
  4315. //
  4316. #define FILE_READ_DATA ( 0x0001 ) // file & pipe
  4317. #define FILE_LIST_DIRECTORY ( 0x0001 ) // directory
  4318. #define FILE_WRITE_DATA ( 0x0002 ) // file & pipe
  4319. #define FILE_ADD_FILE ( 0x0002 ) // directory
  4320. #define FILE_APPEND_DATA ( 0x0004 ) // file
  4321. #define FILE_ADD_SUBDIRECTORY ( 0x0004 ) // directory
  4322. #define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) // named pipe
  4323. #define FILE_READ_EA ( 0x0008 ) // file & directory
  4324. #define FILE_WRITE_EA ( 0x0010 ) // file & directory
  4325. #define FILE_EXECUTE ( 0x0020 ) // file
  4326. #define FILE_TRAVERSE ( 0x0020 ) // directory
  4327. #define FILE_DELETE_CHILD ( 0x0040 ) // directory
  4328. #define FILE_READ_ATTRIBUTES ( 0x0080 ) // all
  4329. #define FILE_WRITE_ATTRIBUTES ( 0x0100 ) // all
  4330. #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
  4331. #define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
  4332. FILE_READ_DATA |\
  4333. FILE_READ_ATTRIBUTES |\
  4334. FILE_READ_EA |\
  4335. SYNCHRONIZE)
  4336. #define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
  4337. FILE_WRITE_DATA |\
  4338. FILE_WRITE_ATTRIBUTES |\
  4339. FILE_WRITE_EA |\
  4340. FILE_APPEND_DATA |\
  4341. SYNCHRONIZE)
  4342. #define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
  4343. FILE_READ_ATTRIBUTES |\
  4344. FILE_EXECUTE |\
  4345. SYNCHRONIZE)
  4346. #define FILE_SHARE_READ 0x00000001
  4347. #define FILE_SHARE_WRITE 0x00000002
  4348. #define FILE_SHARE_DELETE 0x00000004
  4349. #define FILE_ATTRIBUTE_READONLY 0x00000001
  4350. #define FILE_ATTRIBUTE_HIDDEN 0x00000002
  4351. #define FILE_ATTRIBUTE_SYSTEM 0x00000004
  4352. #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
  4353. #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
  4354. #define FILE_ATTRIBUTE_DEVICE 0x00000040
  4355. #define FILE_ATTRIBUTE_NORMAL 0x00000080
  4356. #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
  4357. #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
  4358. #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
  4359. #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
  4360. #define FILE_ATTRIBUTE_OFFLINE 0x00001000
  4361. #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
  4362. #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
  4363. #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
  4364. #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
  4365. #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
  4366. #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
  4367. #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
  4368. #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
  4369. #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
  4370. #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
  4371. #define FILE_ACTION_ADDED 0x00000001
  4372. #define FILE_ACTION_REMOVED 0x00000002
  4373. #define FILE_ACTION_MODIFIED 0x00000003
  4374. #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
  4375. #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
  4376. #define MAILSLOT_NO_MESSAGE ((DWORD)-1)
  4377. #define MAILSLOT_WAIT_FOREVER ((DWORD)-1)
  4378. #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
  4379. #define FILE_CASE_PRESERVED_NAMES 0x00000002
  4380. #define FILE_UNICODE_ON_DISK 0x00000004
  4381. #define FILE_PERSISTENT_ACLS 0x00000008
  4382. #define FILE_FILE_COMPRESSION 0x00000010
  4383. #define FILE_VOLUME_QUOTAS 0x00000020
  4384. #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
  4385. #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
  4386. #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
  4387. #define FILE_VOLUME_IS_COMPRESSED 0x00008000
  4388. #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
  4389. #define FILE_SUPPORTS_ENCRYPTION 0x00020000
  4390. #define FILE_NAMED_STREAMS 0x00040000
  4391. #define FILE_READ_ONLY_VOLUME 0x00080000
  4392. //
  4393. // Define the file notification information structure
  4394. //
  4395. typedef struct _FILE_NOTIFY_INFORMATION {
  4396. DWORD NextEntryOffset;
  4397. DWORD Action;
  4398. DWORD FileNameLength;
  4399. WCHAR FileName[1];
  4400. } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
  4401. //
  4402. // Define segement buffer structure for scatter/gather read/write.
  4403. //
  4404. typedef union _FILE_SEGMENT_ELEMENT {
  4405. PVOID64 Buffer;
  4406. ULONGLONG Alignment;
  4407. }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
  4408. //
  4409. // The reparse GUID structure is used by all 3rd party layered drivers to
  4410. // store data in a reparse point. For non-Microsoft tags, The GUID field
  4411. // cannot be GUID_NULL.
  4412. // The constraints on reparse tags are defined below.
  4413. // Microsoft tags can also be used with this format of the reparse point buffer.
  4414. //
  4415. typedef struct _REPARSE_GUID_DATA_BUFFER {
  4416. DWORD ReparseTag;
  4417. WORD ReparseDataLength;
  4418. WORD Reserved;
  4419. GUID ReparseGuid;
  4420. struct {
  4421. BYTE DataBuffer[1];
  4422. } GenericReparseBuffer;
  4423. } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
  4424. #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
  4425. //
  4426. // Maximum allowed size of the reparse data.
  4427. //
  4428. #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
  4429. //
  4430. // Predefined reparse tags.
  4431. // These tags need to avoid conflicting with IO_REMOUNT defined in ntos\inc\io.h
  4432. //
  4433. #define IO_REPARSE_TAG_RESERVED_ZERO (0)
  4434. #define IO_REPARSE_TAG_RESERVED_ONE (1)
  4435. //
  4436. // The value of the following constant needs to satisfy the following conditions:
  4437. // (1) Be at least as large as the largest of the reserved tags.
  4438. // (2) Be strictly smaller than all the tags in use.
  4439. //
  4440. #define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
  4441. //
  4442. // The reparse tags are a DWORD. The 32 bits are laid out as follows:
  4443. //
  4444. // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  4445. // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  4446. // +-+-+-+-+-----------------------+-------------------------------+
  4447. // |M|R|N|R| Reserved bits | Reparse Tag Value |
  4448. // +-+-+-+-+-----------------------+-------------------------------+
  4449. //
  4450. // M is the Microsoft bit. When set to 1, it denotes a tag owned by Microsoft.
  4451. // All ISVs must use a tag with a 0 in this position.
  4452. // Note: If a Microsoft tag is used by non-Microsoft software, the
  4453. // behavior is not defined.
  4454. //
  4455. // R is reserved. Must be zero for non-Microsoft tags.
  4456. //
  4457. // N is name surrogate. When set to 1, the file represents another named
  4458. // entity in the system.
  4459. //
  4460. // The M and N bits are OR-able.
  4461. // The following macros check for the M and N bit values:
  4462. //
  4463. //
  4464. // Macro to determine whether a reparse point tag corresponds to a tag
  4465. // owned by Microsoft.
  4466. //
  4467. #define IsReparseTagMicrosoft(_tag) ( \
  4468. ((_tag) & 0x80000000) \
  4469. )
  4470. //
  4471. // Macro to determine whether a reparse point tag is a name surrogate
  4472. //
  4473. #define IsReparseTagNameSurrogate(_tag) ( \
  4474. ((_tag) & 0x20000000) \
  4475. )
  4476. #define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
  4477. #define IO_REPARSE_TAG_HSM (0xC0000004L)
  4478. #define IO_REPARSE_TAG_SIS (0x80000007L)
  4479. #define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL)
  4480. #define IO_COMPLETION_MODIFY_STATE 0x0002
  4481. #define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
  4482. #define DUPLICATE_CLOSE_SOURCE 0x00000001
  4483. #define DUPLICATE_SAME_ACCESS 0x00000002
  4484. typedef enum _SYSTEM_POWER_STATE {
  4485. PowerSystemUnspecified = 0,
  4486. PowerSystemWorking = 1,
  4487. PowerSystemSleeping1 = 2,
  4488. PowerSystemSleeping2 = 3,
  4489. PowerSystemSleeping3 = 4,
  4490. PowerSystemHibernate = 5,
  4491. PowerSystemShutdown = 6,
  4492. PowerSystemMaximum = 7
  4493. } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
  4494. #define POWER_SYSTEM_MAXIMUM 7
  4495. typedef enum {
  4496. PowerActionNone = 0,
  4497. PowerActionReserved,
  4498. PowerActionSleep,
  4499. PowerActionHibernate,
  4500. PowerActionShutdown,
  4501. PowerActionShutdownReset,
  4502. PowerActionShutdownOff,
  4503. PowerActionWarmEject
  4504. } POWER_ACTION, *PPOWER_ACTION;
  4505. typedef enum _DEVICE_POWER_STATE {
  4506. PowerDeviceUnspecified = 0,
  4507. PowerDeviceD0,
  4508. PowerDeviceD1,
  4509. PowerDeviceD2,
  4510. PowerDeviceD3,
  4511. PowerDeviceMaximum
  4512. } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
  4513. #define ES_SYSTEM_REQUIRED ((DWORD)0x00000001)
  4514. #define ES_DISPLAY_REQUIRED ((DWORD)0x00000002)
  4515. #define ES_USER_PRESENT ((DWORD)0x00000004)
  4516. #define ES_CONTINUOUS ((DWORD)0x80000000)
  4517. typedef DWORD EXECUTION_STATE;
  4518. typedef enum {
  4519. LT_DONT_CARE,
  4520. LT_LOWEST_LATENCY
  4521. } LATENCY_TIME;
  4522. // end_ntminiport end_ntifs end_wdm end_ntddk
  4523. //-----------------------------------------------------------------------------
  4524. // Device Power Information
  4525. // Accessable via CM_Get_DevInst_Registry_Property_Ex(CM_DRP_DEVICE_POWER_DATA)
  4526. //-----------------------------------------------------------------------------
  4527. #define PDCAP_D0_SUPPORTED 0x00000001
  4528. #define PDCAP_D1_SUPPORTED 0x00000002
  4529. #define PDCAP_D2_SUPPORTED 0x00000004
  4530. #define PDCAP_D3_SUPPORTED 0x00000008
  4531. #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
  4532. #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
  4533. #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
  4534. #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
  4535. #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
  4536. typedef struct CM_Power_Data_s {
  4537. DWORD PD_Size;
  4538. DEVICE_POWER_STATE PD_MostRecentPowerState;
  4539. DWORD PD_Capabilities;
  4540. DWORD PD_D1Latency;
  4541. DWORD PD_D2Latency;
  4542. DWORD PD_D3Latency;
  4543. DEVICE_POWER_STATE PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];
  4544. SYSTEM_POWER_STATE PD_DeepestSystemWake;
  4545. } CM_POWER_DATA, *PCM_POWER_DATA;
  4546. // begin_ntddk
  4547. typedef enum {
  4548. SystemPowerPolicyAc,
  4549. SystemPowerPolicyDc,
  4550. VerifySystemPolicyAc,
  4551. VerifySystemPolicyDc,
  4552. SystemPowerCapabilities,
  4553. SystemBatteryState,
  4554. SystemPowerStateHandler,
  4555. ProcessorStateHandler,
  4556. SystemPowerPolicyCurrent,
  4557. AdministratorPowerPolicy,
  4558. SystemReserveHiberFile,
  4559. ProcessorInformation,
  4560. SystemPowerInformation,
  4561. ProcessorStateHandler2,
  4562. LastWakeTime, // Compare with KeQueryInterruptTime()
  4563. LastSleepTime, // Compare with KeQueryInterruptTime()
  4564. SystemExecutionState,
  4565. SystemPowerStateNotifyHandler,
  4566. ProcessorPowerPolicyAc,
  4567. ProcessorPowerPolicyDc,
  4568. VerifyProcessorPowerPolicyAc,
  4569. VerifyProcessorPowerPolicyDc,
  4570. ProcessorPowerPolicyCurrent
  4571. } POWER_INFORMATION_LEVEL;
  4572. // begin_wdm
  4573. //
  4574. // System power manager capabilities
  4575. //
  4576. typedef struct {
  4577. DWORD Granularity;
  4578. DWORD Capacity;
  4579. } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
  4580. //
  4581. // Power Policy Management interfaces
  4582. //
  4583. typedef struct {
  4584. POWER_ACTION Action;
  4585. DWORD Flags;
  4586. DWORD EventCode;
  4587. } POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
  4588. // POWER_ACTION_POLICY->Flags:
  4589. #define POWER_ACTION_QUERY_ALLOWED 0x00000001
  4590. #define POWER_ACTION_UI_ALLOWED 0x00000002
  4591. #define POWER_ACTION_OVERRIDE_APPS 0x00000004
  4592. #define POWER_ACTION_LIGHTEST_FIRST 0x10000000
  4593. #define POWER_ACTION_LOCK_CONSOLE 0x20000000
  4594. #define POWER_ACTION_DISABLE_WAKES 0x40000000
  4595. #define POWER_ACTION_CRITICAL 0x80000000
  4596. // POWER_ACTION_POLICY->EventCode flags
  4597. #define POWER_LEVEL_USER_NOTIFY_TEXT 0x00000001
  4598. #define POWER_LEVEL_USER_NOTIFY_SOUND 0x00000002
  4599. #define POWER_LEVEL_USER_NOTIFY_EXEC 0x00000004
  4600. #define POWER_USER_NOTIFY_BUTTON 0x00000008
  4601. #define POWER_USER_NOTIFY_SHUTDOWN 0x00000010
  4602. #define POWER_FORCE_TRIGGER_RESET 0x80000000
  4603. // system battery drain policies
  4604. typedef struct {
  4605. BOOLEAN Enable;
  4606. BYTE Spare[3];
  4607. DWORD BatteryLevel;
  4608. POWER_ACTION_POLICY PowerPolicy;
  4609. SYSTEM_POWER_STATE MinSystemState;
  4610. } SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
  4611. // Discharge policy constants
  4612. #define NUM_DISCHARGE_POLICIES 4
  4613. #define DISCHARGE_POLICY_CRITICAL 0
  4614. #define DISCHARGE_POLICY_LOW 1
  4615. //
  4616. // Throttling policies
  4617. //
  4618. #define PO_THROTTLE_NONE 0
  4619. #define PO_THROTTLE_CONSTANT 1
  4620. #define PO_THROTTLE_DEGRADE 2
  4621. #define PO_THROTTLE_ADAPTIVE 3
  4622. #define PO_THROTTLE_MAXIMUM 4 // not a policy, just a limit
  4623. // system power policies
  4624. typedef struct _SYSTEM_POWER_POLICY {
  4625. DWORD Revision; // 1
  4626. // events
  4627. POWER_ACTION_POLICY PowerButton;
  4628. POWER_ACTION_POLICY SleepButton;
  4629. POWER_ACTION_POLICY LidClose;
  4630. SYSTEM_POWER_STATE LidOpenWake;
  4631. DWORD Reserved;
  4632. // "system idle" detection
  4633. POWER_ACTION_POLICY Idle;
  4634. DWORD IdleTimeout;
  4635. BYTE IdleSensitivity;
  4636. // dynamic throttling policy
  4637. // PO_THROTTLE_NONE, PO_THROTTLE_CONSTANT, PO_THROTTLE_DEGRADE, or PO_THROTTLE_ADAPTIVE
  4638. BYTE DynamicThrottle;
  4639. BYTE Spare2[2];
  4640. // meaning of power action "sleep"
  4641. SYSTEM_POWER_STATE MinSleep;
  4642. SYSTEM_POWER_STATE MaxSleep;
  4643. SYSTEM_POWER_STATE ReducedLatencySleep;
  4644. DWORD WinLogonFlags;
  4645. // parameters for dozing
  4646. DWORD Spare3;
  4647. DWORD DozeS4Timeout;
  4648. // battery policies
  4649. DWORD BroadcastCapacityResolution;
  4650. SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES];
  4651. // video policies
  4652. DWORD VideoTimeout;
  4653. BOOLEAN VideoDimDisplay;
  4654. DWORD VideoReserved[3];
  4655. // hard disk policies
  4656. DWORD SpindownTimeout;
  4657. // processor policies
  4658. BOOLEAN OptimizeForPower;
  4659. BYTE FanThrottleTolerance;
  4660. BYTE ForcedThrottle;
  4661. BYTE MinThrottle;
  4662. POWER_ACTION_POLICY OverThrottled;
  4663. } SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;
  4664. // processor power policy state
  4665. typedef struct _PROCESSOR_POWER_POLICY_INFO {
  4666. // Time based information (will be converted to kernel units)
  4667. DWORD TimeCheck; // in US
  4668. DWORD DemoteLimit; // in US
  4669. DWORD PromoteLimit; // in US
  4670. // Percentage based information
  4671. BYTE DemotePercent;
  4672. BYTE PromotePercent;
  4673. BYTE Spare[2];
  4674. // Flags
  4675. DWORD AllowDemotion:1;
  4676. DWORD AllowPromotion:1;
  4677. DWORD Reserved:30;
  4678. } PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;
  4679. // processor power policy
  4680. typedef struct _PROCESSOR_POWER_POLICY {
  4681. DWORD Revision; // 1
  4682. // Dynamic Throttling Policy
  4683. BYTE DynamicThrottle;
  4684. BYTE Spare[3];
  4685. // Flags
  4686. DWORD DisableCStates:1;
  4687. DWORD Reserved:31;
  4688. // System policy information
  4689. // The Array is last, in case it needs to be grown and the structure
  4690. // revision incremented.
  4691. DWORD PolicyCount;
  4692. PROCESSOR_POWER_POLICY_INFO Policy[3];
  4693. } PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;
  4694. // administrator power policy overrides
  4695. typedef struct _ADMINISTRATOR_POWER_POLICY {
  4696. // meaning of power action "sleep"
  4697. SYSTEM_POWER_STATE MinSleep;
  4698. SYSTEM_POWER_STATE MaxSleep;
  4699. // video policies
  4700. DWORD MinVideoTimeout;
  4701. DWORD MaxVideoTimeout;
  4702. // disk policies
  4703. DWORD MinSpindownTimeout;
  4704. DWORD MaxSpindownTimeout;
  4705. } ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
  4706. typedef struct {
  4707. // Misc supported system features
  4708. BOOLEAN PowerButtonPresent;
  4709. BOOLEAN SleepButtonPresent;
  4710. BOOLEAN LidPresent;
  4711. BOOLEAN SystemS1;
  4712. BOOLEAN SystemS2;
  4713. BOOLEAN SystemS3;
  4714. BOOLEAN SystemS4; // hibernate
  4715. BOOLEAN SystemS5; // off
  4716. BOOLEAN HiberFilePresent;
  4717. BOOLEAN FullWake;
  4718. BOOLEAN VideoDimPresent;
  4719. BOOLEAN ApmPresent;
  4720. BOOLEAN UpsPresent;
  4721. // Processors
  4722. BOOLEAN ThermalControl;
  4723. BOOLEAN ProcessorThrottle;
  4724. BYTE ProcessorMinThrottle;
  4725. BYTE ProcessorMaxThrottle;
  4726. BYTE spare2[4];
  4727. // Disk
  4728. BOOLEAN DiskSpinDown;
  4729. BYTE spare3[8];
  4730. // System Battery
  4731. BOOLEAN SystemBatteriesPresent;
  4732. BOOLEAN BatteriesAreShortTerm;
  4733. BATTERY_REPORTING_SCALE BatteryScale[3];
  4734. // Wake
  4735. SYSTEM_POWER_STATE AcOnLineWake;
  4736. SYSTEM_POWER_STATE SoftLidWake;
  4737. SYSTEM_POWER_STATE RtcWake;
  4738. SYSTEM_POWER_STATE MinDeviceWakeState; // note this may change on driver load
  4739. SYSTEM_POWER_STATE DefaultLowLatencyWake;
  4740. } SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
  4741. typedef struct {
  4742. BOOLEAN AcOnLine;
  4743. BOOLEAN BatteryPresent;
  4744. BOOLEAN Charging;
  4745. BOOLEAN Discharging;
  4746. BOOLEAN Spare1[4];
  4747. DWORD MaxCapacity;
  4748. DWORD RemainingCapacity;
  4749. DWORD Rate;
  4750. DWORD EstimatedTime;
  4751. DWORD DefaultAlert1;
  4752. DWORD DefaultAlert2;
  4753. } SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
  4754. //
  4755. // Image Format
  4756. //
  4757. #ifndef _MAC
  4758. #include "pshpack4.h" // 4 byte packing is the default
  4759. #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
  4760. #define IMAGE_OS2_SIGNATURE 0x454E // NE
  4761. #define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
  4762. #define IMAGE_VXD_SIGNATURE 0x454C // LE
  4763. #define IMAGE_NT_SIGNATURE 0x00004550 // PE00
  4764. #include "pshpack2.h" // 16 bit headers are 2 byte packed
  4765. #else
  4766. #include "pshpack1.h"
  4767. #define IMAGE_DOS_SIGNATURE 0x4D5A // MZ
  4768. #define IMAGE_OS2_SIGNATURE 0x4E45 // NE
  4769. #define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE
  4770. #define IMAGE_NT_SIGNATURE 0x50450000 // PE00
  4771. #endif
  4772. typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
  4773. WORD e_magic; // Magic number
  4774. WORD e_cblp; // Bytes on last page of file
  4775. WORD e_cp; // Pages in file
  4776. WORD e_crlc; // Relocations
  4777. WORD e_cparhdr; // Size of header in paragraphs
  4778. WORD e_minalloc; // Minimum extra paragraphs needed
  4779. WORD e_maxalloc; // Maximum extra paragraphs needed
  4780. WORD e_ss; // Initial (relative) SS value
  4781. WORD e_sp; // Initial SP value
  4782. WORD e_csum; // Checksum
  4783. WORD e_ip; // Initial IP value
  4784. WORD e_cs; // Initial (relative) CS value
  4785. WORD e_lfarlc; // File address of relocation table
  4786. WORD e_ovno; // Overlay number
  4787. WORD e_res[4]; // Reserved words
  4788. WORD e_oemid; // OEM identifier (for e_oeminfo)
  4789. WORD e_oeminfo; // OEM information; e_oemid specific
  4790. WORD e_res2[10]; // Reserved words
  4791. LONG e_lfanew; // File address of new exe header
  4792. } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
  4793. typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header
  4794. WORD ne_magic; // Magic number
  4795. CHAR ne_ver; // Version number
  4796. CHAR ne_rev; // Revision number
  4797. WORD ne_enttab; // Offset of Entry Table
  4798. WORD ne_cbenttab; // Number of bytes in Entry Table
  4799. LONG ne_crc; // Checksum of whole file
  4800. WORD ne_flags; // Flag word
  4801. WORD ne_autodata; // Automatic data segment number
  4802. WORD ne_heap; // Initial heap allocation
  4803. WORD ne_stack; // Initial stack allocation
  4804. LONG ne_csip; // Initial CS:IP setting
  4805. LONG ne_sssp; // Initial SS:SP setting
  4806. WORD ne_cseg; // Count of file segments
  4807. WORD ne_cmod; // Entries in Module Reference Table
  4808. WORD ne_cbnrestab; // Size of non-resident name table
  4809. WORD ne_segtab; // Offset of Segment Table
  4810. WORD ne_rsrctab; // Offset of Resource Table
  4811. WORD ne_restab; // Offset of resident name table
  4812. WORD ne_modtab; // Offset of Module Reference Table
  4813. WORD ne_imptab; // Offset of Imported Names Table
  4814. LONG ne_nrestab; // Offset of Non-resident Names Table
  4815. WORD ne_cmovent; // Count of movable entries
  4816. WORD ne_align; // Segment alignment shift count
  4817. WORD ne_cres; // Count of resource segments
  4818. BYTE ne_exetyp; // Target Operating system
  4819. BYTE ne_flagsothers; // Other .EXE flags
  4820. WORD ne_pretthunks; // offset to return thunks
  4821. WORD ne_psegrefbytes; // offset to segment ref. bytes
  4822. WORD ne_swaparea; // Minimum code swap area size
  4823. WORD ne_expver; // Expected Windows version number
  4824. } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
  4825. typedef struct _IMAGE_VXD_HEADER { // Windows VXD header
  4826. WORD e32_magic; // Magic number
  4827. BYTE e32_border; // The byte ordering for the VXD
  4828. BYTE e32_worder; // The word ordering for the VXD
  4829. DWORD e32_level; // The EXE format level for now = 0
  4830. WORD e32_cpu; // The CPU type
  4831. WORD e32_os; // The OS type
  4832. DWORD e32_ver; // Module version
  4833. DWORD e32_mflags; // Module flags
  4834. DWORD e32_mpages; // Module # pages
  4835. DWORD e32_startobj; // Object # for instruction pointer
  4836. DWORD e32_eip; // Extended instruction pointer
  4837. DWORD e32_stackobj; // Object # for stack pointer
  4838. DWORD e32_esp; // Extended stack pointer
  4839. DWORD e32_pagesize; // VXD page size
  4840. DWORD e32_lastpagesize; // Last page size in VXD
  4841. DWORD e32_fixupsize; // Fixup section size
  4842. DWORD e32_fixupsum; // Fixup section checksum
  4843. DWORD e32_ldrsize; // Loader section size
  4844. DWORD e32_ldrsum; // Loader section checksum
  4845. DWORD e32_objtab; // Object table offset
  4846. DWORD e32_objcnt; // Number of objects in module
  4847. DWORD e32_objmap; // Object page map offset
  4848. DWORD e32_itermap; // Object iterated data map offset
  4849. DWORD e32_rsrctab; // Offset of Resource Table
  4850. DWORD e32_rsrccnt; // Number of resource entries
  4851. DWORD e32_restab; // Offset of resident name table
  4852. DWORD e32_enttab; // Offset of Entry Table
  4853. DWORD e32_dirtab; // Offset of Module Directive Table
  4854. DWORD e32_dircnt; // Number of module directives
  4855. DWORD e32_fpagetab; // Offset of Fixup Page Table
  4856. DWORD e32_frectab; // Offset of Fixup Record Table
  4857. DWORD e32_impmod; // Offset of Import Module Name Table
  4858. DWORD e32_impmodcnt; // Number of entries in Import Module Name Table
  4859. DWORD e32_impproc; // Offset of Import Procedure Name Table
  4860. DWORD e32_pagesum; // Offset of Per-Page Checksum Table
  4861. DWORD e32_datapage; // Offset of Enumerated Data Pages
  4862. DWORD e32_preload; // Number of preload pages
  4863. DWORD e32_nrestab; // Offset of Non-resident Names Table
  4864. DWORD e32_cbnrestab; // Size of Non-resident Name Table
  4865. DWORD e32_nressum; // Non-resident Name Table Checksum
  4866. DWORD e32_autodata; // Object # for automatic data object
  4867. DWORD e32_debuginfo; // Offset of the debugging information
  4868. DWORD e32_debuglen; // The length of the debugging info. in bytes
  4869. DWORD e32_instpreload; // Number of instance pages in preload section of VXD file
  4870. DWORD e32_instdemand; // Number of instance pages in demand load section of VXD file
  4871. DWORD e32_heapsize; // Size of heap - for 16-bit apps
  4872. BYTE e32_res3[12]; // Reserved words
  4873. DWORD e32_winresoff;
  4874. DWORD e32_winreslen;
  4875. WORD e32_devid; // Device ID for VxD
  4876. WORD e32_ddkver; // DDK version for VxD
  4877. } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
  4878. #ifndef _MAC
  4879. #include "poppack.h" // Back to 4 byte packing
  4880. #endif
  4881. //
  4882. // File header format.
  4883. //
  4884. typedef struct _IMAGE_FILE_HEADER {
  4885. WORD Machine;
  4886. WORD NumberOfSections;
  4887. DWORD TimeDateStamp;
  4888. DWORD PointerToSymbolTable;
  4889. DWORD NumberOfSymbols;
  4890. WORD SizeOfOptionalHeader;
  4891. WORD Characteristics;
  4892. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  4893. #define IMAGE_SIZEOF_FILE_HEADER 20
  4894. #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
  4895. #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).
  4896. #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
  4897. #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
  4898. #define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 // Agressively trim working set
  4899. #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
  4900. #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
  4901. #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
  4902. #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
  4903. #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // If Image is on removable media, copy and run from the swap file.
  4904. #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // If Image is on Net, copy and run from the swap file.
  4905. #define IMAGE_FILE_SYSTEM 0x1000 // System File.
  4906. #define IMAGE_FILE_DLL 0x2000 // File is a DLL.
  4907. #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // File should only be run on a UP machine
  4908. #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.
  4909. #define IMAGE_FILE_MACHINE_UNKNOWN 0
  4910. #define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
  4911. #define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
  4912. #define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
  4913. #define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian
  4914. #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2
  4915. #define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP
  4916. #define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian
  4917. #define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
  4918. #define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian
  4919. #define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian
  4920. #define IMAGE_FILE_MACHINE_SH5 0x01a8 // SH5
  4921. #define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian
  4922. #define IMAGE_FILE_MACHINE_THUMB 0x01c2
  4923. #define IMAGE_FILE_MACHINE_AM33 0x01d3
  4924. #define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
  4925. #define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
  4926. #define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
  4927. #define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
  4928. #define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
  4929. #define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
  4930. #define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
  4931. #define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
  4932. #define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
  4933. #define IMAGE_FILE_MACHINE_CEF 0x0CEF
  4934. #define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
  4935. #define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
  4936. #define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
  4937. #define IMAGE_FILE_MACHINE_CEE 0xC0EE
  4938. //
  4939. // Directory format.
  4940. //
  4941. typedef struct _IMAGE_DATA_DIRECTORY {
  4942. DWORD VirtualAddress;
  4943. DWORD Size;
  4944. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  4945. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
  4946. //
  4947. // Optional header format.
  4948. //
  4949. typedef struct _IMAGE_OPTIONAL_HEADER {
  4950. //
  4951. // Standard fields.
  4952. //
  4953. WORD Magic;
  4954. BYTE MajorLinkerVersion;
  4955. BYTE MinorLinkerVersion;
  4956. DWORD SizeOfCode;
  4957. DWORD SizeOfInitializedData;
  4958. DWORD SizeOfUninitializedData;
  4959. DWORD AddressOfEntryPoint;
  4960. DWORD BaseOfCode;
  4961. DWORD BaseOfData;
  4962. //
  4963. // NT additional fields.
  4964. //
  4965. DWORD ImageBase;
  4966. DWORD SectionAlignment;
  4967. DWORD FileAlignment;
  4968. WORD MajorOperatingSystemVersion;
  4969. WORD MinorOperatingSystemVersion;
  4970. WORD MajorImageVersion;
  4971. WORD MinorImageVersion;
  4972. WORD MajorSubsystemVersion;
  4973. WORD MinorSubsystemVersion;
  4974. DWORD Win32VersionValue;
  4975. DWORD SizeOfImage;
  4976. DWORD SizeOfHeaders;
  4977. DWORD CheckSum;
  4978. WORD Subsystem;
  4979. WORD DllCharacteristics;
  4980. DWORD SizeOfStackReserve;
  4981. DWORD SizeOfStackCommit;
  4982. DWORD SizeOfHeapReserve;
  4983. DWORD SizeOfHeapCommit;
  4984. DWORD LoaderFlags;
  4985. DWORD NumberOfRvaAndSizes;
  4986. IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  4987. } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
  4988. typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
  4989. WORD Magic;
  4990. BYTE MajorLinkerVersion;
  4991. BYTE MinorLinkerVersion;
  4992. DWORD SizeOfCode;
  4993. DWORD SizeOfInitializedData;
  4994. DWORD SizeOfUninitializedData;
  4995. DWORD AddressOfEntryPoint;
  4996. DWORD BaseOfCode;
  4997. DWORD BaseOfData;
  4998. DWORD BaseOfBss;
  4999. DWORD GprMask;
  5000. DWORD CprMask[4];
  5001. DWORD GpValue;
  5002. } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
  5003. typedef struct _IMAGE_OPTIONAL_HEADER64 {
  5004. WORD Magic;
  5005. BYTE MajorLinkerVersion;
  5006. BYTE MinorLinkerVersion;
  5007. DWORD SizeOfCode;
  5008. DWORD SizeOfInitializedData;
  5009. DWORD SizeOfUninitializedData;
  5010. DWORD AddressOfEntryPoint;
  5011. DWORD BaseOfCode;
  5012. ULONGLONG ImageBase;
  5013. DWORD SectionAlignment;
  5014. DWORD FileAlignment;
  5015. WORD MajorOperatingSystemVersion;
  5016. WORD MinorOperatingSystemVersion;
  5017. WORD MajorImageVersion;
  5018. WORD MinorImageVersion;
  5019. WORD MajorSubsystemVersion;
  5020. WORD MinorSubsystemVersion;
  5021. DWORD Win32VersionValue;
  5022. DWORD SizeOfImage;
  5023. DWORD SizeOfHeaders;
  5024. DWORD CheckSum;
  5025. WORD Subsystem;
  5026. WORD DllCharacteristics;
  5027. ULONGLONG SizeOfStackReserve;
  5028. ULONGLONG SizeOfStackCommit;
  5029. ULONGLONG SizeOfHeapReserve;
  5030. ULONGLONG SizeOfHeapCommit;
  5031. DWORD LoaderFlags;
  5032. DWORD NumberOfRvaAndSizes;
  5033. IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  5034. } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
  5035. #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56
  5036. #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28
  5037. #define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER 224
  5038. #define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 240
  5039. #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
  5040. #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
  5041. #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
  5042. #ifdef _WIN64
  5043. typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
  5044. typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
  5045. #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
  5046. #define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
  5047. #else
  5048. typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
  5049. typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
  5050. #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
  5051. #define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
  5052. #endif
  5053. typedef struct _IMAGE_NT_HEADERS64 {
  5054. DWORD Signature;
  5055. IMAGE_FILE_HEADER FileHeader;
  5056. IMAGE_OPTIONAL_HEADER64 OptionalHeader;
  5057. } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
  5058. typedef struct _IMAGE_NT_HEADERS {
  5059. DWORD Signature;
  5060. IMAGE_FILE_HEADER FileHeader;
  5061. IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  5062. } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
  5063. typedef struct _IMAGE_ROM_HEADERS {
  5064. IMAGE_FILE_HEADER FileHeader;
  5065. IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
  5066. } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
  5067. #ifdef _WIN64
  5068. typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
  5069. typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
  5070. #else
  5071. typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
  5072. typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
  5073. #endif
  5074. // IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is the same either way.
  5075. #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
  5076. ((ULONG_PTR)ntheader + \
  5077. FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
  5078. ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \
  5079. ))
  5080. // Subsystem Values
  5081. #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
  5082. #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem.
  5083. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
  5084. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
  5085. #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
  5086. #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem.
  5087. #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
  5088. #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem.
  5089. #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 //
  5090. #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 //
  5091. #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 //
  5092. #define IMAGE_SUBSYSTEM_EFI_ROM 13
  5093. #define IMAGE_SUBSYSTEM_XBOX 14
  5094. // DllCharacteristics Entries
  5095. // IMAGE_LIBRARY_PROCESS_INIT 0x0001 // Reserved.
  5096. // IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved.
  5097. // IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved.
  5098. // IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved.
  5099. #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 // Image understands isolation and doesn't want it
  5100. #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Image does not use SEH. No SE handler may reside in this image
  5101. #define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 // Do not bind this image.
  5102. // 0x1000 // Reserved.
  5103. #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 // Driver uses WDM model
  5104. // 0x4000 // Reserved.
  5105. #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
  5106. // Directory Entries
  5107. #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
  5108. #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
  5109. #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
  5110. #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
  5111. #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
  5112. #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
  5113. #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
  5114. // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
  5115. #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data
  5116. #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
  5117. #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
  5118. #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
  5119. #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
  5120. #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
  5121. #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
  5122. #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
  5123. //
  5124. // Non-COFF Object file header
  5125. //
  5126. typedef struct ANON_OBJECT_HEADER {
  5127. WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
  5128. WORD Sig2; // Must be 0xffff
  5129. WORD Version; // >= 1 (implies the CLSID field is present)
  5130. WORD Machine;
  5131. DWORD TimeDateStamp;
  5132. CLSID ClassID; // Used to invoke CoCreateInstance
  5133. DWORD SizeOfData; // Size of data that follows the header
  5134. } ANON_OBJECT_HEADER;
  5135. //
  5136. // Section header format.
  5137. //
  5138. #define IMAGE_SIZEOF_SHORT_NAME 8
  5139. typedef struct _IMAGE_SECTION_HEADER {
  5140. BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
  5141. union {
  5142. DWORD PhysicalAddress;
  5143. DWORD VirtualSize;
  5144. } Misc;
  5145. DWORD VirtualAddress;
  5146. DWORD SizeOfRawData;
  5147. DWORD PointerToRawData;
  5148. DWORD PointerToRelocations;
  5149. DWORD PointerToLinenumbers;
  5150. WORD NumberOfRelocations;
  5151. WORD NumberOfLinenumbers;
  5152. DWORD Characteristics;
  5153. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
  5154. #define IMAGE_SIZEOF_SECTION_HEADER 40
  5155. //
  5156. // Section characteristics.
  5157. //
  5158. // IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
  5159. // IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
  5160. // IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
  5161. // IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
  5162. #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
  5163. // IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
  5164. #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
  5165. #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
  5166. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
  5167. #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
  5168. #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
  5169. // IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
  5170. #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
  5171. #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
  5172. // 0x00002000 // Reserved.
  5173. // IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
  5174. #define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section.
  5175. #define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP
  5176. #define IMAGE_SCN_MEM_FARDATA 0x00008000
  5177. // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
  5178. #define IMAGE_SCN_MEM_PURGEABLE 0x00020000
  5179. #define IMAGE_SCN_MEM_16BIT 0x00020000
  5180. #define IMAGE_SCN_MEM_LOCKED 0x00040000
  5181. #define IMAGE_SCN_MEM_PRELOAD 0x00080000
  5182. #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
  5183. #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
  5184. #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
  5185. #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
  5186. #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
  5187. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
  5188. #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
  5189. #define IMAGE_SCN_ALIGN_128BYTES 0x00800000 //
  5190. #define IMAGE_SCN_ALIGN_256BYTES 0x00900000 //
  5191. #define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 //
  5192. #define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 //
  5193. #define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 //
  5194. #define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 //
  5195. #define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 //
  5196. // Unused 0x00F00000
  5197. #define IMAGE_SCN_ALIGN_MASK 0x00F00000
  5198. #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations.
  5199. #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
  5200. #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
  5201. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
  5202. #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
  5203. #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
  5204. #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
  5205. #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
  5206. //
  5207. // TLS Chaacteristic Flags
  5208. //
  5209. #define IMAGE_SCN_SCALE_INDEX 0x00000001 // Tls index is scaled
  5210. #ifndef _MAC
  5211. #include "pshpack2.h" // Symbols, relocs, and linenumbers are 2 byte packed
  5212. #endif
  5213. //
  5214. // Symbol format.
  5215. //
  5216. typedef struct _IMAGE_SYMBOL {
  5217. union {
  5218. BYTE ShortName[8];
  5219. struct {
  5220. DWORD Short; // if 0, use LongName
  5221. DWORD Long; // offset into string table
  5222. } Name;
  5223. DWORD LongName[2]; // PBYTE [2]
  5224. } N;
  5225. DWORD Value;
  5226. SHORT SectionNumber;
  5227. WORD Type;
  5228. BYTE StorageClass;
  5229. BYTE NumberOfAuxSymbols;
  5230. } IMAGE_SYMBOL;
  5231. typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
  5232. #define IMAGE_SIZEOF_SYMBOL 18
  5233. //
  5234. // Section values.
  5235. //
  5236. // Symbols have a section number of the section in which they are
  5237. // defined. Otherwise, section numbers have the following meanings:
  5238. //
  5239. #define IMAGE_SYM_UNDEFINED (SHORT)0 // Symbol is undefined or is common.
  5240. #define IMAGE_SYM_ABSOLUTE (SHORT)-1 // Symbol is an absolute value.
  5241. #define IMAGE_SYM_DEBUG (SHORT)-2 // Symbol is a special debug item.
  5242. #define IMAGE_SYM_SECTION_MAX 0xFEFF // Values 0xFF00-0xFFFF are special
  5243. //
  5244. // Type (fundamental) values.
  5245. //
  5246. #define IMAGE_SYM_TYPE_NULL 0x0000 // no type.
  5247. #define IMAGE_SYM_TYPE_VOID 0x0001 //
  5248. #define IMAGE_SYM_TYPE_CHAR 0x0002 // type character.
  5249. #define IMAGE_SYM_TYPE_SHORT 0x0003 // type short integer.
  5250. #define IMAGE_SYM_TYPE_INT 0x0004 //
  5251. #define IMAGE_SYM_TYPE_LONG 0x0005 //
  5252. #define IMAGE_SYM_TYPE_FLOAT 0x0006 //
  5253. #define IMAGE_SYM_TYPE_DOUBLE 0x0007 //
  5254. #define IMAGE_SYM_TYPE_STRUCT 0x0008 //
  5255. #define IMAGE_SYM_TYPE_UNION 0x0009 //
  5256. #define IMAGE_SYM_TYPE_ENUM 0x000A // enumeration.
  5257. #define IMAGE_SYM_TYPE_MOE 0x000B // member of enumeration.
  5258. #define IMAGE_SYM_TYPE_BYTE 0x000C //
  5259. #define IMAGE_SYM_TYPE_WORD 0x000D //
  5260. #define IMAGE_SYM_TYPE_UINT 0x000E //
  5261. #define IMAGE_SYM_TYPE_DWORD 0x000F //
  5262. #define IMAGE_SYM_TYPE_PCODE 0x8000 //
  5263. //
  5264. // Type (derived) values.
  5265. //
  5266. #define IMAGE_SYM_DTYPE_NULL 0 // no derived type.
  5267. #define IMAGE_SYM_DTYPE_POINTER 1 // pointer.
  5268. #define IMAGE_SYM_DTYPE_FUNCTION 2 // function.
  5269. #define IMAGE_SYM_DTYPE_ARRAY 3 // array.
  5270. //
  5271. // Storage classes.
  5272. //
  5273. #define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1
  5274. #define IMAGE_SYM_CLASS_NULL 0x0000
  5275. #define IMAGE_SYM_CLASS_AUTOMATIC 0x0001
  5276. #define IMAGE_SYM_CLASS_EXTERNAL 0x0002
  5277. #define IMAGE_SYM_CLASS_STATIC 0x0003
  5278. #define IMAGE_SYM_CLASS_REGISTER 0x0004
  5279. #define IMAGE_SYM_CLASS_EXTERNAL_DEF 0x0005
  5280. #define IMAGE_SYM_CLASS_LABEL 0x0006
  5281. #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 0x0007
  5282. #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 0x0008
  5283. #define IMAGE_SYM_CLASS_ARGUMENT 0x0009
  5284. #define IMAGE_SYM_CLASS_STRUCT_TAG 0x000A
  5285. #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 0x000B
  5286. #define IMAGE_SYM_CLASS_UNION_TAG 0x000C
  5287. #define IMAGE_SYM_CLASS_TYPE_DEFINITION 0x000D
  5288. #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 0x000E
  5289. #define IMAGE_SYM_CLASS_ENUM_TAG 0x000F
  5290. #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 0x0010
  5291. #define IMAGE_SYM_CLASS_REGISTER_PARAM 0x0011
  5292. #define IMAGE_SYM_CLASS_BIT_FIELD 0x0012
  5293. #define IMAGE_SYM_CLASS_FAR_EXTERNAL 0x0044 //
  5294. #define IMAGE_SYM_CLASS_BLOCK 0x0064
  5295. #define IMAGE_SYM_CLASS_FUNCTION 0x0065
  5296. #define IMAGE_SYM_CLASS_END_OF_STRUCT 0x0066
  5297. #define IMAGE_SYM_CLASS_FILE 0x0067
  5298. // new
  5299. #define IMAGE_SYM_CLASS_SECTION 0x0068
  5300. #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 0x0069
  5301. #define IMAGE_SYM_CLASS_CLR_TOKEN 0x006B
  5302. // type packing constants
  5303. #define N_BTMASK 0x000F
  5304. #define N_TMASK 0x0030
  5305. #define N_TMASK1 0x00C0
  5306. #define N_TMASK2 0x00F0
  5307. #define N_BTSHFT 4
  5308. #define N_TSHIFT 2
  5309. // MACROS
  5310. // Basic Type of x
  5311. #define BTYPE(x) ((x) & N_BTMASK)
  5312. // Is x a pointer?
  5313. #ifndef ISPTR
  5314. #define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
  5315. #endif
  5316. // Is x a function?
  5317. #ifndef ISFCN
  5318. #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
  5319. #endif
  5320. // Is x an array?
  5321. #ifndef ISARY
  5322. #define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
  5323. #endif
  5324. // Is x a structure, union, or enumeration TAG?
  5325. #ifndef ISTAG
  5326. #define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
  5327. #endif
  5328. #ifndef INCREF
  5329. #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
  5330. #endif
  5331. #ifndef DECREF
  5332. #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
  5333. #endif
  5334. //
  5335. // Auxiliary entry format.
  5336. //
  5337. typedef union _IMAGE_AUX_SYMBOL {
  5338. struct {
  5339. DWORD TagIndex; // struct, union, or enum tag index
  5340. union {
  5341. struct {
  5342. WORD Linenumber; // declaration line number
  5343. WORD Size; // size of struct, union, or enum
  5344. } LnSz;
  5345. DWORD TotalSize;
  5346. } Misc;
  5347. union {
  5348. struct { // if ISFCN, tag, or .bb
  5349. DWORD PointerToLinenumber;
  5350. DWORD PointerToNextFunction;
  5351. } Function;
  5352. struct { // if ISARY, up to 4 dimen.
  5353. WORD Dimension[4];
  5354. } Array;
  5355. } FcnAry;
  5356. WORD TvIndex; // tv index
  5357. } Sym;
  5358. struct {
  5359. BYTE Name[IMAGE_SIZEOF_SYMBOL];
  5360. } File;
  5361. struct {
  5362. DWORD Length; // section length
  5363. WORD NumberOfRelocations; // number of relocation entries
  5364. WORD NumberOfLinenumbers; // number of line numbers
  5365. DWORD CheckSum; // checksum for communal
  5366. SHORT Number; // section number to associate with
  5367. BYTE Selection; // communal selection type
  5368. } Section;
  5369. } IMAGE_AUX_SYMBOL;
  5370. typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;
  5371. #define IMAGE_SIZEOF_AUX_SYMBOL 18
  5372. typedef enum IMAGE_AUX_SYMBOL_TYPE {
  5373. IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
  5374. } IMAGE_AUX_SYMBOL_TYPE;
  5375. #include <pshpack2.h>
  5376. typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
  5377. BYTE bAuxType; // IMAGE_AUX_SYMBOL_TYPE
  5378. BYTE bReserved; // Must be 0
  5379. DWORD SymbolTableIndex;
  5380. BYTE rgbReserved[12]; // Must be 0
  5381. } IMAGE_AUX_SYMBOL_TOKEN_DEF;
  5382. typedef IMAGE_AUX_SYMBOL_TOKEN_DEF UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
  5383. #include <poppack.h>
  5384. //
  5385. // Communal selection types.
  5386. //
  5387. #define IMAGE_COMDAT_SELECT_NODUPLICATES 1
  5388. #define IMAGE_COMDAT_SELECT_ANY 2
  5389. #define IMAGE_COMDAT_SELECT_SAME_SIZE 3
  5390. #define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
  5391. #define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
  5392. #define IMAGE_COMDAT_SELECT_LARGEST 6
  5393. #define IMAGE_COMDAT_SELECT_NEWEST 7
  5394. #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
  5395. #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
  5396. #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
  5397. //
  5398. // Relocation format.
  5399. //
  5400. typedef struct _IMAGE_RELOCATION {
  5401. union {
  5402. DWORD VirtualAddress;
  5403. DWORD RelocCount; // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set
  5404. };
  5405. DWORD SymbolTableIndex;
  5406. WORD Type;
  5407. } IMAGE_RELOCATION;
  5408. typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;
  5409. #define IMAGE_SIZEOF_RELOCATION 10
  5410. //
  5411. // I386 relocation types.
  5412. //
  5413. #define IMAGE_REL_I386_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
  5414. #define IMAGE_REL_I386_DIR16 0x0001 // Direct 16-bit reference to the symbols virtual address
  5415. #define IMAGE_REL_I386_REL16 0x0002 // PC-relative 16-bit reference to the symbols virtual address
  5416. #define IMAGE_REL_I386_DIR32 0x0006 // Direct 32-bit reference to the symbols virtual address
  5417. #define IMAGE_REL_I386_DIR32NB 0x0007 // Direct 32-bit reference to the symbols virtual address, base not included
  5418. #define IMAGE_REL_I386_SEG12 0x0009 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
  5419. #define IMAGE_REL_I386_SECTION 0x000A
  5420. #define IMAGE_REL_I386_SECREL 0x000B
  5421. #define IMAGE_REL_I386_TOKEN 0x000C // clr token
  5422. #define IMAGE_REL_I386_SECREL7 0x000D // 7 bit offset from base of section containing target
  5423. #define IMAGE_REL_I386_REL32 0x0014 // PC-relative 32-bit reference to the symbols virtual address
  5424. //
  5425. // MIPS relocation types.
  5426. //
  5427. #define IMAGE_REL_MIPS_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
  5428. #define IMAGE_REL_MIPS_REFHALF 0x0001
  5429. #define IMAGE_REL_MIPS_REFWORD 0x0002
  5430. #define IMAGE_REL_MIPS_JMPADDR 0x0003
  5431. #define IMAGE_REL_MIPS_REFHI 0x0004
  5432. #define IMAGE_REL_MIPS_REFLO 0x0005
  5433. #define IMAGE_REL_MIPS_GPREL 0x0006
  5434. #define IMAGE_REL_MIPS_LITERAL 0x0007
  5435. #define IMAGE_REL_MIPS_SECTION 0x000A
  5436. #define IMAGE_REL_MIPS_SECREL 0x000B
  5437. #define IMAGE_REL_MIPS_SECRELLO 0x000C // Low 16-bit section relative referemce (used for >32k TLS)
  5438. #define IMAGE_REL_MIPS_SECRELHI 0x000D // High 16-bit section relative reference (used for >32k TLS)
  5439. #define IMAGE_REL_MIPS_TOKEN 0x000E // clr token
  5440. #define IMAGE_REL_MIPS_JMPADDR16 0x0010
  5441. #define IMAGE_REL_MIPS_REFWORDNB 0x0022
  5442. #define IMAGE_REL_MIPS_PAIR 0x0025
  5443. //
  5444. // Alpha Relocation types.
  5445. //
  5446. #define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
  5447. #define IMAGE_REL_ALPHA_REFLONG 0x0001
  5448. #define IMAGE_REL_ALPHA_REFQUAD 0x0002
  5449. #define IMAGE_REL_ALPHA_GPREL32 0x0003
  5450. #define IMAGE_REL_ALPHA_LITERAL 0x0004
  5451. #define IMAGE_REL_ALPHA_LITUSE 0x0005
  5452. #define IMAGE_REL_ALPHA_GPDISP 0x0006
  5453. #define IMAGE_REL_ALPHA_BRADDR 0x0007
  5454. #define IMAGE_REL_ALPHA_HINT 0x0008
  5455. #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
  5456. #define IMAGE_REL_ALPHA_REFHI 0x000A
  5457. #define IMAGE_REL_ALPHA_REFLO 0x000B
  5458. #define IMAGE_REL_ALPHA_PAIR 0x000C
  5459. #define IMAGE_REL_ALPHA_MATCH 0x000D
  5460. #define IMAGE_REL_ALPHA_SECTION 0x000E
  5461. #define IMAGE_REL_ALPHA_SECREL 0x000F
  5462. #define IMAGE_REL_ALPHA_REFLONGNB 0x0010
  5463. #define IMAGE_REL_ALPHA_SECRELLO 0x0011 // Low 16-bit section relative reference
  5464. #define IMAGE_REL_ALPHA_SECRELHI 0x0012 // High 16-bit section relative reference
  5465. #define IMAGE_REL_ALPHA_REFQ3 0x0013 // High 16 bits of 48 bit reference
  5466. #define IMAGE_REL_ALPHA_REFQ2 0x0014 // Middle 16 bits of 48 bit reference
  5467. #define IMAGE_REL_ALPHA_REFQ1 0x0015 // Low 16 bits of 48 bit reference
  5468. #define IMAGE_REL_ALPHA_GPRELLO 0x0016 // Low 16-bit GP relative reference
  5469. #define IMAGE_REL_ALPHA_GPRELHI 0x0017 // High 16-bit GP relative reference
  5470. //
  5471. // IBM PowerPC relocation types.
  5472. //
  5473. #define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP
  5474. #define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address
  5475. #define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address
  5476. #define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute)
  5477. #define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address
  5478. #define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword)
  5479. #define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative)
  5480. #define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative)
  5481. #define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base
  5482. #define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword)
  5483. #define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base
  5484. #define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr)
  5485. #define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number
  5486. #define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code
  5487. #define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction
  5488. #define IMAGE_REL_PPC_SECREL16 0x000F // va of containing section (limited to 16 bits)
  5489. #define IMAGE_REL_PPC_REFHI 0x0010
  5490. #define IMAGE_REL_PPC_REFLO 0x0011
  5491. #define IMAGE_REL_PPC_PAIR 0x0012
  5492. #define IMAGE_REL_PPC_SECRELLO 0x0013 // Low 16-bit section relative reference (used for >32k TLS)
  5493. #define IMAGE_REL_PPC_SECRELHI 0x0014 // High 16-bit section relative reference (used for >32k TLS)
  5494. #define IMAGE_REL_PPC_GPREL 0x0015
  5495. #define IMAGE_REL_PPC_TOKEN 0x0016 // clr token
  5496. #define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type
  5497. // Flag bits in IMAGE_RELOCATION.TYPE
  5498. #define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it
  5499. #define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken
  5500. #define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken
  5501. #define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc)
  5502. //
  5503. // Hitachi SH3 relocation types.
  5504. //
  5505. #define IMAGE_REL_SH3_ABSOLUTE 0x0000 // No relocation
  5506. #define IMAGE_REL_SH3_DIRECT16 0x0001 // 16 bit direct
  5507. #define IMAGE_REL_SH3_DIRECT32 0x0002 // 32 bit direct
  5508. #define IMAGE_REL_SH3_DIRECT8 0x0003 // 8 bit direct, -128..255
  5509. #define IMAGE_REL_SH3_DIRECT8_WORD 0x0004 // 8 bit direct .W (0 ext.)
  5510. #define IMAGE_REL_SH3_DIRECT8_LONG 0x0005 // 8 bit direct .L (0 ext.)
  5511. #define IMAGE_REL_SH3_DIRECT4 0x0006 // 4 bit direct (0 ext.)
  5512. #define IMAGE_REL_SH3_DIRECT4_WORD 0x0007 // 4 bit direct .W (0 ext.)
  5513. #define IMAGE_REL_SH3_DIRECT4_LONG 0x0008 // 4 bit direct .L (0 ext.)
  5514. #define IMAGE_REL_SH3_PCREL8_WORD 0x0009 // 8 bit PC relative .W
  5515. #define IMAGE_REL_SH3_PCREL8_LONG 0x000A // 8 bit PC relative .L
  5516. #define IMAGE_REL_SH3_PCREL12_WORD 0x000B // 12 LSB PC relative .W
  5517. #define IMAGE_REL_SH3_STARTOF_SECTION 0x000C // Start of EXE section
  5518. #define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D // Size of EXE section
  5519. #define IMAGE_REL_SH3_SECTION 0x000E // Section table index
  5520. #define IMAGE_REL_SH3_SECREL 0x000F // Offset within section
  5521. #define IMAGE_REL_SH3_DIRECT32_NB 0x0010 // 32 bit direct not based
  5522. #define IMAGE_REL_SH3_GPREL4_LONG 0x0011 // GP-relative addressing
  5523. #define IMAGE_REL_SH3_TOKEN 0x0012 // clr token
  5524. #define IMAGE_REL_ARM_ABSOLUTE 0x0000 // No relocation required
  5525. #define IMAGE_REL_ARM_ADDR32 0x0001 // 32 bit address
  5526. #define IMAGE_REL_ARM_ADDR32NB 0x0002 // 32 bit address w/o image base
  5527. #define IMAGE_REL_ARM_BRANCH24 0x0003 // 24 bit offset << 2 & sign ext.
  5528. #define IMAGE_REL_ARM_BRANCH11 0x0004 // Thumb: 2 11 bit offsets
  5529. #define IMAGE_REL_ARM_TOKEN 0x0005 // clr token
  5530. #define IMAGE_REL_ARM_GPREL12 0x0006 // GP-relative addressing (ARM)
  5531. #define IMAGE_REL_ARM_GPREL7 0x0007 // GP-relative addressing (Thumb)
  5532. #define IMAGE_REL_ARM_BLX24 0x0008
  5533. #define IMAGE_REL_ARM_BLX11 0x0009
  5534. #define IMAGE_REL_ARM_SECTION 0x000E // Section table index
  5535. #define IMAGE_REL_ARM_SECREL 0x000F // Offset within section
  5536. #define IMAGE_REL_AM_ABSOLUTE 0x0000
  5537. #define IMAGE_REL_AM_ADDR32 0x0001
  5538. #define IMAGE_REL_AM_ADDR32NB 0x0002
  5539. #define IMAGE_REL_AM_CALL32 0x0003
  5540. #define IMAGE_REL_AM_FUNCINFO 0x0004
  5541. #define IMAGE_REL_AM_REL32_1 0x0005
  5542. #define IMAGE_REL_AM_REL32_2 0x0006
  5543. #define IMAGE_REL_AM_SECREL 0x0007
  5544. #define IMAGE_REL_AM_SECTION 0x0008
  5545. #define IMAGE_REL_AM_TOKEN 0x0009
  5546. //
  5547. // X86-64 relocations
  5548. //
  5549. #define IMAGE_REL_AMD64_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
  5550. #define IMAGE_REL_AMD64_ADDR64 0x0001 // 64-bit address (VA).
  5551. #define IMAGE_REL_AMD64_ADDR32 0x0002 // 32-bit address (VA).
  5552. #define IMAGE_REL_AMD64_ADDR32NB 0x0003 // 32-bit address w/o image base (RVA).
  5553. #define IMAGE_REL_AMD64_REL32 0x0004 // 32-bit relative address from byte following reloc
  5554. #define IMAGE_REL_AMD64_REL32_1 0x0005 // 32-bit relative address from byte distance 1 from reloc
  5555. #define IMAGE_REL_AMD64_REL32_2 0x0006 // 32-bit relative address from byte distance 2 from reloc
  5556. #define IMAGE_REL_AMD64_REL32_3 0x0007 // 32-bit relative address from byte distance 3 from reloc
  5557. #define IMAGE_REL_AMD64_REL32_4 0x0008 // 32-bit relative address from byte distance 4 from reloc
  5558. #define IMAGE_REL_AMD64_REL32_5 0x0009 // 32-bit relative address from byte distance 5 from reloc
  5559. #define IMAGE_REL_AMD64_SECTION 0x000A // Section index
  5560. #define IMAGE_REL_AMD64_SECREL 0x000B // 32 bit offset from base of section containing target
  5561. #define IMAGE_REL_AMD64_SECREL7 0x000C // 7 bit unsigned offset from base of section containing target
  5562. #define IMAGE_REL_AMD64_TOKEN 0x000D // 32 bit metadata token
  5563. #define IMAGE_REL_AMD64_SREL32 0x000E // 32 bit signed span-dependent value emitted into object
  5564. #define IMAGE_REL_AMD64_PAIR 0x000F
  5565. #define IMAGE_REL_AMD64_SSPAN32 0x0010 // 32 bit signed span-dependent value applied at link time
  5566. //
  5567. // IA64 relocation types.
  5568. //
  5569. #define IMAGE_REL_IA64_ABSOLUTE 0x0000
  5570. #define IMAGE_REL_IA64_IMM14 0x0001
  5571. #define IMAGE_REL_IA64_IMM22 0x0002
  5572. #define IMAGE_REL_IA64_IMM64 0x0003
  5573. #define IMAGE_REL_IA64_DIR32 0x0004
  5574. #define IMAGE_REL_IA64_DIR64 0x0005
  5575. #define IMAGE_REL_IA64_PCREL21B 0x0006
  5576. #define IMAGE_REL_IA64_PCREL21M 0x0007
  5577. #define IMAGE_REL_IA64_PCREL21F 0x0008
  5578. #define IMAGE_REL_IA64_GPREL22 0x0009
  5579. #define IMAGE_REL_IA64_LTOFF22 0x000A
  5580. #define IMAGE_REL_IA64_SECTION 0x000B
  5581. #define IMAGE_REL_IA64_SECREL22 0x000C
  5582. #define IMAGE_REL_IA64_SECREL64I 0x000D
  5583. #define IMAGE_REL_IA64_SECREL32 0x000E
  5584. //
  5585. #define IMAGE_REL_IA64_DIR32NB 0x0010
  5586. #define IMAGE_REL_IA64_SREL14 0x0011
  5587. #define IMAGE_REL_IA64_SREL22 0x0012
  5588. #define IMAGE_REL_IA64_SREL32 0x0013
  5589. #define IMAGE_REL_IA64_UREL32 0x0014
  5590. #define IMAGE_REL_IA64_PCREL60X 0x0015 // This is always a BRL and never converted
  5591. #define IMAGE_REL_IA64_PCREL60B 0x0016 // If possible, convert to MBB bundle with NOP.B in slot 1
  5592. #define IMAGE_REL_IA64_PCREL60F 0x0017 // If possible, convert to MFB bundle with NOP.F in slot 1
  5593. #define IMAGE_REL_IA64_PCREL60I 0x0018 // If possible, convert to MIB bundle with NOP.I in slot 1
  5594. #define IMAGE_REL_IA64_PCREL60M 0x0019 // If possible, convert to MMB bundle with NOP.M in slot 1
  5595. #define IMAGE_REL_IA64_IMMGPREL64 0x001A
  5596. #define IMAGE_REL_IA64_TOKEN 0x001B // clr token
  5597. #define IMAGE_REL_IA64_GPREL32 0x001C
  5598. #define IMAGE_REL_IA64_ADDEND 0x001F
  5599. //
  5600. // CEF relocation types.
  5601. //
  5602. #define IMAGE_REL_CEF_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
  5603. #define IMAGE_REL_CEF_ADDR32 0x0001 // 32-bit address (VA).
  5604. #define IMAGE_REL_CEF_ADDR64 0x0002 // 64-bit address (VA).
  5605. #define IMAGE_REL_CEF_ADDR32NB 0x0003 // 32-bit address w/o image base (RVA).
  5606. #define IMAGE_REL_CEF_SECTION 0x0004 // Section index
  5607. #define IMAGE_REL_CEF_SECREL 0x0005 // 32 bit offset from base of section containing target
  5608. #define IMAGE_REL_CEF_TOKEN 0x0006 // 32 bit metadata token
  5609. //
  5610. // clr relocation types.
  5611. //
  5612. #define IMAGE_REL_CEE_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
  5613. #define IMAGE_REL_CEE_ADDR32 0x0001 // 32-bit address (VA).
  5614. #define IMAGE_REL_CEE_ADDR64 0x0002 // 64-bit address (VA).
  5615. #define IMAGE_REL_CEE_ADDR32NB 0x0003 // 32-bit address w/o image base (RVA).
  5616. #define IMAGE_REL_CEE_SECTION 0x0004 // Section index
  5617. #define IMAGE_REL_CEE_SECREL 0x0005 // 32 bit offset from base of section containing target
  5618. #define IMAGE_REL_CEE_TOKEN 0x0006 // 32 bit metadata token
  5619. #define IMAGE_REL_M32R_ABSOLUTE 0x0000 // No relocation required
  5620. #define IMAGE_REL_M32R_ADDR32 0x0001 // 32 bit address
  5621. #define IMAGE_REL_M32R_ADDR32NB 0x0002 // 32 bit address w/o image base
  5622. #define IMAGE_REL_M32R_ADDR24 0x0003 // 24 bit address
  5623. #define IMAGE_REL_M32R_GPREL16 0x0004 // GP relative addressing
  5624. #define IMAGE_REL_M32R_PCREL24 0x0005 // 24 bit offset << 2 & sign ext.
  5625. #define IMAGE_REL_M32R_PCREL16 0x0006 // 16 bit offset << 2 & sign ext.
  5626. #define IMAGE_REL_M32R_PCREL8 0x0007 // 8 bit offset << 2 & sign ext.
  5627. #define IMAGE_REL_M32R_REFHALF 0x0008 // 16 MSBs
  5628. #define IMAGE_REL_M32R_REFHI 0x0009 // 16 MSBs; adj for LSB sign ext.
  5629. #define IMAGE_REL_M32R_REFLO 0x000A // 16 LSBs
  5630. #define IMAGE_REL_M32R_PAIR 0x000B // Link HI and LO
  5631. #define IMAGE_REL_M32R_SECTION 0x000C // Section table index
  5632. #define IMAGE_REL_M32R_SECREL32 0x000D // 32 bit section relative reference
  5633. #define IMAGE_REL_M32R_TOKEN 0x000E // clr token
  5634. #define EXT_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */ \
  5635. Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos) // Intel-IA64-Filler
  5636. #define INS_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */\
  5637. *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\
  5638. ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos) // Intel-IA64-Filler
  5639. #define EMARCH_ENC_I17_IMM7B_INST_WORD_X 3 // Intel-IA64-Filler
  5640. #define EMARCH_ENC_I17_IMM7B_SIZE_X 7 // Intel-IA64-Filler
  5641. #define EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X 4 // Intel-IA64-Filler
  5642. #define EMARCH_ENC_I17_IMM7B_VAL_POS_X 0 // Intel-IA64-Filler
  5643. #define EMARCH_ENC_I17_IMM9D_INST_WORD_X 3 // Intel-IA64-Filler
  5644. #define EMARCH_ENC_I17_IMM9D_SIZE_X 9 // Intel-IA64-Filler
  5645. #define EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X 18 // Intel-IA64-Filler
  5646. #define EMARCH_ENC_I17_IMM9D_VAL_POS_X 7 // Intel-IA64-Filler
  5647. #define EMARCH_ENC_I17_IMM5C_INST_WORD_X 3 // Intel-IA64-Filler
  5648. #define EMARCH_ENC_I17_IMM5C_SIZE_X 5 // Intel-IA64-Filler
  5649. #define EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X 13 // Intel-IA64-Filler
  5650. #define EMARCH_ENC_I17_IMM5C_VAL_POS_X 16 // Intel-IA64-Filler
  5651. #define EMARCH_ENC_I17_IC_INST_WORD_X 3 // Intel-IA64-Filler
  5652. #define EMARCH_ENC_I17_IC_SIZE_X 1 // Intel-IA64-Filler
  5653. #define EMARCH_ENC_I17_IC_INST_WORD_POS_X 12 // Intel-IA64-Filler
  5654. #define EMARCH_ENC_I17_IC_VAL_POS_X 21 // Intel-IA64-Filler
  5655. #define EMARCH_ENC_I17_IMM41a_INST_WORD_X 1 // Intel-IA64-Filler
  5656. #define EMARCH_ENC_I17_IMM41a_SIZE_X 10 // Intel-IA64-Filler
  5657. #define EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X 14 // Intel-IA64-Filler
  5658. #define EMARCH_ENC_I17_IMM41a_VAL_POS_X 22 // Intel-IA64-Filler
  5659. #define EMARCH_ENC_I17_IMM41b_INST_WORD_X 1 // Intel-IA64-Filler
  5660. #define EMARCH_ENC_I17_IMM41b_SIZE_X 8 // Intel-IA64-Filler
  5661. #define EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X 24 // Intel-IA64-Filler
  5662. #define EMARCH_ENC_I17_IMM41b_VAL_POS_X 32 // Intel-IA64-Filler
  5663. #define EMARCH_ENC_I17_IMM41c_INST_WORD_X 2 // Intel-IA64-Filler
  5664. #define EMARCH_ENC_I17_IMM41c_SIZE_X 23 // Intel-IA64-Filler
  5665. #define EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X 0 // Intel-IA64-Filler
  5666. #define EMARCH_ENC_I17_IMM41c_VAL_POS_X 40 // Intel-IA64-Filler
  5667. #define EMARCH_ENC_I17_SIGN_INST_WORD_X 3 // Intel-IA64-Filler
  5668. #define EMARCH_ENC_I17_SIGN_SIZE_X 1 // Intel-IA64-Filler
  5669. #define EMARCH_ENC_I17_SIGN_INST_WORD_POS_X 27 // Intel-IA64-Filler
  5670. #define EMARCH_ENC_I17_SIGN_VAL_POS_X 63 // Intel-IA64-Filler
  5671. //
  5672. // Line number format.
  5673. //
  5674. typedef struct _IMAGE_LINENUMBER {
  5675. union {
  5676. DWORD SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.
  5677. DWORD VirtualAddress; // Virtual address of line number.
  5678. } Type;
  5679. WORD Linenumber; // Line number.
  5680. } IMAGE_LINENUMBER;
  5681. typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;
  5682. #define IMAGE_SIZEOF_LINENUMBER 6
  5683. #ifndef _MAC
  5684. #include "poppack.h" // Back to 4 byte packing
  5685. #endif
  5686. //
  5687. // Based relocation format.
  5688. //
  5689. typedef struct _IMAGE_BASE_RELOCATION {
  5690. DWORD VirtualAddress;
  5691. DWORD SizeOfBlock;
  5692. // WORD TypeOffset[1];
  5693. } IMAGE_BASE_RELOCATION;
  5694. typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
  5695. #define IMAGE_SIZEOF_BASE_RELOCATION 8
  5696. //
  5697. // Based relocation types.
  5698. //
  5699. #define IMAGE_REL_BASED_ABSOLUTE 0
  5700. #define IMAGE_REL_BASED_HIGH 1
  5701. #define IMAGE_REL_BASED_LOW 2
  5702. #define IMAGE_REL_BASED_HIGHLOW 3
  5703. #define IMAGE_REL_BASED_HIGHADJ 4
  5704. #define IMAGE_REL_BASED_MIPS_JMPADDR 5
  5705. #define IMAGE_REL_BASED_MIPS_JMPADDR16 9
  5706. #define IMAGE_REL_BASED_IA64_IMM64 9
  5707. #define IMAGE_REL_BASED_DIR64 10
  5708. //
  5709. // Archive format.
  5710. //
  5711. #define IMAGE_ARCHIVE_START_SIZE 8
  5712. #define IMAGE_ARCHIVE_START "!<arch>\n"
  5713. #define IMAGE_ARCHIVE_END "`\n"
  5714. #define IMAGE_ARCHIVE_PAD "\n"
  5715. #define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
  5716. #define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
  5717. typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
  5718. BYTE Name[16]; // File member name - `/' terminated.
  5719. BYTE Date[12]; // File member date - decimal.
  5720. BYTE UserID[6]; // File member user id - decimal.
  5721. BYTE GroupID[6]; // File member group id - decimal.
  5722. BYTE Mode[8]; // File member mode - octal.
  5723. BYTE Size[10]; // File member size - decimal.
  5724. BYTE EndHeader[2]; // String to end header.
  5725. } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
  5726. #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
  5727. //
  5728. // DLL support.
  5729. //
  5730. //
  5731. // Export Format
  5732. //
  5733. typedef struct _IMAGE_EXPORT_DIRECTORY {
  5734. DWORD Characteristics;
  5735. DWORD TimeDateStamp;
  5736. WORD MajorVersion;
  5737. WORD MinorVersion;
  5738. DWORD Name;
  5739. DWORD Base;
  5740. DWORD NumberOfFunctions;
  5741. DWORD NumberOfNames;
  5742. DWORD AddressOfFunctions; // RVA from base of image
  5743. DWORD AddressOfNames; // RVA from base of image
  5744. DWORD AddressOfNameOrdinals; // RVA from base of image
  5745. } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
  5746. //
  5747. // Import Format
  5748. //
  5749. typedef struct _IMAGE_IMPORT_BY_NAME {
  5750. WORD Hint;
  5751. BYTE Name[1];
  5752. } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
  5753. #include "pshpack8.h" // Use align 8 for the 64-bit IAT.
  5754. typedef struct _IMAGE_THUNK_DATA64 {
  5755. union {
  5756. ULONGLONG ForwarderString; // PBYTE
  5757. ULONGLONG Function; // PDWORD
  5758. ULONGLONG Ordinal;
  5759. ULONGLONG AddressOfData; // PIMAGE_IMPORT_BY_NAME
  5760. } u1;
  5761. } IMAGE_THUNK_DATA64;
  5762. typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
  5763. #include "poppack.h" // Back to 4 byte packing
  5764. typedef struct _IMAGE_THUNK_DATA32 {
  5765. union {
  5766. DWORD ForwarderString; // PBYTE
  5767. DWORD Function; // PDWORD
  5768. DWORD Ordinal;
  5769. DWORD AddressOfData; // PIMAGE_IMPORT_BY_NAME
  5770. } u1;
  5771. } IMAGE_THUNK_DATA32;
  5772. typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
  5773. #define IMAGE_ORDINAL_FLAG64 0x8000000000000000
  5774. #define IMAGE_ORDINAL_FLAG32 0x80000000
  5775. #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
  5776. #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
  5777. #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
  5778. #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
  5779. //
  5780. // Thread Local Storage
  5781. //
  5782. typedef VOID
  5783. (NTAPI *PIMAGE_TLS_CALLBACK) (
  5784. PVOID DllHandle,
  5785. DWORD Reason,
  5786. PVOID Reserved
  5787. );
  5788. typedef struct _IMAGE_TLS_DIRECTORY64 {
  5789. ULONGLONG StartAddressOfRawData;
  5790. ULONGLONG EndAddressOfRawData;
  5791. ULONGLONG AddressOfIndex; // PDWORD
  5792. ULONGLONG AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *;
  5793. DWORD SizeOfZeroFill;
  5794. DWORD Characteristics;
  5795. } IMAGE_TLS_DIRECTORY64;
  5796. typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
  5797. typedef struct _IMAGE_TLS_DIRECTORY32 {
  5798. DWORD StartAddressOfRawData;
  5799. DWORD EndAddressOfRawData;
  5800. DWORD AddressOfIndex; // PDWORD
  5801. DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *
  5802. DWORD SizeOfZeroFill;
  5803. DWORD Characteristics;
  5804. } IMAGE_TLS_DIRECTORY32;
  5805. typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
  5806. #ifdef _WIN64
  5807. #define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
  5808. #define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
  5809. typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
  5810. typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA;
  5811. #define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)
  5812. typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
  5813. typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY;
  5814. #else
  5815. #define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32
  5816. #define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)
  5817. typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
  5818. typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;
  5819. #define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)
  5820. typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
  5821. typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;
  5822. #endif
  5823. typedef struct _IMAGE_IMPORT_DESCRIPTOR {
  5824. union {
  5825. DWORD Characteristics; // 0 for terminating null import descriptor
  5826. DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
  5827. };
  5828. DWORD TimeDateStamp; // 0 if not bound,
  5829. // -1 if bound, and real date\time stamp
  5830. // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
  5831. // O.W. date/time stamp of DLL bound to (Old BIND)
  5832. DWORD ForwarderChain; // -1 if no forwarders
  5833. DWORD Name;
  5834. DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
  5835. } IMAGE_IMPORT_DESCRIPTOR;
  5836. typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
  5837. //
  5838. // New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]
  5839. //
  5840. typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
  5841. DWORD TimeDateStamp;
  5842. WORD OffsetModuleName;
  5843. WORD NumberOfModuleForwarderRefs;
  5844. // Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
  5845. } IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
  5846. typedef struct _IMAGE_BOUND_FORWARDER_REF {
  5847. DWORD TimeDateStamp;
  5848. WORD OffsetModuleName;
  5849. WORD Reserved;
  5850. } IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
  5851. //
  5852. // Resource Format.
  5853. //
  5854. //
  5855. // Resource directory consists of two counts, following by a variable length
  5856. // array of directory entries. The first count is the number of entries at
  5857. // beginning of the array that have actual names associated with each entry.
  5858. // The entries are in ascending order, case insensitive strings. The second
  5859. // count is the number of entries that immediately follow the named entries.
  5860. // This second count identifies the number of entries that have 16-bit integer
  5861. // Ids as their name. These entries are also sorted in ascending order.
  5862. //
  5863. // This structure allows fast lookup by either name or number, but for any
  5864. // given resource entry only one form of lookup is supported, not both.
  5865. // This is consistant with the syntax of the .RC file and the .RES file.
  5866. //
  5867. typedef struct _IMAGE_RESOURCE_DIRECTORY {
  5868. DWORD Characteristics;
  5869. DWORD TimeDateStamp;
  5870. WORD MajorVersion;
  5871. WORD MinorVersion;
  5872. WORD NumberOfNamedEntries;
  5873. WORD NumberOfIdEntries;
  5874. // IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
  5875. } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
  5876. #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
  5877. #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
  5878. //
  5879. // Each directory contains the 32-bit Name of the entry and an offset,
  5880. // relative to the beginning of the resource directory of the data associated
  5881. // with this directory entry. If the name of the entry is an actual text
  5882. // string instead of an integer Id, then the high order bit of the name field
  5883. // is set to one and the low order 31-bits are an offset, relative to the
  5884. // beginning of the resource directory of the string, which is of type
  5885. // IMAGE_RESOURCE_DIRECTORY_STRING. Otherwise the high bit is clear and the
  5886. // low-order 16-bits are the integer Id that identify this resource directory
  5887. // entry. If the directory entry is yet another resource directory (i.e. a
  5888. // subdirectory), then the high order bit of the offset field will be
  5889. // set to indicate this. Otherwise the high bit is clear and the offset
  5890. // field points to a resource data entry.
  5891. //
  5892. typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
  5893. union {
  5894. struct {
  5895. DWORD NameOffset:31;
  5896. DWORD NameIsString:1;
  5897. };
  5898. DWORD Name;
  5899. WORD Id;
  5900. };
  5901. union {
  5902. DWORD OffsetToData;
  5903. struct {
  5904. DWORD OffsetToDirectory:31;
  5905. DWORD DataIsDirectory:1;
  5906. };
  5907. };
  5908. } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
  5909. //
  5910. // For resource directory entries that have actual string names, the Name
  5911. // field of the directory entry points to an object of the following type.
  5912. // All of these string objects are stored together after the last resource
  5913. // directory entry and before the first resource data object. This minimizes
  5914. // the impact of these variable length objects on the alignment of the fixed
  5915. // size directory entry objects.
  5916. //
  5917. typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
  5918. WORD Length;
  5919. CHAR NameString[ 1 ];
  5920. } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
  5921. typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
  5922. WORD Length;
  5923. WCHAR NameString[ 1 ];
  5924. } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
  5925. //
  5926. // Each resource data entry describes a leaf node in the resource directory
  5927. // tree. It contains an offset, relative to the beginning of the resource
  5928. // directory of the data for the resource, a size field that gives the number
  5929. // of bytes of data at that offset, a CodePage that should be used when
  5930. // decoding code point values within the resource data. Typically for new
  5931. // applications the code page would be the unicode code page.
  5932. //
  5933. typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
  5934. DWORD OffsetToData;
  5935. DWORD Size;
  5936. DWORD CodePage;
  5937. DWORD Reserved;
  5938. } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
  5939. //
  5940. // Load Configuration Directory Entry
  5941. //
  5942. typedef struct {
  5943. DWORD Size;
  5944. DWORD TimeDateStamp;
  5945. WORD MajorVersion;
  5946. WORD MinorVersion;
  5947. DWORD GlobalFlagsClear;
  5948. DWORD GlobalFlagsSet;
  5949. DWORD CriticalSectionDefaultTimeout;
  5950. DWORD DeCommitFreeBlockThreshold;
  5951. DWORD DeCommitTotalFreeThreshold;
  5952. DWORD LockPrefixTable; // VA
  5953. DWORD MaximumAllocationSize;
  5954. DWORD VirtualMemoryThreshold;
  5955. DWORD ProcessHeapFlags;
  5956. DWORD ProcessAffinityMask;
  5957. WORD CSDVersion;
  5958. WORD Reserved1;
  5959. DWORD EditList; // VA
  5960. DWORD SecurityCookie; // VA
  5961. DWORD SEHandlerTable; // VA
  5962. DWORD SEHandlerCount;
  5963. } IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
  5964. typedef struct {
  5965. DWORD Size;
  5966. DWORD TimeDateStamp;
  5967. WORD MajorVersion;
  5968. WORD MinorVersion;
  5969. DWORD GlobalFlagsClear;
  5970. DWORD GlobalFlagsSet;
  5971. DWORD CriticalSectionDefaultTimeout;
  5972. ULONGLONG DeCommitFreeBlockThreshold;
  5973. ULONGLONG DeCommitTotalFreeThreshold;
  5974. ULONGLONG LockPrefixTable; // VA
  5975. ULONGLONG MaximumAllocationSize;
  5976. ULONGLONG VirtualMemoryThreshold;
  5977. ULONGLONG ProcessAffinityMask;
  5978. DWORD ProcessHeapFlags;
  5979. WORD CSDVersion;
  5980. WORD Reserved1;
  5981. ULONGLONG EditList; // VA
  5982. ULONGLONG SecurityCookie; // VA
  5983. ULONGLONG SEHandlerTable; // VA
  5984. ULONGLONG SEHandlerCount;
  5985. } IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
  5986. #ifdef _WIN64
  5987. typedef IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY;
  5988. typedef PIMAGE_LOAD_CONFIG_DIRECTORY64 PIMAGE_LOAD_CONFIG_DIRECTORY;
  5989. #else
  5990. typedef IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY;
  5991. typedef PIMAGE_LOAD_CONFIG_DIRECTORY32 PIMAGE_LOAD_CONFIG_DIRECTORY;
  5992. #endif
  5993. //
  5994. // WIN CE Exception table format
  5995. //
  5996. //
  5997. // Function table entry format. Function table is pointed to by the
  5998. // IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.
  5999. //
  6000. typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
  6001. DWORD FuncStart;
  6002. DWORD PrologLen : 8;
  6003. DWORD FuncLen : 22;
  6004. DWORD ThirtyTwoBit : 1;
  6005. DWORD ExceptionFlag : 1;
  6006. } IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
  6007. typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
  6008. ULONGLONG BeginAddress;
  6009. ULONGLONG EndAddress;
  6010. ULONGLONG ExceptionHandler;
  6011. ULONGLONG HandlerData;
  6012. ULONGLONG PrologEndAddress;
  6013. } IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;
  6014. typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
  6015. DWORD BeginAddress;
  6016. DWORD EndAddress;
  6017. DWORD ExceptionHandler;
  6018. DWORD HandlerData;
  6019. DWORD PrologEndAddress;
  6020. } IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;
  6021. typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
  6022. DWORD BeginAddress;
  6023. DWORD EndAddress;
  6024. DWORD UnwindInfoAddress;
  6025. } _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;
  6026. typedef _IMAGE_RUNTIME_FUNCTION_ENTRY IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
  6027. typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
  6028. #if defined(_AXP64_)
  6029. typedef IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY IMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
  6030. typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
  6031. typedef IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;
  6032. typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
  6033. #elif defined(_ALPHA_)
  6034. typedef IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;
  6035. typedef PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
  6036. #else
  6037. typedef _IMAGE_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;
  6038. typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
  6039. #endif
  6040. //
  6041. // Debug Format
  6042. //
  6043. typedef struct _IMAGE_DEBUG_DIRECTORY {
  6044. DWORD Characteristics;
  6045. DWORD TimeDateStamp;
  6046. WORD MajorVersion;
  6047. WORD MinorVersion;
  6048. DWORD Type;
  6049. DWORD SizeOfData;
  6050. DWORD AddressOfRawData;
  6051. DWORD PointerToRawData;
  6052. } IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
  6053. #define IMAGE_DEBUG_TYPE_UNKNOWN 0
  6054. #define IMAGE_DEBUG_TYPE_COFF 1
  6055. #define IMAGE_DEBUG_TYPE_CODEVIEW 2
  6056. #define IMAGE_DEBUG_TYPE_FPO 3
  6057. #define IMAGE_DEBUG_TYPE_MISC 4
  6058. #define IMAGE_DEBUG_TYPE_EXCEPTION 5
  6059. #define IMAGE_DEBUG_TYPE_FIXUP 6
  6060. #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
  6061. #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
  6062. #define IMAGE_DEBUG_TYPE_BORLAND 9
  6063. #define IMAGE_DEBUG_TYPE_RESERVED10 10
  6064. #define IMAGE_DEBUG_TYPE_CLSID 11
  6065. typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
  6066. DWORD NumberOfSymbols;
  6067. DWORD LvaToFirstSymbol;
  6068. DWORD NumberOfLinenumbers;
  6069. DWORD LvaToFirstLinenumber;
  6070. DWORD RvaToFirstByteOfCode;
  6071. DWORD RvaToLastByteOfCode;
  6072. DWORD RvaToFirstByteOfData;
  6073. DWORD RvaToLastByteOfData;
  6074. } IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
  6075. #define FRAME_FPO 0
  6076. #define FRAME_TRAP 1
  6077. #define FRAME_TSS 2
  6078. #define FRAME_NONFPO 3
  6079. typedef struct _FPO_DATA {
  6080. DWORD ulOffStart; // offset 1st byte of function code
  6081. DWORD cbProcSize; // # bytes in function
  6082. DWORD cdwLocals; // # bytes in locals/4
  6083. WORD cdwParams; // # bytes in params/4
  6084. WORD cbProlog : 8; // # bytes in prolog
  6085. WORD cbRegs : 3; // # regs saved
  6086. WORD fHasSEH : 1; // TRUE if SEH in func
  6087. WORD fUseBP : 1; // TRUE if EBP has been allocated
  6088. WORD reserved : 1; // reserved for future use
  6089. WORD cbFrame : 2; // frame type
  6090. } FPO_DATA, *PFPO_DATA;
  6091. #define SIZEOF_RFPO_DATA 16
  6092. #define IMAGE_DEBUG_MISC_EXENAME 1
  6093. typedef struct _IMAGE_DEBUG_MISC {
  6094. DWORD DataType; // type of misc data, see defines
  6095. DWORD Length; // total length of record, rounded to four
  6096. // byte multiple.
  6097. BOOLEAN Unicode; // TRUE if data is unicode string
  6098. BYTE Reserved[ 3 ];
  6099. BYTE Data[ 1 ]; // Actual data
  6100. } IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
  6101. //
  6102. // Function table extracted from MIPS/ALPHA/IA64 images. Does not contain
  6103. // information needed only for runtime support. Just those fields for
  6104. // each entry needed by a debugger.
  6105. //
  6106. typedef struct _IMAGE_FUNCTION_ENTRY {
  6107. DWORD StartingAddress;
  6108. DWORD EndingAddress;
  6109. DWORD EndOfPrologue;
  6110. } IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
  6111. typedef struct _IMAGE_FUNCTION_ENTRY64 {
  6112. ULONGLONG StartingAddress;
  6113. ULONGLONG EndingAddress;
  6114. union {
  6115. ULONGLONG EndOfPrologue;
  6116. ULONGLONG UnwindInfoAddress;
  6117. };
  6118. } IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;
  6119. //
  6120. // Debugging information can be stripped from an image file and placed
  6121. // in a separate .DBG file, whose file name part is the same as the
  6122. // image file name part (e.g. symbols for CMD.EXE could be stripped
  6123. // and placed in CMD.DBG). This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
  6124. // flag in the Characteristics field of the file header. The beginning of
  6125. // the .DBG file contains the following structure which captures certain
  6126. // information from the image file. This allows a debug to proceed even if
  6127. // the original image file is not accessable. This header is followed by
  6128. // zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
  6129. // IMAGE_DEBUG_DIRECTORY structures. The latter structures and those in
  6130. // the image file contain file offsets relative to the beginning of the
  6131. // .DBG file.
  6132. //
  6133. // If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
  6134. // is left in the image file, but not mapped. This allows a debugger to
  6135. // compute the name of the .DBG file, from the name of the image in the
  6136. // IMAGE_DEBUG_MISC structure.
  6137. //
  6138. typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
  6139. WORD Signature;
  6140. WORD Flags;
  6141. WORD Machine;
  6142. WORD Characteristics;
  6143. DWORD TimeDateStamp;
  6144. DWORD CheckSum;
  6145. DWORD ImageBase;
  6146. DWORD SizeOfImage;
  6147. DWORD NumberOfSections;
  6148. DWORD ExportedNamesSize;
  6149. DWORD DebugDirectorySize;
  6150. DWORD SectionAlignment;
  6151. DWORD Reserved[2];
  6152. } IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
  6153. typedef struct _NON_PAGED_DEBUG_INFO {
  6154. WORD Signature;
  6155. WORD Flags;
  6156. DWORD Size;
  6157. WORD Machine;
  6158. WORD Characteristics;
  6159. DWORD TimeDateStamp;
  6160. DWORD CheckSum;
  6161. DWORD SizeOfImage;
  6162. ULONGLONG ImageBase;
  6163. //DebugDirectorySize
  6164. //IMAGE_DEBUG_DIRECTORY
  6165. } NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
  6166. #ifndef _MAC
  6167. #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
  6168. #define NON_PAGED_DEBUG_SIGNATURE 0x494E
  6169. #else
  6170. #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4449 // DI
  6171. #define NON_PAGED_DEBUG_SIGNATURE 0x4E49 // NI
  6172. #endif
  6173. #define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000
  6174. #define IMAGE_SEPARATE_DEBUG_MISMATCH 0x8000 // when DBG was updated, the
  6175. // old checksum didn't match.
  6176. //
  6177. // The .arch section is made up of headers, each describing an amask position/value
  6178. // pointing to an array of IMAGE_ARCHITECTURE_ENTRY's. Each "array" (both the header
  6179. // and entry arrays) are terminiated by a quadword of 0xffffffffL.
  6180. //
  6181. // NOTE: There may be quadwords of 0 sprinkled around and must be skipped.
  6182. //
  6183. typedef struct _ImageArchitectureHeader {
  6184. unsigned int AmaskValue: 1; // 1 -> code section depends on mask bit
  6185. // 0 -> new instruction depends on mask bit
  6186. int :7; // MBZ
  6187. unsigned int AmaskShift: 8; // Amask bit in question for this fixup
  6188. int :16; // MBZ
  6189. DWORD FirstEntryRVA; // RVA into .arch section to array of ARCHITECTURE_ENTRY's
  6190. } IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;
  6191. typedef struct _ImageArchitectureEntry {
  6192. DWORD FixupInstRVA; // RVA of instruction to fixup
  6193. DWORD NewInst; // fixup instruction (see alphaops.h)
  6194. } IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;
  6195. #include "poppack.h" // Back to the initial value
  6196. // The following structure defines the new import object. Note the values of the first two fields,
  6197. // which must be set as stated in order to differentiate old and new import members.
  6198. // Following this structure, the linker emits two null-terminated strings used to recreate the
  6199. // import at the time of use. The first string is the import's name, the second is the dll's name.
  6200. #define IMPORT_OBJECT_HDR_SIG2 0xffff
  6201. typedef struct IMPORT_OBJECT_HEADER {
  6202. WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
  6203. WORD Sig2; // Must be IMPORT_OBJECT_HDR_SIG2.
  6204. WORD Version;
  6205. WORD Machine;
  6206. DWORD TimeDateStamp; // Time/date stamp
  6207. DWORD SizeOfData; // particularly useful for incremental links
  6208. union {
  6209. WORD Ordinal; // if grf & IMPORT_OBJECT_ORDINAL
  6210. WORD Hint;
  6211. };
  6212. WORD Type : 2; // IMPORT_TYPE
  6213. WORD NameType : 3; // IMPORT_NAME_TYPE
  6214. WORD Reserved : 11; // Reserved. Must be zero.
  6215. } IMPORT_OBJECT_HEADER;
  6216. typedef enum IMPORT_OBJECT_TYPE
  6217. {
  6218. IMPORT_OBJECT_CODE = 0,
  6219. IMPORT_OBJECT_DATA = 1,
  6220. IMPORT_OBJECT_CONST = 2,
  6221. } IMPORT_OBJECT_TYPE;
  6222. typedef enum IMPORT_OBJECT_NAME_TYPE
  6223. {
  6224. IMPORT_OBJECT_ORDINAL = 0, // Import by ordinal
  6225. IMPORT_OBJECT_NAME = 1, // Import name == public symbol name.
  6226. IMPORT_OBJECT_NAME_NO_PREFIX = 2, // Import name == public symbol name skipping leading ?, @, or optionally _.
  6227. IMPORT_OBJECT_NAME_UNDECORATE = 3, // Import name == public symbol name skipping leading ?, @, or optionally _
  6228. // and truncating at first @
  6229. } IMPORT_OBJECT_NAME_TYPE;
  6230. #ifndef __IMAGE_COR20_HEADER_DEFINED__
  6231. #define __IMAGE_COR20_HEADER_DEFINED__
  6232. typedef enum ReplacesCorHdrNumericDefines
  6233. {
  6234. // COM+ Header entry point flags.
  6235. COMIMAGE_FLAGS_ILONLY =0x00000001,
  6236. COMIMAGE_FLAGS_32BITREQUIRED =0x00000002,
  6237. COMIMAGE_FLAGS_IL_LIBRARY =0x00000004,
  6238. COMIMAGE_FLAGS_STRONGNAMESIGNED =0x00000008,
  6239. COMIMAGE_FLAGS_TRACKDEBUGDATA =0x00010000,
  6240. // Version flags for image.
  6241. COR_VERSION_MAJOR_V2 =2,
  6242. COR_VERSION_MAJOR =COR_VERSION_MAJOR_V2,
  6243. COR_VERSION_MINOR =0,
  6244. COR_DELETED_NAME_LENGTH =8,
  6245. COR_VTABLEGAP_NAME_LENGTH =8,
  6246. // Maximum size of a NativeType descriptor.
  6247. NATIVE_TYPE_MAX_CB =1,
  6248. COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,
  6249. // #defines for the MIH FLAGS
  6250. IMAGE_COR_MIH_METHODRVA =0x01,
  6251. IMAGE_COR_MIH_EHRVA =0x02,
  6252. IMAGE_COR_MIH_BASICBLOCK =0x08,
  6253. // V-table constants
  6254. COR_VTABLE_32BIT =0x01, // V-table slots are 32-bits in size.
  6255. COR_VTABLE_64BIT =0x02, // V-table slots are 64-bits in size.
  6256. COR_VTABLE_FROM_UNMANAGED =0x04, // If set, transition from unmanaged.
  6257. COR_VTABLE_CALL_MOST_DERIVED =0x10, // Call most derived method described by
  6258. // EATJ constants
  6259. IMAGE_COR_EATJ_THUNK_SIZE =32, // Size of a jump thunk reserved range.
  6260. // Max name lengths
  6261. //@todo: Change to unlimited name lengths.
  6262. MAX_CLASS_NAME =1024,
  6263. MAX_PACKAGE_NAME =1024,
  6264. } ReplacesCorHdrNumericDefines;
  6265. // COM+ 2.0 header structure.
  6266. typedef struct IMAGE_COR20_HEADER
  6267. {
  6268. // Header versioning
  6269. DWORD cb;
  6270. WORD MajorRuntimeVersion;
  6271. WORD MinorRuntimeVersion;
  6272. // Symbol table and startup information
  6273. IMAGE_DATA_DIRECTORY MetaData;
  6274. DWORD Flags;
  6275. DWORD EntryPointToken;
  6276. // Binding information
  6277. IMAGE_DATA_DIRECTORY Resources;
  6278. IMAGE_DATA_DIRECTORY StrongNameSignature;
  6279. // Regular fixup and binding information
  6280. IMAGE_DATA_DIRECTORY CodeManagerTable;
  6281. IMAGE_DATA_DIRECTORY VTableFixups;
  6282. IMAGE_DATA_DIRECTORY ExportAddressTableJumps;
  6283. // Precompiled image info (internal use only - set to zero)
  6284. IMAGE_DATA_DIRECTORY ManagedNativeHeader;
  6285. } IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
  6286. #endif // __IMAGE_COR20_HEADER_DEFINED__
  6287. //
  6288. // End Image Format
  6289. //
  6290. //
  6291. // for move macros
  6292. //
  6293. #ifdef _MAC
  6294. #ifndef _INC_STRING
  6295. #include <string.h>
  6296. #endif /* _INC_STRING */
  6297. #else
  6298. #include <string.h>
  6299. #endif // _MAC
  6300. #ifndef _SLIST_HEADER_
  6301. #define _SLIST_HEADER_
  6302. #define SLIST_ENTRY SINGLE_LIST_ENTRY
  6303. #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
  6304. #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
  6305. #if defined(_WIN64)
  6306. typedef struct DECLSPEC_ALIGN(16) _SLIST_HEADER {
  6307. ULONGLONG Alignment;
  6308. ULONGLONG Region;
  6309. } SLIST_HEADER;
  6310. typedef struct _SLIST_HEADER *PSLIST_HEADER;
  6311. #else
  6312. typedef union _SLIST_HEADER {
  6313. ULONGLONG Alignment;
  6314. struct {
  6315. SLIST_ENTRY Next;
  6316. WORD Depth;
  6317. WORD Sequence;
  6318. };
  6319. } SLIST_HEADER, *PSLIST_HEADER;
  6320. #endif
  6321. #endif
  6322. NTSYSAPI
  6323. VOID
  6324. NTAPI
  6325. RtlInitializeSListHead (
  6326. IN PSLIST_HEADER ListHead
  6327. );
  6328. NTSYSAPI
  6329. PSLIST_ENTRY
  6330. RtlFirstEntrySList (
  6331. IN const SLIST_HEADER *ListHead
  6332. );
  6333. NTSYSAPI
  6334. PSLIST_ENTRY
  6335. NTAPI
  6336. RtlInterlockedPopEntrySList (
  6337. IN PSLIST_HEADER ListHead
  6338. );
  6339. NTSYSAPI
  6340. PSLIST_ENTRY
  6341. NTAPI
  6342. RtlInterlockedPushEntrySList (
  6343. IN PSLIST_HEADER ListHead,
  6344. IN PSLIST_ENTRY ListEntry
  6345. );
  6346. NTSYSAPI
  6347. PSLIST_ENTRY
  6348. NTAPI
  6349. RtlInterlockedFlushSList (
  6350. IN PSLIST_HEADER ListHead
  6351. );
  6352. NTSYSAPI
  6353. WORD
  6354. NTAPI
  6355. RtlQueryDepthSList (
  6356. IN PSLIST_HEADER ListHead
  6357. );
  6358. #define HEAP_NO_SERIALIZE 0x00000001
  6359. #define HEAP_GROWABLE 0x00000002
  6360. #define HEAP_GENERATE_EXCEPTIONS 0x00000004
  6361. #define HEAP_ZERO_MEMORY 0x00000008
  6362. #define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
  6363. #define HEAP_TAIL_CHECKING_ENABLED 0x00000020
  6364. #define HEAP_FREE_CHECKING_ENABLED 0x00000040
  6365. #define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
  6366. #define HEAP_CREATE_ALIGN_16 0x00010000
  6367. #define HEAP_CREATE_ENABLE_TRACING 0x00020000
  6368. #define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
  6369. #define HEAP_MAXIMUM_TAG 0x0FFF
  6370. #define HEAP_PSEUDO_TAG_FLAG 0x8000
  6371. #define HEAP_TAG_SHIFT 18
  6372. #define HEAP_MAKE_TAG_FLAGS( b, o ) ((DWORD)((b) + ((o) << 18)))
  6373. #define IS_TEXT_UNICODE_ASCII16 0x0001
  6374. #define IS_TEXT_UNICODE_REVERSE_ASCII16 0x0010
  6375. #define IS_TEXT_UNICODE_STATISTICS 0x0002
  6376. #define IS_TEXT_UNICODE_REVERSE_STATISTICS 0x0020
  6377. #define IS_TEXT_UNICODE_CONTROLS 0x0004
  6378. #define IS_TEXT_UNICODE_REVERSE_CONTROLS 0x0040
  6379. #define IS_TEXT_UNICODE_SIGNATURE 0x0008
  6380. #define IS_TEXT_UNICODE_REVERSE_SIGNATURE 0x0080
  6381. #define IS_TEXT_UNICODE_ILLEGAL_CHARS 0x0100
  6382. #define IS_TEXT_UNICODE_ODD_LENGTH 0x0200
  6383. #define IS_TEXT_UNICODE_DBCS_LEADBYTE 0x0400
  6384. #define IS_TEXT_UNICODE_NULL_BYTES 0x1000
  6385. #define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
  6386. #define IS_TEXT_UNICODE_REVERSE_MASK 0x00F0
  6387. #define IS_TEXT_UNICODE_NOT_UNICODE_MASK 0x0F00
  6388. #define IS_TEXT_UNICODE_NOT_ASCII_MASK 0xF000
  6389. #define COMPRESSION_FORMAT_NONE (0x0000)
  6390. #define COMPRESSION_FORMAT_DEFAULT (0x0001)
  6391. #define COMPRESSION_FORMAT_LZNT1 (0x0002)
  6392. #define COMPRESSION_ENGINE_STANDARD (0x0000)
  6393. #define COMPRESSION_ENGINE_MAXIMUM (0x0100)
  6394. #define COMPRESSION_ENGINE_HIBER (0x0200)
  6395. NTSYSAPI
  6396. SIZE_T
  6397. NTAPI
  6398. RtlCompareMemory (
  6399. const VOID *Source1,
  6400. const VOID *Source2,
  6401. SIZE_T Length
  6402. );
  6403. #if defined(_M_AMD64) || defined(_M_IA64)
  6404. #define RtlEqualMemory(Source1, Source2, Length) \
  6405. ((Length) == RtlCompareMemory(Source1, Source2, Length))
  6406. NTSYSAPI
  6407. VOID
  6408. NTAPI
  6409. RtlCopyMemory (
  6410. VOID UNALIGNED *Destination,
  6411. CONST VOID UNALIGNED *Source,
  6412. SIZE_T Length
  6413. );
  6414. #if !defined(_M_AMD64)
  6415. NTSYSAPI
  6416. VOID
  6417. NTAPI
  6418. RtlCopyMemory32 (
  6419. VOID UNALIGNED *Destination,
  6420. CONST VOID UNALIGNED *Source,
  6421. DWORD Length
  6422. );
  6423. #endif
  6424. NTSYSAPI
  6425. VOID
  6426. NTAPI
  6427. RtlMoveMemory (
  6428. VOID UNALIGNED *Destination,
  6429. CONST VOID UNALIGNED *Source,
  6430. SIZE_T Length
  6431. );
  6432. NTSYSAPI
  6433. VOID
  6434. NTAPI
  6435. RtlFillMemory (
  6436. VOID UNALIGNED *Destination,
  6437. SIZE_T Length,
  6438. BYTE Fill
  6439. );
  6440. NTSYSAPI
  6441. VOID
  6442. NTAPI
  6443. RtlZeroMemory (
  6444. VOID UNALIGNED *Destination,
  6445. SIZE_T Length
  6446. );
  6447. #else
  6448. #define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
  6449. #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
  6450. #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
  6451. #define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
  6452. #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
  6453. #endif
  6454. #if !defined(MIDL_PASS)
  6455. FORCEINLINE
  6456. PVOID
  6457. RtlSecureZeroMemory(
  6458. IN PVOID ptr,
  6459. IN SIZE_T cnt
  6460. )
  6461. {
  6462. volatile char *vptr = (volatile char *)ptr;
  6463. while (cnt) {
  6464. *vptr = 0;
  6465. vptr++;
  6466. cnt--;
  6467. }
  6468. return ptr;
  6469. }
  6470. #endif
  6471. typedef struct _MESSAGE_RESOURCE_ENTRY {
  6472. WORD Length;
  6473. WORD Flags;
  6474. BYTE Text[ 1 ];
  6475. } MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
  6476. #define MESSAGE_RESOURCE_UNICODE 0x0001
  6477. typedef struct _MESSAGE_RESOURCE_BLOCK {
  6478. DWORD LowId;
  6479. DWORD HighId;
  6480. DWORD OffsetToEntries;
  6481. } MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
  6482. typedef struct _MESSAGE_RESOURCE_DATA {
  6483. DWORD NumberOfBlocks;
  6484. MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
  6485. } MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
  6486. typedef struct _OSVERSIONINFOA {
  6487. DWORD dwOSVersionInfoSize;
  6488. DWORD dwMajorVersion;
  6489. DWORD dwMinorVersion;
  6490. DWORD dwBuildNumber;
  6491. DWORD dwPlatformId;
  6492. CHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
  6493. } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
  6494. typedef struct _OSVERSIONINFOW {
  6495. DWORD dwOSVersionInfoSize;
  6496. DWORD dwMajorVersion;
  6497. DWORD dwMinorVersion;
  6498. DWORD dwBuildNumber;
  6499. DWORD dwPlatformId;
  6500. WCHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
  6501. } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
  6502. #ifdef UNICODE
  6503. typedef OSVERSIONINFOW OSVERSIONINFO;
  6504. typedef POSVERSIONINFOW POSVERSIONINFO;
  6505. typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
  6506. #else
  6507. typedef OSVERSIONINFOA OSVERSIONINFO;
  6508. typedef POSVERSIONINFOA POSVERSIONINFO;
  6509. typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
  6510. #endif // UNICODE
  6511. typedef struct _OSVERSIONINFOEXA {
  6512. DWORD dwOSVersionInfoSize;
  6513. DWORD dwMajorVersion;
  6514. DWORD dwMinorVersion;
  6515. DWORD dwBuildNumber;
  6516. DWORD dwPlatformId;
  6517. CHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
  6518. WORD wServicePackMajor;
  6519. WORD wServicePackMinor;
  6520. WORD wSuiteMask;
  6521. BYTE wProductType;
  6522. BYTE wReserved;
  6523. } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
  6524. typedef struct _OSVERSIONINFOEXW {
  6525. DWORD dwOSVersionInfoSize;
  6526. DWORD dwMajorVersion;
  6527. DWORD dwMinorVersion;
  6528. DWORD dwBuildNumber;
  6529. DWORD dwPlatformId;
  6530. WCHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
  6531. WORD wServicePackMajor;
  6532. WORD wServicePackMinor;
  6533. WORD wSuiteMask;
  6534. BYTE wProductType;
  6535. BYTE wReserved;
  6536. } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
  6537. #ifdef UNICODE
  6538. typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
  6539. typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
  6540. typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
  6541. #else
  6542. typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
  6543. typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
  6544. typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
  6545. #endif // UNICODE
  6546. //
  6547. // RtlVerifyVersionInfo() conditions
  6548. //
  6549. #define VER_EQUAL 1
  6550. #define VER_GREATER 2
  6551. #define VER_GREATER_EQUAL 3
  6552. #define VER_LESS 4
  6553. #define VER_LESS_EQUAL 5
  6554. #define VER_AND 6
  6555. #define VER_OR 7
  6556. #define VER_CONDITION_MASK 7
  6557. #define VER_NUM_BITS_PER_CONDITION_MASK 3
  6558. //
  6559. // RtlVerifyVersionInfo() type mask bits
  6560. //
  6561. #define VER_MINORVERSION 0x0000001
  6562. #define VER_MAJORVERSION 0x0000002
  6563. #define VER_BUILDNUMBER 0x0000004
  6564. #define VER_PLATFORMID 0x0000008
  6565. #define VER_SERVICEPACKMINOR 0x0000010
  6566. #define VER_SERVICEPACKMAJOR 0x0000020
  6567. #define VER_SUITENAME 0x0000040
  6568. #define VER_PRODUCT_TYPE 0x0000080
  6569. //
  6570. // RtlVerifyVersionInfo() os product type values
  6571. //
  6572. #define VER_NT_WORKSTATION 0x0000001
  6573. #define VER_NT_DOMAIN_CONTROLLER 0x0000002
  6574. #define VER_NT_SERVER 0x0000003
  6575. //
  6576. // dwPlatformId defines:
  6577. //
  6578. #define VER_PLATFORM_WIN32s 0
  6579. #define VER_PLATFORM_WIN32_WINDOWS 1
  6580. #define VER_PLATFORM_WIN32_NT 2
  6581. //
  6582. //
  6583. // VerifyVersionInfo() macro to set the condition mask
  6584. //
  6585. // For documentation sakes here's the old version of the macro that got
  6586. // changed to call an API
  6587. // #define VER_SET_CONDITION(_m_,_t_,_c_) _m_=(_m_|(_c_<<(1<<_t_)))
  6588. //
  6589. #define VER_SET_CONDITION(_m_,_t_,_c_) \
  6590. ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))
  6591. ULONGLONG
  6592. NTAPI
  6593. VerSetConditionMask(
  6594. IN ULONGLONG ConditionMask,
  6595. IN DWORD TypeMask,
  6596. IN BYTE Condition
  6597. );
  6598. //
  6599. typedef struct _RTL_CRITICAL_SECTION_DEBUG {
  6600. WORD Type;
  6601. WORD CreatorBackTraceIndex;
  6602. struct _RTL_CRITICAL_SECTION *CriticalSection;
  6603. LIST_ENTRY ProcessLocksList;
  6604. DWORD EntryCount;
  6605. DWORD ContentionCount;
  6606. DWORD Spare[ 2 ];
  6607. } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
  6608. #define RTL_CRITSECT_TYPE 0
  6609. #define RTL_RESOURCE_TYPE 1
  6610. typedef struct _RTL_CRITICAL_SECTION {
  6611. PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
  6612. //
  6613. // The following three fields control entering and exiting the critical
  6614. // section for the resource
  6615. //
  6616. LONG LockCount;
  6617. LONG RecursionCount;
  6618. HANDLE OwningThread; // from the thread's ClientId->UniqueThread
  6619. HANDLE LockSemaphore;
  6620. ULONG_PTR SpinCount; // force size on 64-bit systems when packed
  6621. } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
  6622. typedef VOID (* RTL_VERIFIER_DLL_LOAD_CALLBACK) (
  6623. PWSTR DllName,
  6624. PVOID DllBase,
  6625. SIZE_T DllSize,
  6626. PVOID Reserved
  6627. );
  6628. typedef VOID (* RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
  6629. PWSTR DllName,
  6630. PVOID DllBase,
  6631. SIZE_T DllSize,
  6632. PVOID Reserved
  6633. );
  6634. typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {
  6635. PCHAR ThunkName;
  6636. PVOID ThunkOldAddress;
  6637. PVOID ThunkNewAddress;
  6638. } RTL_VERIFIER_THUNK_DESCRIPTOR, *PRTL_VERIFIER_THUNK_DESCRIPTOR;
  6639. typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {
  6640. PWCHAR DllName;
  6641. DWORD DllFlags;
  6642. PVOID DllAddress;
  6643. PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;
  6644. } RTL_VERIFIER_DLL_DESCRIPTOR, *PRTL_VERIFIER_DLL_DESCRIPTOR;
  6645. typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {
  6646. //
  6647. // Filled by verifier provider DLL
  6648. //
  6649. DWORD Length;
  6650. PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls;
  6651. RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback;
  6652. RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback;
  6653. //
  6654. // Filled by verifier engine
  6655. //
  6656. PWSTR VerifierImage;
  6657. DWORD VerifierFlags;
  6658. DWORD VerifierDebug;
  6659. } RTL_VERIFIER_PROVIDER_DESCRIPTOR, *PRTL_VERIFIER_PROVIDER_DESCRIPTOR;
  6660. //
  6661. // Application verifier standard flags
  6662. //
  6663. #define RTL_VRF_FLG_FULL_PAGE_HEAP 0x0001
  6664. #define RTL_VRF_FLG_LOCK_CHECKS 0x0002
  6665. #define RTL_VRF_FLG_HANDLE_CHECKS 0x0004
  6666. #define RTL_VRF_FLG_STACK_CHECKS 0x0008
  6667. #define RTL_VRF_FLG_APPCOMPAT_CHECKS 0x0010
  6668. //
  6669. // Application verifier standard stop codes
  6670. //
  6671. #define APPLICATION_VERIFIER_INTERNAL_ERROR 0x80000000
  6672. #define APPLICATION_VERIFIER_INTERNAL_WARNING 0x40000000
  6673. #define APPLICATION_VERIFIER_NO_BREAK 0x20000000
  6674. #define APPLICATION_VERIFIER_RESERVED_BIT_28 0x10000000
  6675. #define APPLICATION_VERIFIER_UNKNOWN_ERROR 0x0001
  6676. #define APPLICATION_VERIFIER_ACCESS_VIOLATION 0x0002
  6677. #define APPLICATION_VERIFIER_UNSYNCHRONIZED_ACCESS 0x0003
  6678. #define APPLICATION_VERIFIER_EXTREME_SIZE_REQUEST 0x0004
  6679. #define APPLICATION_VERIFIER_BAD_HEAP_HANDLE 0x0005
  6680. #define APPLICATION_VERIFIER_SWITCHED_HEAP_HANDLE 0x0006
  6681. #define APPLICATION_VERIFIER_DOUBLE_FREE 0x0007
  6682. #define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK 0x0008
  6683. #define APPLICATION_VERIFIER_DESTROY_PROCESS_HEAP 0x0009
  6684. #define APPLICATION_VERIFIER_UNEXPECTED_EXCEPTION 0x000A
  6685. #define APPLICATION_VERIFIER_STACK_OVERFLOW 0x000B
  6686. #define APPLICATION_VERIFIER_TERMINATE_THREAD_CALL 0x0100
  6687. #define APPLICATION_VERIFIER_EXIT_THREAD_OWNS_LOCK 0x0200
  6688. #define APPLICATION_VERIFIER_LOCK_IN_UNLOADED_DLL 0x0201
  6689. #define APPLICATION_VERIFIER_LOCK_IN_FREED_HEAP 0x0202
  6690. #define APPLICATION_VERIFIER_LOCK_DOUBLE_INITIALIZE 0x0203
  6691. #define APPLICATION_VERIFIER_LOCK_IN_FREED_MEMORY 0x0204
  6692. #define APPLICATION_VERIFIER_LOCK_CORRUPTED 0x0205
  6693. #define APPLICATION_VERIFIER_LOCK_INVALID_OWNER 0x0206
  6694. #define APPLICATION_VERIFIER_LOCK_INVALID_RECURSION_COUNT 0x0207
  6695. #define APPLICATION_VERIFIER_LOCK_INVALID_LOCK_COUNT 0x0208
  6696. #define APPLICATION_VERIFIER_LOCK_OVER_RELEASED 0x0209
  6697. #define APPLICATION_VERIFIER_LOCK_NOT_INITIALIZED 0x0210
  6698. #define APPLICATION_VERIFIER_INVALID_HANDLE 0x0300
  6699. #define VERIFIER_STOP(Code, Msg, P1, S1, P2, S2, P3, S3, P4, S4) { \
  6700. RtlApplicationVerifierStop ((Code), \
  6701. (Msg), \
  6702. (ULONG_PTR)(P1),(S1), \
  6703. (ULONG_PTR)(P2),(S2), \
  6704. (ULONG_PTR)(P3),(S3), \
  6705. (ULONG_PTR)(P4),(S4)); \
  6706. }
  6707. VOID
  6708. RtlApplicationVerifierStop (
  6709. ULONG_PTR Code,
  6710. PCHAR Message,
  6711. ULONG_PTR Param1, PCHAR Description1,
  6712. ULONG_PTR Param2, PCHAR Description2,
  6713. ULONG_PTR Param3, PCHAR Description3,
  6714. ULONG_PTR Param4, PCHAR Description4
  6715. );
  6716. typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)(
  6717. struct _EXCEPTION_POINTERS *ExceptionInfo
  6718. );
  6719. #define SEF_DACL_AUTO_INHERIT 0x01
  6720. #define SEF_SACL_AUTO_INHERIT 0x02
  6721. #define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04
  6722. #define SEF_AVOID_PRIVILEGE_CHECK 0x08
  6723. #define SEF_AVOID_OWNER_CHECK 0x10
  6724. #define SEF_DEFAULT_OWNER_FROM_PARENT 0x20
  6725. #define SEF_DEFAULT_GROUP_FROM_PARENT 0x40
  6726. typedef enum _HEAP_INFORMATION_CLASS {
  6727. HeapCompatibilityInformation
  6728. } HEAP_INFORMATION_CLASS;
  6729. DWORD
  6730. RtlSetHeapInformation (
  6731. IN PVOID HeapHandle,
  6732. IN HEAP_INFORMATION_CLASS HeapInformationClass,
  6733. IN PVOID HeapInformation OPTIONAL,
  6734. IN SIZE_T HeapInformationLength OPTIONAL
  6735. );
  6736. DWORD
  6737. RtlQueryHeapInformation (
  6738. IN PVOID HeapHandle,
  6739. IN HEAP_INFORMATION_CLASS HeapInformationClass,
  6740. OUT PVOID HeapInformation OPTIONAL,
  6741. IN SIZE_T HeapInformationLength OPTIONAL,
  6742. OUT PSIZE_T ReturnLength OPTIONAL
  6743. );
  6744. #define WT_EXECUTEDEFAULT 0x00000000
  6745. #define WT_EXECUTEINIOTHREAD 0x00000001
  6746. #define WT_EXECUTEINUITHREAD 0x00000002
  6747. #define WT_EXECUTEINWAITTHREAD 0x00000004
  6748. #define WT_EXECUTEONLYONCE 0x00000008
  6749. #define WT_EXECUTEINTIMERTHREAD 0x00000020
  6750. #define WT_EXECUTELONGFUNCTION 0x00000010
  6751. #define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040
  6752. #define WT_EXECUTEINPERSISTENTTHREAD 0x00000080
  6753. #define WT_TRANSFER_IMPERSONATION 0x00000100
  6754. #define WT_SET_MAX_THREADPOOL_THREADS(Flags, Limit) ((Flags) |= (Limit)<<16)
  6755. typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
  6756. typedef VOID (NTAPI * WORKERCALLBACKFUNC) (PVOID );
  6757. typedef VOID (NTAPI * APC_CALLBACK_FUNCTION) (DWORD , PVOID, PVOID);
  6758. #define WT_EXECUTEINLONGTHREAD 0x00000010
  6759. #define WT_EXECUTEDELETEWAIT 0x00000008
  6760. typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
  6761. ActivationContextBasicInformation = 1,
  6762. ActivationContextDetailedInformation = 2,
  6763. AssemblyDetailedInformationInActivationContext = 3,
  6764. FileInformationInAssemblyOfAssemblyInActivationContext = 4,
  6765. MaxActivationContextInfoClass,
  6766. //
  6767. // compatibility with old names
  6768. //
  6769. AssemblyDetailedInformationInActivationContxt = 3,
  6770. FileInformationInAssemblyOfAssemblyInActivationContxt = 4
  6771. } ACTIVATION_CONTEXT_INFO_CLASS;
  6772. #define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASS
  6773. typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
  6774. DWORD ulAssemblyIndex;
  6775. DWORD ulFileIndexInAssembly;
  6776. } ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
  6777. typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
  6778. #define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1)
  6779. #define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2)
  6780. #define ACTIVATION_CONTEXT_PATH_TYPE_URL (3)
  6781. #define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)
  6782. typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
  6783. DWORD ulFlags;
  6784. DWORD ulFilenameLength;
  6785. DWORD ulPathLength;
  6786. PCWSTR lpFileName;
  6787. PCWSTR lpFilePath;
  6788. } ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
  6789. typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
  6790. //
  6791. // compatibility with old names
  6792. // The new names use "file" consistently.
  6793. //
  6794. #define _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION _ASSEMBLY_FILE_DETAILED_INFORMATION
  6795. #define ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION ASSEMBLY_FILE_DETAILED_INFORMATION
  6796. #define PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PASSEMBLY_FILE_DETAILED_INFORMATION
  6797. #define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATION
  6798. typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
  6799. DWORD ulFlags;
  6800. DWORD ulEncodedAssemblyIdentityLength; // in bytes
  6801. DWORD ulManifestPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*
  6802. DWORD ulManifestPathLength; // in bytes
  6803. LARGE_INTEGER liManifestLastWriteTime; // FILETIME
  6804. DWORD ulPolicyPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*
  6805. DWORD ulPolicyPathLength; // in bytes
  6806. LARGE_INTEGER liPolicyLastWriteTime; // FILETIME
  6807. DWORD ulMetadataSatelliteRosterIndex;
  6808. DWORD ulManifestVersionMajor; // 1
  6809. DWORD ulManifestVersionMinor; // 0
  6810. DWORD ulPolicyVersionMajor; // 0
  6811. DWORD ulPolicyVersionMinor; // 0
  6812. DWORD ulAssemblyDirectoryNameLength; // in bytes
  6813. PCWSTR lpAssemblyEncodedAssemblyIdentity;
  6814. PCWSTR lpAssemblyManifestPath;
  6815. PCWSTR lpAssemblyPolicyPath;
  6816. PCWSTR lpAssemblyDirectoryName;
  6817. DWORD ulFileCount;
  6818. } ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
  6819. typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
  6820. typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
  6821. DWORD dwFlags;
  6822. DWORD ulFormatVersion;
  6823. DWORD ulAssemblyCount;
  6824. DWORD ulRootManifestPathType;
  6825. DWORD ulRootManifestPathChars;
  6826. DWORD ulRootConfigurationPathType;
  6827. DWORD ulRootConfigurationPathChars;
  6828. DWORD ulAppDirPathType;
  6829. DWORD ulAppDirPathChars;
  6830. PCWSTR lpRootManifestPath;
  6831. PCWSTR lpRootConfigurationPath;
  6832. PCWSTR lpAppDirPath;
  6833. } ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
  6834. typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
  6835. #define DLL_PROCESS_ATTACH 1
  6836. #define DLL_THREAD_ATTACH 2
  6837. #define DLL_THREAD_DETACH 3
  6838. #define DLL_PROCESS_DETACH 0
  6839. #define DLL_PROCESS_VERIFIER 4
  6840. //
  6841. // Defines for the READ flags for Eventlogging
  6842. //
  6843. #define EVENTLOG_SEQUENTIAL_READ 0x0001
  6844. #define EVENTLOG_SEEK_READ 0x0002
  6845. #define EVENTLOG_FORWARDS_READ 0x0004
  6846. #define EVENTLOG_BACKWARDS_READ 0x0008
  6847. //
  6848. // The types of events that can be logged.
  6849. //
  6850. #define EVENTLOG_SUCCESS 0x0000
  6851. #define EVENTLOG_ERROR_TYPE 0x0001
  6852. #define EVENTLOG_WARNING_TYPE 0x0002
  6853. #define EVENTLOG_INFORMATION_TYPE 0x0004
  6854. #define EVENTLOG_AUDIT_SUCCESS 0x0008
  6855. #define EVENTLOG_AUDIT_FAILURE 0x0010
  6856. //
  6857. // Defines for the WRITE flags used by Auditing for paired events
  6858. // These are not implemented in Product 1
  6859. //
  6860. #define EVENTLOG_START_PAIRED_EVENT 0x0001
  6861. #define EVENTLOG_END_PAIRED_EVENT 0x0002
  6862. #define EVENTLOG_END_ALL_PAIRED_EVENTS 0x0004
  6863. #define EVENTLOG_PAIRED_EVENT_ACTIVE 0x0008
  6864. #define EVENTLOG_PAIRED_EVENT_INACTIVE 0x0010
  6865. //
  6866. // Structure that defines the header of the Eventlog record. This is the
  6867. // fixed-sized portion before all the variable-length strings, binary
  6868. // data and pad bytes.
  6869. //
  6870. // TimeGenerated is the time it was generated at the client.
  6871. // TimeWritten is the time it was put into the log at the server end.
  6872. //
  6873. typedef struct _EVENTLOGRECORD {
  6874. DWORD Length; // Length of full record
  6875. DWORD Reserved; // Used by the service
  6876. DWORD RecordNumber; // Absolute record number
  6877. DWORD TimeGenerated; // Seconds since 1-1-1970
  6878. DWORD TimeWritten; // Seconds since 1-1-1970
  6879. DWORD EventID;
  6880. WORD EventType;
  6881. WORD NumStrings;
  6882. WORD EventCategory;
  6883. WORD ReservedFlags; // For use with paired events (auditing)
  6884. DWORD ClosingRecordNumber; // For use with paired events (auditing)
  6885. DWORD StringOffset; // Offset from beginning of record
  6886. DWORD UserSidLength;
  6887. DWORD UserSidOffset;
  6888. DWORD DataLength;
  6889. DWORD DataOffset; // Offset from beginning of record
  6890. //
  6891. // Then follow:
  6892. //
  6893. // WCHAR SourceName[]
  6894. // WCHAR Computername[]
  6895. // SID UserSid
  6896. // WCHAR Strings[]
  6897. // BYTE Data[]
  6898. // CHAR Pad[]
  6899. // DWORD Length;
  6900. //
  6901. } EVENTLOGRECORD, *PEVENTLOGRECORD;
  6902. //SS: start of changes to support clustering
  6903. //SS: ideally the
  6904. #define MAXLOGICALLOGNAMESIZE 256
  6905. #if _MSC_VER >= 1200
  6906. #pragma warning(push)
  6907. #endif
  6908. #pragma warning(disable : 4200)
  6909. typedef struct _EVENTSFORLOGFILE{
  6910. DWORD ulSize;
  6911. WCHAR szLogicalLogFile[MAXLOGICALLOGNAMESIZE]; //name of the logical file-security/application/system
  6912. DWORD ulNumRecords;
  6913. EVENTLOGRECORD pEventLogRecords[];
  6914. }EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;
  6915. typedef struct _PACKEDEVENTINFO{
  6916. DWORD ulSize; //total size of the structure
  6917. DWORD ulNumEventsForLogFile; //number of EventsForLogFile structure that follow
  6918. DWORD ulOffsets[]; //the offsets from the start of this structure to the EVENTSFORLOGFILE structure
  6919. }PACKEDEVENTINFO, *PPACKEDEVENTINFO;
  6920. #if _MSC_VER >= 1200
  6921. #pragma warning(pop)
  6922. #else
  6923. #pragma warning(default : 4200)
  6924. #endif
  6925. //SS: end of changes to support clustering
  6926. //
  6927. // begin_ntddk begin_wdm begin_nthal
  6928. //
  6929. // Registry Specific Access Rights.
  6930. //
  6931. #define KEY_QUERY_VALUE (0x0001)
  6932. #define KEY_SET_VALUE (0x0002)
  6933. #define KEY_CREATE_SUB_KEY (0x0004)
  6934. #define KEY_ENUMERATE_SUB_KEYS (0x0008)
  6935. #define KEY_NOTIFY (0x0010)
  6936. #define KEY_CREATE_LINK (0x0020)
  6937. #define KEY_WOW64_32KEY (0x0200)
  6938. #define KEY_WOW64_64KEY (0x0100)
  6939. #define KEY_WOW64_RES (0x0300)
  6940. #define KEY_READ ((STANDARD_RIGHTS_READ |\
  6941. KEY_QUERY_VALUE |\
  6942. KEY_ENUMERATE_SUB_KEYS |\
  6943. KEY_NOTIFY) \
  6944. & \
  6945. (~SYNCHRONIZE))
  6946. #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
  6947. KEY_SET_VALUE |\
  6948. KEY_CREATE_SUB_KEY) \
  6949. & \
  6950. (~SYNCHRONIZE))
  6951. #define KEY_EXECUTE ((KEY_READ) \
  6952. & \
  6953. (~SYNCHRONIZE))
  6954. #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
  6955. KEY_QUERY_VALUE |\
  6956. KEY_SET_VALUE |\
  6957. KEY_CREATE_SUB_KEY |\
  6958. KEY_ENUMERATE_SUB_KEYS |\
  6959. KEY_NOTIFY |\
  6960. KEY_CREATE_LINK) \
  6961. & \
  6962. (~SYNCHRONIZE))
  6963. //
  6964. // Open/Create Options
  6965. //
  6966. #define REG_OPTION_RESERVED (0x00000000L) // Parameter is reserved
  6967. #define REG_OPTION_NON_VOLATILE (0x00000000L) // Key is preserved
  6968. // when system is rebooted
  6969. #define REG_OPTION_VOLATILE (0x00000001L) // Key is not preserved
  6970. // when system is rebooted
  6971. #define REG_OPTION_CREATE_LINK (0x00000002L) // Created key is a
  6972. // symbolic link
  6973. #define REG_OPTION_BACKUP_RESTORE (0x00000004L) // open for backup or restore
  6974. // special access rules
  6975. // privilege required
  6976. #define REG_OPTION_OPEN_LINK (0x00000008L) // Open symbolic link
  6977. #define REG_LEGAL_OPTION \
  6978. (REG_OPTION_RESERVED |\
  6979. REG_OPTION_NON_VOLATILE |\
  6980. REG_OPTION_VOLATILE |\
  6981. REG_OPTION_CREATE_LINK |\
  6982. REG_OPTION_BACKUP_RESTORE |\
  6983. REG_OPTION_OPEN_LINK)
  6984. //
  6985. // Key creation/open disposition
  6986. //
  6987. #define REG_CREATED_NEW_KEY (0x00000001L) // New Registry Key created
  6988. #define REG_OPENED_EXISTING_KEY (0x00000002L) // Existing Key opened
  6989. //
  6990. // hive format to be used by Reg(Nt)SaveKeyEx
  6991. //
  6992. #define REG_STANDARD_FORMAT 1
  6993. #define REG_LATEST_FORMAT 2
  6994. #define REG_NO_COMPRESSION 4
  6995. //
  6996. // Key restore flags
  6997. //
  6998. #define REG_WHOLE_HIVE_VOLATILE (0x00000001L) // Restore whole hive volatile
  6999. #define REG_REFRESH_HIVE (0x00000002L) // Unwind changes to last flush
  7000. #define REG_NO_LAZY_FLUSH (0x00000004L) // Never lazy flush this hive
  7001. #define REG_FORCE_RESTORE (0x00000008L) // Force the restore process even when we have open handles on subkeys
  7002. // end_ntddk end_wdm end_nthal
  7003. //
  7004. // Notify filter values
  7005. //
  7006. #define REG_NOTIFY_CHANGE_NAME (0x00000001L) // Create or delete (child)
  7007. #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
  7008. #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L) // time stamp
  7009. #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
  7010. #define REG_LEGAL_CHANGE_FILTER \
  7011. (REG_NOTIFY_CHANGE_NAME |\
  7012. REG_NOTIFY_CHANGE_ATTRIBUTES |\
  7013. REG_NOTIFY_CHANGE_LAST_SET |\
  7014. REG_NOTIFY_CHANGE_SECURITY)
  7015. //
  7016. //
  7017. // Predefined Value Types.
  7018. //
  7019. #define REG_NONE ( 0 ) // No value type
  7020. #define REG_SZ ( 1 ) // Unicode nul terminated string
  7021. #define REG_EXPAND_SZ ( 2 ) // Unicode nul terminated string
  7022. // (with environment variable references)
  7023. #define REG_BINARY ( 3 ) // Free form binary
  7024. #define REG_DWORD ( 4 ) // 32-bit number
  7025. #define REG_DWORD_LITTLE_ENDIAN ( 4 ) // 32-bit number (same as REG_DWORD)
  7026. #define REG_DWORD_BIG_ENDIAN ( 5 ) // 32-bit number
  7027. #define REG_LINK ( 6 ) // Symbolic Link (unicode)
  7028. #define REG_MULTI_SZ ( 7 ) // Multiple Unicode strings
  7029. #define REG_RESOURCE_LIST ( 8 ) // Resource list in the resource map
  7030. #define REG_FULL_RESOURCE_DESCRIPTOR ( 9 ) // Resource list in the hardware description
  7031. #define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
  7032. #define REG_QWORD ( 11 ) // 64-bit number
  7033. #define REG_QWORD_LITTLE_ENDIAN ( 11 ) // 64-bit number (same as REG_QWORD)
  7034. // end_ntddk end_wdm end_nthal
  7035. // begin_ntddk begin_wdm begin_nthal
  7036. //
  7037. // Service Types (Bit Mask)
  7038. //
  7039. #define SERVICE_KERNEL_DRIVER 0x00000001
  7040. #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
  7041. #define SERVICE_ADAPTER 0x00000004
  7042. #define SERVICE_RECOGNIZER_DRIVER 0x00000008
  7043. #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
  7044. SERVICE_FILE_SYSTEM_DRIVER | \
  7045. SERVICE_RECOGNIZER_DRIVER)
  7046. #define SERVICE_WIN32_OWN_PROCESS 0x00000010
  7047. #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
  7048. #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
  7049. SERVICE_WIN32_SHARE_PROCESS)
  7050. #define SERVICE_INTERACTIVE_PROCESS 0x00000100
  7051. #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
  7052. SERVICE_ADAPTER | \
  7053. SERVICE_DRIVER | \
  7054. SERVICE_INTERACTIVE_PROCESS)
  7055. //
  7056. // Start Type
  7057. //
  7058. #define SERVICE_BOOT_START 0x00000000
  7059. #define SERVICE_SYSTEM_START 0x00000001
  7060. #define SERVICE_AUTO_START 0x00000002
  7061. #define SERVICE_DEMAND_START 0x00000003
  7062. #define SERVICE_DISABLED 0x00000004
  7063. //
  7064. // Error control type
  7065. //
  7066. #define SERVICE_ERROR_IGNORE 0x00000000
  7067. #define SERVICE_ERROR_NORMAL 0x00000001
  7068. #define SERVICE_ERROR_SEVERE 0x00000002
  7069. #define SERVICE_ERROR_CRITICAL 0x00000003
  7070. //
  7071. //
  7072. // Define the registry driver node enumerations
  7073. //
  7074. typedef enum _CM_SERVICE_NODE_TYPE {
  7075. DriverType = SERVICE_KERNEL_DRIVER,
  7076. FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
  7077. Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
  7078. Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
  7079. AdapterType = SERVICE_ADAPTER,
  7080. RecognizerType = SERVICE_RECOGNIZER_DRIVER
  7081. } SERVICE_NODE_TYPE;
  7082. typedef enum _CM_SERVICE_LOAD_TYPE {
  7083. BootLoad = SERVICE_BOOT_START,
  7084. SystemLoad = SERVICE_SYSTEM_START,
  7085. AutoLoad = SERVICE_AUTO_START,
  7086. DemandLoad = SERVICE_DEMAND_START,
  7087. DisableLoad = SERVICE_DISABLED
  7088. } SERVICE_LOAD_TYPE;
  7089. typedef enum _CM_ERROR_CONTROL_TYPE {
  7090. IgnoreError = SERVICE_ERROR_IGNORE,
  7091. NormalError = SERVICE_ERROR_NORMAL,
  7092. SevereError = SERVICE_ERROR_SEVERE,
  7093. CriticalError = SERVICE_ERROR_CRITICAL
  7094. } SERVICE_ERROR_TYPE;
  7095. //
  7096. // IOCTL_TAPE_ERASE definitions
  7097. //
  7098. #define TAPE_ERASE_SHORT 0L
  7099. #define TAPE_ERASE_LONG 1L
  7100. typedef struct _TAPE_ERASE {
  7101. DWORD Type;
  7102. BOOLEAN Immediate;
  7103. } TAPE_ERASE, *PTAPE_ERASE;
  7104. //
  7105. // IOCTL_TAPE_PREPARE definitions
  7106. //
  7107. #define TAPE_LOAD 0L
  7108. #define TAPE_UNLOAD 1L
  7109. #define TAPE_TENSION 2L
  7110. #define TAPE_LOCK 3L
  7111. #define TAPE_UNLOCK 4L
  7112. #define TAPE_FORMAT 5L
  7113. typedef struct _TAPE_PREPARE {
  7114. DWORD Operation;
  7115. BOOLEAN Immediate;
  7116. } TAPE_PREPARE, *PTAPE_PREPARE;
  7117. //
  7118. // IOCTL_TAPE_WRITE_MARKS definitions
  7119. //
  7120. #define TAPE_SETMARKS 0L
  7121. #define TAPE_FILEMARKS 1L
  7122. #define TAPE_SHORT_FILEMARKS 2L
  7123. #define TAPE_LONG_FILEMARKS 3L
  7124. typedef struct _TAPE_WRITE_MARKS {
  7125. DWORD Type;
  7126. DWORD Count;
  7127. BOOLEAN Immediate;
  7128. } TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
  7129. //
  7130. // IOCTL_TAPE_GET_POSITION definitions
  7131. //
  7132. #define TAPE_ABSOLUTE_POSITION 0L
  7133. #define TAPE_LOGICAL_POSITION 1L
  7134. #define TAPE_PSEUDO_LOGICAL_POSITION 2L
  7135. typedef struct _TAPE_GET_POSITION {
  7136. DWORD Type;
  7137. DWORD Partition;
  7138. LARGE_INTEGER Offset;
  7139. } TAPE_GET_POSITION, *PTAPE_GET_POSITION;
  7140. //
  7141. // IOCTL_TAPE_SET_POSITION definitions
  7142. //
  7143. #define TAPE_REWIND 0L
  7144. #define TAPE_ABSOLUTE_BLOCK 1L
  7145. #define TAPE_LOGICAL_BLOCK 2L
  7146. #define TAPE_PSEUDO_LOGICAL_BLOCK 3L
  7147. #define TAPE_SPACE_END_OF_DATA 4L
  7148. #define TAPE_SPACE_RELATIVE_BLOCKS 5L
  7149. #define TAPE_SPACE_FILEMARKS 6L
  7150. #define TAPE_SPACE_SEQUENTIAL_FMKS 7L
  7151. #define TAPE_SPACE_SETMARKS 8L
  7152. #define TAPE_SPACE_SEQUENTIAL_SMKS 9L
  7153. typedef struct _TAPE_SET_POSITION {
  7154. DWORD Method;
  7155. DWORD Partition;
  7156. LARGE_INTEGER Offset;
  7157. BOOLEAN Immediate;
  7158. } TAPE_SET_POSITION, *PTAPE_SET_POSITION;
  7159. //
  7160. // IOCTL_TAPE_GET_DRIVE_PARAMS definitions
  7161. //
  7162. //
  7163. // Definitions for FeaturesLow parameter
  7164. //
  7165. #define TAPE_DRIVE_FIXED 0x00000001
  7166. #define TAPE_DRIVE_SELECT 0x00000002
  7167. #define TAPE_DRIVE_INITIATOR 0x00000004
  7168. #define TAPE_DRIVE_ERASE_SHORT 0x00000010
  7169. #define TAPE_DRIVE_ERASE_LONG 0x00000020
  7170. #define TAPE_DRIVE_ERASE_BOP_ONLY 0x00000040
  7171. #define TAPE_DRIVE_ERASE_IMMEDIATE 0x00000080
  7172. #define TAPE_DRIVE_TAPE_CAPACITY 0x00000100
  7173. #define TAPE_DRIVE_TAPE_REMAINING 0x00000200
  7174. #define TAPE_DRIVE_FIXED_BLOCK 0x00000400
  7175. #define TAPE_DRIVE_VARIABLE_BLOCK 0x00000800
  7176. #define TAPE_DRIVE_WRITE_PROTECT 0x00001000
  7177. #define TAPE_DRIVE_EOT_WZ_SIZE 0x00002000
  7178. #define TAPE_DRIVE_ECC 0x00010000
  7179. #define TAPE_DRIVE_COMPRESSION 0x00020000
  7180. #define TAPE_DRIVE_PADDING 0x00040000
  7181. #define TAPE_DRIVE_REPORT_SMKS 0x00080000
  7182. #define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000
  7183. #define TAPE_DRIVE_GET_LOGICAL_BLK 0x00200000
  7184. #define TAPE_DRIVE_SET_EOT_WZ_SIZE 0x00400000
  7185. #define TAPE_DRIVE_EJECT_MEDIA 0x01000000
  7186. #define TAPE_DRIVE_CLEAN_REQUESTS 0x02000000
  7187. #define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000
  7188. #define TAPE_DRIVE_RESERVED_BIT 0x80000000 //don't use this bit!
  7189. // //can't be a low features bit!
  7190. // //reserved; high features only
  7191. //
  7192. // Definitions for FeaturesHigh parameter
  7193. //
  7194. #define TAPE_DRIVE_LOAD_UNLOAD 0x80000001
  7195. #define TAPE_DRIVE_TENSION 0x80000002
  7196. #define TAPE_DRIVE_LOCK_UNLOCK 0x80000004
  7197. #define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008
  7198. #define TAPE_DRIVE_SET_BLOCK_SIZE 0x80000010
  7199. #define TAPE_DRIVE_LOAD_UNLD_IMMED 0x80000020
  7200. #define TAPE_DRIVE_TENSION_IMMED 0x80000040
  7201. #define TAPE_DRIVE_LOCK_UNLK_IMMED 0x80000080
  7202. #define TAPE_DRIVE_SET_ECC 0x80000100
  7203. #define TAPE_DRIVE_SET_COMPRESSION 0x80000200
  7204. #define TAPE_DRIVE_SET_PADDING 0x80000400
  7205. #define TAPE_DRIVE_SET_REPORT_SMKS 0x80000800
  7206. #define TAPE_DRIVE_ABSOLUTE_BLK 0x80001000
  7207. #define TAPE_DRIVE_ABS_BLK_IMMED 0x80002000
  7208. #define TAPE_DRIVE_LOGICAL_BLK 0x80004000
  7209. #define TAPE_DRIVE_LOG_BLK_IMMED 0x80008000
  7210. #define TAPE_DRIVE_END_OF_DATA 0x80010000
  7211. #define TAPE_DRIVE_RELATIVE_BLKS 0x80020000
  7212. #define TAPE_DRIVE_FILEMARKS 0x80040000
  7213. #define TAPE_DRIVE_SEQUENTIAL_FMKS 0x80080000
  7214. #define TAPE_DRIVE_SETMARKS 0x80100000
  7215. #define TAPE_DRIVE_SEQUENTIAL_SMKS 0x80200000
  7216. #define TAPE_DRIVE_REVERSE_POSITION 0x80400000
  7217. #define TAPE_DRIVE_SPACE_IMMEDIATE 0x80800000
  7218. #define TAPE_DRIVE_WRITE_SETMARKS 0x81000000
  7219. #define TAPE_DRIVE_WRITE_FILEMARKS 0x82000000
  7220. #define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000
  7221. #define TAPE_DRIVE_WRITE_LONG_FMKS 0x88000000
  7222. #define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000
  7223. #define TAPE_DRIVE_FORMAT 0xA0000000
  7224. #define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000
  7225. #define TAPE_DRIVE_HIGH_FEATURES 0x80000000 //mask for high features flag
  7226. typedef struct _TAPE_GET_DRIVE_PARAMETERS {
  7227. BOOLEAN ECC;
  7228. BOOLEAN Compression;
  7229. BOOLEAN DataPadding;
  7230. BOOLEAN ReportSetmarks;
  7231. DWORD DefaultBlockSize;
  7232. DWORD MaximumBlockSize;
  7233. DWORD MinimumBlockSize;
  7234. DWORD MaximumPartitionCount;
  7235. DWORD FeaturesLow;
  7236. DWORD FeaturesHigh;
  7237. DWORD EOTWarningZoneSize;
  7238. } TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
  7239. //
  7240. // IOCTL_TAPE_SET_DRIVE_PARAMETERS definitions
  7241. //
  7242. typedef struct _TAPE_SET_DRIVE_PARAMETERS {
  7243. BOOLEAN ECC;
  7244. BOOLEAN Compression;
  7245. BOOLEAN DataPadding;
  7246. BOOLEAN ReportSetmarks;
  7247. DWORD EOTWarningZoneSize;
  7248. } TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
  7249. //
  7250. // IOCTL_TAPE_GET_MEDIA_PARAMETERS definitions
  7251. //
  7252. typedef struct _TAPE_GET_MEDIA_PARAMETERS {
  7253. LARGE_INTEGER Capacity;
  7254. LARGE_INTEGER Remaining;
  7255. DWORD BlockSize;
  7256. DWORD PartitionCount;
  7257. BOOLEAN WriteProtected;
  7258. } TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
  7259. //
  7260. // IOCTL_TAPE_SET_MEDIA_PARAMETERS definitions
  7261. //
  7262. typedef struct _TAPE_SET_MEDIA_PARAMETERS {
  7263. DWORD BlockSize;
  7264. } TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;
  7265. //
  7266. // IOCTL_TAPE_CREATE_PARTITION definitions
  7267. //
  7268. #define TAPE_FIXED_PARTITIONS 0L
  7269. #define TAPE_SELECT_PARTITIONS 1L
  7270. #define TAPE_INITIATOR_PARTITIONS 2L
  7271. typedef struct _TAPE_CREATE_PARTITION {
  7272. DWORD Method;
  7273. DWORD Count;
  7274. DWORD Size;
  7275. } TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
  7276. //
  7277. // WMI Methods
  7278. //
  7279. #define TAPE_QUERY_DRIVE_PARAMETERS 0L
  7280. #define TAPE_QUERY_MEDIA_CAPACITY 1L
  7281. #define TAPE_CHECK_FOR_DRIVE_PROBLEM 2L
  7282. #define TAPE_QUERY_IO_ERROR_DATA 3L
  7283. #define TAPE_QUERY_DEVICE_ERROR_DATA 4L
  7284. typedef struct _TAPE_WMI_OPERATIONS {
  7285. DWORD Method;
  7286. DWORD DataBufferSize;
  7287. PVOID DataBuffer;
  7288. } TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
  7289. //
  7290. // Type of drive errors
  7291. //
  7292. typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
  7293. TapeDriveProblemNone, TapeDriveReadWriteWarning,
  7294. TapeDriveReadWriteError, TapeDriveReadWarning,
  7295. TapeDriveWriteWarning, TapeDriveReadError,
  7296. TapeDriveWriteError, TapeDriveHardwareError,
  7297. TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
  7298. TapeDriveTimetoClean, TapeDriveCleanDriveNow,
  7299. TapeDriveMediaLifeExpired, TapeDriveSnappedTape
  7300. } TAPE_DRIVE_PROBLEM_TYPE;
  7301. #if defined(_M_AMD64) && !defined(__midl)
  7302. __forceinline
  7303. PVOID
  7304. GetCurrentFiber (
  7305. VOID
  7306. )
  7307. {
  7308. return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));
  7309. }
  7310. __forceinline
  7311. PVOID
  7312. GetFiberData (
  7313. VOID
  7314. )
  7315. {
  7316. return *(PVOID *)GetCurrentFiber();
  7317. }
  7318. #endif // _M_AMD64 && !defined(__midl)
  7319. #if (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) || ISOLATION_AWARE_ENABLED // winnt_only
  7320. #define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION (1)
  7321. #define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION (2)
  7322. #define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION (3)
  7323. #define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION (4)
  7324. #define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION (5)
  7325. #define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)
  7326. #define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION (7)
  7327. #define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE (8)
  7328. #define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES (9)
  7329. #endif // winnt_only
  7330. #ifdef __cplusplus
  7331. }
  7332. #endif
  7333. #endif /* _WINNT_ */