libc_windows.go 152 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280
  1. // Copyright 2020 The Libc Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package libc // import "modernc.org/libc"
  5. import (
  6. "errors"
  7. "fmt"
  8. "math"
  9. "os"
  10. "os/exec"
  11. "os/user"
  12. "path/filepath"
  13. "strings"
  14. "sync"
  15. "sync/atomic"
  16. "syscall"
  17. gotime "time"
  18. "unicode"
  19. "unicode/utf16"
  20. "unsafe"
  21. "modernc.org/libc/errno"
  22. "modernc.org/libc/fcntl"
  23. "modernc.org/libc/limits"
  24. "modernc.org/libc/stdio"
  25. "modernc.org/libc/sys/stat"
  26. "modernc.org/libc/sys/types"
  27. "modernc.org/libc/time"
  28. "modernc.org/libc/unistd"
  29. )
  30. // Keep these outside of the var block otherwise go generate will miss them.
  31. var X__imp__environ = EnvironP()
  32. var X__imp__wenviron = uintptr(unsafe.Pointer(&wenviron))
  33. var X_imp___environ = EnvironP()
  34. var X_iob [stdio.X_IOB_ENTRIES]stdio.FILE
  35. var Xtimezone long // extern long timezone;
  36. var (
  37. iobMap = map[uintptr]int32{} // &_iob[fd] -> fd
  38. wenvValid bool
  39. wenviron uintptr // &winEnviron[0]
  40. winEnviron = []uintptr{0}
  41. )
  42. func init() {
  43. for i := range X_iob {
  44. iobMap[uintptr(unsafe.Pointer(&X_iob[i]))] = int32(i)
  45. }
  46. }
  47. func winGetObject(stream uintptr) interface{} {
  48. if fd, ok := iobMap[stream]; ok {
  49. f, _ := fdToFile(fd)
  50. return f
  51. }
  52. return getObject(stream)
  53. }
  54. type (
  55. long = int32
  56. ulong = uint32
  57. )
  58. var (
  59. modkernel32 = syscall.NewLazyDLL("kernel32.dll")
  60. //--
  61. procAreFileApisANSI = modkernel32.NewProc("AreFileApisANSI")
  62. procCopyFileW = modkernel32.NewProc("CopyFileW")
  63. procCreateEventA = modkernel32.NewProc("CreateEventA")
  64. procCreateEventW = modkernel32.NewProc("CreateEventW")
  65. procCreateFileA = modkernel32.NewProc("CreateFileA")
  66. procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW")
  67. procCreateFileW = modkernel32.NewProc("CreateFileW")
  68. procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW")
  69. procCreatePipe = modkernel32.NewProc("CreatePipe")
  70. procCreateProcessA = modkernel32.NewProc("CreateProcessA")
  71. procCreateProcessW = modkernel32.NewProc("CreateProcessW")
  72. procCreateThread = modkernel32.NewProc("CreateThread")
  73. procDeleteCriticalSection = modkernel32.NewProc("DeleteCriticalSection")
  74. procDeviceIoControl = modkernel32.NewProc("DeviceIoControl")
  75. procDuplicateHandle = modkernel32.NewProc("DuplicateHandle")
  76. procEnterCriticalSection = modkernel32.NewProc("EnterCriticalSection")
  77. procFindClose = modkernel32.NewProc("FindClose")
  78. procFindFirstFileExW = modkernel32.NewProc("FindFirstFileExW")
  79. procFindFirstFileW = modkernel32.NewProc("FindFirstFileW")
  80. procFindNextFileW = modkernel32.NewProc("FindNextFileW")
  81. procFormatMessageW = modkernel32.NewProc("FormatMessageW")
  82. procGetACP = modkernel32.NewProc("GetACP")
  83. procGetCommState = modkernel32.NewProc("GetCommState")
  84. procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW")
  85. procGetConsoleCP = modkernel32.NewProc("GetConsoleCP")
  86. procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
  87. procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess")
  88. procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId")
  89. procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
  90. procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId")
  91. procGetEnvironmentVariableA = modkernel32.NewProc("GetEnvironmentVariableA")
  92. procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW")
  93. procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess")
  94. procGetExitCodeThread = modkernel32.NewProc("GetExitCodeThread")
  95. procGetFileAttributesA = modkernel32.NewProc("GetFileAttributesA")
  96. procGetFileAttributesExA = modkernel32.NewProc("GetFileAttributesExA")
  97. procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW")
  98. procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle")
  99. procGetFileSize = modkernel32.NewProc("GetFileSize")
  100. procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW")
  101. procGetLastError = modkernel32.NewProc("GetLastError")
  102. procGetLogicalDriveStringsA = modkernel32.NewProc("GetLogicalDriveStringsA")
  103. procGetModuleFileNameW = modkernel32.NewProc("GetModuleFileNameW")
  104. procGetModuleHandleA = modkernel32.NewProc("GetModuleHandleA")
  105. procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW")
  106. procGetPrivateProfileStringA = modkernel32.NewProc("GetPrivateProfileStringA")
  107. procGetProcAddress = modkernel32.NewProc("GetProcAddress")
  108. procGetProcessHeap = modkernel32.NewProc("GetProcessHeap")
  109. procGetSystemInfo = modkernel32.NewProc("GetSystemInfo")
  110. procGetSystemTime = modkernel32.NewProc("GetSystemTime")
  111. procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime")
  112. procGetTempFileNameW = modkernel32.NewProc("GetTempFileNameW")
  113. procGetTickCount = modkernel32.NewProc("GetTickCount")
  114. procGetVersionExA = modkernel32.NewProc("GetVersionExA")
  115. procGetVersionExW = modkernel32.NewProc("GetVersionExW")
  116. procGetVolumeInformationA = modkernel32.NewProc("GetVolumeInformationA")
  117. procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW")
  118. procHeapAlloc = modkernel32.NewProc("HeapAlloc")
  119. procHeapFree = modkernel32.NewProc("HeapFree")
  120. procInitializeCriticalSection = modkernel32.NewProc("InitializeCriticalSection")
  121. procLeaveCriticalSection = modkernel32.NewProc("LeaveCriticalSection")
  122. procLockFile = modkernel32.NewProc("LockFile")
  123. procLockFileEx = modkernel32.NewProc("LockFileEx")
  124. procLstrlenW = modkernel32.NewProc("lstrlenW")
  125. procMapViewOfFile = modkernel32.NewProc("MapViewOfFile")
  126. procMoveFileW = modkernel32.NewProc("MoveFileW")
  127. procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar")
  128. procOpenEventA = modkernel32.NewProc("OpenEventA")
  129. procPeekConsoleInputW = modkernel32.NewProc("PeekConsoleInputW")
  130. procPeekNamedPipe = modkernel32.NewProc("PeekNamedPipe")
  131. procQueryPerformanceCounter = modkernel32.NewProc("QueryPerformanceCounter")
  132. procQueryPerformanceFrequency = modkernel32.NewProc("QueryPerformanceFrequency")
  133. procReadConsoleW = modkernel32.NewProc("ReadConsoleW")
  134. procReadFile = modkernel32.NewProc("ReadFile")
  135. procResetEvent = modkernel32.NewProc("ResetEvent")
  136. procSearchPathW = modkernel32.NewProc("SearchPathW")
  137. procSetConsoleCtrlHandler = modkernel32.NewProc("SetConsoleCtrlHandler")
  138. procSetConsoleMode = modkernel32.NewProc("SetConsoleMode")
  139. procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
  140. procSetEvent = modkernel32.NewProc("SetEvent")
  141. procSetFilePointer = modkernel32.NewProc("SetFilePointer")
  142. procSleepEx = modkernel32.NewProc("SleepEx")
  143. procSystemTimeToFileTime = modkernel32.NewProc("SystemTimeToFileTime")
  144. procTerminateThread = modkernel32.NewProc("TerminateThread")
  145. procUnlockFile = modkernel32.NewProc("UnlockFile")
  146. procUnlockFileEx = modkernel32.NewProc("UnlockFileEx")
  147. procWaitForSingleObjectEx = modkernel32.NewProc("WaitForSingleObjectEx")
  148. procWideCharToMultiByte = modkernel32.NewProc("WideCharToMultiByte")
  149. procWriteConsoleA = modkernel32.NewProc("WriteConsoleA")
  150. procWriteConsoleW = modkernel32.NewProc("WriteConsoleW")
  151. procWriteFile = modkernel32.NewProc("WriteFile")
  152. // procSetConsoleCP = modkernel32.NewProc("SetConsoleCP")
  153. // procSetThreadPriority = modkernel32.NewProc("SetThreadPriority")
  154. //--
  155. modadvapi = syscall.NewLazyDLL("advapi32.dll")
  156. //--
  157. procAccessCheck = modadvapi.NewProc("AccessCheck")
  158. procGetAclInformation = modadvapi.NewProc("GetAclInformation")
  159. procGetFileSecurityA = modadvapi.NewProc("GetFileSecurityA")
  160. procGetFileSecurityW = modadvapi.NewProc("GetFileSecurityW")
  161. procGetSecurityDescriptorDacl = modadvapi.NewProc("GetSecurityDescriptorDacl")
  162. procGetSecurityDescriptorOwner = modadvapi.NewProc("GetSecurityDescriptorOwner")
  163. procGetSidIdentifierAuthority = modadvapi.NewProc("GetSidIdentifierAuthority")
  164. procGetSidLengthRequired = modadvapi.NewProc("GetSidLengthRequired")
  165. procGetSidSubAuthority = modadvapi.NewProc("GetSidSubAuthority")
  166. procImpersonateSelf = modadvapi.NewProc("ImpersonateSelf")
  167. procInitializeSid = modadvapi.NewProc("InitializeSid")
  168. procOpenThreadToken = modadvapi.NewProc("OpenThreadToken")
  169. procRevertToSelf = modadvapi.NewProc("RevertToSelf")
  170. //--
  171. modws2_32 = syscall.NewLazyDLL("ws2_32.dll")
  172. //--
  173. procWSAStartup = modws2_32.NewProc("WSAStartup")
  174. //--
  175. moduser32 = syscall.NewLazyDLL("user32.dll")
  176. //--
  177. procCreateWindowExW = moduser32.NewProc("CreateWindowExW")
  178. procMsgWaitForMultipleObjectsEx = moduser32.NewProc("MsgWaitForMultipleObjectsEx")
  179. procPeekMessageW = moduser32.NewProc("PeekMessageW")
  180. procRegisterClassW = moduser32.NewProc("RegisterClassW")
  181. procUnregisterClassW = moduser32.NewProc("UnregisterClassW")
  182. procWaitForInputIdle = moduser32.NewProc("WaitForInputIdle")
  183. //--
  184. netapi = syscall.NewLazyDLL("netapi32.dll")
  185. procNetGetDCName = netapi.NewProc("NetGetDCName")
  186. procNetUserGetInfo = netapi.NewProc("NetUserGetInfo")
  187. userenvapi = syscall.NewLazyDLL("userenv.dll")
  188. procGetProfilesDirectoryW = userenvapi.NewProc("GetProfilesDirectoryW")
  189. )
  190. var (
  191. threadCallback uintptr
  192. )
  193. func init() {
  194. isWindows = true
  195. threadCallback = syscall.NewCallback(ThreadProc)
  196. }
  197. // ---------------------------------
  198. // Windows filehandle-to-fd mapping
  199. // so the lib-c interface contract looks
  200. // like normal fds being passed around
  201. // but we're mapping them back and forth to
  202. // native windows file handles (syscall.Handle)
  203. //
  204. var EBADF = errors.New("EBADF")
  205. var w_nextFd int32 = 42
  206. var w_fdLock sync.Mutex
  207. var w_fd_to_file = map[int32]*file{}
  208. type file struct {
  209. _fd int32
  210. hadErr bool
  211. t uintptr
  212. syscall.Handle
  213. }
  214. func addFile(hdl syscall.Handle, fd int32) uintptr {
  215. var f = file{_fd: fd, Handle: hdl}
  216. w_fdLock.Lock()
  217. defer w_fdLock.Unlock()
  218. w_fd_to_file[fd] = &f
  219. f.t = addObject(&f)
  220. return f.t
  221. }
  222. func remFile(f *file) {
  223. removeObject(f.t)
  224. w_fdLock.Lock()
  225. defer w_fdLock.Unlock()
  226. delete(w_fd_to_file, f._fd)
  227. }
  228. func fdToFile(fd int32) (*file, bool) {
  229. w_fdLock.Lock()
  230. defer w_fdLock.Unlock()
  231. f, ok := w_fd_to_file[fd]
  232. return f, ok
  233. }
  234. // Wrap the windows handle up tied to a unique fd
  235. func wrapFdHandle(hdl syscall.Handle) (uintptr, int32) {
  236. newFd := atomic.AddInt32(&w_nextFd, 1)
  237. return addFile(hdl, newFd), newFd
  238. }
  239. func (f *file) err() bool {
  240. return f.hadErr
  241. }
  242. func (f *file) setErr() {
  243. f.hadErr = true
  244. }
  245. // -----------------------------------
  246. // On windows we have to fetch these
  247. //
  248. // stdout, stdin, sterr
  249. //
  250. // Using the windows specific GetStdHandle
  251. // they're mapped to the standard fds (0,1,2)
  252. // Note: it's possible they don't exist
  253. // if the app has been built for a GUI only
  254. // target in windows. If that's the case
  255. // panic seems like the only reasonable option
  256. // ------------------------------
  257. func newFile(t *TLS, fd int32) uintptr {
  258. if fd == unistd.STDIN_FILENO {
  259. h, err := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE)
  260. if err != nil {
  261. panic("no console")
  262. }
  263. return addFile(h, fd)
  264. }
  265. if fd == unistd.STDOUT_FILENO {
  266. h, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE)
  267. if err != nil {
  268. panic("no console")
  269. }
  270. return addFile(h, fd)
  271. }
  272. if fd == unistd.STDERR_FILENO {
  273. h, err := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE)
  274. if err != nil {
  275. panic("no console")
  276. }
  277. return addFile(h, fd)
  278. }
  279. // should not get here -- unless newFile
  280. // is being used from somewhere we don't know about
  281. // to originate fds.
  282. panic("unknown fd source")
  283. return 0
  284. }
  285. func (f *file) close(t *TLS) int32 {
  286. remFile(f)
  287. err := syscall.Close(f.Handle)
  288. if err != nil {
  289. return (-1) // EOF
  290. }
  291. return 0
  292. }
  293. func fwrite(fd int32, b []byte) (int, error) {
  294. if fd == unistd.STDOUT_FILENO {
  295. return write(b)
  296. }
  297. f, ok := fdToFile(fd)
  298. if !ok {
  299. return -1, EBADF
  300. }
  301. if dmesgs {
  302. dmesg("%v: fd %v: %s", origin(1), fd, b)
  303. }
  304. return syscall.Write(f.Handle, b)
  305. }
  306. // int fprintf(FILE *stream, const char *format, ...);
  307. func Xfprintf(t *TLS, stream, format, args uintptr) int32 {
  308. f, ok := winGetObject(stream).(*file)
  309. if !ok {
  310. t.setErrno(errno.EBADF)
  311. return -1
  312. }
  313. n, _ := fwrite(f._fd, printf(format, args))
  314. return int32(n)
  315. }
  316. // int usleep(useconds_t usec);
  317. func Xusleep(t *TLS, usec types.Useconds_t) int32 {
  318. gotime.Sleep(gotime.Microsecond * gotime.Duration(usec))
  319. return 0
  320. }
  321. // int getrusage(int who, struct rusage *usage);
  322. func Xgetrusage(t *TLS, who int32, usage uintptr) int32 {
  323. panic(todo(""))
  324. // if _, _, err := unix.Syscall(unix.SYS_GETRUSAGE, uintptr(who), usage, 0); err != 0 {
  325. // t.setErrno(err)
  326. // return -1
  327. // }
  328. // return 0
  329. }
  330. // int lstat(const char *pathname, struct stat *statbuf);
  331. func Xlstat(t *TLS, pathname, statbuf uintptr) int32 {
  332. return Xlstat64(t, pathname, statbuf)
  333. }
  334. // int stat(const char *pathname, struct stat *statbuf);
  335. func Xstat(t *TLS, pathname, statbuf uintptr) int32 {
  336. return Xstat64(t, pathname, statbuf)
  337. }
  338. // int chdir(const char *path);
  339. func Xchdir(t *TLS, path uintptr) int32 {
  340. err := syscall.Chdir(GoString(path))
  341. if err != nil {
  342. t.setErrno(err)
  343. return -1
  344. }
  345. if dmesgs {
  346. dmesg("%v: %q: ok", origin(1), GoString(path))
  347. }
  348. return 0
  349. }
  350. var localtime time.Tm
  351. // struct tm *localtime(const time_t *timep);
  352. func Xlocaltime(_ *TLS, timep uintptr) uintptr {
  353. loc := gotime.Local
  354. if r := getenv(Environ(), "TZ"); r != 0 {
  355. zone, off := parseZone(GoString(r))
  356. loc = gotime.FixedZone(zone, -off)
  357. }
  358. ut := *(*time.Time_t)(unsafe.Pointer(timep))
  359. t := gotime.Unix(int64(ut), 0).In(loc)
  360. localtime.Ftm_sec = int32(t.Second())
  361. localtime.Ftm_min = int32(t.Minute())
  362. localtime.Ftm_hour = int32(t.Hour())
  363. localtime.Ftm_mday = int32(t.Day())
  364. localtime.Ftm_mon = int32(t.Month() - 1)
  365. localtime.Ftm_year = int32(t.Year() - 1900)
  366. localtime.Ftm_wday = int32(t.Weekday())
  367. localtime.Ftm_yday = int32(t.YearDay())
  368. localtime.Ftm_isdst = Bool32(isTimeDST(t))
  369. return uintptr(unsafe.Pointer(&localtime))
  370. }
  371. // struct tm *localtime(const time_t *timep);
  372. func X_localtime64(_ *TLS, timep uintptr) uintptr {
  373. return Xlocaltime(nil, timep)
  374. }
  375. // struct tm *localtime_r(const time_t *timep, struct tm *result);
  376. func Xlocaltime_r(_ *TLS, timep, result uintptr) uintptr {
  377. panic(todo(""))
  378. // loc := gotime.Local
  379. // if r := getenv(Environ(), "TZ"); r != 0 {
  380. // zone, off := parseZone(GoString(r))
  381. // loc = gotime.FixedZone(zone, -off)
  382. // }
  383. // ut := *(*unix.Time_t)(unsafe.Pointer(timep))
  384. // t := gotime.Unix(int64(ut), 0).In(loc)
  385. // (*time.Tm)(unsafe.Pointer(result)).Ftm_sec = int32(t.Second())
  386. // (*time.Tm)(unsafe.Pointer(result)).Ftm_min = int32(t.Minute())
  387. // (*time.Tm)(unsafe.Pointer(result)).Ftm_hour = int32(t.Hour())
  388. // (*time.Tm)(unsafe.Pointer(result)).Ftm_mday = int32(t.Day())
  389. // (*time.Tm)(unsafe.Pointer(result)).Ftm_mon = int32(t.Month() - 1)
  390. // (*time.Tm)(unsafe.Pointer(result)).Ftm_year = int32(t.Year() - 1900)
  391. // (*time.Tm)(unsafe.Pointer(result)).Ftm_wday = int32(t.Weekday())
  392. // (*time.Tm)(unsafe.Pointer(result)).Ftm_yday = int32(t.YearDay())
  393. // (*time.Tm)(unsafe.Pointer(result)).Ftm_isdst = Bool32(isTimeDST(t))
  394. // return result
  395. }
  396. // int _wopen(
  397. //
  398. // const wchar_t *filename,
  399. // int oflag [,
  400. // int pmode]
  401. //
  402. // );
  403. func X_wopen(t *TLS, pathname uintptr, flags int32, args uintptr) int32 {
  404. var mode types.Mode_t
  405. if args != 0 {
  406. mode = *(*types.Mode_t)(unsafe.Pointer(args))
  407. }
  408. s := goWideString(pathname)
  409. h, err := syscall.Open(GoString(pathname), int(flags), uint32(mode))
  410. if err != nil {
  411. if dmesgs {
  412. dmesg("%v: %q %#x: %v", origin(1), s, flags, err)
  413. }
  414. t.setErrno(err)
  415. return 0
  416. }
  417. _, n := wrapFdHandle(h)
  418. if dmesgs {
  419. dmesg("%v: %q flags %#x mode %#o: fd %v", origin(1), s, flags, mode, n)
  420. }
  421. return n
  422. }
  423. // int open(const char *pathname, int flags, ...);
  424. func Xopen(t *TLS, pathname uintptr, flags int32, args uintptr) int32 {
  425. return Xopen64(t, pathname, flags, args)
  426. }
  427. // int open(const char *pathname, int flags, ...);
  428. func Xopen64(t *TLS, pathname uintptr, flags int32, cmode uintptr) int32 {
  429. var mode types.Mode_t
  430. if cmode != 0 {
  431. mode = (types.Mode_t)(VaUint32(&cmode))
  432. }
  433. // fdcwd := fcntl.AT_FDCWD
  434. h, err := syscall.Open(GoString(pathname), int(flags), uint32(mode))
  435. if err != nil {
  436. if dmesgs {
  437. dmesg("%v: %q %#x: %v", origin(1), GoString(pathname), flags, err)
  438. }
  439. t.setErrno(err)
  440. return -1
  441. }
  442. _, n := wrapFdHandle(h)
  443. if dmesgs {
  444. dmesg("%v: %q flags %#x mode %#o: fd %v", origin(1), GoString(pathname), flags, mode, n)
  445. }
  446. return n
  447. }
  448. // off_t lseek(int fd, off_t offset, int whence);
  449. func Xlseek(t *TLS, fd int32, offset types.Off_t, whence int32) types.Off_t {
  450. return types.Off_t(Xlseek64(t, fd, offset, whence))
  451. }
  452. func whenceStr(whence int32) string {
  453. switch whence {
  454. case syscall.FILE_CURRENT:
  455. return "SEEK_CUR"
  456. case syscall.FILE_END:
  457. return "SEEK_END"
  458. case syscall.FILE_BEGIN:
  459. return "SEEK_SET"
  460. default:
  461. return fmt.Sprintf("whence(%d)", whence)
  462. }
  463. }
  464. var fsyncStatbuf stat.Stat
  465. // int fsync(int fd);
  466. func Xfsync(t *TLS, fd int32) int32 {
  467. f, ok := fdToFile(fd)
  468. if !ok {
  469. t.setErrno(errno.EBADF)
  470. return -1
  471. }
  472. err := syscall.FlushFileBuffers(f.Handle)
  473. if err != nil {
  474. t.setErrno(err)
  475. return -1
  476. }
  477. if dmesgs {
  478. dmesg("%v: %d: ok", origin(1), fd)
  479. }
  480. return 0
  481. }
  482. // long sysconf(int name);
  483. func Xsysconf(t *TLS, name int32) long {
  484. panic(todo(""))
  485. // switch name {
  486. // case unistd.X_SC_PAGESIZE:
  487. // return long(unix.Getpagesize())
  488. // }
  489. // panic(todo(""))
  490. }
  491. // int close(int fd);
  492. func Xclose(t *TLS, fd int32) int32 {
  493. f, ok := fdToFile(fd)
  494. if !ok {
  495. t.setErrno(errno.EBADF)
  496. return -1
  497. }
  498. err := syscall.Close(f.Handle)
  499. if err != nil {
  500. t.setErrno(err)
  501. return -1
  502. }
  503. if dmesgs {
  504. dmesg("%v: %d: ok", origin(1), fd)
  505. }
  506. return 0
  507. }
  508. // char *getcwd(char *buf, size_t size);
  509. func Xgetcwd(t *TLS, buf uintptr, size types.Size_t) uintptr {
  510. b := make([]uint16, size)
  511. n, err := syscall.GetCurrentDirectory(uint32(len(b)), &b[0])
  512. if err != nil {
  513. t.setErrno(err)
  514. return 0
  515. }
  516. // to bytes
  517. var wd = []byte(string(utf16.Decode(b[0:n])))
  518. if types.Size_t(len(wd)) > size {
  519. t.setErrno(errno.ERANGE)
  520. return 0
  521. }
  522. copy((*RawMem)(unsafe.Pointer(buf))[:], wd)
  523. (*RawMem)(unsafe.Pointer(buf))[len(wd)] = 0
  524. if dmesgs {
  525. dmesg("%v: %q: ok", origin(1), GoString(buf))
  526. }
  527. return buf
  528. }
  529. // int fstat(int fd, struct stat *statbuf);
  530. func Xfstat(t *TLS, fd int32, statbuf uintptr) int32 {
  531. return Xfstat64(t, fd, statbuf)
  532. }
  533. // int ftruncate(int fd, off_t length);
  534. func Xftruncate(t *TLS, fd int32, length types.Off_t) int32 {
  535. return Xftruncate64(t, fd, length)
  536. }
  537. // int fcntl(int fd, int cmd, ... /* arg */ );
  538. func Xfcntl(t *TLS, fd, cmd int32, args uintptr) int32 {
  539. return Xfcntl64(t, fd, cmd, args)
  540. }
  541. // int _read( // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/read?view=msvc-160
  542. //
  543. // int const fd,
  544. // void * const buffer,
  545. // unsigned const buffer_size
  546. //
  547. // );
  548. func Xread(t *TLS, fd int32, buf uintptr, count uint32) int32 {
  549. f, ok := fdToFile(fd)
  550. if !ok {
  551. t.setErrno(errno.EBADF)
  552. return -1
  553. }
  554. var obuf = ((*RawMem)(unsafe.Pointer(buf)))[:count]
  555. n, err := syscall.Read(f.Handle, obuf)
  556. if err != nil {
  557. t.setErrno(err)
  558. return -1
  559. }
  560. if dmesgs {
  561. // dmesg("%v: %d %#x: %#x\n%s", origin(1), fd, count, n, hex.Dump(GoBytes(buf, int(n))))
  562. dmesg("%v: %d %#x: %#x", origin(1), fd, count, n)
  563. }
  564. return int32(n)
  565. }
  566. // int _write( // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/write?view=msvc-160
  567. //
  568. // int fd,
  569. // const void *buffer,
  570. // unsigned int count
  571. //
  572. // );
  573. func Xwrite(t *TLS, fd int32, buf uintptr, count uint32) int32 {
  574. f, ok := fdToFile(fd)
  575. if !ok {
  576. t.setErrno(errno.EBADF)
  577. return -1
  578. }
  579. var obuf = ((*RawMem)(unsafe.Pointer(buf)))[:count]
  580. n, err := syscall.Write(f.Handle, obuf)
  581. if err != nil {
  582. if dmesgs {
  583. dmesg("%v: fd %v, count %#x: %v", origin(1), fd, count, err)
  584. }
  585. t.setErrno(err)
  586. return -1
  587. }
  588. if dmesgs {
  589. // dmesg("%v: %d %#x: %#x\n%s", origin(1), fd, count, n, hex.Dump(GoBytes(buf, int(n))))
  590. dmesg("%v: %d %#x: %#x", origin(1), fd, count, n)
  591. }
  592. return int32(n)
  593. }
  594. // int fchmod(int fd, mode_t mode);
  595. func Xfchmod(t *TLS, fd int32, mode types.Mode_t) int32 {
  596. panic(todo(""))
  597. // if _, _, err := unix.Syscall(unix.SYS_FCHMOD, uintptr(fd), uintptr(mode), 0); err != 0 {
  598. // t.setErrno(err)
  599. // return -1
  600. // }
  601. // if dmesgs {
  602. // dmesg("%v: %d %#o: ok", origin(1), fd, mode)
  603. // }
  604. // return 0
  605. }
  606. // // int fchown(int fd, uid_t owner, gid_t group);
  607. // func Xfchown(t *TLS, fd int32, owner types.Uid_t, group types.Gid_t) int32 {
  608. // if _, _, err := unix.Syscall(unix.SYS_FCHOWN, uintptr(fd), uintptr(owner), uintptr(group)); err != 0 {
  609. // t.setErrno(err)
  610. // return -1
  611. // }
  612. //
  613. // return 0
  614. // }
  615. // // uid_t geteuid(void);
  616. // func Xgeteuid(t *TLS) types.Uid_t {
  617. // n, _, _ := unix.Syscall(unix.SYS_GETEUID, 0, 0, 0)
  618. // return types.Uid_t(n)
  619. // }
  620. // int munmap(void *addr, size_t length);
  621. func Xmunmap(t *TLS, addr uintptr, length types.Size_t) int32 {
  622. panic(todo(""))
  623. // if _, _, err := unix.Syscall(unix.SYS_MUNMAP, addr, uintptr(length), 0); err != 0 {
  624. // t.setErrno(err)
  625. // return -1
  626. // }
  627. // return 0
  628. }
  629. // int gettimeofday(struct timeval *tv, struct timezone *tz);
  630. func Xgettimeofday(t *TLS, tv, tz uintptr) int32 {
  631. panic(todo(""))
  632. // if tz != 0 {
  633. // panic(todo(""))
  634. // }
  635. // var tvs unix.Timeval
  636. // err := unix.Gettimeofday(&tvs)
  637. // if err != nil {
  638. // t.setErrno(err)
  639. // return -1
  640. // }
  641. // *(*unix.Timeval)(unsafe.Pointer(tv)) = tvs
  642. // return 0
  643. }
  644. // int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
  645. func Xgetsockopt(t *TLS, _ ...interface{}) int32 {
  646. panic(todo(""))
  647. // if _, _, err := unix.Syscall6(unix.SYS_GETSOCKOPT, uintptr(sockfd), uintptr(level), uintptr(optname), optval, optlen, 0); err != 0 {
  648. // t.setErrno(err)
  649. // return -1
  650. // }
  651. // return 0
  652. }
  653. // // int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
  654. func Xsetsockopt(t *TLS, _ ...interface{}) int32 {
  655. panic(todo(""))
  656. }
  657. // int ioctl(int fd, unsigned long request, ...);
  658. func Xioctl(t *TLS, fd int32, request ulong, va uintptr) int32 {
  659. panic(todo(""))
  660. // var argp uintptr
  661. // if va != 0 {
  662. // argp = VaUintptr(&va)
  663. // }
  664. // n, _, err := unix.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(request), argp)
  665. // if err != 0 {
  666. // t.setErrno(err)
  667. // return -1
  668. // }
  669. // return int32(n)
  670. }
  671. // int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
  672. func Xselect(t *TLS, nfds int32, readfds, writefds, exceptfds, timeout uintptr) int32 {
  673. panic(todo(""))
  674. // n, err := unix.Select(
  675. // int(nfds),
  676. // (*unix.FdSet)(unsafe.Pointer(readfds)),
  677. // (*unix.FdSet)(unsafe.Pointer(writefds)),
  678. // (*unix.FdSet)(unsafe.Pointer(exceptfds)),
  679. // (*unix.Timeval)(unsafe.Pointer(timeout)),
  680. // )
  681. // if err != nil {
  682. // t.setErrno(err)
  683. // return -1
  684. // }
  685. // return int32(n)
  686. }
  687. // int mkfifo(const char *pathname, mode_t mode);
  688. func Xmkfifo(t *TLS, pathname uintptr, mode types.Mode_t) int32 {
  689. panic(todo(""))
  690. // if err := unix.Mkfifo(GoString(pathname), mode); err != nil {
  691. // t.setErrno(err)
  692. // return -1
  693. // }
  694. //
  695. // return 0
  696. }
  697. // mode_t umask(mode_t mask);
  698. func Xumask(t *TLS, mask types.Mode_t) types.Mode_t {
  699. panic(todo(""))
  700. // n, _, _ := unix.Syscall(unix.SYS_UMASK, uintptr(mask), 0, 0)
  701. // return types.Mode_t(n)
  702. }
  703. // int execvp(const char *file, char *const argv[]);
  704. func Xexecvp(t *TLS, file, argv uintptr) int32 {
  705. panic(todo(""))
  706. // if _, _, err := unix.Syscall(unix.SYS_EXECVE, file, argv, Environ()); err != 0 {
  707. // t.setErrno(err)
  708. // return -1
  709. // }
  710. //
  711. // return 0
  712. }
  713. // pid_t waitpid(pid_t pid, int *wstatus, int options);
  714. func Xwaitpid(t *TLS, pid types.Pid_t, wstatus uintptr, optname int32) types.Pid_t {
  715. panic(todo(""))
  716. // n, _, err := unix.Syscall6(unix.SYS_WAIT4, uintptr(pid), wstatus, uintptr(optname), 0, 0, 0)
  717. // if err != 0 {
  718. // t.setErrno(err)
  719. // return -1
  720. // }
  721. //
  722. // return types.Pid_t(n)
  723. }
  724. // int uname(struct utsname *buf);
  725. func Xuname(t *TLS, buf uintptr) int32 {
  726. panic(todo(""))
  727. // if _, _, err := unix.Syscall(unix.SYS_UNAME, buf, 0, 0); err != 0 {
  728. // t.setErrno(err)
  729. // return -1
  730. // }
  731. //
  732. // return 0
  733. }
  734. // int getrlimit(int resource, struct rlimit *rlim);
  735. func Xgetrlimit(t *TLS, resource int32, rlim uintptr) int32 {
  736. return Xgetrlimit64(t, resource, rlim)
  737. }
  738. // int setrlimit(int resource, const struct rlimit *rlim);
  739. func Xsetrlimit(t *TLS, resource int32, rlim uintptr) int32 {
  740. return Xsetrlimit64(t, resource, rlim)
  741. }
  742. // int setrlimit(int resource, const struct rlimit *rlim);
  743. func Xsetrlimit64(t *TLS, resource int32, rlim uintptr) int32 {
  744. panic(todo(""))
  745. // if _, _, err := unix.Syscall(unix.SYS_SETRLIMIT, uintptr(resource), uintptr(rlim), 0); err != 0 {
  746. // t.setErrno(err)
  747. // return -1
  748. // }
  749. //
  750. // return 0
  751. }
  752. // // uid_t getuid(void);
  753. // func Xgetuid(t *TLS) types.Uid_t {
  754. // return types.Uid_t(os.Getuid())
  755. // }
  756. // pid_t getpid(void);
  757. func Xgetpid(t *TLS) int32 {
  758. return int32(os.Getpid())
  759. }
  760. // int system(const char *command);
  761. func Xsystem(t *TLS, command uintptr) int32 {
  762. s := GoString(command)
  763. if command == 0 {
  764. panic(todo(""))
  765. }
  766. cmd := exec.Command("sh", "-c", s)
  767. cmd.Stdout = os.Stdout
  768. cmd.Stderr = os.Stderr
  769. err := cmd.Run()
  770. if err != nil {
  771. ps := err.(*exec.ExitError)
  772. return int32(ps.ExitCode())
  773. }
  774. return 0
  775. }
  776. // var staticGetpwuid pwd.Passwd
  777. //
  778. // func init() {
  779. // atExit = append(atExit, func() { closePasswd(&staticGetpwuid) })
  780. // }
  781. //
  782. // func closePasswd(p *pwd.Passwd) {
  783. // Xfree(nil, p.Fpw_name)
  784. // Xfree(nil, p.Fpw_passwd)
  785. // Xfree(nil, p.Fpw_gecos)
  786. // Xfree(nil, p.Fpw_dir)
  787. // Xfree(nil, p.Fpw_shell)
  788. // *p = pwd.Passwd{}
  789. // }
  790. // struct passwd *getpwuid(uid_t uid);
  791. func Xgetpwuid(t *TLS, uid uint32) uintptr {
  792. panic(todo(""))
  793. // f, err := os.Open("/etc/passwd")
  794. // if err != nil {
  795. // panic(todo("", err))
  796. // }
  797. //
  798. // defer f.Close()
  799. //
  800. // sid := strconv.Itoa(int(uid))
  801. // sc := bufio.NewScanner(f)
  802. // for sc.Scan() {
  803. // // eg. "root:x:0:0:root:/root:/bin/bash"
  804. // a := strings.Split(sc.Text(), ":")
  805. // if len(a) < 7 {
  806. // panic(todo(""))
  807. // }
  808. //
  809. // if a[2] == sid {
  810. // uid, err := strconv.Atoi(a[2])
  811. // if err != nil {
  812. // panic(todo(""))
  813. // }
  814. //
  815. // gid, err := strconv.Atoi(a[3])
  816. // if err != nil {
  817. // panic(todo(""))
  818. // }
  819. //
  820. // closePasswd(&staticGetpwuid)
  821. // gecos := a[4]
  822. // if strings.Contains(gecos, ",") {
  823. // a := strings.Split(gecos, ",")
  824. // gecos = a[0]
  825. // }
  826. // initPasswd(t, &staticGetpwuid, a[0], a[1], uint32(uid), uint32(gid), gecos, a[5], a[6])
  827. // return uintptr(unsafe.Pointer(&staticGetpwuid))
  828. // }
  829. // }
  830. //
  831. // if sc.Err() != nil {
  832. // panic(todo(""))
  833. // }
  834. //
  835. // return 0
  836. }
  837. // func initPasswd(t *TLS, p *pwd.Passwd, name, pwd string, uid, gid uint32, gecos, dir, shell string) {
  838. // p.Fpw_name = cString(t, name)
  839. // p.Fpw_passwd = cString(t, pwd)
  840. // p.Fpw_uid = uid
  841. // p.Fpw_gid = gid
  842. // p.Fpw_gecos = cString(t, gecos)
  843. // p.Fpw_dir = cString(t, dir)
  844. // p.Fpw_shell = cString(t, shell)
  845. // }
  846. // int setvbuf(FILE *stream, char *buf, int mode, size_t size);
  847. func Xsetvbuf(t *TLS, stream, buf uintptr, mode int32, size types.Size_t) int32 {
  848. return 0 //TODO
  849. }
  850. // int raise(int sig);
  851. func Xraise(t *TLS, sig int32) int32 {
  852. panic(todo(""))
  853. }
  854. // int backtrace(void **buffer, int size);
  855. func Xbacktrace(t *TLS, buf uintptr, size int32) int32 {
  856. panic(todo(""))
  857. }
  858. // void backtrace_symbols_fd(void *const *buffer, int size, int fd);
  859. func Xbacktrace_symbols_fd(t *TLS, buffer uintptr, size, fd int32) {
  860. panic(todo(""))
  861. }
  862. // int fileno(FILE *stream);
  863. func Xfileno(t *TLS, stream uintptr) int32 {
  864. if stream == 0 {
  865. t.setErrno(errno.EBADF)
  866. return -1
  867. }
  868. f, ok := winGetObject(stream).(*file)
  869. if !ok {
  870. t.setErrno(errno.EBADF)
  871. return -1
  872. }
  873. return f._fd
  874. }
  875. // var staticGetpwnam pwd.Passwd
  876. //
  877. // func init() {
  878. // atExit = append(atExit, func() { closePasswd(&staticGetpwnam) })
  879. // }
  880. //
  881. // // struct passwd *getpwnam(const char *name);
  882. // func Xgetpwnam(t *TLS, name uintptr) uintptr {
  883. // f, err := os.Open("/etc/passwd")
  884. // if err != nil {
  885. // panic(todo("", err))
  886. // }
  887. //
  888. // defer f.Close()
  889. //
  890. // sname := GoString(name)
  891. // sc := bufio.NewScanner(f)
  892. // for sc.Scan() {
  893. // // eg. "root:x:0:0:root:/root:/bin/bash"
  894. // a := strings.Split(sc.Text(), ":")
  895. // if len(a) < 7 {
  896. // panic(todo(""))
  897. // }
  898. //
  899. // if a[0] == sname {
  900. // uid, err := strconv.Atoi(a[2])
  901. // if err != nil {
  902. // panic(todo(""))
  903. // }
  904. //
  905. // gid, err := strconv.Atoi(a[3])
  906. // if err != nil {
  907. // panic(todo(""))
  908. // }
  909. //
  910. // closePasswd(&staticGetpwnam)
  911. // gecos := a[4]
  912. // if strings.Contains(gecos, ",") {
  913. // a := strings.Split(gecos, ",")
  914. // gecos = a[0]
  915. // }
  916. // initPasswd(t, &staticGetpwnam, a[0], a[1], uint32(uid), uint32(gid), gecos, a[5], a[6])
  917. // return uintptr(unsafe.Pointer(&staticGetpwnam))
  918. // }
  919. // }
  920. //
  921. // if sc.Err() != nil {
  922. // panic(todo(""))
  923. // }
  924. //
  925. // return 0
  926. // }
  927. //
  928. // var staticGetgrnam grp.Group
  929. //
  930. // func init() {
  931. // atExit = append(atExit, func() { closeGroup(&staticGetgrnam) })
  932. // }
  933. //
  934. // // struct group *getgrnam(const char *name);
  935. // func Xgetgrnam(t *TLS, name uintptr) uintptr {
  936. // f, err := os.Open("/etc/group")
  937. // if err != nil {
  938. // panic(todo(""))
  939. // }
  940. //
  941. // defer f.Close()
  942. //
  943. // sname := GoString(name)
  944. // sc := bufio.NewScanner(f)
  945. // for sc.Scan() {
  946. // // eg. "root:x:0:"
  947. // a := strings.Split(sc.Text(), ":")
  948. // if len(a) < 4 {
  949. // panic(todo(""))
  950. // }
  951. //
  952. // if a[0] == sname {
  953. // closeGroup(&staticGetgrnam)
  954. // gid, err := strconv.Atoi(a[2])
  955. // if err != nil {
  956. // panic(todo(""))
  957. // }
  958. //
  959. // var names []string
  960. // if a[3] != "" {
  961. // names = strings.Split(a[3], ",")
  962. // }
  963. // initGroup(t, &staticGetgrnam, a[0], a[1], uint32(gid), names)
  964. // return uintptr(unsafe.Pointer(&staticGetgrnam))
  965. // }
  966. // }
  967. //
  968. // if sc.Err() != nil {
  969. // panic(todo(""))
  970. // }
  971. //
  972. // return 0
  973. // }
  974. //
  975. // func closeGroup(p *grp.Group) {
  976. // Xfree(nil, p.Fgr_name)
  977. // Xfree(nil, p.Fgr_passwd)
  978. // if p.Fgr_mem != 0 {
  979. // panic(todo(""))
  980. // }
  981. //
  982. // *p = grp.Group{}
  983. // }
  984. //
  985. // func initGroup(t *TLS, p *grp.Group, name, pwd string, gid uint32, names []string) {
  986. // p.Fgr_name = cString(t, name)
  987. // p.Fgr_passwd = cString(t, pwd)
  988. // p.Fgr_gid = gid
  989. // p.Fgr_mem = 0
  990. // if len(names) != 0 {
  991. // panic(todo("%q %q %v %q %v", name, pwd, gid, names, len(names)))
  992. // }
  993. // }
  994. //
  995. // func init() {
  996. // atExit = append(atExit, func() { closeGroup(&staticGetgrgid) })
  997. // }
  998. //
  999. // var staticGetgrgid grp.Group
  1000. //
  1001. // // struct group *getgrgid(gid_t gid);
  1002. // func Xgetgrgid(t *TLS, gid uint32) uintptr {
  1003. // f, err := os.Open("/etc/group")
  1004. // if err != nil {
  1005. // panic(todo(""))
  1006. // }
  1007. //
  1008. // defer f.Close()
  1009. //
  1010. // sid := strconv.Itoa(int(gid))
  1011. // sc := bufio.NewScanner(f)
  1012. // for sc.Scan() {
  1013. // // eg. "root:x:0:"
  1014. // a := strings.Split(sc.Text(), ":")
  1015. // if len(a) < 4 {
  1016. // panic(todo(""))
  1017. // }
  1018. //
  1019. // if a[2] == sid {
  1020. // closeGroup(&staticGetgrgid)
  1021. // var names []string
  1022. // if a[3] != "" {
  1023. // names = strings.Split(a[3], ",")
  1024. // }
  1025. // initGroup(t, &staticGetgrgid, a[0], a[1], gid, names)
  1026. // return uintptr(unsafe.Pointer(&staticGetgrgid))
  1027. // }
  1028. // }
  1029. //
  1030. // if sc.Err() != nil {
  1031. // panic(todo(""))
  1032. // }
  1033. //
  1034. // return 0
  1035. // }
  1036. // int mkstemps(char *template, int suffixlen);
  1037. func Xmkstemps(t *TLS, template uintptr, suffixlen int32) int32 {
  1038. return Xmkstemps64(t, template, suffixlen)
  1039. }
  1040. // int mkstemps(char *template, int suffixlen);
  1041. func Xmkstemps64(t *TLS, template uintptr, suffixlen int32) int32 {
  1042. panic(todo(""))
  1043. // len := uintptr(Xstrlen(t, template))
  1044. // x := template + uintptr(len-6) - uintptr(suffixlen)
  1045. // for i := uintptr(0); i < 6; i++ {
  1046. // if *(*byte)(unsafe.Pointer(x + i)) != 'X' {
  1047. // t.setErrno(errno.EINVAL)
  1048. // return -1
  1049. // }
  1050. // }
  1051. //
  1052. // fd, err := tempFile(template, x)
  1053. // if err != 0 {
  1054. // t.setErrno(err)
  1055. // return -1
  1056. // }
  1057. //
  1058. // return int32(fd)
  1059. }
  1060. // int mkstemp(char *template);
  1061. func Xmkstemp64(t *TLS, template uintptr) int32 {
  1062. return Xmkstemps64(t, template, 0)
  1063. }
  1064. // func newFtsent(t *TLS, info int, path string, stat *unix.Stat_t, err syscall.Errno) (r *fts.FTSENT) {
  1065. // var statp uintptr
  1066. // if stat != nil {
  1067. // statp = Xmalloc(t, types.Size_t(unsafe.Sizeof(unix.Stat_t{})))
  1068. // if statp == 0 {
  1069. // panic("OOM")
  1070. // }
  1071. //
  1072. // *(*unix.Stat_t)(unsafe.Pointer(statp)) = *stat
  1073. // }
  1074. // csp := CString(path)
  1075. // if csp == 0 {
  1076. // panic("OOM")
  1077. // }
  1078. //
  1079. // return &fts.FTSENT{
  1080. // Ffts_info: uint16(info),
  1081. // Ffts_path: csp,
  1082. // Ffts_pathlen: uint16(len(path)),
  1083. // Ffts_statp: statp,
  1084. // Ffts_errno: int32(err),
  1085. // }
  1086. // }
  1087. //
  1088. // func newCFtsent(t *TLS, info int, path string, stat *unix.Stat_t, err syscall.Errno) uintptr {
  1089. // p := Xcalloc(t, types.Size_t(unsafe.Sizeof(fts.FTSENT{})))
  1090. // if p == 0 {
  1091. // panic("OOM")
  1092. // }
  1093. //
  1094. // *(*fts.FTSENT)(unsafe.Pointer(p)) = *newFtsent(t, info, path, stat, err)
  1095. // return p
  1096. // }
  1097. //
  1098. // func ftsentClose(t *TLS, p uintptr) {
  1099. // Xfree(t, (*fts.FTSENT)(unsafe.Pointer(p)).Ffts_path)
  1100. // Xfree(t, (*fts.FTSENT)(unsafe.Pointer(p)).Ffts_statp)
  1101. // }
  1102. type ftstream struct {
  1103. s []uintptr
  1104. x int
  1105. }
  1106. // func (f *ftstream) close(t *TLS) {
  1107. // for _, p := range f.s {
  1108. // ftsentClose(t, p)
  1109. // Xfree(t, p)
  1110. // }
  1111. // *f = ftstream{}
  1112. // }
  1113. //
  1114. // // FTS *fts_open(char * const *path_argv, int options, int (*compar)(const FTSENT **, const FTSENT **));
  1115. // func Xfts_open(t *TLS, path_argv uintptr, options int32, compar uintptr) uintptr {
  1116. // return Xfts64_open(t, path_argv, options, compar)
  1117. // }
  1118. // FTS *fts_open(char * const *path_argv, int options, int (*compar)(const FTSENT **, const FTSENT **));
  1119. func Xfts64_open(t *TLS, path_argv uintptr, options int32, compar uintptr) uintptr {
  1120. panic(todo(""))
  1121. // f := &ftstream{}
  1122. //
  1123. // var walk func(string)
  1124. // walk = func(path string) {
  1125. // var fi os.FileInfo
  1126. // var err error
  1127. // switch {
  1128. // case options&fts.FTS_LOGICAL != 0:
  1129. // fi, err = os.Stat(path)
  1130. // case options&fts.FTS_PHYSICAL != 0:
  1131. // fi, err = os.Lstat(path)
  1132. // default:
  1133. // panic(todo(""))
  1134. // }
  1135. //
  1136. // if err != nil {
  1137. // panic(todo(""))
  1138. // }
  1139. //
  1140. // var statp *unix.Stat_t
  1141. // if options&fts.FTS_NOSTAT == 0 {
  1142. // var stat unix.Stat_t
  1143. // switch {
  1144. // case options&fts.FTS_LOGICAL != 0:
  1145. // if err := unix.Stat(path, &stat); err != nil {
  1146. // panic(todo(""))
  1147. // }
  1148. // case options&fts.FTS_PHYSICAL != 0:
  1149. // if err := unix.Lstat(path, &stat); err != nil {
  1150. // panic(todo(""))
  1151. // }
  1152. // default:
  1153. // panic(todo(""))
  1154. // }
  1155. //
  1156. // statp = &stat
  1157. // }
  1158. //
  1159. // out:
  1160. // switch {
  1161. // case fi.IsDir():
  1162. // f.s = append(f.s, newCFtsent(t, fts.FTS_D, path, statp, 0))
  1163. // g, err := os.Open(path)
  1164. // switch x := err.(type) {
  1165. // case nil:
  1166. // // ok
  1167. // case *os.PathError:
  1168. // f.s = append(f.s, newCFtsent(t, fts.FTS_DNR, path, statp, errno.EACCES))
  1169. // break out
  1170. // default:
  1171. // panic(todo("%q: %v %T", path, x, x))
  1172. // }
  1173. //
  1174. // names, err := g.Readdirnames(-1)
  1175. // g.Close()
  1176. // if err != nil {
  1177. // panic(todo(""))
  1178. // }
  1179. //
  1180. // for _, name := range names {
  1181. // walk(path + "/" + name)
  1182. // if f == nil {
  1183. // break out
  1184. // }
  1185. // }
  1186. //
  1187. // f.s = append(f.s, newCFtsent(t, fts.FTS_DP, path, statp, 0))
  1188. // default:
  1189. // info := fts.FTS_F
  1190. // if fi.Mode()&os.ModeSymlink != 0 {
  1191. // info = fts.FTS_SL
  1192. // }
  1193. // switch {
  1194. // case statp != nil:
  1195. // f.s = append(f.s, newCFtsent(t, info, path, statp, 0))
  1196. // case options&fts.FTS_NOSTAT != 0:
  1197. // f.s = append(f.s, newCFtsent(t, fts.FTS_NSOK, path, nil, 0))
  1198. // default:
  1199. // panic(todo(""))
  1200. // }
  1201. // }
  1202. // }
  1203. //
  1204. // for {
  1205. // p := *(*uintptr)(unsafe.Pointer(path_argv))
  1206. // if p == 0 {
  1207. // if f == nil {
  1208. // return 0
  1209. // }
  1210. //
  1211. // if compar != 0 {
  1212. // panic(todo(""))
  1213. // }
  1214. //
  1215. // return addObject(f)
  1216. // }
  1217. //
  1218. // walk(GoString(p))
  1219. // path_argv += unsafe.Sizeof(uintptr(0))
  1220. // }
  1221. }
  1222. // FTSENT *fts_read(FTS *ftsp);
  1223. func Xfts_read(t *TLS, ftsp uintptr) uintptr {
  1224. return Xfts64_read(t, ftsp)
  1225. }
  1226. // FTSENT *fts_read(FTS *ftsp);
  1227. func Xfts64_read(t *TLS, ftsp uintptr) uintptr {
  1228. panic(todo(""))
  1229. // f := winGetObject(ftsp).(*ftstream)
  1230. // if f.x == len(f.s) {
  1231. // t.setErrno(0)
  1232. // return 0
  1233. // }
  1234. //
  1235. // r := f.s[f.x]
  1236. // if e := (*fts.FTSENT)(unsafe.Pointer(r)).Ffts_errno; e != 0 {
  1237. // t.setErrno(e)
  1238. // }
  1239. // f.x++
  1240. // return r
  1241. }
  1242. // int fts_close(FTS *ftsp);
  1243. func Xfts_close(t *TLS, ftsp uintptr) int32 {
  1244. return Xfts64_close(t, ftsp)
  1245. }
  1246. // int fts_close(FTS *ftsp);
  1247. func Xfts64_close(t *TLS, ftsp uintptr) int32 {
  1248. panic(todo(""))
  1249. // winGetObject(ftsp).(*ftstream).close(t)
  1250. // removeObject(ftsp)
  1251. // return 0
  1252. }
  1253. // void tzset (void);
  1254. func Xtzset(t *TLS) {
  1255. //TODO
  1256. }
  1257. var strerrorBuf [256]byte
  1258. // char *strerror(int errnum);
  1259. func Xstrerror(t *TLS, errnum int32) uintptr {
  1260. copy((*RawMem)(unsafe.Pointer(&strerrorBuf[0]))[:len(strerrorBuf):len(strerrorBuf)], fmt.Sprintf("errno %d\x00", errnum))
  1261. return uintptr(unsafe.Pointer(&strerrorBuf[0]))
  1262. }
  1263. // void *dlopen(const char *filename, int flags);
  1264. func Xdlopen(t *TLS, filename uintptr, flags int32) uintptr {
  1265. panic(todo(""))
  1266. }
  1267. // char *dlerror(void);
  1268. func Xdlerror(t *TLS) uintptr {
  1269. panic(todo(""))
  1270. }
  1271. // int dlclose(void *handle);
  1272. func Xdlclose(t *TLS, handle uintptr) int32 {
  1273. panic(todo(""))
  1274. }
  1275. // void *dlsym(void *handle, const char *symbol);
  1276. func Xdlsym(t *TLS, handle, symbol uintptr) uintptr {
  1277. panic(todo(""))
  1278. }
  1279. // void perror(const char *s);
  1280. func Xperror(t *TLS, s uintptr) {
  1281. panic(todo(""))
  1282. }
  1283. // int pclose(FILE *stream);
  1284. func Xpclose(t *TLS, stream uintptr) int32 {
  1285. panic(todo(""))
  1286. }
  1287. var gai_strerrorBuf [100]byte
  1288. // const char *gai_strerror(int errcode);
  1289. func Xgai_strerror(t *TLS, errcode int32) uintptr {
  1290. copy(gai_strerrorBuf[:], fmt.Sprintf("gai error %d\x00", errcode))
  1291. return uintptr(unsafe.Pointer(&gai_strerrorBuf))
  1292. }
  1293. // int tcgetattr(int fd, struct termios *termios_p);
  1294. func Xtcgetattr(t *TLS, fd int32, termios_p uintptr) int32 {
  1295. panic(todo(""))
  1296. }
  1297. // int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
  1298. func Xtcsetattr(t *TLS, fd, optional_actions int32, termios_p uintptr) int32 {
  1299. panic(todo(""))
  1300. }
  1301. // // speed_t cfgetospeed(const struct termios *termios_p);
  1302. // func Xcfgetospeed(t *TLS, termios_p uintptr) termios.Speed_t {
  1303. // panic(todo(""))
  1304. // }
  1305. // int cfsetospeed(struct termios *termios_p, speed_t speed);
  1306. func Xcfsetospeed(t *TLS, termios_p uintptr, speed uint32) int32 {
  1307. panic(todo(""))
  1308. }
  1309. // int cfsetispeed(struct termios *termios_p, speed_t speed);
  1310. func Xcfsetispeed(t *TLS, termios_p uintptr, speed uint32) int32 {
  1311. panic(todo(""))
  1312. }
  1313. // pid_t fork(void);
  1314. func Xfork(t *TLS) int32 {
  1315. t.setErrno(errno.ENOSYS)
  1316. return -1
  1317. }
  1318. // char *setlocale(int category, const char *locale);
  1319. func Xsetlocale(t *TLS, category int32, locale uintptr) uintptr {
  1320. return 0 //TODO
  1321. }
  1322. // // char *nl_langinfo(nl_item item);
  1323. // func Xnl_langinfo(t *TLS, item langinfo.Nl_item) uintptr {
  1324. // panic(todo(""))
  1325. // }
  1326. // FILE *popen(const char *command, const char *type);
  1327. func Xpopen(t *TLS, command, type1 uintptr) uintptr {
  1328. panic(todo(""))
  1329. }
  1330. // char *realpath(const char *path, char *resolved_path);
  1331. func Xrealpath(t *TLS, path, resolved_path uintptr) uintptr {
  1332. s, err := filepath.EvalSymlinks(GoString(path))
  1333. if err != nil {
  1334. if os.IsNotExist(err) {
  1335. if dmesgs {
  1336. dmesg("%v: %q: %v", origin(1), GoString(path), err)
  1337. }
  1338. t.setErrno(errno.ENOENT)
  1339. return 0
  1340. }
  1341. panic(todo("", err))
  1342. }
  1343. if resolved_path == 0 {
  1344. panic(todo(""))
  1345. }
  1346. if len(s) >= limits.PATH_MAX {
  1347. s = s[:limits.PATH_MAX-1]
  1348. }
  1349. copy((*RawMem)(unsafe.Pointer(resolved_path))[:len(s):len(s)], s)
  1350. (*RawMem)(unsafe.Pointer(resolved_path))[len(s)] = 0
  1351. return resolved_path
  1352. }
  1353. // struct tm *gmtime_r(const time_t *timep, struct tm *result);
  1354. func Xgmtime_r(t *TLS, timep, result uintptr) uintptr {
  1355. panic(todo(""))
  1356. }
  1357. // // char *inet_ntoa(struct in_addr in);
  1358. // func Xinet_ntoa(t *TLS, in1 in.In_addr) uintptr {
  1359. // panic(todo(""))
  1360. // }
  1361. // func X__ccgo_in6addr_anyp(t *TLS) uintptr {
  1362. // return uintptr(unsafe.Pointer(&in6_addr_any))
  1363. // }
  1364. func Xabort(t *TLS) {
  1365. panic(todo(""))
  1366. // if dmesgs {
  1367. // dmesg("%v:\n%s", origin(1), debug.Stack())
  1368. // }
  1369. // p := Xmalloc(t, types.Size_t(unsafe.Sizeof(signal.Sigaction{})))
  1370. // if p == 0 {
  1371. // panic("OOM")
  1372. // }
  1373. //
  1374. // *(*signal.Sigaction)(unsafe.Pointer(p)) = signal.Sigaction{
  1375. // F__sigaction_handler: struct{ Fsa_handler signal.X__sighandler_t }{Fsa_handler: signal.SIG_DFL},
  1376. // }
  1377. // Xsigaction(t, signal.SIGABRT, p, 0)
  1378. // Xfree(t, p)
  1379. // unix.Kill(unix.Getpid(), syscall.Signal(signal.SIGABRT))
  1380. // panic(todo("unrechable"))
  1381. }
  1382. // int fflush(FILE *stream);
  1383. func Xfflush(t *TLS, stream uintptr) int32 {
  1384. f, ok := winGetObject(stream).(*file)
  1385. if !ok {
  1386. t.setErrno(errno.EBADF)
  1387. return -1
  1388. }
  1389. err := syscall.FlushFileBuffers(f.Handle)
  1390. if err != nil {
  1391. t.setErrno(err)
  1392. return -1
  1393. }
  1394. return 0
  1395. }
  1396. // size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  1397. func Xfread(t *TLS, ptr uintptr, size, nmemb types.Size_t, stream uintptr) types.Size_t {
  1398. f, ok := winGetObject(stream).(*file)
  1399. if !ok {
  1400. t.setErrno(errno.EBADF)
  1401. return 0
  1402. }
  1403. var sz = size * nmemb
  1404. var obuf = ((*RawMem)(unsafe.Pointer(ptr)))[:sz]
  1405. n, err := syscall.Read(f.Handle, obuf)
  1406. if err != nil {
  1407. f.setErr()
  1408. return 0
  1409. }
  1410. if dmesgs {
  1411. // dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), file(stream).fd(), size, nmemb, types.Size_t(m)/size, hex.Dump(GoBytes(ptr, int(m))))
  1412. dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), f._fd, size, nmemb, types.Size_t(n)/size)
  1413. }
  1414. return types.Size_t(n) / size
  1415. }
  1416. // size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  1417. func Xfwrite(t *TLS, ptr uintptr, size, nmemb types.Size_t, stream uintptr) types.Size_t {
  1418. if ptr == 0 || size == 0 {
  1419. return 0
  1420. }
  1421. f, ok := winGetObject(stream).(*file)
  1422. if !ok {
  1423. t.setErrno(errno.EBADF)
  1424. return 0
  1425. }
  1426. var sz = size * nmemb
  1427. var obuf = ((*RawMem)(unsafe.Pointer(ptr)))[:sz]
  1428. n, err := syscall.Write(f.Handle, obuf)
  1429. if err != nil {
  1430. f.setErr()
  1431. return 0
  1432. }
  1433. if dmesgs {
  1434. // // dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), file(stream).fd(), size, nmemb, types.Size_t(m)/size, hex.Dump(GoBytes(ptr, int(m))))
  1435. dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), f._fd, size, nmemb, types.Size_t(n)/size)
  1436. }
  1437. return types.Size_t(n) / size
  1438. }
  1439. // int fclose(FILE *stream);
  1440. func Xfclose(t *TLS, stream uintptr) int32 {
  1441. f, ok := winGetObject(stream).(*file)
  1442. if !ok {
  1443. t.setErrno(errno.EBADF)
  1444. return -1
  1445. }
  1446. return f.close(t)
  1447. }
  1448. // int fputc(int c, FILE *stream);
  1449. func Xfputc(t *TLS, c int32, stream uintptr) int32 {
  1450. f, ok := winGetObject(stream).(*file)
  1451. if !ok {
  1452. t.setErrno(errno.EBADF)
  1453. return -1
  1454. }
  1455. if _, err := fwrite(f._fd, []byte{byte(c)}); err != nil {
  1456. return -1
  1457. }
  1458. return int32(byte(c))
  1459. }
  1460. // int fseek(FILE *stream, long offset, int whence);
  1461. func Xfseek(t *TLS, stream uintptr, offset long, whence int32) int32 {
  1462. f, ok := winGetObject(stream).(*file)
  1463. if !ok {
  1464. t.setErrno(errno.EBADF)
  1465. return -1
  1466. }
  1467. if n := Xlseek(t, f._fd, types.Off_t(offset), whence); n < 0 {
  1468. if dmesgs {
  1469. dmesg("%v: fd %v, off %#x, whence %v: %v", origin(1), f._fd, offset, whenceStr(whence), n)
  1470. }
  1471. f.setErr()
  1472. return -1
  1473. }
  1474. if dmesgs {
  1475. dmesg("%v: fd %v, off %#x, whence %v: ok", origin(1), f._fd, offset, whenceStr(whence))
  1476. }
  1477. return 0
  1478. }
  1479. // long ftell(FILE *stream);
  1480. func Xftell(t *TLS, stream uintptr) long {
  1481. f, ok := winGetObject(stream).(*file)
  1482. if !ok {
  1483. t.setErrno(errno.EBADF)
  1484. return -1
  1485. }
  1486. n := Xlseek(t, f._fd, 0, syscall.FILE_CURRENT)
  1487. if n < 0 {
  1488. f.setErr()
  1489. return -1
  1490. }
  1491. if dmesgs {
  1492. dmesg("%v: fd %v, n %#x: ok %#x", origin(1), f._fd, n, long(n))
  1493. }
  1494. return long(n)
  1495. }
  1496. // int ferror(FILE *stream);
  1497. func Xferror(t *TLS, stream uintptr) int32 {
  1498. f, ok := winGetObject(stream).(*file)
  1499. if !ok {
  1500. t.setErrno(errno.EBADF)
  1501. return -1
  1502. }
  1503. return Bool32(f.err())
  1504. }
  1505. // int getc(FILE *stream);
  1506. func Xfgetc(t *TLS, stream uintptr) int32 {
  1507. f, ok := winGetObject(stream).(*file)
  1508. if !ok {
  1509. t.setErrno(errno.EBADF)
  1510. return stdio.EOF
  1511. }
  1512. var buf [1]byte
  1513. if n, _ := syscall.Read(f.Handle, buf[:]); n != 0 {
  1514. return int32(buf[0])
  1515. }
  1516. return stdio.EOF
  1517. }
  1518. // int ungetc(int c, FILE *stream);
  1519. func Xungetc(t *TLS, c int32, stream uintptr) int32 {
  1520. panic(todo(""))
  1521. }
  1522. // int fscanf(FILE *stream, const char *format, ...);
  1523. func Xfscanf(t *TLS, stream, format, va uintptr) int32 {
  1524. panic(todo(""))
  1525. }
  1526. // int fputs(const char *s, FILE *stream);
  1527. func Xfputs(t *TLS, s, stream uintptr) int32 {
  1528. f, ok := winGetObject(stream).(*file)
  1529. if !ok {
  1530. t.setErrno(errno.EBADF)
  1531. return -1
  1532. }
  1533. gS := GoString(s)
  1534. if _, err := fwrite(f._fd, []byte(gS)); err != nil {
  1535. return -1
  1536. }
  1537. return 0
  1538. }
  1539. // var getservbynameStaticResult netdb.Servent
  1540. //
  1541. // // struct servent *getservbyname(const char *name, const char *proto);
  1542. // func Xgetservbyname(t *TLS, name, proto uintptr) uintptr {
  1543. // var protoent *gonetdb.Protoent
  1544. // if proto != 0 {
  1545. // protoent = gonetdb.GetProtoByName(GoString(proto))
  1546. // }
  1547. // servent := gonetdb.GetServByName(GoString(name), protoent)
  1548. // if servent == nil {
  1549. // if dmesgs {
  1550. // dmesg("%q %q: nil (protoent %+v)", GoString(name), GoString(proto), protoent)
  1551. // }
  1552. // return 0
  1553. // }
  1554. //
  1555. // Xfree(t, (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_name)
  1556. // if v := (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_aliases; v != 0 {
  1557. // for {
  1558. // p := *(*uintptr)(unsafe.Pointer(v))
  1559. // if p == 0 {
  1560. // break
  1561. // }
  1562. //
  1563. // Xfree(t, p)
  1564. // v += unsafe.Sizeof(uintptr(0))
  1565. // }
  1566. // Xfree(t, v)
  1567. // }
  1568. // Xfree(t, (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_proto)
  1569. // cname, err := CString(servent.Name)
  1570. // if err != nil {
  1571. // getservbynameStaticResult = netdb.Servent{}
  1572. // return 0
  1573. // }
  1574. //
  1575. // var protoname uintptr
  1576. // if protoent != nil {
  1577. // if protoname, err = CString(protoent.Name); err != nil {
  1578. // Xfree(t, cname)
  1579. // getservbynameStaticResult = netdb.Servent{}
  1580. // return 0
  1581. // }
  1582. // }
  1583. // var a []uintptr
  1584. // for _, v := range servent.Aliases {
  1585. // cs, err := CString(v)
  1586. // if err != nil {
  1587. // for _, v := range a {
  1588. // Xfree(t, v)
  1589. // }
  1590. // return 0
  1591. // }
  1592. //
  1593. // a = append(a, cs)
  1594. // }
  1595. // v := Xcalloc(t, types.Size_t(len(a)+1), types.Size_t(unsafe.Sizeof(uintptr(0))))
  1596. // if v == 0 {
  1597. // Xfree(t, cname)
  1598. // Xfree(t, protoname)
  1599. // for _, v := range a {
  1600. // Xfree(t, v)
  1601. // }
  1602. // getservbynameStaticResult = netdb.Servent{}
  1603. // return 0
  1604. // }
  1605. // for _, p := range a {
  1606. // *(*uintptr)(unsafe.Pointer(v)) = p
  1607. // v += unsafe.Sizeof(uintptr(0))
  1608. // }
  1609. //
  1610. // getservbynameStaticResult = netdb.Servent{
  1611. // Fs_name: cname,
  1612. // Fs_aliases: v,
  1613. // Fs_port: int32(servent.Port),
  1614. // Fs_proto: protoname,
  1615. // }
  1616. // return uintptr(unsafe.Pointer(&getservbynameStaticResult))
  1617. // }
  1618. // func Xreaddir64(t *TLS, dir uintptr) uintptr {
  1619. // return Xreaddir(t, dir)
  1620. // }
  1621. // func fcntlCmdStr(cmd int32) string {
  1622. // switch cmd {
  1623. // case fcntl.F_GETOWN:
  1624. // return "F_GETOWN"
  1625. // case fcntl.F_SETLK:
  1626. // return "F_SETLK"
  1627. // case fcntl.F_GETLK:
  1628. // return "F_GETLK"
  1629. // case fcntl.F_SETFD:
  1630. // return "F_SETFD"
  1631. // case fcntl.F_GETFD:
  1632. // return "F_GETFD"
  1633. // default:
  1634. // return fmt.Sprintf("cmd(%d)", cmd)
  1635. // }
  1636. // }
  1637. // _CRTIMP extern int *__cdecl _errno(void); // /usr/share/mingw-w64/include/errno.h:17:
  1638. func X_errno(t *TLS) uintptr {
  1639. return t.errnop
  1640. }
  1641. // int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg);
  1642. func X__ms_vfscanf(t *TLS, stream, format, ap uintptr) int32 {
  1643. panic(todo(""))
  1644. }
  1645. // int vsscanf(const char *str, const char *format, va_list ap);
  1646. func X__ms_vsscanf(t *TLS, str, format, ap uintptr) int32 {
  1647. panic(todo(""))
  1648. }
  1649. // int vscanf(const char *format, va_list ap);
  1650. func X__ms_vscanf(t *TLS, format, ap uintptr) int32 {
  1651. panic(todo(""))
  1652. }
  1653. // int vsnprintf(char *str, size_t size, const char *format, va_list ap);
  1654. func X__ms_vsnprintf(t *TLS, str uintptr, size types.Size_t, format, ap uintptr) int32 {
  1655. return Xvsnprintf(t, str, size, format, ap)
  1656. }
  1657. // int vfwscanf(FILE *stream, const wchar_t *format, va_list argptr;);
  1658. func X__ms_vfwscanf(t *TLS, stream uintptr, format, ap uintptr) int32 {
  1659. panic(todo(""))
  1660. }
  1661. // int vwscanf(const wchar_t * restrict format, va_list arg);
  1662. func X__ms_vwscanf(t *TLS, format, ap uintptr) int32 {
  1663. panic(todo(""))
  1664. }
  1665. // int _vsnwprintf(wchar_t *buffer, size_t count, const wchar_t *format, va_list argptr);
  1666. func X_vsnwprintf(t *TLS, buffer uintptr, count types.Size_t, format, ap uintptr) int32 {
  1667. panic(todo(""))
  1668. }
  1669. // int vswscanf(const wchar_t *buffer, const wchar_t *format, va_list arglist);
  1670. func X__ms_vswscanf(t *TLS, stream uintptr, format, ap uintptr) int32 {
  1671. panic(todo(""))
  1672. }
  1673. // __acrt_iob_func
  1674. func X__acrt_iob_func(t *TLS, fd uint32) uintptr {
  1675. f, ok := fdToFile(int32(fd))
  1676. if !ok {
  1677. t.setErrno(EBADF)
  1678. return 0
  1679. }
  1680. return f.t
  1681. }
  1682. // BOOL SetEvent(
  1683. //
  1684. // HANDLE hEvent
  1685. //
  1686. // );
  1687. func XSetEvent(t *TLS, hEvent uintptr) int32 {
  1688. r0, _, err := syscall.Syscall(procSetEvent.Addr(), 1, hEvent, 0, 0)
  1689. if r0 == 0 {
  1690. t.setErrno(err)
  1691. }
  1692. return int32(r0)
  1693. }
  1694. // int _stricmp(
  1695. //
  1696. // const char *string1,
  1697. // const char *string2
  1698. //
  1699. // );
  1700. func X_stricmp(t *TLS, string1, string2 uintptr) int32 {
  1701. var s1 = strings.ToLower(GoString(string1))
  1702. var s2 = strings.ToLower(GoString(string2))
  1703. return int32(strings.Compare(s1, s2))
  1704. }
  1705. // BOOL HeapFree(
  1706. //
  1707. // HANDLE hHeap,
  1708. // DWORD dwFlags,
  1709. // _Frees_ptr_opt_ LPVOID lpMem
  1710. //
  1711. // );
  1712. func XHeapFree(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr) int32 {
  1713. r0, _, err := syscall.Syscall(procHeapFree.Addr(), 3, hHeap, uintptr(dwFlags), lpMem)
  1714. if err != 0 {
  1715. t.setErrno(err)
  1716. }
  1717. return int32(r0)
  1718. }
  1719. // HANDLE GetProcessHeap();
  1720. func XGetProcessHeap(t *TLS) uintptr {
  1721. r0, _, err := syscall.Syscall(procGetProcessHeap.Addr(), 0, 0, 0, 0)
  1722. if r0 == 0 {
  1723. t.setErrno(err)
  1724. }
  1725. return r0
  1726. }
  1727. // LPVOID HeapAlloc(
  1728. //
  1729. // HANDLE hHeap,
  1730. // DWORD dwFlags,
  1731. // SIZE_T dwBytes
  1732. //
  1733. // );
  1734. func XHeapAlloc(t *TLS, hHeap uintptr, dwFlags uint32, dwBytes types.Size_t) uintptr {
  1735. r0, _, err := syscall.Syscall(procHeapAlloc.Addr(), 3, hHeap, uintptr(dwFlags), uintptr(dwBytes))
  1736. if r0 == 0 {
  1737. t.setErrno(err)
  1738. }
  1739. return r0
  1740. }
  1741. // WCHAR * gai_strerrorW(
  1742. //
  1743. // int ecode
  1744. //
  1745. // );
  1746. func Xgai_strerrorW(t *TLS, _ ...interface{}) uintptr {
  1747. panic(todo(""))
  1748. }
  1749. // servent * getservbyname(
  1750. //
  1751. // const char *name,
  1752. // const char *proto
  1753. //
  1754. // );
  1755. func Xgetservbyname(t *TLS, _ ...interface{}) uintptr {
  1756. panic(todo(""))
  1757. }
  1758. // INT WSAAPI getaddrinfo(
  1759. //
  1760. // PCSTR pNodeName,
  1761. // PCSTR pServiceName,
  1762. // const ADDRINFOA *pHints,
  1763. // PADDRINFOA *ppResult
  1764. //
  1765. // );
  1766. func XWspiapiGetAddrInfo(t *TLS, _ ...interface{}) int32 {
  1767. panic(todo(""))
  1768. }
  1769. // int wcscmp(
  1770. //
  1771. // const wchar_t *string1,
  1772. // const wchar_t *string2
  1773. //
  1774. // );
  1775. func Xwcscmp(t *TLS, string1, string2 uintptr) int32 {
  1776. var s1 = goWideString(string1)
  1777. var s2 = goWideString(string2)
  1778. return int32(strings.Compare(s1, s2))
  1779. }
  1780. // BOOL IsDebuggerPresent();
  1781. func XIsDebuggerPresent(t *TLS) int32 {
  1782. panic(todo(""))
  1783. }
  1784. func XExitProcess(t *TLS, _ ...interface{}) int32 {
  1785. panic(todo(""))
  1786. }
  1787. // BOOL GetVersionExW(
  1788. //
  1789. // LPOSVERSIONINFOW lpVersionInformation
  1790. //
  1791. // );
  1792. func XGetVersionExW(t *TLS, lpVersionInformation uintptr) int32 {
  1793. r0, _, err := syscall.Syscall(procGetVersionExW.Addr(), 1, lpVersionInformation, 0, 0)
  1794. if r0 == 0 {
  1795. t.setErrno(err)
  1796. }
  1797. return int32(r0)
  1798. }
  1799. // BOOL GetVolumeNameForVolumeMountPointW(
  1800. //
  1801. // LPCWSTR lpszVolumeMountPoint,
  1802. // LPWSTR lpszVolumeName,
  1803. // DWORD cchBufferLength
  1804. //
  1805. // );
  1806. func XGetVolumeNameForVolumeMountPointW(t *TLS, _ ...interface{}) int32 {
  1807. panic(todo(""))
  1808. }
  1809. // size_t wcslen(
  1810. //
  1811. // const wchar_t *str
  1812. //
  1813. // );
  1814. func Xwcslen(t *TLS, str uintptr) types.Size_t {
  1815. r0, _, _ := syscall.Syscall(procLstrlenW.Addr(), 1, str, 0, 0)
  1816. return types.Size_t(r0)
  1817. }
  1818. // HANDLE WINAPI GetStdHandle(
  1819. //
  1820. // _In_ DWORD nStdHandle
  1821. //
  1822. // );
  1823. func XGetStdHandle(t *TLS, nStdHandle uint32) uintptr {
  1824. h, err := syscall.GetStdHandle(int(nStdHandle))
  1825. if err != nil {
  1826. panic("no console")
  1827. }
  1828. return uintptr(h)
  1829. }
  1830. // BOOL CloseHandle(
  1831. //
  1832. // HANDLE hObject
  1833. //
  1834. // );
  1835. func XCloseHandle(t *TLS, hObject uintptr) int32 {
  1836. r := syscall.CloseHandle(syscall.Handle(hObject))
  1837. if r != nil {
  1838. return errno.EINVAL
  1839. }
  1840. return 1
  1841. }
  1842. // DWORD GetLastError();
  1843. func XGetLastError(t *TLS) uint32 {
  1844. var rv = *(*int32)(unsafe.Pointer(t.errnop))
  1845. return uint32(rv)
  1846. //r1, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
  1847. //return uint32(r1)
  1848. }
  1849. // DWORD SetFilePointer(
  1850. //
  1851. // HANDLE hFile,
  1852. // LONG lDistanceToMove,
  1853. // PLONG lpDistanceToMoveHigh,
  1854. // DWORD dwMoveMethod
  1855. //
  1856. // );
  1857. func XSetFilePointer(t *TLS, hFile uintptr, lDistanceToMove long, lpDistanceToMoveHigh uintptr, dwMoveMethod uint32) uint32 {
  1858. r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, hFile, uintptr(lDistanceToMove), lpDistanceToMoveHigh, uintptr(dwMoveMethod), 0, 0)
  1859. var uOff = uint32(r0)
  1860. if uOff == 0xffffffff {
  1861. if e1 != 0 {
  1862. t.setErrno(e1)
  1863. } else {
  1864. t.setErrno(errno.EINVAL)
  1865. }
  1866. }
  1867. return uint32(r0)
  1868. }
  1869. // BOOL SetEndOfFile(
  1870. //
  1871. // HANDLE hFile
  1872. //
  1873. // );
  1874. func XSetEndOfFile(t *TLS, hFile uintptr) int32 {
  1875. err := syscall.SetEndOfFile(syscall.Handle(hFile))
  1876. if err != nil {
  1877. t.setErrno(err)
  1878. return 0
  1879. }
  1880. return 1
  1881. }
  1882. // BOOL ReadFile(
  1883. //
  1884. // HANDLE hFile,
  1885. // LPVOID lpBuffer,
  1886. // DWORD nNumberOfBytesToRead,
  1887. // LPDWORD lpNumberOfBytesRead,
  1888. // LPOVERLAPPED lpOverlapped
  1889. //
  1890. // );
  1891. func XReadFile(t *TLS, hFile, lpBuffer uintptr, nNumberOfBytesToRead uint32, lpNumberOfBytesRead, lpOverlapped uintptr) int32 {
  1892. r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5,
  1893. hFile, lpBuffer, uintptr(nNumberOfBytesToRead), uintptr(lpNumberOfBytesRead), uintptr(lpOverlapped), 0)
  1894. if r1 == 0 {
  1895. if e1 != 0 {
  1896. t.setErrno(e1)
  1897. } else {
  1898. t.setErrno(errno.EINVAL)
  1899. }
  1900. return 0
  1901. }
  1902. return int32(r1)
  1903. }
  1904. // BOOL WriteFile(
  1905. //
  1906. // HANDLE hFile,
  1907. // LPCVOID lpBuffer,
  1908. // DWORD nNumberOfBytesToWrite,
  1909. // LPDWORD lpNumberOfBytesWritten,
  1910. // LPOVERLAPPED lpOverlapped
  1911. //
  1912. // );
  1913. func XWriteFile(t *TLS, hFile, lpBuffer uintptr, nNumberOfBytesToWrite uint32, lpNumberOfBytesWritten, lpOverlapped uintptr) int32 {
  1914. r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5,
  1915. hFile, lpBuffer, uintptr(nNumberOfBytesToWrite), lpNumberOfBytesWritten, lpOverlapped, 0)
  1916. if r1 == 0 {
  1917. if e1 != 0 {
  1918. t.setErrno(e1)
  1919. } else {
  1920. t.setErrno(errno.EINVAL)
  1921. }
  1922. return 0
  1923. }
  1924. return int32(r1)
  1925. }
  1926. // DWORD GetFileAttributesW(
  1927. //
  1928. // LPCWSTR lpFileName
  1929. //
  1930. // );
  1931. func XGetFileAttributesW(t *TLS, lpFileName uintptr) uint32 {
  1932. attrs, err := syscall.GetFileAttributes((*uint16)(unsafe.Pointer(lpFileName)))
  1933. if attrs == syscall.INVALID_FILE_ATTRIBUTES {
  1934. if err != nil {
  1935. t.setErrno(err)
  1936. } else {
  1937. t.setErrno(errno.EINVAL)
  1938. }
  1939. }
  1940. return attrs
  1941. }
  1942. // HANDLE CreateFileW(
  1943. //
  1944. // LPCWSTR lpFileName,
  1945. // DWORD dwDesiredAccess,
  1946. // DWORD dwShareMode,
  1947. // LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  1948. // DWORD dwCreationDisposition,
  1949. // DWORD dwFlagsAndAttributes,
  1950. // HANDLE hTemplateFile
  1951. //
  1952. // );
  1953. func XCreateFileW(t *TLS, lpFileName uintptr, dwDesiredAccess, dwShareMode uint32, lpSecurityAttributes uintptr, dwCreationDisposition, dwFlagsAndAttributes uint32, hTemplateFile uintptr) uintptr {
  1954. r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, lpFileName, uintptr(dwDesiredAccess), uintptr(dwShareMode), lpSecurityAttributes,
  1955. uintptr(dwCreationDisposition), uintptr(dwFlagsAndAttributes), hTemplateFile, 0, 0)
  1956. h := syscall.Handle(r0)
  1957. if h == syscall.InvalidHandle {
  1958. if e1 != 0 {
  1959. t.setErrno(e1)
  1960. } else {
  1961. t.setErrno(errno.EINVAL)
  1962. }
  1963. return r0
  1964. }
  1965. return uintptr(h)
  1966. }
  1967. // BOOL DuplicateHandle(
  1968. //
  1969. // HANDLE hSourceProcessHandle,
  1970. // HANDLE hSourceHandle,
  1971. // HANDLE hTargetProcessHandle,
  1972. // LPHANDLE lpTargetHandle,
  1973. // DWORD dwDesiredAccess,
  1974. // BOOL bInheritHandle,
  1975. // DWORD dwOptions
  1976. //
  1977. // );
  1978. func XDuplicateHandle(t *TLS, hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, lpTargetHandle uintptr, dwDesiredAccess uint32, bInheritHandle int32, dwOptions uint32) int32 {
  1979. r0, _, err := syscall.Syscall9(procDuplicateHandle.Addr(), 7, hSourceProcessHandle, hSourceHandle, hTargetProcessHandle,
  1980. lpTargetHandle, uintptr(dwDesiredAccess), uintptr(bInheritHandle), uintptr(dwOptions), 0, 0)
  1981. if r0 == 0 {
  1982. t.setErrno(err)
  1983. }
  1984. return int32(r0)
  1985. }
  1986. // HANDLE GetCurrentProcess();
  1987. func XGetCurrentProcess(t *TLS) uintptr {
  1988. r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0)
  1989. if r0 == 0 {
  1990. if e1 != 0 {
  1991. t.setErrno(e1)
  1992. } else {
  1993. t.setErrno(errno.EINVAL)
  1994. }
  1995. }
  1996. return r0
  1997. }
  1998. // BOOL FlushFileBuffers(
  1999. //
  2000. // HANDLE hFile
  2001. //
  2002. // );
  2003. func XFlushFileBuffers(t *TLS, hFile uintptr) int32 {
  2004. err := syscall.FlushFileBuffers(syscall.Handle(hFile))
  2005. if err != nil {
  2006. t.setErrno(err)
  2007. return -1
  2008. }
  2009. return 1
  2010. }
  2011. // DWORD GetFileType(
  2012. //
  2013. // HANDLE hFile
  2014. //
  2015. // );
  2016. func XGetFileType(t *TLS, hFile uintptr) uint32 {
  2017. n, err := syscall.GetFileType(syscall.Handle(hFile))
  2018. if err != nil {
  2019. t.setErrno(err)
  2020. }
  2021. return n
  2022. }
  2023. // BOOL WINAPI GetConsoleMode(
  2024. //
  2025. // _In_ HANDLE hConsoleHandle,
  2026. // _Out_ LPDWORD lpMode
  2027. //
  2028. // );
  2029. func XGetConsoleMode(t *TLS, hConsoleHandle, lpMode uintptr) int32 {
  2030. err := syscall.GetConsoleMode(syscall.Handle(hConsoleHandle), (*uint32)(unsafe.Pointer(lpMode)))
  2031. if err != nil {
  2032. t.setErrno(err)
  2033. return 0
  2034. }
  2035. return 1
  2036. }
  2037. // BOOL GetCommState(
  2038. //
  2039. // HANDLE hFile,
  2040. // LPDCB lpDCB
  2041. //
  2042. // );
  2043. func XGetCommState(t *TLS, hFile, lpDCB uintptr) int32 {
  2044. r1, _, err := syscall.Syscall(procGetCommState.Addr(), 2, hFile, lpDCB, 0)
  2045. if r1 == 0 {
  2046. t.setErrno(err)
  2047. return 0
  2048. }
  2049. return int32(r1)
  2050. }
  2051. // int _wcsnicmp(
  2052. //
  2053. // const wchar_t *string1,
  2054. // const wchar_t *string2,
  2055. // size_t count
  2056. //
  2057. // );
  2058. func X_wcsnicmp(t *TLS, string1, string2 uintptr, count types.Size_t) int32 {
  2059. var s1 = strings.ToLower(goWideString(string1))
  2060. var l1 = len(s1)
  2061. var s2 = strings.ToLower(goWideString(string2))
  2062. var l2 = len(s2)
  2063. // shorter is lesser
  2064. if l1 < l2 {
  2065. return -1
  2066. }
  2067. if l2 > l1 {
  2068. return 1
  2069. }
  2070. // compare at most count
  2071. var cmpLen = count
  2072. if types.Size_t(l1) < cmpLen {
  2073. cmpLen = types.Size_t(l1)
  2074. }
  2075. return int32(strings.Compare(s1[:cmpLen], s2[:cmpLen]))
  2076. }
  2077. // BOOL WINAPI ReadConsole(
  2078. //
  2079. // _In_ HANDLE hConsoleInput,
  2080. // _Out_ LPVOID lpBuffer,
  2081. // _In_ DWORD nNumberOfCharsToRead,
  2082. // _Out_ LPDWORD lpNumberOfCharsRead,
  2083. // _In_opt_ LPVOID pInputControl
  2084. //
  2085. // );
  2086. func XReadConsoleW(t *TLS, hConsoleInput, lpBuffer uintptr, nNumberOfCharsToRead uint32, lpNumberOfCharsRead, pInputControl uintptr) int32 {
  2087. rv, _, err := syscall.Syscall6(procReadConsoleW.Addr(), 5, hConsoleInput,
  2088. lpBuffer, uintptr(nNumberOfCharsToRead), lpNumberOfCharsRead, pInputControl, 0)
  2089. if rv == 0 {
  2090. t.setErrno(err)
  2091. }
  2092. return int32(rv)
  2093. }
  2094. // BOOL WINAPI WriteConsoleW(
  2095. //
  2096. // _In_ HANDLE hConsoleOutput,
  2097. // _In_ const VOID *lpBuffer,
  2098. // _In_ DWORD nNumberOfCharsToWrite,
  2099. // _Out_opt_ LPDWORD lpNumberOfCharsWritten,
  2100. // _Reserved_ LPVOID lpReserved
  2101. //
  2102. // );
  2103. func XWriteConsoleW(t *TLS, hConsoleOutput, lpBuffer uintptr, nNumberOfCharsToWrite uint32, lpNumberOfCharsWritten, lpReserved uintptr) int32 {
  2104. rv, _, err := syscall.Syscall6(procWriteConsoleW.Addr(), 5, hConsoleOutput,
  2105. lpBuffer, uintptr(nNumberOfCharsToWrite), lpNumberOfCharsWritten, lpReserved, 0)
  2106. if rv == 0 {
  2107. t.setErrno(err)
  2108. }
  2109. return int32(rv)
  2110. }
  2111. // DWORD WaitForSingleObject(
  2112. //
  2113. // HANDLE hHandle,
  2114. // DWORD dwMilliseconds
  2115. //
  2116. // );
  2117. func XWaitForSingleObject(t *TLS, hHandle uintptr, dwMilliseconds uint32) uint32 {
  2118. rv, err := syscall.WaitForSingleObject(syscall.Handle(hHandle), dwMilliseconds)
  2119. if err != nil {
  2120. t.setErrno(err)
  2121. }
  2122. return rv
  2123. }
  2124. // BOOL ResetEvent(
  2125. //
  2126. // HANDLE hEvent
  2127. //
  2128. // );
  2129. func XResetEvent(t *TLS, hEvent uintptr) int32 {
  2130. rv, _, err := syscall.Syscall(procResetEvent.Addr(), 1, hEvent, 0, 0)
  2131. if rv == 0 {
  2132. t.setErrno(err)
  2133. }
  2134. return int32(rv)
  2135. }
  2136. // BOOL WINAPI PeekConsoleInput(
  2137. //
  2138. // _In_ HANDLE hConsoleInput,
  2139. // _Out_ PINPUT_RECORD lpBuffer,
  2140. // _In_ DWORD nLength,
  2141. // _Out_ LPDWORD lpNumberOfEventsRead
  2142. //
  2143. // );
  2144. func XPeekConsoleInputW(t *TLS, hConsoleInput, lpBuffer uintptr, nLength uint32, lpNumberOfEventsRead uintptr) int32 {
  2145. r0, _, err := syscall.Syscall6(procPeekConsoleInputW.Addr(), 4, hConsoleInput, lpBuffer, uintptr(nLength), lpNumberOfEventsRead, 0, 0)
  2146. if r0 == 0 {
  2147. t.setErrno(err)
  2148. }
  2149. return int32(r0)
  2150. }
  2151. // int WINAPIV wsprintfA(
  2152. //
  2153. // LPSTR ,
  2154. // LPCSTR ,
  2155. // ...
  2156. //
  2157. // );
  2158. func XwsprintfA(t *TLS, buf, format, args uintptr) int32 {
  2159. return Xsprintf(t, buf, format, args)
  2160. }
  2161. // UINT WINAPI GetConsoleCP(void);
  2162. func XGetConsoleCP(t *TLS) uint32 {
  2163. r0, _, err := syscall.Syscall(procGetConsoleCP.Addr(), 0, 0, 0, 0)
  2164. if r0 == 0 {
  2165. t.setErrno(err)
  2166. }
  2167. return uint32(r0)
  2168. }
  2169. // UINT WINAPI SetConsoleCP(UNIT);
  2170. //func setConsoleCP(cp uint32) uint32 {
  2171. //
  2172. // r0, _, _ := syscall.Syscall(procSetConsoleCP.Addr(), 1, uintptr(cp), 0, 0)
  2173. // if r0 == 0 {
  2174. // panic("setcp failed")
  2175. // }
  2176. // return uint32(r0)
  2177. //}
  2178. // HANDLE CreateEventW(
  2179. //
  2180. // LPSECURITY_ATTRIBUTES lpEventAttributes,
  2181. // BOOL bManualReset,
  2182. // BOOL bInitialState,
  2183. // LPCWSTR lpName
  2184. //
  2185. // );
  2186. func XCreateEventW(t *TLS, lpEventAttributes uintptr, bManualReset, bInitialState int32, lpName uintptr) uintptr {
  2187. r0, _, err := syscall.Syscall6(procCreateEventW.Addr(), 4, lpEventAttributes, uintptr(bManualReset),
  2188. uintptr(bInitialState), lpName, 0, 0)
  2189. if r0 == 0 {
  2190. t.setErrno(err)
  2191. }
  2192. return r0
  2193. }
  2194. type ThreadAdapter struct {
  2195. token uintptr
  2196. tls *TLS
  2197. param uintptr
  2198. threadFunc func(*TLS, uintptr) uint32
  2199. }
  2200. func (ta *ThreadAdapter) run() uintptr {
  2201. r := ta.threadFunc(ta.tls, ta.param)
  2202. ta.tls.Close()
  2203. removeObject(ta.token)
  2204. return uintptr(r)
  2205. }
  2206. func ThreadProc(p uintptr) uintptr {
  2207. adp, ok := winGetObject(p).(*ThreadAdapter)
  2208. if !ok {
  2209. panic("invalid thread")
  2210. }
  2211. return adp.run()
  2212. }
  2213. // HANDLE CreateThread(
  2214. //
  2215. // LPSECURITY_ATTRIBUTES lpThreadAttributes,
  2216. // SIZE_T dwStackSize,
  2217. // LPTHREAD_START_ROUTINE lpStartAddress,
  2218. // __drv_aliasesMem LPVOID lpParameter,
  2219. // DWORD dwCreationFlags,
  2220. // LPDWORD lpThreadId
  2221. //
  2222. // );
  2223. func XCreateThread(t *TLS, lpThreadAttributes uintptr, dwStackSize types.Size_t, lpStartAddress, lpParameter uintptr, dwCreationFlags uint32, lpThreadId uintptr) uintptr {
  2224. f := (*struct{ f func(*TLS, uintptr) uint32 })(unsafe.Pointer(&struct{ uintptr }{lpStartAddress})).f
  2225. var tAdp = ThreadAdapter{threadFunc: f, tls: NewTLS(), param: lpParameter}
  2226. tAdp.token = addObject(&tAdp)
  2227. r0, _, err := syscall.Syscall6(procCreateThread.Addr(), 6, lpThreadAttributes, uintptr(dwStackSize),
  2228. threadCallback, tAdp.token, uintptr(dwCreationFlags), lpThreadId)
  2229. if r0 == 0 {
  2230. t.setErrno(err)
  2231. }
  2232. return r0
  2233. }
  2234. // BOOL SetThreadPriority(
  2235. //
  2236. // HANDLE hThread,
  2237. // int nPriority
  2238. //
  2239. // );
  2240. func XSetThreadPriority(t *TLS, hThread uintptr, nPriority int32) int32 {
  2241. //r0, _, err := syscall.Syscall(procSetThreadPriority.Addr(), 2, hThread, uintptr(nPriority), 0)
  2242. //if r0 == 0 {
  2243. // t.setErrno(err)
  2244. //}
  2245. //return int32(r0)
  2246. return 1
  2247. }
  2248. // BOOL WINAPI SetConsoleMode(
  2249. //
  2250. // _In_ HANDLE hConsoleHandle,
  2251. // _In_ DWORD dwMode
  2252. //
  2253. // );
  2254. func XSetConsoleMode(t *TLS, hConsoleHandle uintptr, dwMode uint32) int32 {
  2255. rv, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, hConsoleHandle, uintptr(dwMode), 0)
  2256. if rv == 0 {
  2257. t.setErrno(err)
  2258. }
  2259. return int32(rv)
  2260. }
  2261. func XPurgeComm(t *TLS, _ ...interface{}) int32 {
  2262. panic(todo(""))
  2263. }
  2264. func XClearCommError(t *TLS, _ ...interface{}) int32 {
  2265. panic(todo(""))
  2266. }
  2267. // void DeleteCriticalSection(
  2268. //
  2269. // LPCRITICAL_SECTION lpCriticalSection
  2270. //
  2271. // );
  2272. func XDeleteCriticalSection(t *TLS, lpCriticalSection uintptr) {
  2273. syscall.Syscall(procDeleteCriticalSection.Addr(), 1, lpCriticalSection, 0, 0)
  2274. }
  2275. // void EnterCriticalSection(
  2276. //
  2277. // LPCRITICAL_SECTION lpCriticalSection
  2278. //
  2279. // );
  2280. func XEnterCriticalSection(t *TLS, lpCriticalSection uintptr) {
  2281. syscall.Syscall(procEnterCriticalSection.Addr(), 1, lpCriticalSection, 0, 0)
  2282. }
  2283. // void LeaveCriticalSection(
  2284. //
  2285. // LPCRITICAL_SECTION lpCriticalSection
  2286. //
  2287. // );
  2288. func XLeaveCriticalSection(t *TLS, lpCriticalSection uintptr) {
  2289. syscall.Syscall(procLeaveCriticalSection.Addr(), 1, lpCriticalSection, 0, 0)
  2290. }
  2291. func XGetOverlappedResult(t *TLS, _ ...interface{}) int32 {
  2292. panic(todo(""))
  2293. }
  2294. func XSetupComm(t *TLS, _ ...interface{}) int32 {
  2295. panic(todo(""))
  2296. }
  2297. func XSetCommTimeouts(t *TLS, _ ...interface{}) int32 {
  2298. panic(todo(""))
  2299. }
  2300. // void InitializeCriticalSection(
  2301. //
  2302. // LPCRITICAL_SECTION lpCriticalSection
  2303. //
  2304. // );
  2305. func XInitializeCriticalSection(t *TLS, lpCriticalSection uintptr) {
  2306. // InitializeCriticalSection always succeeds, even in low memory situations.
  2307. syscall.Syscall(procInitializeCriticalSection.Addr(), 1, lpCriticalSection, 0, 0)
  2308. }
  2309. func XBuildCommDCBW(t *TLS, _ ...interface{}) int32 {
  2310. panic(todo(""))
  2311. }
  2312. func XSetCommState(t *TLS, _ ...interface{}) int32 {
  2313. panic(todo(""))
  2314. }
  2315. func X_strnicmp(t *TLS, _ ...interface{}) int32 {
  2316. panic(todo(""))
  2317. }
  2318. func XEscapeCommFunction(t *TLS, _ ...interface{}) int32 {
  2319. panic(todo(""))
  2320. }
  2321. func XGetCommModemStatus(t *TLS, _ ...interface{}) int32 {
  2322. panic(todo(""))
  2323. }
  2324. // BOOL MoveFileW(
  2325. //
  2326. // LPCWSTR lpExistingFileName,
  2327. // LPCWSTR lpNewFileName
  2328. //
  2329. // );
  2330. func XMoveFileW(t *TLS, lpExistingFileName, lpNewFileName uintptr) int32 {
  2331. r0, _, err := syscall.Syscall(procMoveFileW.Addr(), 2, lpExistingFileName, lpNewFileName, 0)
  2332. if err != 0 {
  2333. t.setErrno(err)
  2334. }
  2335. return int32(r0)
  2336. }
  2337. // DWORD GetFullPathNameW(
  2338. //
  2339. // LPCWSTR lpFileName,
  2340. // DWORD nBufferLength,
  2341. // LPWSTR lpBuffer,
  2342. // LPWSTR *lpFilePart
  2343. //
  2344. // );
  2345. func XGetFullPathNameW(t *TLS, lpFileName uintptr, nBufferLength uint32, lpBuffer, lpFilePart uintptr) uint32 {
  2346. r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, lpFileName, uintptr(nBufferLength), uintptr(lpBuffer), uintptr(lpFilePart), 0, 0)
  2347. n := uint32(r0)
  2348. if n == 0 {
  2349. if e1 != 0 {
  2350. t.setErrno(e1)
  2351. } else {
  2352. t.setErrno(errno.EINVAL)
  2353. }
  2354. }
  2355. return n
  2356. }
  2357. // LPWSTR CharLowerW(
  2358. //
  2359. // LPWSTR lpsz
  2360. //
  2361. // );
  2362. func XCharLowerW(t *TLS, lpsz uintptr) uintptr {
  2363. panic(todo(""))
  2364. }
  2365. // BOOL CreateDirectoryW(
  2366. //
  2367. // LPCWSTR lpPathName,
  2368. // LPSECURITY_ATTRIBUTES lpSecurityAttributes
  2369. //
  2370. // );
  2371. func XCreateDirectoryW(t *TLS, lpPathName, lpSecurityAttributes uintptr) int32 {
  2372. err := syscall.CreateDirectory((*uint16)(unsafe.Pointer(lpPathName)),
  2373. (*syscall.SecurityAttributes)(unsafe.Pointer(lpSecurityAttributes)))
  2374. if err != nil {
  2375. t.setErrno(err)
  2376. return 0
  2377. }
  2378. return 1
  2379. }
  2380. // BOOL SetFileAttributesW(
  2381. //
  2382. // LPCWSTR lpFileName,
  2383. // DWORD dwFileAttributes
  2384. //
  2385. // );
  2386. func XSetFileAttributesW(t *TLS, lpFileName uintptr, dwFileAttributes uint32) int32 {
  2387. err := syscall.SetFileAttributes((*uint16)(unsafe.Pointer(lpFileName)), dwFileAttributes)
  2388. if err != nil {
  2389. t.setErrno(err)
  2390. return 0
  2391. }
  2392. return 1
  2393. }
  2394. // UINT GetTempFileNameW(
  2395. //
  2396. // LPCWSTR lpPathName,
  2397. // LPCWSTR lpPrefixString,
  2398. // UINT uUnique,
  2399. // LPWSTR lpTempFileName
  2400. //
  2401. // );
  2402. func XGetTempFileNameW(t *TLS, lpPathName, lpPrefixString uintptr, uUnique uint32, lpTempFileName uintptr) uint32 {
  2403. r0, _, e1 := syscall.Syscall6(procGetTempFileNameW.Addr(), 4, lpPathName, lpPrefixString, uintptr(uUnique), lpTempFileName, 0, 0)
  2404. if r0 == 0 {
  2405. t.setErrno(e1)
  2406. }
  2407. return uint32(r0)
  2408. }
  2409. // BOOL CopyFileW(
  2410. //
  2411. // LPCWSTR lpExistingFileName,
  2412. // LPCWSTR lpNewFileName,
  2413. // BOOL bFailIfExists
  2414. //
  2415. // );
  2416. func XCopyFileW(t *TLS, lpExistingFileName, lpNewFileName uintptr, bFailIfExists int32) int32 {
  2417. r0, _, e1 := syscall.Syscall(procCopyFileW.Addr(), 3, lpExistingFileName, lpNewFileName, uintptr(bFailIfExists))
  2418. if r0 == 0 {
  2419. t.setErrno(e1)
  2420. }
  2421. return int32(r0)
  2422. }
  2423. // BOOL DeleteFileW(
  2424. //
  2425. // LPCWSTR lpFileName
  2426. //
  2427. // );
  2428. func XDeleteFileW(t *TLS, lpFileName uintptr) int32 {
  2429. err := syscall.DeleteFile((*uint16)(unsafe.Pointer(lpFileName)))
  2430. if err != nil {
  2431. t.setErrno(err)
  2432. return 0
  2433. }
  2434. return 1
  2435. }
  2436. // BOOL RemoveDirectoryW(
  2437. //
  2438. // LPCWSTR lpPathName
  2439. //
  2440. // );
  2441. func XRemoveDirectoryW(t *TLS, lpPathName uintptr) int32 {
  2442. err := syscall.RemoveDirectory((*uint16)(unsafe.Pointer(lpPathName)))
  2443. if err != nil {
  2444. t.setErrno(err)
  2445. return 0
  2446. }
  2447. return 1
  2448. }
  2449. // HANDLE FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
  2450. func XFindFirstFileW(t *TLS, lpFileName, lpFindFileData uintptr) uintptr {
  2451. r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, lpFileName, lpFindFileData, 0)
  2452. handle := syscall.Handle(r0)
  2453. if handle == syscall.InvalidHandle {
  2454. if e1 != 0 {
  2455. t.setErrno(e1)
  2456. } else {
  2457. t.setErrno(errno.EINVAL)
  2458. }
  2459. }
  2460. return r0
  2461. }
  2462. // HANDLE FindFirstFileExW(
  2463. //
  2464. // LPCWSTR lpFileName,
  2465. // FINDEX_INFO_LEVELS fInfoLevelId,
  2466. // LPVOID lpFindFileData,
  2467. // FINDEX_SEARCH_OPS fSearchOp,
  2468. // LPVOID lpSearchFilter,
  2469. // DWORD dwAdditionalFlags
  2470. //
  2471. // );
  2472. func XFindFirstFileExW(t *TLS, lpFileName uintptr, fInfoLevelId int32, lpFindFileData uintptr, fSearchOp int32, lpSearchFilter uintptr, dwAdditionalFlags uint32) uintptr {
  2473. r0, _, e1 := syscall.Syscall6(procFindFirstFileExW.Addr(), 6, lpFileName, uintptr(fInfoLevelId), lpFindFileData, uintptr(fSearchOp), lpSearchFilter, uintptr(dwAdditionalFlags))
  2474. handle := syscall.Handle(r0)
  2475. if handle == syscall.InvalidHandle {
  2476. if e1 != 0 {
  2477. t.setErrno(e1)
  2478. } else {
  2479. t.setErrno(errno.EINVAL)
  2480. }
  2481. }
  2482. return r0
  2483. }
  2484. // BOOL FindClose(HANDLE hFindFile);
  2485. func XFindClose(t *TLS, hFindFile uintptr) int32 {
  2486. r0, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, hFindFile, 0, 0)
  2487. if r0 == 0 {
  2488. if e1 != 0 {
  2489. t.setErrno(e1)
  2490. } else {
  2491. t.setErrno(errno.EINVAL)
  2492. }
  2493. }
  2494. return int32(r0)
  2495. }
  2496. // BOOL FindNextFileW(
  2497. //
  2498. // HANDLE hFindFile,
  2499. // LPWIN32_FIND_DATAW lpFindFileData
  2500. //
  2501. // );
  2502. func XFindNextFileW(t *TLS, hFindFile, lpFindFileData uintptr) int32 {
  2503. r0, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, hFindFile, lpFindFileData, 0)
  2504. if r0 == 0 {
  2505. if e1 != 0 {
  2506. t.setErrno(e1)
  2507. } else {
  2508. t.setErrno(errno.EINVAL)
  2509. }
  2510. }
  2511. return int32(r0)
  2512. }
  2513. // DWORD GetLogicalDriveStringsA(
  2514. //
  2515. // DWORD nBufferLength,
  2516. // LPSTR lpBuffer
  2517. //
  2518. // );
  2519. func XGetLogicalDriveStringsA(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 {
  2520. r0, _, err := syscall.Syscall(procGetLogicalDriveStringsA.Addr(), 2, uintptr(nBufferLength), lpBuffer, 0)
  2521. if err != 0 {
  2522. t.setErrno(err)
  2523. }
  2524. return uint32(r0)
  2525. }
  2526. // BOOL GetVolumeInformationA(
  2527. //
  2528. // LPCSTR lpRootPathName,
  2529. // LPSTR lpVolumeNameBuffer,
  2530. // DWORD nVolumeNameSize,
  2531. // LPDWORD lpVolumeSerialNumber,
  2532. // LPDWORD lpMaximumComponentLength,
  2533. // LPDWORD lpFileSystemFlags,
  2534. // LPSTR lpFileSystemNameBuffer,
  2535. // DWORD nFileSystemNameSize
  2536. //
  2537. // );
  2538. func XGetVolumeInformationA(t *TLS, lpRootPathName, lpVolumeNameBuffer uintptr, nVolumeNameSize uint32, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer uintptr, nFileSystemNameSize uint32) int32 {
  2539. r0, _, err := syscall.Syscall9(procGetVolumeInformationA.Addr(), 8,
  2540. lpRootPathName,
  2541. lpVolumeNameBuffer,
  2542. uintptr(nVolumeNameSize),
  2543. lpVolumeSerialNumber,
  2544. lpMaximumComponentLength,
  2545. lpFileSystemFlags,
  2546. lpFileSystemNameBuffer,
  2547. uintptr(nFileSystemNameSize),
  2548. 0,
  2549. )
  2550. if err != 0 {
  2551. t.setErrno(err)
  2552. }
  2553. return int32(r0)
  2554. }
  2555. // BOOL CreateHardLinkW(
  2556. //
  2557. // LPCWSTR lpFileName,
  2558. // LPCWSTR lpExistingFileName,
  2559. // LPSECURITY_ATTRIBUTES lpSecurityAttributes
  2560. //
  2561. // );
  2562. func XCreateHardLinkW(t *TLS, lpFileName, lpExistingFileName, lpSecurityAttributes uintptr) int32 {
  2563. r0, _, err := syscall.Syscall(procCreateHardLinkW.Addr(), 1, lpFileName, lpExistingFileName, lpSecurityAttributes)
  2564. if err != 0 {
  2565. t.setErrno(err)
  2566. }
  2567. return int32(r0)
  2568. }
  2569. // BOOL DeviceIoControl(
  2570. //
  2571. // HANDLE hDevice,
  2572. // DWORD dwIoControlCode,
  2573. // LPVOID lpInBuffer,
  2574. // DWORD nInBufferSize,
  2575. // LPVOID lpOutBuffer,
  2576. // DWORD nOutBufferSize,
  2577. // LPDWORD lpBytesReturned,
  2578. // LPOVERLAPPED lpOverlapped
  2579. //
  2580. // );
  2581. func XDeviceIoControl(t *TLS, hDevice uintptr, dwIoControlCode uint32, lpInBuffer uintptr, nInBufferSize uint32, lpOutBuffer uintptr, nOutBufferSize uint32, lpBytesReturned, lpOverlapped uintptr) int32 {
  2582. r0, _, err := syscall.Syscall9(procDeviceIoControl.Addr(), 8, hDevice, uintptr(dwIoControlCode), lpInBuffer,
  2583. uintptr(nInBufferSize), lpOutBuffer, uintptr(nOutBufferSize), lpBytesReturned, lpOverlapped, 0)
  2584. if r0 == 0 {
  2585. t.setErrno(err)
  2586. }
  2587. return int32(r0)
  2588. }
  2589. // int wcsncmp(
  2590. //
  2591. // const wchar_t *string1,
  2592. // const wchar_t *string2,
  2593. // size_t count
  2594. //
  2595. // );
  2596. func Xwcsncmp(t *TLS, string1, string2 uintptr, count types.Size_t) int32 {
  2597. var s1 = goWideString(string1)
  2598. var l1 = len(s1)
  2599. var s2 = goWideString(string2)
  2600. var l2 = len(s2)
  2601. // shorter is lesser
  2602. if l1 < l2 {
  2603. return -1
  2604. }
  2605. if l2 > l1 {
  2606. return 1
  2607. }
  2608. // compare at most count
  2609. var cmpLen = count
  2610. if types.Size_t(l1) < cmpLen {
  2611. cmpLen = types.Size_t(l1)
  2612. }
  2613. return int32(strings.Compare(s1[:cmpLen], s2[:cmpLen]))
  2614. }
  2615. // int MultiByteToWideChar(
  2616. //
  2617. // UINT CodePage,
  2618. // DWORD dwFlags,
  2619. // _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
  2620. // int cbMultiByte,
  2621. // LPWSTR lpWideCharStr,
  2622. // int cchWideChar
  2623. //
  2624. // );
  2625. func XMultiByteToWideChar(t *TLS, CodePage uint32, dwFlags uint32, lpMultiByteStr uintptr, cbMultiByte int32, lpWideCharStr uintptr, cchWideChar int32) int32 {
  2626. r1, _, _ := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6,
  2627. uintptr(CodePage), uintptr(dwFlags), uintptr(lpMultiByteStr),
  2628. uintptr(cbMultiByte), uintptr(lpWideCharStr), uintptr(cchWideChar))
  2629. return (int32(r1))
  2630. }
  2631. // void OutputDebugStringW(
  2632. //
  2633. // LPCWSTR lpOutputString
  2634. //
  2635. // );
  2636. func XOutputDebugStringW(t *TLS, lpOutputString uintptr) {
  2637. panic(todo(""))
  2638. }
  2639. func XMessageBeep(t *TLS, _ ...interface{}) int32 {
  2640. panic(todo(""))
  2641. }
  2642. //====
  2643. // long _InterlockedCompareExchange(
  2644. //
  2645. // long volatile * Destination,
  2646. // long Exchange,
  2647. // long Comparand
  2648. //
  2649. // );
  2650. func X_InterlockedCompareExchange(t *TLS, Destination uintptr, Exchange, Comparand long) long {
  2651. // The function returns the initial value of the Destination parameter.
  2652. var v = *(*int32)(unsafe.Pointer(Destination))
  2653. _ = atomic.CompareAndSwapInt32((*int32)(unsafe.Pointer(Destination)), Comparand, Exchange)
  2654. return long(v)
  2655. }
  2656. // int rename(const char *oldpath, const char *newpath);
  2657. func Xrename(t *TLS, oldpath, newpath uintptr) int32 {
  2658. panic(todo(""))
  2659. }
  2660. // BOOL AreFileApisANSI();
  2661. func XAreFileApisANSI(t *TLS) int32 {
  2662. r0, _, _ := syscall.Syscall(procAreFileApisANSI.Addr(), 0, 0, 0, 0)
  2663. return int32(r0)
  2664. }
  2665. // HANDLE CreateFileA(
  2666. //
  2667. // LPCSTR lpFileName,
  2668. // DWORD dwDesiredAccess,
  2669. // DWORD dwShareMode,
  2670. // LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  2671. // DWORD dwCreationDisposition,
  2672. // DWORD dwFlagsAndAttributes,
  2673. // HANDLE hTemplateFile
  2674. //
  2675. // );
  2676. func XCreateFileA(t *TLS, lpFileName uintptr, dwDesiredAccess, dwShareMode uint32,
  2677. lpSecurityAttributes uintptr, dwCreationDisposition, dwFlagsAndAttributes uint32, hTemplateFile uintptr) uintptr {
  2678. r0, _, e1 := syscall.Syscall9(procCreateFileA.Addr(), 7, lpFileName, uintptr(dwDesiredAccess), uintptr(dwShareMode), lpSecurityAttributes,
  2679. uintptr(dwCreationDisposition), uintptr(dwFlagsAndAttributes), hTemplateFile, 0, 0)
  2680. h := syscall.Handle(r0)
  2681. if h == syscall.InvalidHandle {
  2682. if e1 != 0 {
  2683. t.setErrno(e1)
  2684. } else {
  2685. t.setErrno(errno.EINVAL)
  2686. }
  2687. return r0
  2688. }
  2689. return uintptr(h)
  2690. }
  2691. // HANDLE CreateFileMappingA(
  2692. //
  2693. // HANDLE hFile,
  2694. // LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  2695. // DWORD flProtect,
  2696. // DWORD dwMaximumSizeHigh,
  2697. // DWORD dwMaximumSizeLow,
  2698. // LPCSTR lpName
  2699. //
  2700. // );
  2701. func XCreateFileMappingA(t *TLS, hFile, lpFileMappingAttributes uintptr, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow uint32, lpName uintptr) uintptr {
  2702. panic(todo(""))
  2703. }
  2704. // HANDLE CreateFileMappingW(
  2705. //
  2706. // HANDLE hFile,
  2707. // LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  2708. // DWORD flProtect,
  2709. // DWORD dwMaximumSizeHigh,
  2710. // DWORD dwMaximumSizeLow,
  2711. // LPCWSTR lpName
  2712. //
  2713. // );
  2714. func XCreateFileMappingW(t *TLS, hFile, lpFileMappingAttributes uintptr, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow uint32, lpName uintptr) uintptr {
  2715. h, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, hFile, lpFileMappingAttributes, uintptr(flProtect),
  2716. uintptr(dwMaximumSizeHigh), uintptr(dwMaximumSizeLow), lpName)
  2717. if h == 0 {
  2718. if e1 != 0 {
  2719. t.setErrno(e1)
  2720. } else {
  2721. t.setErrno(errno.EINVAL)
  2722. }
  2723. }
  2724. return h
  2725. }
  2726. // HANDLE CreateMutexW(
  2727. //
  2728. // LPSECURITY_ATTRIBUTES lpMutexAttributes,
  2729. // BOOL bInitialOwner,
  2730. // LPCWSTR lpName
  2731. //
  2732. // );
  2733. func XCreateMutexW(t *TLS, lpMutexAttributes uintptr, bInitialOwner int32, lpName uintptr) uintptr {
  2734. panic(todo(""))
  2735. }
  2736. // BOOL DeleteFileA(
  2737. //
  2738. // LPCSTR lpFileName
  2739. //
  2740. // );
  2741. func XDeleteFileA(t *TLS, lpFileName uintptr) int32 {
  2742. panic(todo(""))
  2743. }
  2744. // DWORD FormatMessageA(
  2745. //
  2746. // DWORD dwFlags,
  2747. // LPCVOID lpSource,
  2748. // DWORD dwMessageId,
  2749. // DWORD dwLanguageId,
  2750. // LPSTR lpBuffer,
  2751. // DWORD nSize,
  2752. // va_list *Arguments
  2753. //
  2754. // );
  2755. func XFormatMessageA(t *TLS, dwFlagsAndAttributes uint32, lpSource uintptr, dwMessageId, dwLanguageId uint32, lpBuffer uintptr, nSize uint32, Arguments uintptr) uint32 {
  2756. panic(todo(""))
  2757. }
  2758. // DWORD FormatMessageW(
  2759. //
  2760. // DWORD dwFlags,
  2761. // LPCVOID lpSource,
  2762. // DWORD dwMessageId,
  2763. // DWORD dwLanguageId,
  2764. // LPWSTR lpBuffer,
  2765. // DWORD nSize,
  2766. // va_list *Arguments
  2767. //
  2768. // );
  2769. func XFormatMessageW(t *TLS, dwFlags uint32, lpSource uintptr, dwMessageId, dwLanguageId uint32, lpBuffer uintptr, nSize uint32, Arguments uintptr) uint32 {
  2770. r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7,
  2771. uintptr(dwFlags), lpSource, uintptr(dwMessageId), uintptr(dwLanguageId),
  2772. lpBuffer, uintptr(nSize), Arguments, 0, 0)
  2773. n := uint32(r0)
  2774. if n == 0 {
  2775. if e1 != 0 {
  2776. t.setErrno(e1)
  2777. } else {
  2778. t.setErrno(errno.EINVAL)
  2779. }
  2780. }
  2781. return n
  2782. }
  2783. // BOOL FreeLibrary(HMODULE hLibModule);
  2784. func XFreeLibrary(t *TLS, hLibModule uintptr) int32 {
  2785. panic(todo(""))
  2786. }
  2787. // DWORD GetCurrentProcessId();
  2788. func XGetCurrentProcessId(t *TLS) uint32 {
  2789. r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0)
  2790. pid := uint32(r0)
  2791. return pid
  2792. }
  2793. // BOOL GetDiskFreeSpaceA(
  2794. //
  2795. // LPCSTR lpRootPathName,
  2796. // LPDWORD lpSectorsPerCluster,
  2797. // LPDWORD lpBytesPerSector,
  2798. // LPDWORD lpNumberOfFreeClusters,
  2799. // LPDWORD lpTotalNumberOfClusters
  2800. //
  2801. // );
  2802. func XGetDiskFreeSpaceA(t *TLS, lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters uintptr) int32 {
  2803. panic(todo(""))
  2804. }
  2805. // BOOL GetDiskFreeSpaceW(
  2806. //
  2807. // LPCWSTR lpRootPathName,
  2808. // LPDWORD lpSectorsPerCluster,
  2809. // LPDWORD lpBytesPerSector,
  2810. // LPDWORD lpNumberOfFreeClusters,
  2811. // LPDWORD lpTotalNumberOfClusters
  2812. //
  2813. // );
  2814. func XGetDiskFreeSpaceW(t *TLS, lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters uintptr) int32 {
  2815. panic(todo(""))
  2816. }
  2817. // DWORD GetFileAttributesA(
  2818. //
  2819. // LPCSTR lpFileName
  2820. //
  2821. // );
  2822. func XGetFileAttributesA(t *TLS, lpFileName uintptr) uint32 {
  2823. r0, _, err := syscall.Syscall(procGetFileAttributesA.Addr(), 1, lpFileName, 0, 0)
  2824. if err != 0 {
  2825. t.setErrno(err)
  2826. }
  2827. return uint32(r0)
  2828. }
  2829. // BOOL GetFileAttributesExW(
  2830. //
  2831. // LPCWSTR lpFileName,
  2832. // GET_FILEEX_INFO_LEVELS fInfoLevelId,
  2833. // LPVOID lpFileInformation
  2834. //
  2835. // );
  2836. func XGetFileAttributesExW(t *TLS, lpFileName uintptr, fInfoLevelId uint32, lpFileInformation uintptr) int32 {
  2837. r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, lpFileName, uintptr(fInfoLevelId), lpFileInformation)
  2838. if r1 == 0 {
  2839. if e1 != 0 {
  2840. t.setErrno(e1)
  2841. } else {
  2842. t.setErrno(errno.EINVAL)
  2843. }
  2844. return 0
  2845. }
  2846. return int32(r1)
  2847. }
  2848. // DWORD GetFileSize(
  2849. //
  2850. // HANDLE hFile,
  2851. // LPDWORD lpFileSizeHigh
  2852. //
  2853. // );
  2854. func XGetFileSize(t *TLS, hFile, lpFileSizeHigh uintptr) uint32 {
  2855. r1, _, e1 := syscall.Syscall(procGetFileSize.Addr(), 2, hFile, lpFileSizeHigh, 0)
  2856. if r1 == math.MaxUint32 {
  2857. if lpFileSizeHigh == 0 {
  2858. // If the function fails and lpFileSizeHigh is NULL, the return value is INVALID_FILE_SIZE.
  2859. // Note that if the return value is INVALID_FILE_SIZE (0xffffffff),
  2860. // an application must call GetLastError to determine whether the function has succeeded or failed.
  2861. t.setErrno(e1)
  2862. return math.MaxUint32
  2863. } else {
  2864. // If the function fails and lpFileSizeHigh is non-NULL, the return value is INVALID_FILE_SIZE
  2865. // and GetLastError will return a value other than NO_ERROR.
  2866. t.setErrno(e1)
  2867. return math.MaxUint32
  2868. }
  2869. }
  2870. return uint32(r1)
  2871. }
  2872. // DWORD GetFullPathNameA(
  2873. //
  2874. // LPCSTR lpFileName,
  2875. // DWORD nBufferLength,
  2876. // LPSTR lpBuffer,
  2877. // LPSTR *lpFilePart
  2878. //
  2879. // );
  2880. func XGetFullPathNameA(t *TLS, lpFileName uintptr, nBufferLength uint32, lpBuffer, lpFilePart uintptr) uint32 {
  2881. panic(todo(""))
  2882. }
  2883. // FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
  2884. func XGetProcAddress(t *TLS, hModule, lpProcName uintptr) uintptr {
  2885. return 0
  2886. //panic(todo(GoString(lpProcName)))
  2887. //
  2888. //r0, _, err := syscall.Syscall(procGetProcAddress.Addr(), 2, hModule, lpProcName, 0)
  2889. //if r0 == 0 {
  2890. // t.setErrno(err)
  2891. //}
  2892. //return r0
  2893. }
  2894. // NTSYSAPI NTSTATUS RtlGetVersion( // ntdll.dll
  2895. //
  2896. // PRTL_OSVERSIONINFOW lpVersionInformation
  2897. //
  2898. // );
  2899. func XRtlGetVersion(t *TLS, lpVersionInformation uintptr) uintptr {
  2900. panic(todo(""))
  2901. }
  2902. // void GetSystemInfo(
  2903. //
  2904. // LPSYSTEM_INFO lpSystemInfo
  2905. //
  2906. // );
  2907. func XGetSystemInfo(t *TLS, lpSystemInfo uintptr) {
  2908. syscall.Syscall(procGetSystemInfo.Addr(), 1, lpSystemInfo, 0, 0)
  2909. }
  2910. // void GetSystemTime(LPSYSTEMTIME lpSystemTime);
  2911. func XGetSystemTime(t *TLS, lpSystemTime uintptr) {
  2912. syscall.Syscall(procGetSystemTime.Addr(), 1, lpSystemTime, 0, 0)
  2913. }
  2914. // void GetSystemTimeAsFileTime(
  2915. //
  2916. // LPFILETIME lpSystemTimeAsFileTime
  2917. //
  2918. // );
  2919. func XGetSystemTimeAsFileTime(t *TLS, lpSystemTimeAsFileTime uintptr) {
  2920. syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, lpSystemTimeAsFileTime, 0, 0)
  2921. }
  2922. // DWORD GetTempPathA(
  2923. //
  2924. // DWORD nBufferLength,
  2925. // LPSTR lpBuffer
  2926. //
  2927. // );
  2928. func XGetTempPathA(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 {
  2929. panic(todo(""))
  2930. }
  2931. // DWORD GetTempPathW(
  2932. //
  2933. // DWORD nBufferLength,
  2934. // LPWSTR lpBuffer
  2935. //
  2936. // );
  2937. func XGetTempPathW(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 {
  2938. rv, err := syscall.GetTempPath(nBufferLength, (*uint16)(unsafe.Pointer(lpBuffer)))
  2939. if err != nil {
  2940. t.setErrno(err)
  2941. }
  2942. return rv
  2943. }
  2944. // DWORD GetTickCount();
  2945. func XGetTickCount(t *TLS) uint32 {
  2946. r0, _, _ := syscall.Syscall(procGetTickCount.Addr(), 0, 0, 0, 0)
  2947. return uint32(r0)
  2948. }
  2949. // BOOL GetVersionExA(
  2950. //
  2951. // LPOSVERSIONINFOA lpVersionInformation
  2952. //
  2953. // );
  2954. func XGetVersionExA(t *TLS, lpVersionInformation uintptr) int32 {
  2955. r0, _, err := syscall.Syscall(procGetVersionExA.Addr(), 1, lpVersionInformation, 0, 0)
  2956. if r0 == 0 {
  2957. t.setErrno(err)
  2958. }
  2959. return int32(r0)
  2960. }
  2961. // HANDLE HeapCreate(
  2962. //
  2963. // DWORD flOptions,
  2964. // SIZE_T dwInitialSize,
  2965. // SIZE_T dwMaximumSize
  2966. //
  2967. // );
  2968. func XHeapCreate(t *TLS, flOptions uint32, dwInitialSize, dwMaximumSize types.Size_t) uintptr {
  2969. panic(todo(""))
  2970. }
  2971. // BOOL HeapDestroy(
  2972. //
  2973. // HANDLE hHeap
  2974. //
  2975. // );
  2976. func XHeapDestroy(t *TLS, hHeap uintptr) int32 {
  2977. panic(todo(""))
  2978. }
  2979. // LPVOID HeapReAlloc(
  2980. //
  2981. // HANDLE hHeap,
  2982. // DWORD dwFlags,
  2983. // _Frees_ptr_opt_ LPVOID lpMem,
  2984. // SIZE_T dwBytes
  2985. //
  2986. // );
  2987. func XHeapReAlloc(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr, dwBytes types.Size_t) uintptr {
  2988. panic(todo(""))
  2989. }
  2990. // SIZE_T HeapSize(
  2991. //
  2992. // HANDLE hHeap,
  2993. // DWORD dwFlags,
  2994. // LPCVOID lpMem
  2995. //
  2996. // );
  2997. func XHeapSize(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr) types.Size_t {
  2998. panic(todo(""))
  2999. }
  3000. // BOOL HeapValidate(
  3001. //
  3002. // HANDLE hHeap,
  3003. // DWORD dwFlags,
  3004. // LPCVOID lpMem
  3005. //
  3006. // );
  3007. func XHeapValidate(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr) int32 {
  3008. panic(todo(""))
  3009. }
  3010. // SIZE_T HeapCompact(
  3011. //
  3012. // HANDLE hHeap,
  3013. // DWORD dwFlags
  3014. //
  3015. // );
  3016. func XHeapCompact(t *TLS, hHeap uintptr, dwFlags uint32) types.Size_t {
  3017. panic(todo(""))
  3018. }
  3019. // HMODULE LoadLibraryA(LPCSTR lpLibFileName);
  3020. func XLoadLibraryA(t *TLS, lpLibFileName uintptr) uintptr {
  3021. panic(todo(""))
  3022. }
  3023. // HMODULE LoadLibraryW(
  3024. //
  3025. // LPCWSTR lpLibFileName
  3026. //
  3027. // );
  3028. func XLoadLibraryW(t *TLS, lpLibFileName uintptr) uintptr {
  3029. panic(todo(""))
  3030. }
  3031. // HLOCAL LocalFree(
  3032. //
  3033. // HLOCAL hMem
  3034. //
  3035. // );
  3036. func XLocalFree(t *TLS, hMem uintptr) uintptr {
  3037. h, err := syscall.LocalFree(syscall.Handle(hMem))
  3038. if h != 0 {
  3039. if err != nil {
  3040. t.setErrno(err)
  3041. } else {
  3042. t.setErrno(errno.EINVAL)
  3043. }
  3044. return uintptr(h)
  3045. }
  3046. return 0
  3047. }
  3048. // BOOL LockFile(
  3049. //
  3050. // HANDLE hFile,
  3051. // DWORD dwFileOffsetLow,
  3052. // DWORD dwFileOffsetHigh,
  3053. // DWORD nNumberOfBytesToLockLow,
  3054. // DWORD nNumberOfBytesToLockHigh
  3055. //
  3056. // );
  3057. func XLockFile(t *TLS, hFile uintptr, dwFileOffsetLow, dwFileOffsetHigh, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh uint32) int32 {
  3058. r1, _, e1 := syscall.Syscall6(procLockFile.Addr(), 5,
  3059. hFile, uintptr(dwFileOffsetLow), uintptr(dwFileOffsetHigh), uintptr(nNumberOfBytesToLockLow), uintptr(nNumberOfBytesToLockHigh), 0)
  3060. if r1 == 0 {
  3061. if e1 != 0 {
  3062. t.setErrno(e1)
  3063. } else {
  3064. t.setErrno(errno.EINVAL)
  3065. }
  3066. return 0
  3067. }
  3068. return int32(r1)
  3069. }
  3070. // BOOL LockFileEx(
  3071. //
  3072. // HANDLE hFile,
  3073. // DWORD dwFlags,
  3074. // DWORD dwReserved,
  3075. // DWORD nNumberOfBytesToLockLow,
  3076. // DWORD nNumberOfBytesToLockHigh,
  3077. // LPOVERLAPPED lpOverlapped
  3078. //
  3079. // );
  3080. func XLockFileEx(t *TLS, hFile uintptr, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh uint32, lpOverlapped uintptr) int32 {
  3081. r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6,
  3082. hFile, uintptr(dwFlags), uintptr(dwReserved), uintptr(nNumberOfBytesToLockLow), uintptr(nNumberOfBytesToLockHigh), lpOverlapped)
  3083. if r1 == 0 {
  3084. if e1 != 0 {
  3085. t.setErrno(e1)
  3086. } else {
  3087. t.setErrno(errno.EINVAL)
  3088. }
  3089. return 0
  3090. }
  3091. return int32(r1)
  3092. }
  3093. // LPVOID MapViewOfFile(
  3094. //
  3095. // HANDLE hFileMappingObject,
  3096. // DWORD dwDesiredAccess,
  3097. // DWORD dwFileOffsetHigh,
  3098. // DWORD dwFileOffsetLow,
  3099. // SIZE_T dwNumberOfBytesToMap
  3100. //
  3101. // );
  3102. func XMapViewOfFile(t *TLS, hFileMappingObject uintptr, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow uint32, dwNumberOfBytesToMap types.Size_t) uintptr {
  3103. h, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, hFileMappingObject, uintptr(dwDesiredAccess),
  3104. uintptr(dwFileOffsetHigh), uintptr(dwFileOffsetLow), uintptr(dwNumberOfBytesToMap), 0)
  3105. if h == 0 {
  3106. if e1 != 0 {
  3107. t.setErrno(e1)
  3108. } else {
  3109. t.setErrno(errno.EINVAL)
  3110. }
  3111. }
  3112. return h
  3113. }
  3114. // BOOL QueryPerformanceCounter(
  3115. //
  3116. // LARGE_INTEGER *lpPerformanceCount
  3117. //
  3118. // );
  3119. func XQueryPerformanceCounter(t *TLS, lpPerformanceCount uintptr) int32 {
  3120. r0, _, _ := syscall.Syscall(procQueryPerformanceCounter.Addr(), 1, lpPerformanceCount, 0, 0)
  3121. return int32(r0)
  3122. }
  3123. // void Sleep(
  3124. //
  3125. // DWORD dwMilliseconds
  3126. //
  3127. // );
  3128. func XSleep(t *TLS, dwMilliseconds uint32) {
  3129. gotime.Sleep(gotime.Duration(dwMilliseconds) * gotime.Millisecond)
  3130. }
  3131. // BOOL SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime);
  3132. func XSystemTimeToFileTime(t *TLS, lpSystemTime, lpFileTime uintptr) int32 {
  3133. r0, _, _ := syscall.Syscall(procSystemTimeToFileTime.Addr(), 2, lpSystemTime, lpFileTime, 0)
  3134. return int32(r0)
  3135. }
  3136. // BOOL UnlockFile(
  3137. //
  3138. // HANDLE hFile,
  3139. // DWORD dwFileOffsetLow,
  3140. // DWORD dwFileOffsetHigh,
  3141. // DWORD nNumberOfBytesToUnlockLow,
  3142. // DWORD nNumberOfBytesToUnlockHigh
  3143. //
  3144. // );
  3145. func XUnlockFile(t *TLS, hFile uintptr, dwFileOffsetLow, dwFileOffsetHigh, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh uint32) int32 {
  3146. r1, _, e1 := syscall.Syscall6(procUnlockFile.Addr(), 5,
  3147. hFile, uintptr(dwFileOffsetLow), uintptr(dwFileOffsetHigh), uintptr(nNumberOfBytesToUnlockLow), uintptr(nNumberOfBytesToUnlockHigh), 0)
  3148. if r1 == 0 {
  3149. if e1 != 0 {
  3150. t.setErrno(e1)
  3151. } else {
  3152. t.setErrno(errno.EINVAL)
  3153. }
  3154. return 0
  3155. }
  3156. return int32(r1)
  3157. }
  3158. // BOOL UnlockFileEx(
  3159. //
  3160. // HANDLE hFile,
  3161. // DWORD dwReserved,
  3162. // DWORD nNumberOfBytesToUnlockLow,
  3163. // DWORD nNumberOfBytesToUnlockHigh,
  3164. // LPOVERLAPPED lpOverlapped
  3165. //
  3166. // );
  3167. func XUnlockFileEx(t *TLS, hFile uintptr, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh uint32, lpOverlapped uintptr) int32 {
  3168. r1, _, e1 := syscall.Syscall6(procUnlockFileEx.Addr(), 5,
  3169. hFile, uintptr(dwReserved), uintptr(nNumberOfBytesToUnlockLow), uintptr(nNumberOfBytesToUnlockHigh), lpOverlapped, 0)
  3170. if r1 == 0 {
  3171. if e1 != 0 {
  3172. t.setErrno(e1)
  3173. } else {
  3174. t.setErrno(errno.EINVAL)
  3175. }
  3176. return 0
  3177. }
  3178. return int32(r1)
  3179. }
  3180. // BOOL UnmapViewOfFile(
  3181. //
  3182. // LPCVOID lpBaseAddress
  3183. //
  3184. // );
  3185. func XUnmapViewOfFile(t *TLS, lpBaseAddress uintptr) int32 {
  3186. err := syscall.UnmapViewOfFile(lpBaseAddress)
  3187. if err != nil {
  3188. t.setErrno(err)
  3189. return 0
  3190. }
  3191. return 1
  3192. }
  3193. // int WideCharToMultiByte(
  3194. //
  3195. // UINT CodePage,
  3196. // DWORD dwFlags,
  3197. // _In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr,
  3198. // int cchWideChar,
  3199. // LPSTR lpMultiByteStr,
  3200. // int cbMultiByte,
  3201. // LPCCH lpDefaultChar,
  3202. // LPBOOL lpUsedDefaultChar
  3203. //
  3204. // );
  3205. func XWideCharToMultiByte(t *TLS, CodePage uint32, dwFlags uint32, lpWideCharStr uintptr, cchWideChar int32, lpMultiByteStr uintptr, cbMultiByte int32, lpDefaultChar, lpUsedDefaultChar uintptr) int32 {
  3206. r1, _, _ := syscall.Syscall9(procWideCharToMultiByte.Addr(), 8,
  3207. uintptr(CodePage), uintptr(dwFlags), lpWideCharStr,
  3208. uintptr(cchWideChar), lpMultiByteStr, uintptr(cbMultiByte),
  3209. lpDefaultChar, lpUsedDefaultChar, 0)
  3210. return (int32(r1))
  3211. }
  3212. // void OutputDebugStringA(
  3213. //
  3214. // LPCSTR lpOutputString
  3215. //
  3216. // )
  3217. func XOutputDebugStringA(t *TLS, lpOutputString uintptr) {
  3218. panic(todo(""))
  3219. }
  3220. // BOOL FlushViewOfFile(
  3221. //
  3222. // LPCVOID lpBaseAddress,
  3223. // SIZE_T dwNumberOfBytesToFlush
  3224. //
  3225. // );
  3226. func XFlushViewOfFile(t *TLS, lpBaseAddress uintptr, dwNumberOfBytesToFlush types.Size_t) int32 {
  3227. err := syscall.FlushViewOfFile(lpBaseAddress, uintptr(dwNumberOfBytesToFlush))
  3228. if err != nil {
  3229. t.setErrno(err)
  3230. return 0
  3231. }
  3232. return 1
  3233. }
  3234. type _ino_t = uint16 /* types.h:43:24 */
  3235. type _dev_t = uint32 /* types.h:51:22 */
  3236. type _stat64 = struct {
  3237. Fst_dev _dev_t
  3238. Fst_ino _ino_t
  3239. Fst_mode uint16
  3240. Fst_nlink int16
  3241. Fst_uid int16
  3242. Fst_gid int16
  3243. _ [2]byte
  3244. Fst_rdev _dev_t
  3245. _ [4]byte
  3246. Fst_size int64
  3247. Fst_atime int64
  3248. Fst_mtime int64
  3249. Fst_ctime int64
  3250. } /* _mingw_stat64.h:83:3 */
  3251. var (
  3252. Windows_Tick int64 = 10000000
  3253. SecToUnixEpoch int64 = 11644473600
  3254. )
  3255. func WindowsTickToUnixSeconds(windowsTicks int64) int64 {
  3256. return (windowsTicks/Windows_Tick - SecToUnixEpoch)
  3257. }
  3258. // int _stat64(const char *path, struct __stat64 *buffer);
  3259. func X_stat64(t *TLS, path, buffer uintptr) int32 {
  3260. var fa syscall.Win32FileAttributeData
  3261. r1, _, e1 := syscall.Syscall(procGetFileAttributesExA.Addr(), 3, path, syscall.GetFileExInfoStandard, (uintptr)(unsafe.Pointer(&fa)))
  3262. if r1 == 0 {
  3263. if e1 != 0 {
  3264. t.setErrno(e1)
  3265. } else {
  3266. t.setErrno(errno.EINVAL)
  3267. }
  3268. return -1
  3269. }
  3270. var bStat64 = (*_stat64)(unsafe.Pointer(buffer))
  3271. var accessTime = int64(fa.LastAccessTime.HighDateTime)<<32 + int64(fa.LastAccessTime.LowDateTime)
  3272. bStat64.Fst_atime = WindowsTickToUnixSeconds(accessTime)
  3273. var modTime = int64(fa.LastWriteTime.HighDateTime)<<32 + int64(fa.LastWriteTime.LowDateTime)
  3274. bStat64.Fst_mtime = WindowsTickToUnixSeconds(modTime)
  3275. var crTime = int64(fa.CreationTime.HighDateTime)<<32 + int64(fa.CreationTime.LowDateTime)
  3276. bStat64.Fst_ctime = WindowsTickToUnixSeconds(crTime)
  3277. var fSz = int64(fa.FileSizeHigh)<<32 + int64(fa.FileSizeLow)
  3278. bStat64.Fst_size = fSz
  3279. bStat64.Fst_mode = WindowsAttrbiutesToStat(fa.FileAttributes)
  3280. return 0
  3281. }
  3282. func WindowsAttrbiutesToStat(fa uint32) uint16 {
  3283. var src_mode = fa & 0xff
  3284. var st_mode uint16
  3285. if (src_mode & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 {
  3286. st_mode = syscall.S_IFDIR
  3287. } else {
  3288. st_mode = syscall.S_IFREG
  3289. }
  3290. if src_mode&syscall.FILE_ATTRIBUTE_READONLY != 0 {
  3291. st_mode = st_mode | syscall.S_IRUSR
  3292. } else {
  3293. st_mode = st_mode | syscall.S_IRUSR | syscall.S_IWUSR
  3294. }
  3295. // fill group fields
  3296. st_mode = st_mode | (st_mode&0x700)>>3
  3297. st_mode = st_mode | (st_mode&0x700)>>6
  3298. return st_mode
  3299. }
  3300. // int _chsize(
  3301. //
  3302. // int fd,
  3303. // long size
  3304. //
  3305. // );
  3306. func X_chsize(t *TLS, fd int32, size long) int32 {
  3307. f, ok := fdToFile(fd)
  3308. if !ok {
  3309. t.setErrno(EBADF)
  3310. return -1
  3311. }
  3312. err := syscall.Ftruncate(f.Handle, int64(size))
  3313. if err != nil {
  3314. t.setErrno(err)
  3315. return -1
  3316. }
  3317. return 0
  3318. }
  3319. // int _snprintf(char *str, size_t size, const char *format, ...);
  3320. func X_snprintf(t *TLS, str uintptr, size types.Size_t, format, args uintptr) int32 {
  3321. return Xsnprintf(t, str, size, format, args)
  3322. }
  3323. const wErr_ERROR_INSUFFICIENT_BUFFER = 122
  3324. func win32FindDataToFileInfo(t *TLS, fdata *stat.X_finddata64i32_t, wfd *syscall.Win32finddata) int32 {
  3325. // t64 = 64-bit time value
  3326. var accessTime = int64(wfd.LastAccessTime.HighDateTime)<<32 + int64(wfd.LastAccessTime.LowDateTime)
  3327. fdata.Ftime_access = WindowsTickToUnixSeconds(accessTime)
  3328. var modTime = int64(wfd.LastWriteTime.HighDateTime)<<32 + int64(wfd.LastWriteTime.LowDateTime)
  3329. fdata.Ftime_write = WindowsTickToUnixSeconds(modTime)
  3330. var crTime = int64(wfd.CreationTime.HighDateTime)<<32 + int64(wfd.CreationTime.LowDateTime)
  3331. fdata.Ftime_create = WindowsTickToUnixSeconds(crTime)
  3332. // i32 = 32-bit size
  3333. fdata.Fsize = wfd.FileSizeLow
  3334. fdata.Fattrib = wfd.FileAttributes
  3335. var cp = XGetConsoleCP(t)
  3336. var wcFn = (uintptr)(unsafe.Pointer(&wfd.FileName[0]))
  3337. var mbcsFn = (uintptr)(unsafe.Pointer(&fdata.Fname[0]))
  3338. rv := XWideCharToMultiByte(t, cp, 0, wcFn, -1, mbcsFn, 260, 0, 0)
  3339. if rv == wErr_ERROR_INSUFFICIENT_BUFFER {
  3340. t.setErrno(errno.ENOMEM)
  3341. return -1
  3342. }
  3343. return 0
  3344. }
  3345. // intptr_t _findfirst64i32(
  3346. //
  3347. // const char *filespec,
  3348. // struct _finddata64i32_t *fileinfo
  3349. //
  3350. // );
  3351. func X_findfirst64i32(t *TLS, filespec, fileinfo uintptr) types.Intptr_t {
  3352. // Note: this is the 'narrow' character findfirst -- expects output
  3353. // as mbcs -- conversion below -- via ToFileInfo
  3354. var gsFileSpec = GoString(filespec)
  3355. namep, err := syscall.UTF16PtrFromString(gsFileSpec)
  3356. if err != nil {
  3357. t.setErrno(err)
  3358. return types.Intptr_t(-1)
  3359. }
  3360. var fdata = (*stat.X_finddata64i32_t)(unsafe.Pointer(fileinfo))
  3361. var wfd syscall.Win32finddata
  3362. h, err := syscall.FindFirstFile((*uint16)(unsafe.Pointer(namep)), &wfd)
  3363. if err != nil {
  3364. t.setErrno(err)
  3365. return types.Intptr_t(-1)
  3366. }
  3367. rv := win32FindDataToFileInfo(t, fdata, &wfd)
  3368. if rv != 0 {
  3369. if h != 0 {
  3370. syscall.FindClose(h)
  3371. }
  3372. return types.Intptr_t(-1)
  3373. }
  3374. return types.Intptr_t(h)
  3375. }
  3376. // int _findnext64i32(
  3377. //
  3378. // intptr_t handle,
  3379. // struct _finddata64i32_t *fileinfo
  3380. //
  3381. // );
  3382. func X_findnext64i32(t *TLS, handle types.Intptr_t, fileinfo uintptr) int32 {
  3383. var fdata = (*stat.X_finddata64i32_t)(unsafe.Pointer(fileinfo))
  3384. var wfd syscall.Win32finddata
  3385. err := syscall.FindNextFile(syscall.Handle(handle), &wfd)
  3386. if err != nil {
  3387. t.setErrno(err)
  3388. return -1
  3389. }
  3390. rv := win32FindDataToFileInfo(t, fdata, &wfd)
  3391. if rv != 0 {
  3392. return -1
  3393. }
  3394. return 0
  3395. }
  3396. // int _findclose(
  3397. //
  3398. // intptr_t handle
  3399. //
  3400. // );
  3401. func X_findclose(t *TLS, handle types.Intptr_t) int32 {
  3402. err := syscall.FindClose(syscall.Handle(handle))
  3403. if err != nil {
  3404. t.setErrno(err)
  3405. return -1
  3406. }
  3407. return 0
  3408. }
  3409. // DWORD GetEnvironmentVariableA(
  3410. //
  3411. // LPCSTR lpName,
  3412. // LPSTR lpBuffer,
  3413. // DWORD nSize
  3414. //
  3415. // );
  3416. func XGetEnvironmentVariableA(t *TLS, lpName, lpBuffer uintptr, nSize uint32) uint32 {
  3417. r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableA.Addr(), 3, lpName, lpBuffer, uintptr(nSize))
  3418. n := uint32(r0)
  3419. if n == 0 {
  3420. if e1 != 0 {
  3421. t.setErrno(e1)
  3422. } else {
  3423. t.setErrno(errno.EINVAL)
  3424. }
  3425. }
  3426. return n
  3427. }
  3428. // int _fstat64(
  3429. //
  3430. // int fd,
  3431. // struct __stat64 *buffer
  3432. //
  3433. // );
  3434. func X_fstat64(t *TLS, fd int32, buffer uintptr) int32 {
  3435. f, ok := fdToFile(fd)
  3436. if !ok {
  3437. t.setErrno(EBADF)
  3438. return -1
  3439. }
  3440. var d syscall.ByHandleFileInformation
  3441. err := syscall.GetFileInformationByHandle(f.Handle, &d)
  3442. if err != nil {
  3443. t.setErrno(EBADF)
  3444. return -1
  3445. }
  3446. var bStat64 = (*_stat64)(unsafe.Pointer(buffer))
  3447. var accessTime = int64(d.LastAccessTime.HighDateTime)<<32 + int64(d.LastAccessTime.LowDateTime)
  3448. bStat64.Fst_atime = WindowsTickToUnixSeconds(accessTime)
  3449. var modTime = int64(d.LastWriteTime.HighDateTime)<<32 + int64(d.LastWriteTime.LowDateTime)
  3450. bStat64.Fst_mtime = WindowsTickToUnixSeconds(modTime)
  3451. var crTime = int64(d.CreationTime.HighDateTime)<<32 + int64(d.CreationTime.LowDateTime)
  3452. bStat64.Fst_ctime = WindowsTickToUnixSeconds(crTime)
  3453. var fSz = int64(d.FileSizeHigh)<<32 + int64(d.FileSizeLow)
  3454. bStat64.Fst_size = fSz
  3455. bStat64.Fst_mode = WindowsAttrbiutesToStat(d.FileAttributes)
  3456. return 0
  3457. }
  3458. // HANDLE CreateEventA(
  3459. //
  3460. // LPSECURITY_ATTRIBUTES lpEventAttributes,
  3461. // BOOL bManualReset,
  3462. // BOOL bInitialState,
  3463. // LPCSTR lpName
  3464. //
  3465. // );
  3466. func XCreateEventA(t *TLS, lpEventAttributes uintptr, bManualReset, bInitialState int32, lpName uintptr) uintptr {
  3467. r0, _, err := syscall.Syscall6(procCreateEventA.Addr(), 4, lpEventAttributes, uintptr(bManualReset),
  3468. uintptr(bInitialState), lpName, 0, 0)
  3469. if r0 == 0 {
  3470. t.setErrno(err)
  3471. }
  3472. return r0
  3473. }
  3474. // BOOL WINAPI CancelSynchronousIo(
  3475. //
  3476. // _In_ HANDLE hThread
  3477. //
  3478. // );
  3479. func XCancelSynchronousIo(t *TLS, hThread uintptr) int32 {
  3480. panic(todo(""))
  3481. }
  3482. func X_endthreadex(t *TLS, _ ...interface{}) {
  3483. // NOOP
  3484. }
  3485. // The calling convention for beginthread is cdecl -- but in this
  3486. // case we're just intercepting it and sending it through CreateThread which expects stdcall
  3487. // and gets that via the go callback. This is safe because the thread is calling into go
  3488. // not a cdecl function which would expect the stack setup of cdecl.
  3489. func X_beginthread(t *TLS, procAddr uintptr, stack_sz uint32, args uintptr) int32 {
  3490. f := (*struct{ f func(*TLS, uintptr) uint32 })(unsafe.Pointer(&struct{ uintptr }{procAddr})).f
  3491. var tAdp = ThreadAdapter{threadFunc: f, tls: NewTLS(), param: args}
  3492. tAdp.token = addObject(&tAdp)
  3493. r0, _, err := syscall.Syscall6(procCreateThread.Addr(), 6, 0, uintptr(stack_sz),
  3494. threadCallback, tAdp.token, 0, 0)
  3495. if r0 == 0 {
  3496. t.setErrno(err)
  3497. }
  3498. return int32(r0)
  3499. }
  3500. // uintptr_t _beginthreadex( // NATIVE CODE
  3501. //
  3502. // void *security,
  3503. // unsigned stack_size,
  3504. // unsigned ( __stdcall *start_address )( void * ),
  3505. // void *arglist,
  3506. // unsigned initflag,
  3507. // unsigned *thrdaddr
  3508. //
  3509. // );
  3510. func X_beginthreadex(t *TLS, _ uintptr, stack_sz uint32, procAddr uintptr, args uintptr, initf uint32, thAddr uintptr) int32 {
  3511. f := (*struct{ f func(*TLS, uintptr) uint32 })(unsafe.Pointer(&struct{ uintptr }{procAddr})).f
  3512. var tAdp = ThreadAdapter{threadFunc: f, tls: NewTLS(), param: args}
  3513. tAdp.token = addObject(&tAdp)
  3514. r0, _, err := syscall.Syscall6(procCreateThread.Addr(), 6, 0, uintptr(stack_sz),
  3515. threadCallback, tAdp.token, uintptr(initf), thAddr)
  3516. if r0 == 0 {
  3517. t.setErrno(err)
  3518. }
  3519. return int32(r0)
  3520. }
  3521. // DWORD GetCurrentThreadId();
  3522. func XGetCurrentThreadId(t *TLS) uint32 {
  3523. r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0)
  3524. return uint32(r0)
  3525. //return uint32(t.ID)
  3526. }
  3527. // BOOL GetExitCodeThread(
  3528. //
  3529. // HANDLE hThread,
  3530. // LPDWORD lpExitCode
  3531. //
  3532. // );
  3533. func XGetExitCodeThread(t *TLS, hThread, lpExitCode uintptr) int32 {
  3534. r0, _, _ := syscall.Syscall(procGetExitCodeThread.Addr(), 2, hThread, lpExitCode, 0)
  3535. return int32(r0)
  3536. }
  3537. // DWORD WaitForSingleObjectEx(
  3538. //
  3539. // HANDLE hHandle,
  3540. // DWORD dwMilliseconds,
  3541. // BOOL bAlertable
  3542. //
  3543. // );
  3544. func XWaitForSingleObjectEx(t *TLS, hHandle uintptr, dwMilliseconds uint32, bAlertable int32) uint32 {
  3545. rv, _, _ := syscall.Syscall(procWaitForSingleObjectEx.Addr(), 3, hHandle, uintptr(dwMilliseconds), uintptr(bAlertable))
  3546. return uint32(rv)
  3547. }
  3548. // DWORD MsgWaitForMultipleObjectsEx(
  3549. //
  3550. // DWORD nCount,
  3551. // const HANDLE *pHandles,
  3552. // DWORD dwMilliseconds,
  3553. // DWORD dwWakeMask,
  3554. // DWORD dwFlags
  3555. //
  3556. // );
  3557. func XMsgWaitForMultipleObjectsEx(t *TLS, nCount uint32, pHandles uintptr, dwMilliseconds, dwWakeMask, dwFlags uint32) uint32 {
  3558. r0, _, err := syscall.Syscall6(procMsgWaitForMultipleObjectsEx.Addr(), 5,
  3559. uintptr(nCount),
  3560. pHandles,
  3561. uintptr(dwMilliseconds),
  3562. uintptr(dwWakeMask),
  3563. uintptr(dwFlags),
  3564. 0,
  3565. )
  3566. if err != 0 {
  3567. t.setErrno(err)
  3568. }
  3569. return uint32(r0)
  3570. }
  3571. func XMessageBoxW(t *TLS, _ ...interface{}) int32 {
  3572. panic(todo(""))
  3573. }
  3574. // DWORD GetModuleFileNameW(
  3575. //
  3576. // HMODULE hModule,
  3577. // LPWSTR lpFileName,
  3578. // DWORD nSize
  3579. //
  3580. // );
  3581. func XGetModuleFileNameW(t *TLS, hModule, lpFileName uintptr, nSize uint32) uint32 {
  3582. r0, _, err := syscall.Syscall(procGetModuleFileNameW.Addr(), 3, hModule, lpFileName, uintptr(nSize))
  3583. if r0 == 0 {
  3584. t.setErrno(err)
  3585. }
  3586. return uint32(r0)
  3587. }
  3588. // NET_API_STATUS NET_API_FUNCTION NetGetDCName(
  3589. //
  3590. // LPCWSTR ServerName,
  3591. // LPCWSTR DomainName,
  3592. // LPBYTE *Buffer
  3593. //
  3594. // );
  3595. func XNetGetDCName(t *TLS, ServerName, DomainName, Buffer uintptr) int32 {
  3596. r0, _, err := syscall.Syscall(procNetGetDCName.Addr(), 3, ServerName, DomainName, Buffer)
  3597. if err != 0 {
  3598. t.setErrno(err)
  3599. }
  3600. return int32(r0)
  3601. }
  3602. // NET_API_STATUS NET_API_FUNCTION NetUserGetInfo(
  3603. //
  3604. // LPCWSTR servername,
  3605. // LPCWSTR username,
  3606. // DWORD level,
  3607. // LPBYTE *bufptr
  3608. //
  3609. // );
  3610. func XNetUserGetInfo(t *TLS, servername, username uintptr, level uint32, bufptr uintptr) uint32 {
  3611. r0, _, err := syscall.Syscall6(procNetUserGetInfo.Addr(), 4,
  3612. servername,
  3613. username,
  3614. uintptr(level),
  3615. bufptr,
  3616. 0,
  3617. 0,
  3618. )
  3619. if err != 0 {
  3620. t.setErrno(err)
  3621. }
  3622. return uint32(r0)
  3623. }
  3624. func XlstrlenW(t *TLS, _ ...interface{}) int32 {
  3625. panic(todo(""))
  3626. }
  3627. // USERENVAPI BOOL GetProfilesDirectoryW(
  3628. //
  3629. // [out] LPWSTR lpProfileDir,
  3630. // [in, out] LPDWORD lpcchSize
  3631. //
  3632. // );
  3633. func XGetProfilesDirectoryW(t *TLS, lpProfileDir, lpcchSize uintptr) int32 {
  3634. r0, _, err := syscall.Syscall(procGetProfilesDirectoryW.Addr(), 2, lpProfileDir, lpcchSize, 0)
  3635. if err != 0 {
  3636. t.setErrno(err)
  3637. }
  3638. return int32(r0)
  3639. }
  3640. func XNetApiBufferFree(t *TLS, _ ...interface{}) int32 {
  3641. panic(todo(""))
  3642. }
  3643. // DWORD GetPrivateProfileStringA(
  3644. //
  3645. // LPCSTR lpAppName,
  3646. // LPCSTR lpKeyName,
  3647. // LPCSTR lpDefault,
  3648. // LPSTR lpReturnedString,
  3649. // DWORD nSize,
  3650. // LPCSTR lpFileName
  3651. //
  3652. // );
  3653. func XGetPrivateProfileStringA(t *TLS, lpAppName, lpKeyName, lpDefault, lpReturnedString uintptr, nSize uint32, lpFileName uintptr) uint32 {
  3654. r0, _, err := syscall.Syscall6(procGetPrivateProfileStringA.Addr(), 4,
  3655. lpAppName,
  3656. lpKeyName,
  3657. lpDefault,
  3658. lpReturnedString,
  3659. uintptr(nSize),
  3660. lpFileName,
  3661. )
  3662. if err != 0 {
  3663. t.setErrno(0x02)
  3664. }
  3665. return uint32(r0)
  3666. }
  3667. func XGetWindowsDirectoryA(t *TLS, _ ...interface{}) int32 {
  3668. panic(todo(""))
  3669. }
  3670. // BOOL GetFileSecurityW(
  3671. //
  3672. // LPCSTR lpFileName,
  3673. // SECURITY_INFORMATION RequestedInformation,
  3674. // PSECURITY_DESCRIPTOR pSecurityDescriptor,
  3675. // DWORD nLength,
  3676. // LPDWORD lpnLengthNeeded
  3677. //
  3678. // );
  3679. func XGetFileSecurityW(t *TLS, lpFileName uintptr, RequestedInformation uint32, pSecurityDescriptor uintptr, nLength uint32, lpnLengthNeeded uintptr) int32 {
  3680. r0, _, err := syscall.Syscall6(procGetFileSecurityW.Addr(), 5, lpFileName, uintptr(RequestedInformation), pSecurityDescriptor, uintptr(nLength), lpnLengthNeeded, 0)
  3681. if err != 0 {
  3682. t.setErrno(err)
  3683. }
  3684. return int32(r0)
  3685. }
  3686. // BOOL GetSecurityDescriptorOwner(
  3687. //
  3688. // PSECURITY_DESCRIPTOR pSecurityDescriptor,
  3689. // PSID *pOwner,
  3690. // LPBOOL lpbOwnerDefaulted
  3691. //
  3692. // );
  3693. func XGetSecurityDescriptorOwner(t *TLS, pSecurityDescriptor, pOwner, lpbOwnerDefaulted uintptr) int32 {
  3694. r0, _, err := syscall.Syscall(procGetSecurityDescriptorOwner.Addr(), 3, pSecurityDescriptor, pOwner, lpbOwnerDefaulted)
  3695. if err != 0 {
  3696. t.setErrno(err)
  3697. }
  3698. return int32(r0)
  3699. }
  3700. // PSID_IDENTIFIER_AUTHORITY GetSidIdentifierAuthority(
  3701. //
  3702. // PSID pSid
  3703. //
  3704. // );
  3705. func XGetSidIdentifierAuthority(t *TLS, pSid uintptr) uintptr {
  3706. r0, _, err := syscall.Syscall(procGetSidIdentifierAuthority.Addr(), 1, pSid, 0, 0)
  3707. if err != 0 {
  3708. t.setErrno(err)
  3709. }
  3710. return r0
  3711. }
  3712. // BOOL ImpersonateSelf(
  3713. //
  3714. // SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
  3715. //
  3716. // );
  3717. func XImpersonateSelf(t *TLS, ImpersonationLevel int32) int32 {
  3718. r0, _, err := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(ImpersonationLevel), 0, 0)
  3719. if err != 0 {
  3720. t.setErrno(err)
  3721. }
  3722. return int32(r0)
  3723. }
  3724. // BOOL OpenThreadToken(
  3725. //
  3726. // HANDLE ThreadHandle,
  3727. // DWORD DesiredAccess,
  3728. // BOOL OpenAsSelf,
  3729. // PHANDLE TokenHandle
  3730. //
  3731. // );
  3732. func XOpenThreadToken(t *TLS, ThreadHandle uintptr, DesiredAccess uint32, OpenAsSelf int32, TokenHandle uintptr) int32 {
  3733. r0, _, err := syscall.Syscall6(procOpenThreadToken.Addr(), 4, ThreadHandle, uintptr(DesiredAccess), uintptr(OpenAsSelf), TokenHandle, 0, 0)
  3734. if err != 0 {
  3735. t.setErrno(err)
  3736. }
  3737. return int32(r0)
  3738. }
  3739. // HANDLE GetCurrentThread();
  3740. func XGetCurrentThread(t *TLS) uintptr {
  3741. r0, _, err := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0)
  3742. if err != 0 {
  3743. t.setErrno(err)
  3744. }
  3745. return r0
  3746. }
  3747. // BOOL RevertToSelf();
  3748. func XRevertToSelf(t *TLS) int32 {
  3749. r0, _, err := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0)
  3750. if err != 0 {
  3751. t.setErrno(err)
  3752. }
  3753. return int32(r0)
  3754. }
  3755. // BOOL AccessCheck(
  3756. //
  3757. // PSECURITY_DESCRIPTOR pSecurityDescriptor,
  3758. // HANDLE ClientToken,
  3759. // DWORD DesiredAccess,
  3760. // PGENERIC_MAPPING GenericMapping,
  3761. // PPRIVILEGE_SET PrivilegeSet,
  3762. // LPDWORD PrivilegeSetLength,
  3763. // LPDWORD GrantedAccess,
  3764. // LPBOOL AccessStatus
  3765. //
  3766. // );
  3767. func XAccessCheck(t *TLS, pSecurityDescriptor, ClientToken uintptr, DesiredAccess uint32, GenericMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess, AccessStatus uintptr) int32 {
  3768. r0, _, err := syscall.Syscall9(procAccessCheck.Addr(), 8,
  3769. pSecurityDescriptor,
  3770. ClientToken,
  3771. uintptr(DesiredAccess),
  3772. GenericMapping,
  3773. PrivilegeSet,
  3774. PrivilegeSetLength,
  3775. GrantedAccess,
  3776. AccessStatus,
  3777. 0,
  3778. )
  3779. if err != 0 {
  3780. t.setErrno(err)
  3781. }
  3782. return int32(r0)
  3783. }
  3784. // int _wcsicmp(
  3785. //
  3786. // const wchar_t *string1,
  3787. // const wchar_t *string2
  3788. //
  3789. // );
  3790. func Xwcsicmp(t *TLS, string1, string2 uintptr) int32 {
  3791. var s1 = strings.ToLower(goWideString(string1))
  3792. var s2 = strings.ToLower(goWideString(string2))
  3793. return int32(strings.Compare(s1, s2))
  3794. }
  3795. // BOOL SetCurrentDirectoryW(
  3796. //
  3797. // LPCTSTR lpPathName
  3798. //
  3799. // );
  3800. func XSetCurrentDirectoryW(t *TLS, lpPathName uintptr) int32 {
  3801. err := syscall.SetCurrentDirectory((*uint16)(unsafe.Pointer(lpPathName)))
  3802. if err != nil {
  3803. t.setErrno(err)
  3804. return 0
  3805. }
  3806. return 1
  3807. }
  3808. // DWORD GetCurrentDirectory(
  3809. //
  3810. // DWORD nBufferLength,
  3811. // LPWTSTR lpBuffer
  3812. //
  3813. // );
  3814. func XGetCurrentDirectoryW(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 {
  3815. n, err := syscall.GetCurrentDirectory(nBufferLength, (*uint16)(unsafe.Pointer(lpBuffer)))
  3816. if err != nil {
  3817. t.setErrno(err)
  3818. }
  3819. return n
  3820. }
  3821. // BOOL GetFileInformationByHandle(
  3822. //
  3823. // HANDLE hFile,
  3824. // LPBY_HANDLE_FILE_INFORMATION lpFileInformation
  3825. //
  3826. // );
  3827. func XGetFileInformationByHandle(t *TLS, hFile, lpFileInformation uintptr) int32 {
  3828. r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, hFile, lpFileInformation, 0)
  3829. if r1 == 0 {
  3830. if e1 != 0 {
  3831. t.setErrno(e1)
  3832. } else {
  3833. t.setErrno(errno.EINVAL)
  3834. }
  3835. }
  3836. return int32(r1)
  3837. }
  3838. // BOOL GetVolumeInformationW(
  3839. //
  3840. // LPCWSTR lpRootPathName,
  3841. // LPWSTR lpVolumeNameBuffer,
  3842. // DWORD nVolumeNameSize,
  3843. // LPDWORD lpVolumeSerialNumber,
  3844. // LPDWORD lpMaximumComponentLength,
  3845. // LPDWORD lpFileSystemFlags,
  3846. // LPWSTR lpFileSystemNameBuffer,
  3847. // DWORD nFileSystemNameSize
  3848. //
  3849. // );
  3850. func XGetVolumeInformationW(t *TLS, lpRootPathName, lpVolumeNameBuffer uintptr, nVolumeNameSize uint32, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer uintptr, nFileSystemNameSize uint32) int32 {
  3851. r0, _, err := syscall.Syscall9(procGetVolumeInformationW.Addr(), 8,
  3852. lpRootPathName,
  3853. lpVolumeNameBuffer,
  3854. uintptr(nVolumeNameSize),
  3855. lpVolumeSerialNumber,
  3856. lpMaximumComponentLength,
  3857. lpFileSystemFlags,
  3858. lpFileSystemNameBuffer,
  3859. uintptr(nFileSystemNameSize),
  3860. 0,
  3861. )
  3862. if err != 0 {
  3863. t.setErrno(err)
  3864. }
  3865. return int32(r0)
  3866. }
  3867. // wchar_t *wcschr(
  3868. //
  3869. // const wchar_t *str,
  3870. // wchar_t c
  3871. //
  3872. // );
  3873. func Xwcschr(t *TLS, str uintptr, c wchar_t) uintptr {
  3874. var source = str
  3875. for {
  3876. var buf = *(*uint16)(unsafe.Pointer(source))
  3877. if buf == 0 {
  3878. return 0
  3879. }
  3880. if buf == c {
  3881. return source
  3882. }
  3883. // wchar_t = 2 bytes
  3884. source++
  3885. source++
  3886. }
  3887. }
  3888. // BOOL SetFileTime(
  3889. //
  3890. // HANDLE hFile,
  3891. // const FILETIME *lpCreationTime,
  3892. // const FILETIME *lpLastAccessTime,
  3893. // const FILETIME *lpLastWriteTime
  3894. //
  3895. // );
  3896. func XSetFileTime(t *TLS, hFile uintptr, lpCreationTime, lpLastAccessTime, lpLastWriteTime uintptr) int32 {
  3897. panic(todo(""))
  3898. }
  3899. // DWORD GetNamedSecurityInfoW(
  3900. //
  3901. // LPCWSTR pObjectName,
  3902. // SE_OBJECT_TYPE ObjectType,
  3903. // SECURITY_INFORMATION SecurityInfo,
  3904. // PSID *ppsidOwner,
  3905. // PSID *ppsidGroup,
  3906. // PACL *ppDacl,
  3907. // PACL *ppSacl,
  3908. // PSECURITY_DESCRIPTOR *ppSecurityDescriptor
  3909. //
  3910. // );
  3911. func XGetNamedSecurityInfoW(t *TLS, pObjectName uintptr, ObjectType, SecurityInfo uint32, ppsidOwner, ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor uintptr) uint32 {
  3912. panic(todo(""))
  3913. }
  3914. // BOOL OpenProcessToken(
  3915. //
  3916. // HANDLE ProcessHandle,
  3917. // DWORD DesiredAccess,
  3918. // PHANDLE TokenHandle
  3919. //
  3920. // );
  3921. func XOpenProcessToken(t *TLS, ProcessHandle uintptr, DesiredAccess uint32, TokenHandle uintptr) int32 {
  3922. panic(todo(""))
  3923. }
  3924. // BOOL GetTokenInformation(
  3925. //
  3926. // HANDLE TokenHandle,
  3927. // TOKEN_INFORMATION_CLASS TokenInformationClass,
  3928. // LPVOID TokenInformation,
  3929. // DWORD TokenInformationLength,
  3930. // PDWORD ReturnLength
  3931. //
  3932. // );
  3933. func XGetTokenInformation(t *TLS, TokenHandle uintptr, TokenInformationClass uint32, TokenInformation uintptr, TokenInformationLength uint32, ReturnLength uintptr) int32 {
  3934. panic(todo(""))
  3935. }
  3936. // BOOL EqualSid(
  3937. //
  3938. // PSID pSid1,
  3939. // PSID pSid2
  3940. //
  3941. // );
  3942. func XEqualSid(t *TLS, pSid1, pSid2 uintptr) int32 {
  3943. panic(todo(""))
  3944. }
  3945. // int WSAStartup(
  3946. //
  3947. // WORD wVersionRequired,
  3948. // LPWSADATA lpWSAData
  3949. //
  3950. // );
  3951. func XWSAStartup(t *TLS, wVersionRequired uint16, lpWSAData uintptr) int32 {
  3952. r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(wVersionRequired), lpWSAData, 0)
  3953. if r0 != 0 {
  3954. t.setErrno(r0)
  3955. }
  3956. return int32(r0)
  3957. }
  3958. // HMODULE GetModuleHandleA(LPCSTR lpModuleName);
  3959. func XGetModuleHandleA(t *TLS, lpModuleName uintptr) uintptr {
  3960. r0, _, err := syscall.Syscall(procGetModuleHandleA.Addr(), 1, lpModuleName, 0, 0)
  3961. if r0 == 0 {
  3962. t.setErrno(err)
  3963. }
  3964. return r0
  3965. }
  3966. // HMODULE GetModuleHandleW(
  3967. //
  3968. // LPCWSTR lpModuleName
  3969. //
  3970. // );
  3971. func XGetModuleHandleW(t *TLS, lpModuleName uintptr) uintptr {
  3972. r0, _, err := syscall.Syscall(procGetModuleHandleW.Addr(), 1, lpModuleName, 0, 0)
  3973. if r0 == 0 {
  3974. t.setErrno(err)
  3975. }
  3976. return r0
  3977. }
  3978. // DWORD GetEnvironmentVariableW(
  3979. //
  3980. // LPCWSTR lpName,
  3981. // LPWSTR lpBuffer,
  3982. // DWORD nSize
  3983. //
  3984. // );
  3985. func XGetEnvironmentVariableW(t *TLS, lpName, lpBuffer uintptr, nSize uint32) uint32 {
  3986. r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, lpName, lpBuffer, uintptr(nSize))
  3987. n := uint32(r0)
  3988. if n == 0 {
  3989. if e1 != 0 {
  3990. t.setErrno(e1)
  3991. } else {
  3992. t.setErrno(errno.EINVAL)
  3993. }
  3994. }
  3995. return n
  3996. }
  3997. // int lstrcmpiA(
  3998. //
  3999. // LPCSTR lpString1,
  4000. // LPCSTR lpString2
  4001. //
  4002. // );
  4003. func XlstrcmpiA(t *TLS, lpString1, lpString2 uintptr) int32 {
  4004. var s1 = strings.ToLower(GoString(lpString1))
  4005. var s2 = strings.ToLower(GoString(lpString2))
  4006. return int32(strings.Compare(s1, s2))
  4007. }
  4008. func XGetModuleFileNameA(t *TLS, _ ...interface{}) int32 {
  4009. panic(todo(""))
  4010. }
  4011. // UINT GetACP();
  4012. func XGetACP(t *TLS) uint32 {
  4013. r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)
  4014. return uint32(r0)
  4015. }
  4016. // BOOL GetUserNameW(
  4017. //
  4018. // LPWSTR lpBuffer,
  4019. // LPDWORD pcbBuffer
  4020. //
  4021. // );
  4022. func XGetUserNameW(t *TLS, lpBuffer, pcbBuffer uintptr) int32 {
  4023. u, err := user.Current()
  4024. if err != nil {
  4025. panic(todo(""))
  4026. return 0
  4027. }
  4028. wcnt := *(*uint16)(unsafe.Pointer(pcbBuffer))
  4029. s := utf16.Encode([]rune(u.Username))
  4030. if len(s)+1 > int(wcnt) {
  4031. panic(todo(""))
  4032. }
  4033. *(*uint16)(unsafe.Pointer(pcbBuffer)) = uint16(len(s) + 1)
  4034. for _, v := range s {
  4035. *(*uint16)(unsafe.Pointer(lpBuffer)) = v
  4036. lpBuffer += 2
  4037. }
  4038. return 1
  4039. }
  4040. // HMODULE LoadLibraryExW(
  4041. //
  4042. // LPCWSTR lpLibFileName,
  4043. // HANDLE hFile,
  4044. // DWORD dwFlags
  4045. //
  4046. // );
  4047. func XLoadLibraryExW(t *TLS, lpLibFileName, hFile uintptr, dwFlags uint32) uintptr {
  4048. return 0 // If the function fails, the return value is NULL.
  4049. }
  4050. // wchar_t *wcscpy(
  4051. //
  4052. // wchar_t *strDestination,
  4053. // const wchar_t *strSource
  4054. //
  4055. // );
  4056. func Xwcscpy(t *TLS, strDestination, strSource uintptr) uintptr {
  4057. if strSource == 0 {
  4058. return 0
  4059. }
  4060. d := strDestination
  4061. for {
  4062. c := *(*uint16)(unsafe.Pointer(strSource))
  4063. strSource += 2
  4064. *(*uint16)(unsafe.Pointer(d)) = c
  4065. d += 2
  4066. if c == 0 {
  4067. return strDestination
  4068. }
  4069. }
  4070. }
  4071. func XwsprintfW(t *TLS, _ ...interface{}) int32 {
  4072. panic(todo(""))
  4073. }
  4074. // ATOM RegisterClassW(
  4075. //
  4076. // const WNDCLASSW *lpWndClass
  4077. //
  4078. // );
  4079. func XRegisterClassW(t *TLS, lpWndClass uintptr) int32 {
  4080. r0, _, err := syscall.Syscall(procRegisterClassW.Addr(), 1, lpWndClass, 0, 0)
  4081. if r0 == 0 {
  4082. t.setErrno(err)
  4083. }
  4084. return int32(r0)
  4085. }
  4086. func XKillTimer(t *TLS, _ ...interface{}) int32 {
  4087. panic(todo(""))
  4088. }
  4089. func XDestroyWindow(t *TLS, _ ...interface{}) int32 {
  4090. panic(todo(""))
  4091. }
  4092. // BOOL UnregisterClassW(
  4093. //
  4094. // LPCWSTR lpClassName,
  4095. // HINSTANCE hInstance
  4096. //
  4097. // );
  4098. func XUnregisterClassW(t *TLS, lpClassName, hInstance uintptr) int32 {
  4099. r0, _, err := syscall.Syscall(procUnregisterClassW.Addr(), 2, lpClassName, hInstance, 0)
  4100. if r0 == 0 {
  4101. t.setErrno(err)
  4102. }
  4103. return int32(r0)
  4104. }
  4105. func XPostMessageW(t *TLS, _ ...interface{}) int32 {
  4106. panic(todo(""))
  4107. }
  4108. func XSetTimer(t *TLS, _ ...interface{}) int32 {
  4109. panic(todo(""))
  4110. }
  4111. // HWND CreateWindowExW(
  4112. //
  4113. // DWORD dwExStyle,
  4114. // LPCWSTR lpClassName,
  4115. // LPCWSTR lpWindowName,
  4116. // DWORD dwStyle,
  4117. // int X,
  4118. // int Y,
  4119. // int nWidth,
  4120. // int nHeight,
  4121. // HWND hWndParent,
  4122. // HMENU hMenu,
  4123. // HINSTANCE hInstance,
  4124. // LPVOID lpParam
  4125. //
  4126. // );
  4127. func XCreateWindowExW(t *TLS, dwExStyle uint32, lpClassName, lpWindowName uintptr, dwStyle uint32, x, y, nWidth, nHeight int32, hWndParent, hMenu, hInstance, lpParam uintptr) uintptr {
  4128. r0, _, err := syscall.Syscall12(procCreateWindowExW.Addr(), 12,
  4129. uintptr(dwExStyle),
  4130. lpClassName,
  4131. lpWindowName,
  4132. uintptr(dwStyle),
  4133. uintptr(x),
  4134. uintptr(y),
  4135. uintptr(nWidth),
  4136. uintptr(nHeight),
  4137. hWndParent,
  4138. hMenu,
  4139. hInstance,
  4140. lpParam,
  4141. )
  4142. if err != 0 {
  4143. t.setErrno(err)
  4144. }
  4145. return r0
  4146. }
  4147. // BOOL PeekMessageW(
  4148. //
  4149. // LPMSG lpMsg,
  4150. // HWND hWnd,
  4151. // UINT wMsgFilterMin,
  4152. // UINT wMsgFilterMax,
  4153. // UINT wRemoveMsg
  4154. //
  4155. // );
  4156. func XPeekMessageW(t *TLS, lpMsg, hWnd uintptr, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) int32 {
  4157. r0, _, err := syscall.Syscall6(procPeekMessageW.Addr(), 5,
  4158. lpMsg,
  4159. hWnd,
  4160. uintptr(wMsgFilterMin),
  4161. uintptr(wMsgFilterMax),
  4162. uintptr(wRemoveMsg),
  4163. 0,
  4164. )
  4165. if err != 0 {
  4166. t.setErrno(err)
  4167. }
  4168. return int32(r0)
  4169. }
  4170. func XGetMessageW(t *TLS, _ ...interface{}) int32 {
  4171. panic(todo(""))
  4172. }
  4173. func XPostQuitMessage(t *TLS, _ ...interface{}) int32 {
  4174. panic(todo(""))
  4175. }
  4176. func XTranslateMessage(t *TLS, _ ...interface{}) int32 {
  4177. panic(todo(""))
  4178. }
  4179. func XDispatchMessageW(t *TLS, _ ...interface{}) int32 {
  4180. panic(todo(""))
  4181. }
  4182. // DWORD SleepEx(
  4183. //
  4184. // DWORD dwMilliseconds,
  4185. // BOOL bAlertable
  4186. //
  4187. // );
  4188. func XSleepEx(t *TLS, dwMilliseconds uint32, bAlertable int32) uint32 {
  4189. r0, _, _ := syscall.Syscall(procSleepEx.Addr(), 2, uintptr(dwMilliseconds), uintptr(bAlertable), 0)
  4190. return uint32(r0)
  4191. }
  4192. // BOOL CreatePipe(
  4193. //
  4194. // PHANDLE hReadPipe,
  4195. // PHANDLE hWritePipe,
  4196. // LPSECURITY_ATTRIBUTES lpPipeAttributes,
  4197. // DWORD nSize
  4198. //
  4199. // );
  4200. func XCreatePipe(t *TLS, hReadPipe, hWritePipe, lpPipeAttributes uintptr, nSize uint32) int32 {
  4201. r0, _, err := syscall.Syscall6(procCreatePipe.Addr(), 4, hReadPipe, hWritePipe, lpPipeAttributes, uintptr(nSize), 0, 0)
  4202. if r0 == 0 {
  4203. t.setErrno(err)
  4204. }
  4205. return int32(r0)
  4206. }
  4207. // BOOL CreateProcessW(
  4208. //
  4209. // LPCWSTR lpApplicationName,
  4210. // LPWSTR lpCommandLine,
  4211. // LPSECURITY_ATTRIBUTES lpProcessAttributes,
  4212. // LPSECURITY_ATTRIBUTES lpThreadAttributes,
  4213. // BOOL bInheritHandles,
  4214. // DWORD dwCreationFlags,
  4215. // LPVOID lpEnvironment,
  4216. // LPCWSTR lpCurrentDirectory,
  4217. // LPSTARTUPINFOW lpStartupInfo,
  4218. // LPPROCESS_INFORMATION lpProcessInformation
  4219. //
  4220. // );
  4221. func XCreateProcessW(t *TLS, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes uintptr, bInheritHandles int32, dwCreationFlags uint32,
  4222. lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation uintptr) int32 {
  4223. r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,
  4224. uintptr(bInheritHandles), uintptr(dwCreationFlags), lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, 0, 0)
  4225. if r1 == 0 {
  4226. if e1 != 0 {
  4227. t.setErrno(e1)
  4228. } else {
  4229. t.setErrno(errno.EINVAL)
  4230. }
  4231. }
  4232. return int32(r1)
  4233. }
  4234. // DWORD WaitForInputIdle(
  4235. //
  4236. // HANDLE hProcess,
  4237. // DWORD dwMilliseconds
  4238. //
  4239. // );
  4240. func XWaitForInputIdle(t *TLS, hProcess uintptr, dwMilliseconds uint32) int32 {
  4241. r0, _, _ := syscall.Syscall(procWaitForInputIdle.Addr(), 2, hProcess, uintptr(dwMilliseconds), 0)
  4242. return int32(r0)
  4243. }
  4244. // DWORD SearchPathW(
  4245. //
  4246. // LPCWSTR lpPath,
  4247. // LPCWSTR lpFileName,
  4248. // LPCWSTR lpExtension,
  4249. // DWORD nBufferLength,
  4250. // LPWSTR lpBuffer,
  4251. // LPWSTR *lpFilePart
  4252. //
  4253. // );
  4254. func XSearchPathW(t *TLS, lpPath, lpFileName, lpExtension uintptr, nBufferLength uint32, lpBuffer, lpFilePart uintptr) int32 {
  4255. r0, _, err := syscall.Syscall6(procSearchPathW.Addr(), 6, lpPath, lpFileName, lpExtension, uintptr(nBufferLength), lpBuffer, lpFilePart)
  4256. if r0 == 0 {
  4257. t.setErrno(err)
  4258. }
  4259. return int32(r0)
  4260. }
  4261. func XGetShortPathNameW(t *TLS, _ ...interface{}) int32 {
  4262. panic(todo(""))
  4263. }
  4264. // BOOL GetExitCodeProcess(
  4265. //
  4266. // HANDLE hProcess,
  4267. // LPDWORD lpExitCode
  4268. //
  4269. // );
  4270. func XGetExitCodeProcess(t *TLS, hProcess, lpExitCode uintptr) int32 {
  4271. r0, _, err := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, hProcess, lpExitCode, 0)
  4272. if r0 == 0 {
  4273. t.setErrno(err)
  4274. }
  4275. return int32(r0)
  4276. }
  4277. // BOOL PeekNamedPipe(
  4278. //
  4279. // HANDLE hNamedPipe,
  4280. // LPVOID lpBuffer,
  4281. // DWORD nBufferSize,
  4282. // LPDWORD lpBytesRead,
  4283. // LPDWORD lpTotalBytesAvail,
  4284. // LPDWORD lpBytesLeftThisMessage
  4285. //
  4286. // );
  4287. func XPeekNamedPipe(t *TLS, hNamedPipe, lpBuffer uintptr, nBufferSize uint32, lpBytesRead, lpTotalBytesAvail, lpBytesLeftThisMessage uintptr) int32 {
  4288. r0, _, err := syscall.Syscall6(procPeekNamedPipe.Addr(), 6, hNamedPipe, lpBuffer, uintptr(nBufferSize), lpBytesRead, lpTotalBytesAvail, lpBytesLeftThisMessage)
  4289. if r0 == 0 {
  4290. t.setErrno(err)
  4291. }
  4292. return int32(r0)
  4293. }
  4294. // long _InterlockedExchange(
  4295. //
  4296. // long volatile * Target,
  4297. // long Value
  4298. //
  4299. // );
  4300. func X_InterlockedExchange(t *TLS, Target uintptr, Value long) long {
  4301. old := atomic.SwapInt32((*int32)(unsafe.Pointer(Target)), Value)
  4302. return old
  4303. }
  4304. // BOOL TerminateThread(
  4305. //
  4306. // [in, out] HANDLE hThread,
  4307. // [in] DWORD dwExitCode
  4308. //
  4309. // );
  4310. func XTerminateThread(t *TLS, hThread uintptr, dwExitCode uint32) int32 {
  4311. r0, _, err := syscall.Syscall(procTerminateThread.Addr(), 2, hThread, uintptr(dwExitCode), 0)
  4312. if err != 0 {
  4313. t.setErrno(err)
  4314. }
  4315. return int32(r0)
  4316. }
  4317. // BOOL GetComputerNameW(
  4318. //
  4319. // LPWSTR lpBuffer,
  4320. // LPDWORD nSize
  4321. //
  4322. // );
  4323. func XGetComputerNameW(t *TLS, lpBuffer, nSize uintptr) int32 {
  4324. panic(todo(""))
  4325. }
  4326. func Xgethostname(t *TLS, _ ...interface{}) int32 {
  4327. panic(todo(""))
  4328. }
  4329. func XSendMessageW(t *TLS, _ ...interface{}) int32 {
  4330. panic(todo(""))
  4331. }
  4332. func XWSAGetLastError(t *TLS, _ ...interface{}) int32 {
  4333. panic(todo(""))
  4334. }
  4335. func Xclosesocket(t *TLS, _ ...interface{}) int32 {
  4336. panic(todo(""))
  4337. }
  4338. func XWspiapiFreeAddrInfo(t *TLS, _ ...interface{}) int32 {
  4339. panic(todo(""))
  4340. }
  4341. func XWspiapiGetNameInfo(t *TLS, _ ...interface{}) int32 {
  4342. panic(todo(""))
  4343. }
  4344. func XIN6_ADDR_EQUAL(t *TLS, _ ...interface{}) int32 {
  4345. panic(todo(""))
  4346. }
  4347. func X__ccgo_in6addr_anyp(t *TLS, _ ...interface{}) int32 {
  4348. panic(todo(""))
  4349. }
  4350. func XIN6_IS_ADDR_V4MAPPED(t *TLS, _ ...interface{}) int32 {
  4351. panic(todo(""))
  4352. }
  4353. func XSetHandleInformation(t *TLS, _ ...interface{}) int32 {
  4354. panic(todo(""))
  4355. }
  4356. func Xioctlsocket(t *TLS, _ ...interface{}) int32 {
  4357. panic(todo(""))
  4358. }
  4359. func XGetWindowLongPtrW(t *TLS, _ ...interface{}) int32 {
  4360. panic(todo(""))
  4361. }
  4362. func XSetWindowLongPtrW(t *TLS, _ ...interface{}) int32 {
  4363. panic(todo(""))
  4364. }
  4365. func XWSAAsyncSelect(t *TLS, _ ...interface{}) int32 {
  4366. panic(todo(""))
  4367. }
  4368. func Xinet_ntoa(t *TLS, _ ...interface{}) uintptr {
  4369. panic(todo(""))
  4370. }
  4371. func X_controlfp(t *TLS, _ ...interface{}) uint32 {
  4372. panic(todo(""))
  4373. }
  4374. // BOOL QueryPerformanceFrequency(
  4375. //
  4376. // LARGE_INTEGER *lpFrequency
  4377. //
  4378. // );
  4379. func XQueryPerformanceFrequency(t *TLS, lpFrequency uintptr) int32 {
  4380. r1, _, err := syscall.Syscall(procQueryPerformanceFrequency.Addr(), 1, lpFrequency, 0, 0)
  4381. if r1 == 0 {
  4382. t.setErrno(err)
  4383. return 0
  4384. }
  4385. return int32(r1)
  4386. }
  4387. func inDST(t gotime.Time) bool {
  4388. jan1st := gotime.Date(t.Year(), 1, 1, 0, 0, 0, 0, t.Location()) // January 1st is always outside DST window
  4389. _, off1 := t.Zone()
  4390. _, off2 := jan1st.Zone()
  4391. return off1 != off2
  4392. }
  4393. // void _ftime( struct _timeb *timeptr );
  4394. func X_ftime(t *TLS, timeptr uintptr) {
  4395. var tm = gotime.Now()
  4396. var tPtr = (*time.X__timeb64)(unsafe.Pointer(timeptr))
  4397. tPtr.Ftime = tm.Unix()
  4398. tPtr.Fmillitm = uint16(gotime.Duration(tm.Nanosecond()) / gotime.Millisecond)
  4399. if inDST(tm) {
  4400. tPtr.Fdstflag = 1
  4401. }
  4402. _, offset := tm.Zone()
  4403. tPtr.Ftimezone = int16(offset)
  4404. }
  4405. func Xgmtime(t *TLS, _ ...interface{}) uintptr {
  4406. panic(todo(""))
  4407. }
  4408. func XDdeInitializeW(t *TLS, _ ...interface{}) uint32 {
  4409. panic(todo(""))
  4410. }
  4411. func XDdeCreateStringHandleW(t *TLS, _ ...interface{}) uintptr {
  4412. panic(todo(""))
  4413. }
  4414. func XDdeNameService(t *TLS, _ ...interface{}) int32 {
  4415. panic(todo(""))
  4416. }
  4417. func X_snwprintf(t *TLS, _ ...interface{}) int32 {
  4418. panic(todo(""))
  4419. }
  4420. func XDdeQueryStringW(t *TLS, _ ...interface{}) int32 {
  4421. panic(todo(""))
  4422. }
  4423. // int _wcsicmp(
  4424. //
  4425. // const wchar_t *string1,
  4426. // const wchar_t *string2
  4427. //
  4428. // );
  4429. func X_wcsicmp(t *TLS, string1, string2 uintptr) int32 {
  4430. return Xwcsicmp(t, string1, string2)
  4431. }
  4432. func XDdeCreateDataHandle(t *TLS, _ ...interface{}) uintptr {
  4433. panic(todo(""))
  4434. }
  4435. func XDdeAccessData(t *TLS, _ ...interface{}) uintptr {
  4436. panic(todo(""))
  4437. }
  4438. func XDdeUnaccessData(t *TLS, _ ...interface{}) int32 {
  4439. panic(todo(""))
  4440. }
  4441. func XDdeUninitialize(t *TLS, _ ...interface{}) int32 {
  4442. panic(todo(""))
  4443. }
  4444. func XDdeConnect(t *TLS, _ ...interface{}) uintptr {
  4445. panic(todo(""))
  4446. }
  4447. func XDdeFreeStringHandle(t *TLS, _ ...interface{}) int32 {
  4448. panic(todo(""))
  4449. }
  4450. func XRegisterClassExW(t *TLS, _ ...interface{}) int32 {
  4451. panic(todo(""))
  4452. }
  4453. func XGlobalGetAtomNameW(t *TLS, _ ...interface{}) int32 {
  4454. panic(todo(""))
  4455. }
  4456. func XGlobalAddAtomW(t *TLS, _ ...interface{}) uint16 {
  4457. panic(todo(""))
  4458. }
  4459. func XEnumWindows(t *TLS, _ ...interface{}) int32 {
  4460. panic(todo(""))
  4461. }
  4462. func XIsWindow(t *TLS, _ ...interface{}) int32 {
  4463. panic(todo(""))
  4464. }
  4465. func XGlobalDeleteAtom(t *TLS, _ ...interface{}) int32 {
  4466. panic(todo(""))
  4467. }
  4468. func XDdeGetLastError(t *TLS, _ ...interface{}) uint32 {
  4469. panic(todo(""))
  4470. }
  4471. // HDDEDATA DdeClientTransaction(
  4472. //
  4473. // LPBYTE pData,
  4474. // DWORD cbData,
  4475. // HCONV hConv,
  4476. // HSZ hszItem,
  4477. // UINT wFmt,
  4478. // UINT wType,
  4479. // DWORD dwTimeout,
  4480. // LPDWORD pdwResult
  4481. //
  4482. // );
  4483. func XDdeClientTransaction(t *TLS, pData uintptr, cbData uint32, hConv uintptr, hszItem uintptr, wFmt, wType, dwTimeout uint32, pdwResult uintptr) uintptr {
  4484. panic(todo(""))
  4485. }
  4486. func XDdeAbandonTransaction(t *TLS, _ ...interface{}) int32 {
  4487. panic(todo(""))
  4488. }
  4489. func XDdeFreeDataHandle(t *TLS, _ ...interface{}) int32 {
  4490. panic(todo(""))
  4491. }
  4492. func XDdeGetData(t *TLS, _ ...interface{}) int32 {
  4493. panic(todo(""))
  4494. }
  4495. func XDdeDisconnect(t *TLS, _ ...interface{}) int32 {
  4496. panic(todo(""))
  4497. }
  4498. func XRegCloseKey(t *TLS, _ ...interface{}) int32 {
  4499. panic(todo(""))
  4500. }
  4501. func XRegDeleteValueW(t *TLS, _ ...interface{}) int32 {
  4502. panic(todo(""))
  4503. }
  4504. func XRegEnumKeyExW(t *TLS, _ ...interface{}) int32 {
  4505. panic(todo(""))
  4506. }
  4507. func XRegQueryValueExW(t *TLS, _ ...interface{}) int32 {
  4508. panic(todo(""))
  4509. }
  4510. func XRegEnumValueW(t *TLS, _ ...interface{}) int32 {
  4511. panic(todo(""))
  4512. }
  4513. func XRegConnectRegistryW(t *TLS, _ ...interface{}) int32 {
  4514. panic(todo(""))
  4515. }
  4516. func XRegCreateKeyExW(t *TLS, _ ...interface{}) int32 {
  4517. panic(todo(""))
  4518. }
  4519. func XRegOpenKeyExW(t *TLS, _ ...interface{}) int32 {
  4520. panic(todo(""))
  4521. }
  4522. func XRegDeleteKeyW(t *TLS, _ ...interface{}) int32 {
  4523. panic(todo(""))
  4524. }
  4525. func XRegSetValueExW(t *TLS, _ ...interface{}) int32 {
  4526. panic(todo(""))
  4527. }
  4528. // int _vsnwprintf(
  4529. //
  4530. // wchar_t *buffer,
  4531. // size_t count,
  4532. // const wchar_t *format,
  4533. // va_list argptr
  4534. //
  4535. // );
  4536. func X__mingw_vsnwprintf(t *TLS, buffer uintptr, count types.Size_t, format, va uintptr) int32 {
  4537. panic(todo(""))
  4538. }
  4539. // int vprintf(const char *format, va_list ap);
  4540. func X__mingw_vprintf(t *TLS, s, ap uintptr) int32 { return Xvprintf(t, s, ap) }
  4541. // int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg);
  4542. func X__mingw_vfscanf(t *TLS, stream, format, ap uintptr) int32 {
  4543. panic(todo(""))
  4544. }
  4545. // int vsscanf(const char *str, const char *format, va_list ap);
  4546. func X__mingw_vsscanf(t *TLS, str, format, ap uintptr) int32 {
  4547. return Xsscanf(t, str, format, ap)
  4548. }
  4549. // int vfprintf(FILE * restrict stream, const char * restrict format, va_list arg);
  4550. func X__mingw_vfprintf(t *TLS, f uintptr, format, va uintptr) int32 {
  4551. return Xvfprintf(t, f, format, va)
  4552. }
  4553. // int vsprintf(char * restrict s, const char * restrict format, va_list arg);
  4554. func X__mingw_vsprintf(t *TLS, s, format, ap uintptr) int32 {
  4555. return Xvsprintf(t, s, format, ap)
  4556. }
  4557. // int vsnprintf(char *str, size_t size, const char *format, va_list ap);
  4558. func X__mingw_vsnprintf(t *TLS, str uintptr, size types.Size_t, format, ap uintptr) int32 {
  4559. panic(todo(""))
  4560. }
  4561. // int putchar(int char)
  4562. func X_putchar(t *TLS, c int32) int32 {
  4563. if _, err := fwrite(unistd.STDOUT_FILENO, []byte{byte(c)}); err != nil {
  4564. return -1
  4565. }
  4566. return int32(byte(c))
  4567. }
  4568. // int vfwscanf(FILE *stream, const wchar_t *format, va_list argptr;);
  4569. func X__mingw_vfwscanf(t *TLS, stream uintptr, format, ap uintptr) int32 {
  4570. panic(todo(""))
  4571. }
  4572. // int vswscanf(const wchar_t *buffer, const wchar_t *format, va_list arglist);
  4573. func X__mingw_vswscanf(t *TLS, stream uintptr, format, ap uintptr) int32 {
  4574. panic(todo(""))
  4575. }
  4576. // int vfwprintf(FILE * restrict stream, const wchar_t * restrict format, va_list arg);
  4577. func X__mingw_vfwprintf(t *TLS, stream, format, ap uintptr) int32 {
  4578. panic(todo(""))
  4579. }
  4580. // int putchar(int c);
  4581. func Xputchar(t *TLS, c int32) int32 {
  4582. panic(todo(""))
  4583. }
  4584. // void _assert(
  4585. //
  4586. // char const* message,
  4587. // char const* filename,
  4588. // unsigned line
  4589. //
  4590. // );
  4591. func X_assert(t *TLS, message, filename uintptr, line uint32) {
  4592. panic(todo(""))
  4593. }
  4594. // char *strdup(const char *s);
  4595. func X_strdup(t *TLS, s uintptr) uintptr {
  4596. panic(todo(""))
  4597. }
  4598. // int _access(
  4599. //
  4600. // const char *path,
  4601. // int mode
  4602. //
  4603. // );
  4604. func X_access(t *TLS, pathname uintptr, mode int32) int32 {
  4605. var path = GoString(pathname)
  4606. info, err := os.Stat(path)
  4607. if err != nil {
  4608. // doesn't exist
  4609. return errno.ENOENT
  4610. }
  4611. switch mode {
  4612. case 0:
  4613. // exists
  4614. return 0
  4615. case 2:
  4616. // write-only
  4617. // Check if the user bit is enabled in file permission
  4618. if info.Mode().Perm()&(1<<(uint(7))) == 1 {
  4619. // write-able
  4620. return 0
  4621. }
  4622. case 4:
  4623. // read-only
  4624. // Check if the user bit is enabled in file permission
  4625. if info.Mode().Perm()&(1<<(uint(7))) == 0 {
  4626. // not set, so read-only
  4627. return 0
  4628. }
  4629. case 6:
  4630. // r/w
  4631. if info.Mode().Perm()&(1<<(uint(7))) == 1 {
  4632. // write-able
  4633. return 0
  4634. }
  4635. }
  4636. return errno.EACCES
  4637. }
  4638. // BOOL WINAPI SetConsoleCtrlHandler(
  4639. //
  4640. // _In_opt_ PHANDLER_ROUTINE HandlerRoutine,
  4641. // _In_ BOOL Add
  4642. //
  4643. // );
  4644. func XSetConsoleCtrlHandler(t *TLS, HandlerRoutine uintptr, Add int32) int32 {
  4645. //var fcc = &struct {
  4646. // f func(*TLS, uint32) int32
  4647. //}{}
  4648. //fcc = (*struct{ f func(*TLS, uint32) int32 })(unsafe.Pointer(HandlerRoutine))
  4649. //var hdlr = fcc.f
  4650. //
  4651. //_, _, err := procSetConsoleCtrlHandler.Call(
  4652. //syscall.NewCallback(func(controlType uint) uint {
  4653. // return uint( hdlr(t, uint32(controlType)) )
  4654. // }), 1)
  4655. //
  4656. //if err != nil {
  4657. // panic("failed: SetConsoleCtrlHandler")
  4658. //}
  4659. return 0
  4660. }
  4661. // DebugBreak
  4662. func XDebugBreak(t *TLS) {
  4663. panic(todo(""))
  4664. }
  4665. // int _isatty( int fd );
  4666. func X_isatty(t *TLS, fd int32) int32 {
  4667. f, ok := fdToFile(fd)
  4668. if !ok {
  4669. t.setErrno(errno.EBADF)
  4670. return 0
  4671. }
  4672. if fd == unistd.STDOUT_FILENO ||
  4673. fd == unistd.STDIN_FILENO ||
  4674. fd == unistd.STDERR_FILENO {
  4675. var mode uint32
  4676. err := syscall.GetConsoleMode(f.Handle, &mode)
  4677. if err != nil {
  4678. t.setErrno(errno.EINVAL)
  4679. return 0
  4680. }
  4681. // is console
  4682. return 1
  4683. }
  4684. return 0
  4685. }
  4686. // BOOL WINAPI SetConsoleTextAttribute(
  4687. //
  4688. // _In_ HANDLE hConsoleOutput,
  4689. // _In_ WORD wAttributes
  4690. //
  4691. // );
  4692. func XSetConsoleTextAttribute(t *TLS, hConsoleOutput uintptr, wAttributes uint16) int32 {
  4693. r1, _, _ := syscall.Syscall(procSetConsoleTextAttribute.Addr(), 2, hConsoleOutput, uintptr(wAttributes), 0)
  4694. return int32(r1)
  4695. }
  4696. // BOOL WINAPI GetConsoleScreenBufferInfo(
  4697. //
  4698. // _In_ HANDLE hConsoleOutput,
  4699. // _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
  4700. //
  4701. // );
  4702. func XGetConsoleScreenBufferInfo(t *TLS, hConsoleOutput, lpConsoleScreenBufferInfo uintptr) int32 {
  4703. r1, _, _ := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, hConsoleOutput, lpConsoleScreenBufferInfo, 0)
  4704. return int32(r1)
  4705. }
  4706. // FILE *_popen(
  4707. //
  4708. // const char *command,
  4709. // const char *mode
  4710. //
  4711. // );
  4712. func X_popen(t *TLS, command, mode uintptr) uintptr {
  4713. panic(todo(""))
  4714. }
  4715. // int _wunlink(
  4716. //
  4717. // const wchar_t *filename
  4718. //
  4719. // );
  4720. func X_wunlink(t *TLS, filename uintptr) int32 {
  4721. panic(todo(""))
  4722. }
  4723. func Xclosedir(tls *TLS, dir uintptr) int32 {
  4724. panic(todo(""))
  4725. }
  4726. func Xopendir(tls *TLS, name uintptr) uintptr {
  4727. panic(todo(""))
  4728. }
  4729. func Xreaddir(tls *TLS, dir uintptr) uintptr {
  4730. panic(todo(""))
  4731. }
  4732. // int _unlink(
  4733. //
  4734. // const char *filename
  4735. //
  4736. // );
  4737. func X_unlink(t *TLS, filename uintptr) int32 {
  4738. panic(todo(""))
  4739. }
  4740. // int pclose(FILE *stream);
  4741. func X_pclose(t *TLS, stream uintptr) int32 {
  4742. panic(todo(""))
  4743. }
  4744. // int setmode (int fd, int mode);
  4745. func Xsetmode(t *TLS, fd, mode int32) int32 {
  4746. return X_setmode(t, fd, mode)
  4747. }
  4748. // int _setmode (int fd, int mode);
  4749. func X_setmode(t *TLS, fd, mode int32) int32 {
  4750. _, ok := fdToFile(fd)
  4751. if !ok {
  4752. t.setErrno(errno.EBADF)
  4753. return -1
  4754. }
  4755. // we're always in binary mode.
  4756. // at least for now.
  4757. if mode == fcntl.O_BINARY {
  4758. return fcntl.O_BINARY
  4759. } else {
  4760. t.setErrno(errno.EINVAL)
  4761. return -1
  4762. }
  4763. }
  4764. // int _mkdir(const char *dirname);
  4765. func X_mkdir(t *TLS, dirname uintptr) int32 {
  4766. panic(todo(""))
  4767. }
  4768. // int _chmod( const char *filename, int pmode );
  4769. func X_chmod(t *TLS, filename uintptr, pmode int32) int32 {
  4770. panic(todo(""))
  4771. }
  4772. // int _fileno(FILE *stream);
  4773. func X_fileno(t *TLS, stream uintptr) int32 {
  4774. f, ok := winGetObject(stream).(*file)
  4775. if !ok {
  4776. t.setErrno(errno.EBADF)
  4777. return -1
  4778. }
  4779. return f._fd
  4780. }
  4781. // void rewind(FILE *stream);
  4782. func Xrewind(t *TLS, stream uintptr) {
  4783. Xfseek(t, stream, 0, unistd.SEEK_SET)
  4784. }
  4785. // __atomic_load_n
  4786. func X__atomic_load_n(t *TLS) {
  4787. panic(todo(""))
  4788. }
  4789. // __atomic_store_n
  4790. func X__atomic_store_n(t *TLS, _ ...interface{}) int32 {
  4791. panic(todo(""))
  4792. }
  4793. // __builtin_add_overflow
  4794. func X__builtin_add_overflow(t *TLS) {
  4795. panic(todo(""))
  4796. }
  4797. // __builtin_mul_overflow
  4798. func X__builtin_mul_overflow(t *TLS) {
  4799. panic(todo(""))
  4800. }
  4801. // __builtin_sub_overflow
  4802. func X__builtin_sub_overflow(t *TLS) {
  4803. panic(todo(""))
  4804. }
  4805. func goWideBytes(p uintptr, n int) []uint16 {
  4806. b := GoBytes(p, 2*n)
  4807. var w []uint16
  4808. for i := 0; i < len(b); i += 2 {
  4809. w = append(w, *(*uint16)(unsafe.Pointer(&b[i])))
  4810. }
  4811. return w
  4812. }
  4813. // This version does include the zero terminator in the returned Go string.
  4814. func goWideString(p uintptr) string {
  4815. if p == 0 {
  4816. return ""
  4817. }
  4818. var w []uint16
  4819. var raw = (*RawMem)(unsafe.Pointer(p))
  4820. var i = 0
  4821. for {
  4822. wc := *(*uint16)(unsafe.Pointer(&raw[i]))
  4823. w = append(w, wc)
  4824. // append until U0000
  4825. if wc == 0 {
  4826. break
  4827. }
  4828. i = i + 2
  4829. }
  4830. s := utf16.Decode(w)
  4831. return string(s)
  4832. }
  4833. func goWideStringN(p uintptr, n int) string {
  4834. panic(todo(""))
  4835. }
  4836. // This version does not include the zero terminator in the returned Go string.
  4837. func goWideStringNZ(p uintptr) string {
  4838. if p == 0 {
  4839. return ""
  4840. }
  4841. var w []uint16
  4842. var raw = (*RawMem)(unsafe.Pointer(p))
  4843. var i = 0
  4844. for {
  4845. wc := *(*uint16)(unsafe.Pointer(&raw[i]))
  4846. if wc == 0 {
  4847. break
  4848. }
  4849. w = append(w, wc)
  4850. i = i + 2
  4851. }
  4852. s := utf16.Decode(w)
  4853. return string(s)
  4854. }
  4855. // LPWSTR GetCommandLineW();
  4856. func XGetCommandLineW(t *TLS) uintptr {
  4857. return uintptr(unsafe.Pointer(syscall.GetCommandLine()))
  4858. }
  4859. // BOOL AddAccessDeniedAce(
  4860. //
  4861. // PACL pAcl,
  4862. // DWORD dwAceRevision,
  4863. // DWORD AccessMask,
  4864. // PSID pSid
  4865. //
  4866. // );
  4867. func XAddAccessDeniedAce(t *TLS, pAcl uintptr, dwAceRevision, AccessMask uint32, pSid uintptr) int32 {
  4868. panic(todo(""))
  4869. }
  4870. // BOOL AddAce(
  4871. //
  4872. // PACL pAcl,
  4873. // DWORD dwAceRevision,
  4874. // DWORD dwStartingAceIndex,
  4875. // LPVOID pAceList,
  4876. // DWORD nAceListLength
  4877. //
  4878. // );
  4879. func XAddAce(t *TLS, pAcl uintptr, dwAceRevision, dwStartingAceIndex uint32, pAceList uintptr, nAceListLength uint32) int32 {
  4880. panic(todo(""))
  4881. }
  4882. // BOOL GetAce(
  4883. //
  4884. // PACL pAcl,
  4885. // DWORD dwAceIndex,
  4886. // LPVOID *pAce
  4887. //
  4888. // );
  4889. func XGetAce(t *TLS, pAcl uintptr, dwAceIndex uint32, pAce uintptr) int32 {
  4890. panic(todo(""))
  4891. }
  4892. // BOOL GetAclInformation(
  4893. //
  4894. // PACL pAcl,
  4895. // LPVOID pAclInformation,
  4896. // DWORD nAclInformationLength,
  4897. // ACL_INFORMATION_CLASS dwAclInformationClass
  4898. //
  4899. // );
  4900. func XGetAclInformation(t *TLS, pAcl, pAclInformation uintptr, nAclInformationLength, dwAclInformationClass uint32) int32 {
  4901. r0, _, err := syscall.Syscall6(procGetAclInformation.Addr(), 4,
  4902. pAclInformation,
  4903. pAclInformation,
  4904. uintptr(nAclInformationLength),
  4905. uintptr(dwAclInformationClass),
  4906. 0,
  4907. 0,
  4908. )
  4909. if err != 0 {
  4910. t.setErrno(err)
  4911. }
  4912. return int32(r0)
  4913. }
  4914. // BOOL GetFileSecurityA(
  4915. //
  4916. // LPCSTR lpFileName,
  4917. // SECURITY_INFORMATION RequestedInformation,
  4918. // PSECURITY_DESCRIPTOR pSecurityDescriptor,
  4919. // DWORD nLength,
  4920. // LPDWORD lpnLengthNeeded
  4921. //
  4922. // );
  4923. func XGetFileSecurityA(t *TLS, lpFileName uintptr, RequestedInformation uint32, pSecurityDescriptor uintptr, nLength uint32, lpnLengthNeeded uintptr) int32 {
  4924. r0, _, err := syscall.Syscall6(procGetFileSecurityA.Addr(), 5,
  4925. lpFileName,
  4926. uintptr(RequestedInformation),
  4927. pSecurityDescriptor,
  4928. uintptr(nLength),
  4929. lpnLengthNeeded,
  4930. 0,
  4931. )
  4932. if err != 0 {
  4933. t.setErrno(err)
  4934. }
  4935. return int32(r0)
  4936. }
  4937. // DWORD GetLengthSid(
  4938. //
  4939. // PSID pSid
  4940. //
  4941. // );
  4942. func XGetLengthSid(t *TLS, pSid uintptr) uint32 {
  4943. panic(todo(""))
  4944. }
  4945. // BOOL GetSecurityDescriptorDacl(
  4946. //
  4947. // PSECURITY_DESCRIPTOR pSecurityDescriptor,
  4948. // LPBOOL lpbDaclPresent,
  4949. // PACL *pDacl,
  4950. // LPBOOL lpbDaclDefaulted
  4951. //
  4952. // );
  4953. func XGetSecurityDescriptorDacl(t *TLS, pSecurityDescriptor, lpbDaclPresent, pDacl, lpbDaclDefaulted uintptr) int32 {
  4954. r0, _, err := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4,
  4955. pSecurityDescriptor,
  4956. lpbDaclPresent,
  4957. pDacl,
  4958. lpbDaclDefaulted,
  4959. 0,
  4960. 0,
  4961. )
  4962. if err != 0 {
  4963. t.setErrno(err)
  4964. }
  4965. return int32(r0)
  4966. }
  4967. // DWORD GetSidLengthRequired(
  4968. //
  4969. // UCHAR nSubAuthorityCount
  4970. //
  4971. // );
  4972. func XGetSidLengthRequired(t *TLS, nSubAuthorityCount uint8) int32 {
  4973. r0, _, err := syscall.Syscall(procGetSidLengthRequired.Addr(), 1, uintptr(nSubAuthorityCount), 0, 0)
  4974. if err != 0 {
  4975. t.setErrno(err)
  4976. }
  4977. return int32(r0)
  4978. }
  4979. // PDWORD GetSidSubAuthority(
  4980. //
  4981. // PSID pSid,
  4982. // DWORD nSubAuthority
  4983. //
  4984. // );
  4985. func XGetSidSubAuthority(t *TLS, pSid uintptr, nSubAuthority uint32) uintptr {
  4986. r0, _, err := syscall.Syscall(procGetSidSubAuthority.Addr(), 2, pSid, uintptr(nSubAuthority), 0)
  4987. if err != 0 {
  4988. t.setErrno(err)
  4989. }
  4990. return r0
  4991. }
  4992. // BOOL InitializeAcl(
  4993. //
  4994. // PACL pAcl,
  4995. // DWORD nAclLength,
  4996. // DWORD dwAclRevision
  4997. //
  4998. // );
  4999. func XInitializeAcl(t *TLS, pAcl uintptr, nAclLength, dwAclRevision uint32) int32 {
  5000. panic(todo(""))
  5001. }
  5002. // BOOL InitializeSid(
  5003. //
  5004. // PSID Sid,
  5005. // PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
  5006. // BYTE nSubAuthorityCount
  5007. //
  5008. // );
  5009. func XInitializeSid(t *TLS, Sid, pIdentifierAuthority uintptr, nSubAuthorityCount uint8) int32 {
  5010. r0, _, err := syscall.Syscall(procInitializeSid.Addr(), 3, Sid, pIdentifierAuthority, uintptr(nSubAuthorityCount))
  5011. if err != 0 {
  5012. t.setErrno(err)
  5013. }
  5014. return int32(r0)
  5015. }
  5016. // VOID RaiseException(
  5017. //
  5018. // DWORD dwExceptionCode,
  5019. // DWORD dwExceptionFlags,
  5020. // DWORD nNumberOfArguments,
  5021. // const ULONG_PTR *lpArguments
  5022. //
  5023. // );
  5024. func XRaiseException(t *TLS, dwExceptionCode, dwExceptionFlags, nNumberOfArguments uint32, lpArguments uintptr) {
  5025. panic(todo(""))
  5026. }
  5027. // UINT SetErrorMode(
  5028. //
  5029. // UINT uMode
  5030. //
  5031. // );
  5032. func XSetErrorMode(t *TLS, uMode uint32) int32 {
  5033. panic(todo(""))
  5034. }
  5035. // DWORD SetNamedSecurityInfoA(
  5036. //
  5037. // LPSTR pObjectName,
  5038. // SE_OBJECT_TYPE ObjectType,
  5039. // SECURITY_INFORMATION SecurityInfo,
  5040. // PSID psidOwner,
  5041. // PSID psidGroup,
  5042. // PACL pDacl,
  5043. // PACL pSacl
  5044. //
  5045. // );
  5046. func XSetNamedSecurityInfoA(t *TLS, pObjectName uintptr, ObjectType, SecurityInfo uint32, psidOwner, psidGroup, pDacl, pSacl uintptr) uint32 {
  5047. panic(todo(""))
  5048. }
  5049. // BOOL CreateProcessA(
  5050. //
  5051. // LPCSTR lpApplicationName,
  5052. // LPSTR lpCommandLine,
  5053. // LPSECURITY_ATTRIBUTES lpProcessAttributes,
  5054. // LPSECURITY_ATTRIBUTES lpThreadAttributes,
  5055. // BOOL bInheritHandles,
  5056. // DWORD dwCreationFlags,
  5057. // LPVOID lpEnvironment,
  5058. // LPCSTR lpCurrentDirectory,
  5059. // LPSTARTUPINFOA lpStartupInfo,
  5060. // LPPROCESS_INFORMATION lpProcessInformation
  5061. //
  5062. // );
  5063. func XCreateProcessA(t *TLS, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes uintptr, bInheritHandles int32,
  5064. dwCreationFlags uint32, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation uintptr) int32 {
  5065. r1, _, err := syscall.Syscall12(procCreateProcessA.Addr(), 10, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes,
  5066. uintptr(bInheritHandles), uintptr(dwCreationFlags), lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, 0, 0)
  5067. if r1 == 0 {
  5068. if err != 0 {
  5069. t.setErrno(err)
  5070. } else {
  5071. t.setErrno(errno.EINVAL)
  5072. }
  5073. }
  5074. return int32(r1)
  5075. }
  5076. // unsigned int _set_abort_behavior(
  5077. //
  5078. // unsigned int flags,
  5079. // unsigned int mask
  5080. //
  5081. // );
  5082. func X_set_abort_behavior(t *TLS, _ ...interface{}) uint32 {
  5083. panic(todo(""))
  5084. }
  5085. // HANDLE OpenEventA(
  5086. //
  5087. // DWORD dwDesiredAccess,
  5088. // BOOL bInheritHandle,
  5089. // LPCSTR lpName
  5090. //
  5091. // );
  5092. func XOpenEventA(t *TLS, dwDesiredAccess uint32, bInheritHandle uint32, lpName uintptr) uintptr {
  5093. r0, _, err := syscall.Syscall(procOpenEventA.Addr(), 3, uintptr(dwDesiredAccess), uintptr(bInheritHandle), lpName)
  5094. if r0 == 0 {
  5095. t.setErrno(err)
  5096. }
  5097. return r0
  5098. }
  5099. // size_t _msize(
  5100. //
  5101. // void *memblock
  5102. //
  5103. // );
  5104. func X_msize(t *TLS, memblock uintptr) types.Size_t {
  5105. return types.Size_t(UsableSize(memblock))
  5106. }
  5107. // unsigned long _byteswap_ulong ( unsigned long val );
  5108. func X_byteswap_ulong(t *TLS, val ulong) ulong {
  5109. return X__builtin_bswap32(t, val)
  5110. }
  5111. // unsigned __int64 _byteswap_uint64 ( unsigned __int64 val );
  5112. func X_byteswap_uint64(t *TLS, val uint64) uint64 {
  5113. return X__builtin_bswap64(t, val)
  5114. }
  5115. // int _commit(
  5116. //
  5117. // int fd
  5118. //
  5119. // );
  5120. func X_commit(t *TLS, fd int32) int32 {
  5121. return Xfsync(t, fd)
  5122. }
  5123. // int _stati64(
  5124. //
  5125. // const char *path,
  5126. // struct _stati64 *buffer
  5127. //
  5128. // );
  5129. func X_stati64(t *TLS, path, buffer uintptr) int32 {
  5130. panic(todo(""))
  5131. }
  5132. // int _fstati64(
  5133. //
  5134. // int fd,
  5135. // struct _stati64 *buffer
  5136. //
  5137. // );
  5138. func X_fstati64(t *TLS, fd int32, buffer uintptr) int32 {
  5139. panic(todo(""))
  5140. }
  5141. // int _findnext32(
  5142. //
  5143. // intptr_t handle,
  5144. // struct _finddata32_t *fileinfo
  5145. //
  5146. // );
  5147. func X_findnext32(t *TLS, handle types.Intptr_t, buffer uintptr) int32 {
  5148. panic(todo(""))
  5149. }
  5150. // intptr_t _findfirst32(
  5151. //
  5152. // const char *filespec,
  5153. // struct _finddata32_t *fileinfo
  5154. //
  5155. // );
  5156. func X_findfirst32(t *TLS, filespec, fileinfo uintptr) types.Intptr_t {
  5157. panic(todo(""))
  5158. }
  5159. /*-
  5160. * Copyright (c) 1990 The Regents of the University of California.
  5161. * All rights reserved.
  5162. *
  5163. * Redistribution and use in source and binary forms, with or without
  5164. * modification, are permitted provided that the following conditions
  5165. * are met:
  5166. * 1. Redistributions of source code must retain the above copyright
  5167. * notice, this list of conditions and the following disclaimer.
  5168. * 2. Redistributions in binary form must reproduce the above copyright
  5169. * notice, this list of conditions and the following disclaimer in the
  5170. * documentation and/or other materials provided with the distribution.
  5171. * 3. Neither the name of the University nor the names of its contributors
  5172. * may be used to endorse or promote products derived from this software
  5173. * without specific prior written permission.
  5174. *
  5175. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  5176. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  5177. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  5178. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  5179. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  5180. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  5181. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  5182. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  5183. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  5184. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  5185. * SUCH DAMAGE.
  5186. */
  5187. // long strtol(const char *nptr, char **endptr, int base);
  5188. func Xstrtol(t *TLS, nptr, endptr uintptr, base int32) long {
  5189. var s uintptr = nptr
  5190. var acc ulong
  5191. var c byte
  5192. var cutoff ulong
  5193. var neg int32
  5194. var any int32
  5195. var cutlim int32
  5196. /*
  5197. * Skip white space and pick up leading +/- sign if any.
  5198. * If base is 0, allow 0x for hex and 0 for octal, else
  5199. * assume decimal; if base is already 16, allow 0x.
  5200. */
  5201. for {
  5202. c = *(*byte)(unsafe.Pointer(s))
  5203. PostIncUintptr(&s, 1)
  5204. var sp = strings.TrimSpace(string(c))
  5205. if len(sp) > 0 {
  5206. break
  5207. }
  5208. }
  5209. if c == '-' {
  5210. neg = 1
  5211. c = *(*byte)(unsafe.Pointer(s))
  5212. PostIncUintptr(&s, 1)
  5213. } else if c == '+' {
  5214. c = *(*byte)(unsafe.Pointer(s))
  5215. PostIncUintptr(&s, 1)
  5216. }
  5217. sp := *(*byte)(unsafe.Pointer(s))
  5218. if (base == 0 || base == 16) &&
  5219. c == '0' && (sp == 'x' || sp == 'X') {
  5220. PostIncUintptr(&s, 1)
  5221. c = *(*byte)(unsafe.Pointer(s)) //s[1];
  5222. PostIncUintptr(&s, 1)
  5223. base = 16
  5224. }
  5225. if base == 0 {
  5226. if c == '0' {
  5227. base = 0
  5228. } else {
  5229. base = 10
  5230. }
  5231. }
  5232. /*
  5233. * Compute the cutoff value between legal numbers and illegal
  5234. * numbers. That is the largest legal value, divided by the
  5235. * base. An input number that is greater than this value, if
  5236. * followed by a legal input character, is too big. One that
  5237. * is equal to this value may be valid or not; the limit
  5238. * between valid and invalid numbers is then based on the last
  5239. * digit. For instance, if the range for longs is
  5240. * [-2147483648..2147483647] and the input base is 10,
  5241. * cutoff will be set to 214748364 and cutlim to either
  5242. * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
  5243. * a value > 214748364, or equal but the next digit is > 7 (or 8),
  5244. * the number is too big, and we will return a range error.
  5245. *
  5246. * Set any if any `digits' consumed; make it negative to indicate
  5247. * overflow.
  5248. */
  5249. var ULONG_MAX ulong = 0xFFFFFFFF
  5250. var LONG_MAX long = long(ULONG_MAX >> 1)
  5251. var LONG_MIN long = ^LONG_MAX
  5252. if neg == 1 {
  5253. cutoff = ulong(-1 * LONG_MIN)
  5254. } else {
  5255. cutoff = ulong(LONG_MAX)
  5256. }
  5257. cutlim = int32(cutoff % ulong(base))
  5258. cutoff = cutoff / ulong(base)
  5259. acc = 0
  5260. any = 0
  5261. for {
  5262. var cs = string(c)
  5263. if unicode.IsDigit([]rune(cs)[0]) {
  5264. c -= '0'
  5265. } else if unicode.IsLetter([]rune(cs)[0]) {
  5266. if unicode.IsUpper([]rune(cs)[0]) {
  5267. c -= 'A' - 10
  5268. } else {
  5269. c -= 'a' - 10
  5270. }
  5271. } else {
  5272. break
  5273. }
  5274. if int32(c) >= base {
  5275. break
  5276. }
  5277. if any < 0 || acc > cutoff || (acc == cutoff && int32(c) > cutlim) {
  5278. any = -1
  5279. } else {
  5280. any = 1
  5281. acc *= ulong(base)
  5282. acc += ulong(c)
  5283. }
  5284. c = *(*byte)(unsafe.Pointer(s))
  5285. PostIncUintptr(&s, 1)
  5286. }
  5287. if any < 0 {
  5288. if neg == 1 {
  5289. acc = ulong(LONG_MIN)
  5290. } else {
  5291. acc = ulong(LONG_MAX)
  5292. }
  5293. t.setErrno(errno.ERANGE)
  5294. } else if neg == 1 {
  5295. acc = -acc
  5296. }
  5297. if endptr != 0 {
  5298. if any == 1 {
  5299. PostDecUintptr(&s, 1)
  5300. AssignPtrUintptr(endptr, s)
  5301. } else {
  5302. AssignPtrUintptr(endptr, nptr)
  5303. }
  5304. }
  5305. return long(acc)
  5306. }
  5307. // unsigned long int strtoul(const char *nptr, char **endptr, int base);
  5308. func Xstrtoul(t *TLS, nptr, endptr uintptr, base int32) ulong {
  5309. var s uintptr = nptr
  5310. var acc ulong
  5311. var c byte
  5312. var cutoff ulong
  5313. var neg int32
  5314. var any int32
  5315. var cutlim int32
  5316. /*
  5317. * Skip white space and pick up leading +/- sign if any.
  5318. * If base is 0, allow 0x for hex and 0 for octal, else
  5319. * assume decimal; if base is already 16, allow 0x.
  5320. */
  5321. for {
  5322. c = *(*byte)(unsafe.Pointer(s))
  5323. PostIncUintptr(&s, 1)
  5324. var sp = strings.TrimSpace(string(c))
  5325. if len(sp) > 0 {
  5326. break
  5327. }
  5328. }
  5329. if c == '-' {
  5330. neg = 1
  5331. c = *(*byte)(unsafe.Pointer(s))
  5332. PostIncUintptr(&s, 1)
  5333. } else if c == '+' {
  5334. c = *(*byte)(unsafe.Pointer(s))
  5335. PostIncUintptr(&s, 1)
  5336. }
  5337. sp := *(*byte)(unsafe.Pointer(s))
  5338. if (base == 0 || base == 16) &&
  5339. c == '0' && (sp == 'x' || sp == 'X') {
  5340. PostIncUintptr(&s, 1)
  5341. c = *(*byte)(unsafe.Pointer(s)) //s[1];
  5342. PostIncUintptr(&s, 1)
  5343. base = 16
  5344. }
  5345. if base == 0 {
  5346. if c == '0' {
  5347. base = 0
  5348. } else {
  5349. base = 10
  5350. }
  5351. }
  5352. var ULONG_MAX ulong = 0xFFFFFFFF
  5353. cutoff = ULONG_MAX / ulong(base)
  5354. cutlim = int32(ULONG_MAX % ulong(base))
  5355. acc = 0
  5356. any = 0
  5357. for {
  5358. var cs = string(c)
  5359. if unicode.IsDigit([]rune(cs)[0]) {
  5360. c -= '0'
  5361. } else if unicode.IsLetter([]rune(cs)[0]) {
  5362. if unicode.IsUpper([]rune(cs)[0]) {
  5363. c -= 'A' - 10
  5364. } else {
  5365. c -= 'a' - 10
  5366. }
  5367. } else {
  5368. break
  5369. }
  5370. if int32(c) >= base {
  5371. break
  5372. }
  5373. if any < 0 || acc > cutoff || (acc == cutoff && int32(c) > cutlim) {
  5374. any = -1
  5375. } else {
  5376. any = 1
  5377. acc *= ulong(base)
  5378. acc += ulong(c)
  5379. }
  5380. c = *(*byte)(unsafe.Pointer(s))
  5381. PostIncUintptr(&s, 1)
  5382. }
  5383. if any < 0 {
  5384. acc = ULONG_MAX
  5385. t.setErrno(errno.ERANGE)
  5386. } else if neg == 1 {
  5387. acc = -acc
  5388. }
  5389. if endptr != 0 {
  5390. if any == 1 {
  5391. PostDecUintptr(&s, 1)
  5392. AssignPtrUintptr(endptr, s)
  5393. } else {
  5394. AssignPtrUintptr(endptr, nptr)
  5395. }
  5396. }
  5397. return acc
  5398. }
  5399. // int __isoc99_sscanf(const char *str, const char *format, ...);
  5400. func X__isoc99_sscanf(t *TLS, str, format, va uintptr) int32 {
  5401. r := scanf(strings.NewReader(GoString(str)), format, va)
  5402. // if dmesgs {
  5403. // dmesg("%v: %q %q: %d", origin(1), GoString(str), GoString(format), r)
  5404. // }
  5405. return r
  5406. }
  5407. // int sscanf(const char *str, const char *format, ...);
  5408. func Xsscanf(t *TLS, str, format, va uintptr) int32 {
  5409. r := scanf(strings.NewReader(GoString(str)), format, va)
  5410. // if dmesgs {
  5411. // dmesg("%v: %q %q: %d", origin(1), GoString(str), GoString(format), r)
  5412. // }
  5413. return r
  5414. }
  5415. func Xstrtod(tls *TLS, s uintptr, p uintptr) float64 { /* strtod.c:22:8: */
  5416. panic(todo(""))
  5417. }
  5418. func Xrint(tls *TLS, x float64) float64 {
  5419. switch {
  5420. case x == 0: // also +0 and -0
  5421. return 0
  5422. case math.IsInf(x, 0), math.IsNaN(x):
  5423. return x
  5424. case x >= math.MinInt64 && x <= math.MaxInt64 && float64(int64(x)) == x:
  5425. return x
  5426. case x >= 0:
  5427. return math.Floor(x + 0.5)
  5428. default:
  5429. return math.Ceil(x - 0.5)
  5430. }
  5431. }
  5432. // FILE *fdopen(int fd, const char *mode);
  5433. func Xfdopen(t *TLS, fd int32, mode uintptr) uintptr {
  5434. panic(todo(""))
  5435. }
  5436. // struct tm *_gmtime64( const __time64_t *sourceTime );
  5437. func X_gmtime64(t *TLS, sourceTime uintptr) uintptr {
  5438. panic(todo(""))
  5439. }
  5440. // __time64_t _mktime64(struct tm *timeptr);
  5441. func X_mktime64(t *TLS, timeptr uintptr) time.X__time64_t {
  5442. return time.X__time64_t(Xmktime(t, timeptr))
  5443. }
  5444. // char * gai_strerrorA(int ecode);
  5445. func Xgai_strerrorA(t *TLS, ecode int32) uintptr {
  5446. panic(todo(""))
  5447. }
  5448. // https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-headers/crt/sys/timeb.h#L69
  5449. //
  5450. // struct __timeb64 {
  5451. // __time64_t time;
  5452. // unsigned short millitm;
  5453. // short timezone;
  5454. // short dstflag;
  5455. // };
  5456. type __timeb64 struct {
  5457. time types.X__time64_t
  5458. millitm uint32
  5459. timezone int16
  5460. dstflag int16
  5461. }
  5462. // void _ftime64( struct __timeb64 *timeptr );
  5463. func X_ftime64(t *TLS, timeptr uintptr) {
  5464. tm := gotime.Now()
  5465. (*__timeb64)(unsafe.Pointer(timeptr)).time = types.X__time64_t(tm.Unix())
  5466. //TODO When Go 1.16 is no more supported
  5467. // (*__timeb64)(unsafe.Pointer(timeptr)).millitm = uint32(tm.UnixMilli() % 1000)
  5468. (*__timeb64)(unsafe.Pointer(timeptr)).millitm = uint32(int64(tm.Nanosecond()) / 1e6)
  5469. }
  5470. func X__ccgo_getMutexType(tls *TLS, m uintptr) int32 { /* pthread_mutex_lock.c:3:5: */
  5471. return *(*int32)(unsafe.Pointer(m)) & 15
  5472. }
  5473. func X__ccgo_pthreadAttrGetDetachState(tls *TLS, a uintptr) int32 { /* pthread_attr_get.c:3:5: */
  5474. return *(*int32)(unsafe.Pointer(a))
  5475. }
  5476. func X__ccgo_pthreadMutexattrGettype(tls *TLS, a uintptr) int32 { /* pthread_attr_get.c:93:5: */
  5477. return *(*int32)(unsafe.Pointer(a)) & int32(3)
  5478. }
  5479. func Xchmod(t *TLS, pathname uintptr, mode int32) int32 {
  5480. panic(todo("%q %#o", GoString(pathname), mode))
  5481. }
  5482. // typedef enum _COMPUTER_NAME_FORMAT {
  5483. // ComputerNameNetBIOS,
  5484. // ComputerNameDnsHostname,
  5485. // ComputerNameDnsDomain,
  5486. // ComputerNameDnsFullyQualified,
  5487. // ComputerNamePhysicalNetBIOS,
  5488. // ComputerNamePhysicalDnsHostname,
  5489. // ComputerNamePhysicalDnsDomain,
  5490. // ComputerNamePhysicalDnsFullyQualified,
  5491. // ComputerNameMax
  5492. // } COMPUTER_NAME_FORMAT;
  5493. // BOOL GetComputerNameExW(
  5494. //
  5495. // [in] COMPUTER_NAME_FORMAT NameType,
  5496. // [out] LPWSTR lpBuffer,
  5497. // [in, out] LPDWORD nSize
  5498. //
  5499. // );
  5500. func XGetComputerNameExW(t *TLS, nameType int32, lpBuffer, nSize uintptr) int32 {
  5501. r0, _, err := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nameType), lpBuffer, nSize)
  5502. if err != 0 {
  5503. t.setErrno(err)
  5504. }
  5505. return int32(r0)
  5506. }
  5507. // double _copysign(
  5508. //
  5509. // double x,
  5510. // double y
  5511. //
  5512. // );
  5513. func X_copysign(t *TLS, x, y float64) float64 { return Xcopysign(t, x, y) }
  5514. // int _wtoi(
  5515. //
  5516. // const wchar_t *str
  5517. //
  5518. // );
  5519. func X_wtoi(t *TLS, str uintptr) int32 {
  5520. panic(todo(""))
  5521. }
  5522. func allocW(t *TLS, v string) (r uintptr) {
  5523. s := utf16.Encode([]rune(v))
  5524. p := Xcalloc(t, types.Size_t(len(s)+1), 2)
  5525. if p == 0 {
  5526. panic(todo(""))
  5527. }
  5528. r = p
  5529. for _, v := range s {
  5530. *(*uint16)(unsafe.Pointer(p)) = v
  5531. p += 2
  5532. }
  5533. return r
  5534. }
  5535. // wchar_t *_wgetenv(
  5536. //
  5537. // const wchar_t *varname
  5538. //
  5539. // );
  5540. func X_wgetenv(t *TLS, varname uintptr) uintptr {
  5541. if !wenvValid {
  5542. bootWinEnviron(t)
  5543. }
  5544. k := strings.ToLower(goWideStringNZ(varname))
  5545. for _, v := range winEnviron[:len(winEnviron)-1] {
  5546. s := strings.ToLower(goWideStringNZ(v))
  5547. x := strings.IndexByte(s, '=')
  5548. if s[:x] == k {
  5549. // trc("%v: %q -> %q", origin(1), goWideStringNZ(varname), goWideStringNZ(v))
  5550. return v
  5551. }
  5552. }
  5553. // trc("%v: %q -> %q", origin(1), goWideStringNZ(varname), "")
  5554. return 0
  5555. }
  5556. // int _wputenv(
  5557. //
  5558. // const wchar_t *envstring
  5559. //
  5560. // );
  5561. func X_wputenv(t *TLS, envstring uintptr) int32 {
  5562. if !wenvValid {
  5563. bootWinEnviron(t)
  5564. }
  5565. s0 := goWideStringNZ(envstring)
  5566. s := strings.ToLower(s0)
  5567. x := strings.IndexByte(s, '=')
  5568. k := s[:x]
  5569. for i, v := range winEnviron[:len(winEnviron)-1] {
  5570. s2 := strings.ToLower(goWideStringNZ(v))
  5571. x := strings.IndexByte(s2, '=')
  5572. if s2[:x] == k {
  5573. Xfree(t, v)
  5574. winEnviron[i] = allocW(t, s0)
  5575. return 0
  5576. }
  5577. }
  5578. np := allocW(t, s0)
  5579. winEnviron = winEnviron[:len(winEnviron)-1]
  5580. winEnviron = append(winEnviron, np, 0)
  5581. wenviron = uintptr(unsafe.Pointer(&winEnviron[0]))
  5582. return 0
  5583. }
  5584. func bootWinEnviron(t *TLS) {
  5585. winEnviron = winEnviron[:0]
  5586. p := Environ()
  5587. for {
  5588. q := *(*uintptr)(unsafe.Pointer(p))
  5589. p += unsafe.Sizeof(uintptr(0))
  5590. if q == 0 {
  5591. break
  5592. }
  5593. s := GoString(q)
  5594. // trc("%v: %q", origin(1), s)
  5595. r := allocW(t, s)
  5596. winEnviron = append(winEnviron, r)
  5597. }
  5598. wenviron = uintptr(unsafe.Pointer(&winEnviron[0]))
  5599. wenvValid = true
  5600. }
  5601. func Xfabsl(t *TLS, x float64) float64 { return math.Abs(x) }
  5602. func X__stdio_common_vfprintf(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5603. func X__stdio_common_vfprintf_p(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5604. func X__stdio_common_vfprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5605. func X__stdio_common_vfscanf(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5606. func X__stdio_common_vfwprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5607. func X__stdio_common_vfwscanf(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5608. func X__stdio_common_vsnprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5609. func X__stdio_common_vsnwprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5610. func X__stdio_common_vsprintf(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5611. func X__stdio_common_vsprintf_p(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5612. func X__stdio_common_vsprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5613. func X__stdio_common_vsscanf(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5614. func X__stdio_common_vswprintf(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5615. func X__stdio_common_vswprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") }
  5616. func X__stdio_common_vswscanf(t *TLS, args ...interface{}) int32 { panic("TODO") }