IdWinsock2.pas 326 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020
  1. {
  2. $Project$
  3. $Workfile$
  4. $Revision$
  5. $DateUTC$
  6. $Id$
  7. This file is part of the Indy (Internet Direct) project, and is offered
  8. under the dual-licensing agreement described on the Indy website.
  9. (http://www.indyproject.org/)
  10. Copyright:
  11. (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
  12. }
  13. {
  14. $Log$
  15. }
  16. {
  17. Log: 56400: IdWinsock2.pas
  18. Rev 1.0 2004.02.03 3:14:50 PM czhower
  19. Move and updates
  20. Rev 1.15 1/3/2004 12:41:48 AM BGooijen
  21. Fixed WSAEnumProtocols
  22. Rev 1.14 10/15/2003 1:20:48 PM DSiders
  23. Added localization comments.
  24. Rev 1.13 2003.10.01 11:16:38 AM czhower
  25. .Net
  26. Rev 1.12 9/24/2003 09:18:24 AM JPMugaas
  27. Fixed an AV that happened when a stack call was made.
  28. Rev 1.11 24/9/2003 3:11:34 PM SGrobety
  29. First wave of fixes for compiling in dotnet. Still not functional, needed to
  30. unlock to fix critical failure in Delphi code
  31. Rev 1.10 9/22/2003 11:20:14 PM EHill
  32. Removed assembly code and replaced with defined API stubs.
  33. Rev 1.9 7/7/2003 12:55:10 PM BGooijen
  34. Fixed ServiceQueryTransmitFile, and made it public
  35. Rev 1.8 2003.05.09 10:59:30 PM czhower
  36. Rev 1.7 4/19/2003 10:28:24 PM BGooijen
  37. some functions were linked to the wrong dll
  38. Rev 1.6 4/19/2003 11:14:40 AM JPMugaas
  39. Made some tentitive wrapper functions for some things that should be called
  40. from the Service Provider. Fixed WSARecvMsg.
  41. Rev 1.5 4/19/2003 02:29:26 AM JPMugaas
  42. Added TransmitPackets API function call. Note that this is only supported in
  43. Windows XP or later.
  44. Rev 1.4 4/19/2003 12:22:58 AM BGooijen
  45. fixed: ConnectEx DisconnectEx WSARecvMsg
  46. Rev 1.3 4/18/2003 12:00:58 AM JPMugaas
  47. added
  48. ConnectEx
  49. DisconnectEx
  50. WSARecvMsg
  51. Changed header procedure type names to be consistant with the old
  52. IdWinsock.pas in Indy 8.0 and with the rest of the unit.
  53. Rev 1.2 3/22/2003 10:01:26 PM JPMugaas
  54. WSACreateEvent couldn't load because of a space.
  55. Rev 1.1 3/22/2003 09:46:54 PM JPMugaas
  56. It turns out that we really do not need the TGUID defination in the header at
  57. all. It's defined in D4, D5, D6, and D7.
  58. Rev 1.0 11/13/2002 09:02:54 AM JPMugaas
  59. }
  60. //-------------------------------------------------------------
  61. //
  62. // Borland Delphi Runtime Library
  63. // <API> interface unit
  64. //
  65. // Portions created by Microsoft are
  66. // Copyright (C) 1995-1999 Microsoft Corporation.
  67. // All Rights Reserved.
  68. //
  69. // The original file is: Winsock2.h from CBuilder5 distribution.
  70. // The original Pascal code is: winsock2.pas, released 03 Mar 2001.
  71. // The initial developer of the Pascal code is Alex Konshin
  72. // ([email protected]).
  73. //-------------------------------------------------------------
  74. { Winsock2.h -- definitions to be used with the WinSock 2 DLL and WinSock 2 applications.
  75. This header file corresponds to version 2.2.x of the WinSock API specification.
  76. This file includes parts which are Copyright (c) 1982-1986 Regents
  77. of the University of California. All rights reserved.
  78. The Berkeley Software License Agreement specifies the terms and
  79. conditions for redistribution. }
  80. // Note that the original unit is copyrighted by the original author and I did obtain his
  81. // permission to port and use this as part of Indy - J. Peter Mugaas
  82. // 2002-01-28 - Hadi Hariri. Fixes for C++ Builder. Thanks to Chuck Smith.
  83. // 2001 - Oct -25 J. Peter Mugaas
  84. // Made adjustments for Indy usage by
  85. // 1) including removing Trace logging
  86. // 2) renaming and consolidating some .INC files as appropriate
  87. // 3) modifying the unit to follow Indy conventions
  88. // 4) Adding TransmitFile support for the HTTP Server
  89. // 5) Removing all static loading code that was IFDEF'ed. {Do not Localize}
  90. // 2001 - Mar - 1 Alex Konshin
  91. // Revision 3
  92. // converted by Alex Konshin, mailto:[email protected]
  93. // revision 3, March,1 2001
  94. unit IdWinsock2;
  95. interface
  96. {$I IdCompilerDefines.inc}
  97. {
  98. Important!!!
  99. With the ARM architecture, you may get an EBusError exception sating that
  100. data is misaligned. Sometimes, that architecture does not have the ability to
  101. read misaligned data. On an i386 and x86_64 architecure, you can do this but it
  102. is inefficient. For the ARM chip architecture, we have to make sure our records
  103. are aligned on a 4 byte boundery. See:
  104. http://wiki.lazarus.freepascal.org/Windows_CE_Development_Notes
  105. This is not necessary and can cause problems
  106. when using the standard Win32 API (win32 and win64) where records are packed
  107. instead of aligned.
  108. To deal with this, I use the FPC predefined FPC_REQUIRES_PROPER_ALIGNMENT.
  109. }
  110. {$RANGECHECKS OFF}
  111. {$IFDEF FPC}
  112. {$IFDEF WIN32}
  113. {$ALIGN OFF}
  114. {$ELSE}
  115. //It turns out that Win64 and WinCE require record alignment
  116. {$PACKRECORDS C}
  117. {$ENDIF}
  118. {$ELSE}
  119. {$IFDEF WIN64}
  120. {$ALIGN ON}
  121. {$MINENUMSIZE 4}
  122. {$ELSE}
  123. {$MINENUMSIZE 4}
  124. {$IFDEF REQUIRES_PROPER_ALIGNMENT}
  125. {$ALIGN ON}
  126. {$ELSE}
  127. {$ALIGN OFF}
  128. {$WRITEABLECONST OFF}
  129. {$ENDIF}
  130. {$ENDIF}
  131. {$ENDIF}
  132. uses
  133. IdException, IdGlobal, SysUtils, Windows;
  134. type
  135. EIdWinsockStubError = class(EIdException)
  136. protected
  137. FWin32Error : DWORD;
  138. FWin32ErrorMessage : String;
  139. FTitle : String;
  140. public
  141. constructor Build(AWin32Error: DWORD; const ATitle: String; AArgs: array of const);
  142. property Win32Error : DWORD read FWin32Error;
  143. property Win32ErrorMessage : String read FWin32ErrorMessage;
  144. property Title : String read FTitle;
  145. end;
  146. const
  147. {$IFDEF WINCE}
  148. WINSOCK2_DLL = 'ws2.dll'; {Do not Localize}
  149. {$ELSE}
  150. WINSOCK2_DLL = 'WS2_32.DLL'; {Do not Localize}
  151. MSWSOCK_DLL = 'MSWSOCK.DLL'; {Do not Localize}
  152. {$ENDIF}
  153. {$EXTERNALSYM WINSOCK_VERSION}
  154. WINSOCK_VERSION = $0202;
  155. {$DEFINE WS2_DLL_FUNC_VARS}
  156. {$DEFINE INCL_WINSOCK_API_PROTOTYPES}
  157. {$DEFINE INCL_WINSOCK_API_TYPEDEFS}
  158. type
  159. {$EXTERNALSYM u_char}
  160. u_char = Byte;
  161. {$EXTERNALSYM u_short}
  162. u_short = Word;
  163. {$EXTERNALSYM u_int}
  164. u_int = DWord; //Integer;
  165. {$EXTERNALSYM u_long}
  166. u_long = DWORD;
  167. // The new type to be used in all instances which refer to sockets.
  168. {$EXTERNALSYM TSocket}
  169. TSocket = PtrUInt;
  170. {$EXTERNALSYM WSAEVENT}
  171. WSAEVENT = THandle;
  172. {$NODEFINE PWSAEVENT}
  173. PWSAEVENT = ^WSAEVENT;
  174. {$EXTERNALSYM LPWSAEVENT}
  175. LPWSAEVENT = PWSAEVENT;
  176. // Must define the following types because the older versions of Delphi do not support them
  177. {$IFNDEF HAS_ULONG_PTR}
  178. {$EXTERNALSYM ULONG_PTR}
  179. ULONG_PTR = PtrUInt;
  180. {$ENDIF}
  181. {$IFNDEF HAS_DWORD_PTR}
  182. {$EXTERNALSYM DWORD_PTR}
  183. DWORD_PTR = PtrUInt;
  184. {$ENDIF}
  185. {$IFNDEF HAS_USHORT}
  186. {$EXTERNALSYM USHORT}
  187. USHORT = UInt16;
  188. {$ENDIF}
  189. {$IFNDEF HAS_PVOID}
  190. {$EXTERNALSYM PVOID}
  191. PVOID = Pointer;
  192. {$ENDIF}
  193. {$IFNDEF HAS_ULONG64}
  194. {$EXTERNALSYM ULONG64}
  195. ULONG64 = UInt64;
  196. {$ENDIF}
  197. {$IFNDEF HAS_LONG}
  198. {$EXTERNALSYM LONG}
  199. LONG = Longint;
  200. {$ENDIF}
  201. {$IFNDEF HAS_ULONGLONG}
  202. {$EXTERNALSYM ULONGLONG}
  203. ULONGLONG = UInt64;
  204. {$ENDIF}
  205. const
  206. {$EXTERNALSYM FD_SETSIZE}
  207. FD_SETSIZE = 64;
  208. // the following emits are a workaround to the name conflicts
  209. // with the winsock2 header files
  210. (*$HPPEMIT '#include <winsock2.h>'*)
  211. (*$HPPEMIT '#include <ws2tcpip.h>'*)
  212. (*$HPPEMIT '#include <wsipx.h>'*)
  213. (*$HPPEMIT '// workaround for a bug in wsnwlink.h where a couple of commented lines are not terminated property'*)
  214. (*$HPPEMIT '#pragma option push -C-'*)
  215. (*$HPPEMIT '#include <wsnwlink.h>'*)
  216. (*$HPPEMIT '#pragma option pop'*)
  217. (*$HPPEMIT '#include <wsnetbs.h>'*)
  218. (*$HPPEMIT '#include <ws2atm.h>'*)
  219. (*$HPPEMIT '#include <mswsock.h>'*)
  220. (*$HPPEMIT ''*)
  221. (*$HPPEMIT 'namespace Idwinsock2'*)
  222. (*$HPPEMIT '{'*)
  223. (*$HPPEMIT ' typedef fd_set *PFDSet;'*) // due to name conflict with procedure FD_SET
  224. (*$HPPEMIT ' typedef fd_set TFDSet;'*) // due to name conflict with procedure FD_SET
  225. (*$HPPEMIT '}'*)
  226. (*$HPPEMIT ''*)
  227. type
  228. {$NODEFINE PFDSet}
  229. PFDSet = ^TFDSet;
  230. {$NODEFINE TFDSet}
  231. TFDSet = record
  232. fd_count: u_int;
  233. fd_array: array[0..FD_SETSIZE-1] of TSocket;
  234. end;
  235. {$EXTERNALSYM timeval}
  236. timeval = record
  237. tv_sec: Longint;
  238. tv_usec: Longint;
  239. end;
  240. {$NODEFINE TTimeVal}
  241. TTimeVal = timeval;
  242. {$NODEFINE PTimeVal}
  243. PTimeVal = ^TTimeVal;
  244. const
  245. {$EXTERNALSYM IOCPARM_MASK}
  246. IOCPARM_MASK = $7F;
  247. {$EXTERNALSYM IOC_VOID}
  248. IOC_VOID = $20000000;
  249. {$EXTERNALSYM IOC_OUT}
  250. IOC_OUT = $40000000;
  251. {$EXTERNALSYM IOC_IN}
  252. IOC_IN = $80000000;
  253. {$EXTERNALSYM IOC_INOUT}
  254. IOC_INOUT = (IOC_IN or IOC_OUT);
  255. // get # bytes to read
  256. {$EXTERNALSYM FIONREAD}
  257. FIONREAD = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 127; {Do not Localize}
  258. // set/clear non-blocking i/o
  259. {$EXTERNALSYM FIONBIO}
  260. FIONBIO = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 126; {Do not Localize}
  261. // set/clear async i/o
  262. {$EXTERNALSYM FIOASYNC}
  263. FIOASYNC = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 125; {Do not Localize}
  264. // Socket I/O Controls
  265. // set high watermark
  266. {$EXTERNALSYM SIOCSHIWAT}
  267. SIOCSHIWAT = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 0; {Do not Localize}
  268. // get high watermark
  269. {$EXTERNALSYM SIOCGHIWAT}
  270. SIOCGHIWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 1; {Do not Localize}
  271. // set low watermark
  272. {$EXTERNALSYM SIOCSLOWAT}
  273. SIOCSLOWAT = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 2; {Do not Localize}
  274. // get low watermark
  275. {$EXTERNALSYM SIOCGLOWAT}
  276. SIOCGLOWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 3; {Do not Localize}
  277. // at oob mark?
  278. {$EXTERNALSYM SIOCATMARK}
  279. SIOCATMARK = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 7; {Do not Localize}
  280. // Structures returned by network data base library, taken from the
  281. // BSD file netdb.h. All addresses are supplied in host order, and
  282. // returned in network order (suitable for use in system calls).
  283. type
  284. {$EXTERNALSYM hostent}
  285. hostent = record
  286. h_name: PIdAnsiChar; // official name of host
  287. h_aliases: PPIdAnsiChar; // alias list
  288. h_addrtype: short; // host address type
  289. h_length: short; // length of address
  290. case Byte of
  291. 0: (h_address_list: PPIdAnsiChar);
  292. 1: (h_addr: PIdAnsiChar); // address, for backward compat
  293. end;
  294. {$NODEFINE THostEnt}
  295. THostEnt = hostent;
  296. {$NODEFINE PHostEnt}
  297. PHostEnt = ^THostEnt;
  298. // It is assumed here that a network number
  299. // fits in 32 bits.
  300. {$EXTERNALSYM netent}
  301. netent = record
  302. n_name: PIdAnsiChar; // official name of net
  303. n_aliases: PPIdAnsiChar; // alias list
  304. n_addrtype: short; // net address type
  305. n_net: u_long; // network #
  306. end;
  307. {$NODEFINE TNetEnt}
  308. TNetEnt = netent;
  309. {$NODEFINE PNetEnt}
  310. PNetEnt = ^TNetEnt;
  311. {$EXTERNALSYM servent}
  312. servent = record
  313. s_name: PIdAnsiChar; // official service name
  314. s_aliases: PPIdAnsiChar; // alias list
  315. {$IFDEF _WIN64}
  316. s_proto: PIdAnsiChar; // protocol to use
  317. s_port: short; // port #
  318. {$ELSE}
  319. s_port: short; // port #
  320. s_proto: PIdAnsiChar; // protocol to use
  321. {$ENDIF}
  322. end;
  323. {$NODEFINE TServEnt}
  324. TServEnt = servent;
  325. {$NODEFINE PServEnt}
  326. PServEnt = ^TServEnt;
  327. {$EXTERNALSYM protoent}
  328. protoent = record
  329. p_name: PIdAnsiChar; // official protocol name
  330. p_aliases: PPIdAnsiChar; // alias list
  331. p_proto: short; // protocol #
  332. end;
  333. {$NODEFINE TProtoEnt}
  334. TProtoEnt = protoent;
  335. {$NODEFINE PProtoEnt}
  336. PProtoEnt = ^TProtoEnt;
  337. {$EXTERNALSYM NL_ADDRESS_TYPE}
  338. NL_ADDRESS_TYPE = (
  339. NlatUnspecified,
  340. NlatUnicast,
  341. NlatAnycast,
  342. NlatMulticast,
  343. NlatBroadcast,
  344. NlatInvalid);
  345. // Constants and structures defined by the internet system,
  346. // Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
  347. const
  348. // Protocols
  349. {$EXTERNALSYM IPPROTO_IP}
  350. IPPROTO_IP = 0; // dummy for IP
  351. {$EXTERNALSYM IPPROTO_ICMP}
  352. IPPROTO_ICMP = 1; // control message protocol
  353. {$EXTERNALSYM IPPROTO_IGMP}
  354. IPPROTO_IGMP = 2; // group management protocol
  355. {$EXTERNALSYM IPPROTO_GGP}
  356. IPPROTO_GGP = 3; // gateway^2 (deprecated)
  357. {$EXTERNALSYM IPPROTO_TCP}
  358. IPPROTO_TCP = 6; // TCP
  359. {$EXTERNALSYM IPPROTO_PUP}
  360. IPPROTO_PUP = 12; // pup
  361. {$EXTERNALSYM IPPROTO_UDP}
  362. IPPROTO_UDP = 17; // UDP - user datagram protocol
  363. {$EXTERNALSYM IPPROTO_IDP}
  364. IPPROTO_IDP = 22; // xns idp
  365. {$EXTERNALSYM IPPROTO_ND}
  366. IPPROTO_ND = 77; // UNOFFICIAL net disk proto
  367. {$EXTERNALSYM IPPROTO_IPV6}
  368. IPPROTO_IPV6 = 41; // IPv6
  369. {$EXTERNALSYM IPPROTO_ICLFXBM}
  370. IPPROTO_ICLFXBM = 78;
  371. {$EXTERNALSYM IPPROTO_ICMPV6}
  372. IPPROTO_ICMPV6 = 58; // control message protocol
  373. {$EXTERNALSYM IPPROTO_RAW}
  374. IPPROTO_RAW = 255; // raw IP packet
  375. {$EXTERNALSYM IPPROTO_MAX}
  376. IPPROTO_MAX = 256;
  377. // Port/socket numbers: network standard functions
  378. {$EXTERNALSYM IPPORT_ECHO}
  379. IPPORT_ECHO = 7;
  380. {$EXTERNALSYM IPPORT_DISCARD}
  381. IPPORT_DISCARD = 9;
  382. {$EXTERNALSYM IPPORT_SYSTAT}
  383. IPPORT_SYSTAT = 11;
  384. {$EXTERNALSYM IPPORT_DAYTIME}
  385. IPPORT_DAYTIME = 13;
  386. {$EXTERNALSYM IPPORT_NETSTAT}
  387. IPPORT_NETSTAT = 15;
  388. {$EXTERNALSYM IPPORT_FTP}
  389. IPPORT_FTP = 21;
  390. {$EXTERNALSYM IPPORT_TELNET}
  391. IPPORT_TELNET = 23;
  392. {$EXTERNALSYM IPPORT_SMTP}
  393. IPPORT_SMTP = 25;
  394. {$EXTERNALSYM IPPORT_TIMESERVER}
  395. IPPORT_TIMESERVER = 37;
  396. {$EXTERNALSYM IPPORT_NAMESERVER}
  397. IPPORT_NAMESERVER = 42;
  398. {$EXTERNALSYM IPPORT_WHOIS}
  399. IPPORT_WHOIS = 43;
  400. {$EXTERNALSYM IPPORT_MTP}
  401. IPPORT_MTP = 57;
  402. // Port/socket numbers: host specific functions
  403. {$EXTERNALSYM IPPORT_TFTP}
  404. IPPORT_TFTP = 69;
  405. {$EXTERNALSYM IPPORT_RJE}
  406. IPPORT_RJE = 77;
  407. {$EXTERNALSYM IPPORT_FINGER}
  408. IPPORT_FINGER = 79;
  409. {$EXTERNALSYM ipport_ttylink}
  410. IPPORT_TTYLINK = 87;
  411. {$EXTERNALSYM IPPORT_SUPDUP}
  412. IPPORT_SUPDUP = 95;
  413. // UNIX TCP sockets
  414. {$EXTERNALSYM IPPORT_EXECSERVER}
  415. IPPORT_EXECSERVER = 512;
  416. {$EXTERNALSYM IPPORT_LOGINSERVER}
  417. IPPORT_LOGINSERVER = 513;
  418. {$EXTERNALSYM IPPORT_CMDSERVER}
  419. IPPORT_CMDSERVER = 514;
  420. {$EXTERNALSYM IPPORT_EFSSERVER}
  421. IPPORT_EFSSERVER = 520;
  422. // UNIX UDP sockets
  423. {$EXTERNALSYM IPPORT_BIFFUDP}
  424. IPPORT_BIFFUDP = 512;
  425. {$EXTERNALSYM IPPORT_WHOSERVER}
  426. IPPORT_WHOSERVER = 513;
  427. {$EXTERNALSYM IPPORT_ROUTESERVER}
  428. IPPORT_ROUTESERVER = 520;
  429. // Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root).
  430. {$EXTERNALSYM IPPORT_RESERVED}
  431. IPPORT_RESERVED = 1024;
  432. {$EXTERNALSYM IPPORT_REGISTERED_MIN}
  433. IPPORT_REGISTERED_MIN = IPPORT_RESERVED;
  434. {$IFNDEF WINCE}
  435. {$EXTERNALSYM IPPORT_REGISTERED_MAX}
  436. IPPORT_REGISTERED_MAX = $bfff;
  437. {$EXTERNALSYM IPPORT_DYNAMIC_MIN}
  438. IPPORT_DYNAMIC_MIN = $c000;
  439. {$EXTERNALSYM IPPORT_DYNAMIC_MAX}
  440. IPPORT_DYNAMIC_MAX = $ffff;
  441. {$ENDIF}
  442. // Link numbers
  443. {$EXTERNALSYM IMPLINK_IP}
  444. IMPLINK_IP = 155;
  445. {$EXTERNALSYM IMPLINK_LOWEXPER}
  446. IMPLINK_LOWEXPER = 156;
  447. {$EXTERNALSYM IMPLINK_HIGHEXPER}
  448. IMPLINK_HIGHEXPER = 158;
  449. {$EXTERNALSYM TF_DISCONNECT}
  450. TF_DISCONNECT = $01;
  451. {$EXTERNALSYM TF_REUSE_SOCKET}
  452. TF_REUSE_SOCKET = $02;
  453. {$EXTERNALSYM TF_WRITE_BEHIND}
  454. TF_WRITE_BEHIND = $04;
  455. {$EXTERNALSYM TF_USE_DEFAULT_WORKER}
  456. TF_USE_DEFAULT_WORKER = $00;
  457. {$EXTERNALSYM TF_USE_SYSTEM_THREAD}
  458. TF_USE_SYSTEM_THREAD = $10;
  459. {$EXTERNALSYM TF_USE_KERNEL_APC}
  460. TF_USE_KERNEL_APC = $20;
  461. // This is used instead of -1, since the TSocket type is unsigned.
  462. {$EXTERNALSYM INVALID_SOCKET}
  463. INVALID_SOCKET = TSocket(not(0));
  464. {$EXTERNALSYM SOCKET_ERROR}
  465. SOCKET_ERROR = -1;
  466. // The following may be used in place of the address family, socket type, or
  467. // protocol in a call to WSASocket to indicate that the corresponding value
  468. // should be taken from the supplied WSAPROTOCOL_INFO structure instead of the
  469. // parameter itself.
  470. {$EXTERNALSYM FROM_PROTOCOL_INFO}
  471. FROM_PROTOCOL_INFO = -1;
  472. // Types
  473. {$EXTERNALSYM SOCK_STREAM}
  474. SOCK_STREAM = 1; { stream socket }
  475. {$EXTERNALSYM SOCK_DGRAM}
  476. SOCK_DGRAM = 2; { datagram socket }
  477. {$EXTERNALSYM SOCK_RAW}
  478. SOCK_RAW = 3; { raw-protocol interface }
  479. {$EXTERNALSYM SOCK_RDM}
  480. SOCK_RDM = 4; { reliably-delivered message }
  481. {$EXTERNALSYM SOCK_SEQPACKET}
  482. SOCK_SEQPACKET = 5; { sequenced packet stream }
  483. // option flags per-socket.
  484. {$EXTERNALSYM SO_DEBUG}
  485. SO_DEBUG = $0001; // turn on debugging info recording
  486. {$EXTERNALSYM SO_ACCEPTCONN}
  487. SO_ACCEPTCONN = $0002; // socket has had listen()
  488. {$EXTERNALSYM SO_REUSEADDR}
  489. SO_REUSEADDR = $0004; // allow local address reuse
  490. {$EXTERNALSYM SO_KEEPALIVE}
  491. SO_KEEPALIVE = $0008; // keep connections alive
  492. {$EXTERNALSYM SO_DONTROUTE}
  493. SO_DONTROUTE = $0010; // just use interface addresses
  494. {$EXTERNALSYM SO_BROADCAST}
  495. SO_BROADCAST = $0020; // permit sending of broadcast msgs
  496. {$EXTERNALSYM SO_USELOOPBACK}
  497. SO_USELOOPBACK = $0040; // bypass hardware when possible
  498. {$EXTERNALSYM SO_LINGER}
  499. SO_LINGER = $0080; // linger on close if data present
  500. {$EXTERNALSYM SO_OOBINLINE}
  501. SO_OOBINLINE = $0100; // leave received OOB data in line
  502. {$EXTERNALSYM SO_DONTLINGER}
  503. SO_DONTLINGER = not SO_LINGER;
  504. {$EXTERNALSYM SO_EXCLUSIVEADDRUSE}
  505. SO_EXCLUSIVEADDRUSE = not SO_REUSEADDR; // disallow local address reuse
  506. // additional options.
  507. {$EXTERNALSYM SO_SNDBUF}
  508. SO_SNDBUF = $1001; // send buffer size
  509. {$EXTERNALSYM SO_RCVBUF}
  510. SO_RCVBUF = $1002; // receive buffer size
  511. {$EXTERNALSYM SO_SNDLOWAT}
  512. SO_SNDLOWAT = $1003; // send low-water mark
  513. {$EXTERNALSYM SO_RCVLOWAT}
  514. SO_RCVLOWAT = $1004; // receive low-water mark
  515. {$EXTERNALSYM SO_SNDTIMEO}
  516. SO_SNDTIMEO = $1005; // send timeout
  517. {$EXTERNALSYM SO_RCVTIMEO}
  518. SO_RCVTIMEO = $1006; // receive timeout
  519. {$EXTERNALSYM SO_ERROR}
  520. SO_ERROR = $1007; // get error status and clear
  521. {$EXTERNALSYM SO_TYPE}
  522. SO_TYPE = $1008; // get socket type
  523. // options for connect and disconnect data and options.
  524. // used only by non-tcp/ip transports such as DECNet, OSI TP4, etc.
  525. {$EXTERNALSYM SO_CONNDATA}
  526. SO_CONNDATA = $7000;
  527. {$EXTERNALSYM SO_CONNOPT}
  528. SO_CONNOPT = $7001;
  529. {$EXTERNALSYM SO_DISCDATA}
  530. SO_DISCDATA = $7002;
  531. {$EXTERNALSYM SO_DISCOPT}
  532. SO_DISCOPT = $7003;
  533. {$EXTERNALSYM SO_CONNDATALEN}
  534. SO_CONNDATALEN = $7004;
  535. {$EXTERNALSYM SO_CONNOPTLEN}
  536. SO_CONNOPTLEN = $7005;
  537. {$EXTERNALSYM SO_DISCDATALEN}
  538. SO_DISCDATALEN = $7006;
  539. {$EXTERNALSYM SO_DISCOPTLEN}
  540. SO_DISCOPTLEN = $7007;
  541. // option for opening sockets for synchronous access.
  542. {$EXTERNALSYM SO_OPENTYPE}
  543. SO_OPENTYPE = $7008;
  544. {$EXTERNALSYM SO_SYNCHRONOUS_ALERT}
  545. SO_SYNCHRONOUS_ALERT = $10;
  546. {$EXTERNALSYM SO_SYNCHRONOUS_NONALERT}
  547. SO_SYNCHRONOUS_NONALERT = $20;
  548. // other nt-specific options.
  549. {$EXTERNALSYM SO_MAXDG}
  550. SO_MAXDG = $7009;
  551. {$EXTERNALSYM SO_MAXPATHDG}
  552. SO_MAXPATHDG = $700A;
  553. {$EXTERNALSYM SO_UPDATE_ACCEPT_CONTEXT}
  554. SO_UPDATE_ACCEPT_CONTEXT = $700B;
  555. {$EXTERNALSYM SO_CONNECT_TIME}
  556. SO_CONNECT_TIME = $700C;
  557. {$EXTERNALSYM SO_UPDATE_CONNECT_CONTEXT}
  558. SO_UPDATE_CONNECT_CONTEXT = $7010;
  559. // tcp options.
  560. {$EXTERNALSYM TCP_NODELAY}
  561. TCP_NODELAY = $0001;
  562. {$EXTERNALSYM TCP_BSDURGENT}
  563. TCP_BSDURGENT = $7000;
  564. // winsock 2 extension -- new options
  565. {$EXTERNALSYM SO_GROUP_ID}
  566. SO_GROUP_ID = $2001; // ID of a socket group
  567. {$EXTERNALSYM SO_GROUP_PRIORITY}
  568. SO_GROUP_PRIORITY = $2002; // the relative priority within a group
  569. {$EXTERNALSYM SO_MAX_MSG_SIZE}
  570. SO_MAX_MSG_SIZE = $2003; // maximum message size
  571. {$EXTERNALSYM SO_PROTOCOL_INFOA}
  572. SO_PROTOCOL_INFOA = $2004; // WSAPROTOCOL_INFOA structure
  573. {$EXTERNALSYM SO_PROTOCOL_INFOW}
  574. SO_PROTOCOL_INFOW = $2005; // WSAPROTOCOL_INFOW structure
  575. {$EXTERNALSYM SO_PROTOCOL_INFO}
  576. {$IFDEF UNICODE}
  577. SO_PROTOCOL_INFO = SO_PROTOCOL_INFOW;
  578. {$ELSE}
  579. SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA;
  580. {$ENDIF}
  581. {$EXTERNALSYM PVD_CONFIG}
  582. PVD_CONFIG = $3001; // configuration info for service provider
  583. {$EXTERNALSYM SO_CONDITIONAL_ACCEPT}
  584. SO_CONDITIONAL_ACCEPT = $3002; // enable true conditional accept:
  585. // connection is not ack-ed to the
  586. // other side until conditional
  587. // function returns CF_ACCEPT
  588. {$EXTERNALSYM SO_REUSE_UNICASTPORT}
  589. SO_REUSE_UNICASTPORT = $3007; // defer ephemeral port allocation for
  590. // outbound connections
  591. {$EXTERNALSYM SO_REUSE_MULTICASTPORT}
  592. SO_REUSE_MULTICASTPORT = $3008; // enable port reuse and disable unicast
  593. //reception.
  594. {$IFNDEF WINCE}
  595. {$EXTERNALSYM SO_RANDOMIZE_PORT}
  596. SO_RANDOMIZE_PORT = $3005; // randomize assignment of wildcard ports
  597. {$EXTERNALSYM SO_PORT_SCALABILITY}
  598. SO_PORT_SCALABILITY = $3006; // enable port scalability
  599. {$ENDIF}
  600. // Address families.
  601. {$EXTERNALSYM AF_UNSPEC}
  602. AF_UNSPEC = 0; // unspecified
  603. {$EXTERNALSYM AF_UNIX}
  604. AF_UNIX = 1; // local to host (pipes, portals)
  605. {$EXTERNALSYM AF_INET}
  606. AF_INET = 2; // internetwork: UDP, TCP, etc.
  607. {$EXTERNALSYM AF_IMPLINK}
  608. AF_IMPLINK = 3; // arpanet imp addresses
  609. {$EXTERNALSYM AF_PUP}
  610. AF_PUP = 4; // pup protocols: e.g. BSP
  611. {$EXTERNALSYM AF_CHAOS}
  612. AF_CHAOS = 5; // mit CHAOS protocols
  613. {$EXTERNALSYM AF_IPX}
  614. AF_IPX = 6; // ipx and SPX
  615. {$EXTERNALSYM AF_NS}
  616. AF_NS = AF_IPX; // xerOX NS protocols
  617. {$EXTERNALSYM AF_ISO}
  618. AF_ISO = 7; // iso protocols
  619. {$EXTERNALSYM AF_OSI}
  620. AF_OSI = AF_ISO; // osi is ISO
  621. {$EXTERNALSYM AF_ECMA}
  622. AF_ECMA = 8; // european computer manufacturers
  623. {$EXTERNALSYM AF_DATAKIT}
  624. AF_DATAKIT = 9; // datakit protocols
  625. {$EXTERNALSYM AF_CCITT}
  626. AF_CCITT = 10; // cciTT protocols, X.25 etc
  627. {$EXTERNALSYM AF_SNA}
  628. AF_SNA = 11; // ibm SNA
  629. {$EXTERNALSYM AF_DECNET}
  630. AF_DECNET = 12; // decnet
  631. {$EXTERNALSYM AF_DLI}
  632. AF_DLI = 13; // direct data link interface
  633. {$EXTERNALSYM AF_LAT}
  634. AF_LAT = 14; // lat
  635. {$EXTERNALSYM AF_HYLINK}
  636. AF_HYLINK = 15; // nsc Hyperchannel
  637. {$EXTERNALSYM AF_APPLETALK}
  638. AF_APPLETALK = 16; // appleTalk
  639. {$EXTERNALSYM AF_NETBIOS}
  640. AF_NETBIOS = 17; // netBios-style addresses
  641. {$EXTERNALSYM AF_VOICEVIEW}
  642. AF_VOICEVIEW = 18; // voiceView
  643. {$EXTERNALSYM AF_FIREFOX}
  644. AF_FIREFOX = 19; // fireFox
  645. {$EXTERNALSYM AF_UNKNOWN1}
  646. AF_UNKNOWN1 = 20; // somebody is using this!
  647. {$EXTERNALSYM AF_BAN}
  648. AF_BAN = 21; // banyan
  649. {$IFDEF WINCE}
  650. {$EXTERNALSYM AF_IRDA}
  651. AF_IRDA = 22; //* IrDA */
  652. {$ELSE}
  653. {$EXTERNALSYM AF_ATM}
  654. AF_ATM = 22; // native ATM Services
  655. {$ENDIF}
  656. {$EXTERNALSYM AF_INET6}
  657. AF_INET6 = 23; // internetwork Version 6
  658. {$EXTERNALSYM AF_CLUSTER}
  659. AF_CLUSTER = 24; // microsoft Wolfpack
  660. {$EXTERNALSYM AF_12844}
  661. AF_12844 = 25; // ieeE 1284.4 WG AF
  662. {$IFDEF WINCE}
  663. {$EXTERNALSYM AF_ATM}
  664. AF_ATM = 26; //* Native ATM Services */
  665. {$ELSE}
  666. {$EXTERNALSYM AF_IRDA}
  667. AF_IRDA = 26; // irdA
  668. {$ENDIF}
  669. {$EXTERNALSYM AF_NETDES}
  670. AF_NETDES = 28; // network Designers OSI & gateway enabled protocols
  671. {$EXTERNALSYM AF_TCNPROCESS}
  672. AF_TCNPROCESS = 29;
  673. {$EXTERNALSYM AF_TCNMESSAGE}
  674. AF_TCNMESSAGE = 30;
  675. {$EXTERNALSYM AF_ICLFXBM}
  676. AF_ICLFXBM = 31;
  677. {$EXTERNALSYM AF_HYPERV}
  678. AF_HYPERV = 34;
  679. {$EXTERNALSYM AF_MAX}
  680. AF_MAX = 35; //was 32
  681. // protocol families, same as address families for now.
  682. {$EXTERNALSYM PF_UNSPEC}
  683. PF_UNSPEC = AF_UNSPEC;
  684. {$EXTERNALSYM PF_UNIX}
  685. PF_UNIX = AF_UNIX;
  686. {$EXTERNALSYM PF_INET}
  687. PF_INET = AF_INET;
  688. {$EXTERNALSYM PF_IMPLINK}
  689. PF_IMPLINK = AF_IMPLINK;
  690. {$EXTERNALSYM PF_PUP}
  691. PF_PUP = AF_PUP;
  692. {$EXTERNALSYM PF_CHAOS}
  693. PF_CHAOS = AF_CHAOS;
  694. {$EXTERNALSYM PF_NS}
  695. PF_NS = AF_NS;
  696. {$EXTERNALSYM PF_IPX}
  697. PF_IPX = AF_IPX;
  698. {$EXTERNALSYM PF_ISO}
  699. PF_ISO = AF_ISO;
  700. {$EXTERNALSYM PF_OSI}
  701. PF_OSI = AF_OSI;
  702. {$EXTERNALSYM PF_ECMA}
  703. PF_ECMA = AF_ECMA;
  704. {$EXTERNALSYM PF_DATAKIT}
  705. PF_DATAKIT = AF_DATAKIT;
  706. {$EXTERNALSYM PF_CCITT}
  707. PF_CCITT = AF_CCITT;
  708. {$EXTERNALSYM PF_SNA}
  709. PF_SNA = AF_SNA;
  710. {$EXTERNALSYM PF_DECNET}
  711. PF_DECNET = AF_DECNET;
  712. {$EXTERNALSYM PF_DLI}
  713. PF_DLI = AF_DLI;
  714. {$EXTERNALSYM PF_LAT}
  715. PF_LAT = AF_LAT;
  716. {$EXTERNALSYM PF_HYLINK}
  717. PF_HYLINK = AF_HYLINK;
  718. {$EXTERNALSYM PF_APPLETALK}
  719. PF_APPLETALK = AF_APPLETALK;
  720. {$EXTERNALSYM PF_VOICEVIEW}
  721. PF_VOICEVIEW = AF_VOICEVIEW;
  722. {$EXTERNALSYM PF_FIREFOX}
  723. PF_FIREFOX = AF_FIREFOX;
  724. {$EXTERNALSYM PF_UNKNOWN1}
  725. PF_UNKNOWN1 = AF_UNKNOWN1;
  726. {$EXTERNALSYM pf_ban}
  727. PF_BAN = AF_BAN;
  728. {$EXTERNALSYM PF_ATM}
  729. PF_ATM = AF_ATM;
  730. {$EXTERNALSYM PF_INET6}
  731. PF_INET6 = AF_INET6;
  732. {$EXTERNALSYM PF_MAX}
  733. PF_MAX = AF_MAX;
  734. {$EXTERNALSYM _SS_MAXSIZE}
  735. _SS_MAXSIZE = 128;
  736. {$EXTERNALSYM _SS_ALIGNSIZE}
  737. _SS_ALIGNSIZE = SizeOf(Int64);
  738. {$EXTERNALSYM _SS_PAD1SIZE}
  739. _SS_PAD1SIZE = _SS_ALIGNSIZE - SizeOf(short);
  740. {$EXTERNALSYM _SS_PAD2SIZE}
  741. _SS_PAD2SIZE = _SS_MAXSIZE - (SizeOf(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE);
  742. type
  743. {$NODEFINE SunB}
  744. SunB = record
  745. s_b1, s_b2, s_b3, s_b4: u_char;
  746. end;
  747. {$NODEFINE SunW}
  748. SunW = record
  749. s_w1, s_w2: u_short;
  750. end;
  751. {$EXTERNALSYM in_addr}
  752. in_addr = record
  753. case integer of
  754. 0: (S_un_b: SunB);
  755. 1: (S_un_w: SunW);
  756. 2: (S_addr: u_long);
  757. end;
  758. {$NODEFINE TInAddr}
  759. TInAddr = in_addr;
  760. {$NODEFINE PInAddr}
  761. PInAddr = ^TInAddr;
  762. // Structure used by kernel to store most addresses.
  763. {$EXTERNALSYM sockaddr_in}
  764. sockaddr_in = record
  765. case Integer of
  766. 0: (sin_family : u_short;
  767. sin_port : u_short;
  768. sin_addr : TInAddr;
  769. sin_zero : array[0..7] of TIdAnsiChar);
  770. 1: (sa_family : u_short;
  771. sa_data : array[0..13] of TIdAnsiChar)
  772. end;
  773. {$NODEFINE TSockAddrIn}
  774. TSockAddrIn = sockaddr_in;
  775. {$NODEFINE PSockAddrIn}
  776. PSockAddrIn = ^TSockAddrIn;
  777. {$NODEFINE PSockAddr_In}
  778. PSockAddr_In = PSockAddrIn;
  779. {$NODEFINE TSockAddr}
  780. TSockAddr = TSockAddrIn;
  781. {$EXTERNALSYM SOCKADDR}
  782. SOCKADDR = TSockAddr;
  783. {$EXTERNALSYM PSOCKADDR}
  784. PSOCKADDR = ^TSockAddr;
  785. {$EXTERNALSYM LPSOCKADDR}
  786. LPSOCKADDR = PSOCKADDR;
  787. {$EXTERNALSYM SOCKADDR_STORAGE}
  788. SOCKADDR_STORAGE = record
  789. ss_family: short; // Address family.
  790. __ss_pad1: array[0.._SS_PAD1SIZE-1] of TIdAnsiChar; // 6 byte pad, this is to make
  791. // implementation specific pad up to
  792. // alignment field that follows explicit
  793. // in the data structure.
  794. __ss_align: Int64; // Field to force desired structure.
  795. __ss_pad2: array[0.._SS_PAD2SIZE-1] of TIdAnsiChar; // 112 byte pad to achieve desired size;
  796. // _SS_MAXSIZE value minus size of
  797. // ss_family, __ss_pad1, and
  798. // __ss_align fields is 112.
  799. end;
  800. {$NODEFINE TSockAddrStorage}
  801. TSockAddrStorage = SOCKADDR_STORAGE;
  802. {$NODEFINE PSockAddrStorage}
  803. PSockAddrStorage = ^TSockAddrStorage;
  804. {$EXTERNALSYM PSOCKADDR_STORAGE}
  805. PSOCKADDR_STORAGE = PSockAddrStorage;
  806. {$EXTERNALSYM LPSOCKADDR_STORAGE}
  807. LPSOCKADDR_STORAGE = PSOCKADDR_STORAGE;
  808. // Structure used by kernel to pass protocol information in raw sockets.
  809. {$EXTERNALSYM sockproto}
  810. sockproto = record
  811. sp_family : u_short;
  812. sp_protocol : u_short;
  813. end;
  814. {$NODEFINE TSockProto}
  815. TSockProto = sockproto;
  816. {$NODEFINE PSockProto}
  817. PSockProto = ^TSockProto;
  818. // Structure used for manipulating linger option.
  819. {$EXTERNALSYM linger}
  820. linger = record
  821. l_onoff: u_short;
  822. l_linger: u_short;
  823. end;
  824. {$NODEFINE TLinger}
  825. TLinger = linger;
  826. {$EXTERNALSYM PLINGER}
  827. PLINGER = ^TLinger;
  828. {$EXTERNALSYM LPLINGER}
  829. LPLINGER = PLINGER;
  830. const
  831. {$EXTERNALSYM INADDR_ANY}
  832. INADDR_ANY = $00000000;
  833. {$EXTERNALSYM INADDR_LOOPBACK}
  834. INADDR_LOOPBACK = $7F000001;
  835. {$EXTERNALSYM INADDR_BROADCAST}
  836. INADDR_BROADCAST = $FFFFFFFF;
  837. {$EXTERNALSYM INADDR_NONE}
  838. INADDR_NONE = $FFFFFFFF;
  839. {$EXTERNALSYM ADDR_ANY}
  840. ADDR_ANY = INADDR_ANY;
  841. {$EXTERNALSYM SOL_SOCKET}
  842. SOL_SOCKET = $FFFF; // options for socket level
  843. {$EXTERNALSYM MSG_OOB}
  844. MSG_OOB = $1; // process out-of-band data
  845. {$EXTERNALSYM MSG_PEEK}
  846. MSG_PEEK = $2; // peek at incoming message
  847. {$EXTERNALSYM MSG_DONTROUTE}
  848. MSG_DONTROUTE = $4; // send without using routing tables
  849. {$EXTERNALSYM MSG_PARTIAL}
  850. MSG_PARTIAL = $8000; // partial send or recv for message xport
  851. // WinSock 2 extension -- new flags for WSASend(), WSASendTo(), WSARecv() and WSARecvFrom()
  852. {$EXTERNALSYM MSG_INTERRUPT}
  853. MSG_INTERRUPT = $10; // send/recv in the interrupt context
  854. {$EXTERNALSYM MSG_MAXIOVLEN}
  855. MSG_MAXIOVLEN = 16;
  856. // Define constant based on rfc883, used by gethostbyxxxx() calls.
  857. {$EXTERNALSYM MAXGETHOSTSTRUCT}
  858. MAXGETHOSTSTRUCT = 1024;
  859. // Maximum queue length specifiable by listen.
  860. {$EXTERNALSYM SOMAXCONN}
  861. SOMAXCONN = $7FFFFFFF;
  862. // WinSock 2 extension -- bit values and indices for FD_XXX network events
  863. {$EXTERNALSYM FD_READ_BIT}
  864. FD_READ_BIT = 0;
  865. {$EXTERNALSYM FD_WRITE_BIT}
  866. FD_WRITE_BIT = 1;
  867. {$EXTERNALSYM FD_OOB_BIT}
  868. FD_OOB_BIT = 2;
  869. {$EXTERNALSYM FD_ACCEPT_BIT}
  870. FD_ACCEPT_BIT = 3;
  871. {$EXTERNALSYM FD_CONNECT_BIT}
  872. FD_CONNECT_BIT = 4;
  873. {$EXTERNALSYM FD_CLOSE_BIT}
  874. FD_CLOSE_BIT = 5;
  875. {$EXTERNALSYM fd_qos_bit}
  876. FD_QOS_BIT = 6;
  877. {$EXTERNALSYM FD_GROUP_QOS_BIT}
  878. FD_GROUP_QOS_BIT = 7;
  879. {$EXTERNALSYM FD_ROUTING_INTERFACE_CHANGE_BIT}
  880. FD_ROUTING_INTERFACE_CHANGE_BIT = 8;
  881. {$EXTERNALSYM FD_ADDRESS_LIST_CHANGE_BIT}
  882. FD_ADDRESS_LIST_CHANGE_BIT = 9;
  883. {$EXTERNALSYM FD_MAX_EVENTS}
  884. FD_MAX_EVENTS = 10;
  885. {$EXTERNALSYM FD_READ}
  886. FD_READ = (1 shl FD_READ_BIT);
  887. {$EXTERNALSYM FD_WRITE}
  888. FD_WRITE = (1 shl FD_WRITE_BIT);
  889. {$EXTERNALSYM FD_OOB}
  890. FD_OOB = (1 shl FD_OOB_BIT);
  891. {$EXTERNALSYM FD_ACCEPT}
  892. FD_ACCEPT = (1 shl FD_ACCEPT_BIT);
  893. {$EXTERNALSYM FD_CONNECT}
  894. FD_CONNECT = (1 shl FD_CONNECT_BIT);
  895. {$EXTERNALSYM FD_CLOSE}
  896. FD_CLOSE = (1 shl FD_CLOSE_BIT);
  897. {$EXTERNALSYM FD_QOS}
  898. FD_QOS = (1 shl FD_QOS_BIT);
  899. {$EXTERNALSYM FD_GROUP_QOS}
  900. FD_GROUP_QOS = (1 shl FD_GROUP_QOS_BIT);
  901. {$EXTERNALSYM FD_ROUTING_INTERFACE_CHANGE}
  902. FD_ROUTING_INTERFACE_CHANGE = (1 shl FD_ROUTING_INTERFACE_CHANGE_BIT);
  903. {$EXTERNALSYM FD_ADDRESS_LIST_CHANGE}
  904. FD_ADDRESS_LIST_CHANGE = (1 shl FD_ADDRESS_LIST_CHANGE_BIT);
  905. {$EXTERNALSYM FD_ALL_EVENTS}
  906. FD_ALL_EVENTS = (1 shl FD_MAX_EVENTS) - 1;
  907. // All Windows Sockets error constants are biased by WSABASEERR from the "normal"
  908. {$EXTERNALSYM WSABASEERR}
  909. WSABASEERR = 10000;
  910. // Windows Sockets definitions of regular Microsoft C error constants
  911. {$EXTERNALSYM WSAEINTR}
  912. WSAEINTR = WSABASEERR+ 4;
  913. {$EXTERNALSYM WSAEBADF}
  914. WSAEBADF = WSABASEERR+ 9;
  915. {$EXTERNALSYM WSAEACCES}
  916. WSAEACCES = WSABASEERR+ 13;
  917. {$EXTERNALSYM WSAEFAULT}
  918. WSAEFAULT = WSABASEERR+ 14;
  919. {$EXTERNALSYM WSAEINVAL}
  920. WSAEINVAL = WSABASEERR+ 22;
  921. {$EXTERNALSYM WSAEMFILE}
  922. WSAEMFILE = WSABASEERR+ 24;
  923. // Windows Sockets definitions of regular Berkeley error constants
  924. {$EXTERNALSYM WSAEWOULDBLOCK}
  925. WSAEWOULDBLOCK = WSABASEERR+ 35;
  926. {$EXTERNALSYM WSAEINPROGRESS}
  927. WSAEINPROGRESS = WSABASEERR+ 36;
  928. {$EXTERNALSYM WSAEALREADY}
  929. WSAEALREADY = WSABASEERR+ 37;
  930. {$EXTERNALSYM WSAENOTSOCK}
  931. WSAENOTSOCK = WSABASEERR+ 38;
  932. {$EXTERNALSYM WSAEDESTADDRREQ}
  933. WSAEDESTADDRREQ = WSABASEERR+ 39;
  934. {$EXTERNALSYM WSAEMSGSIZE}
  935. WSAEMSGSIZE = WSABASEERR+ 40;
  936. {$EXTERNALSYM WSAEPROTOTYPE}
  937. WSAEPROTOTYPE = WSABASEERR+ 41;
  938. {$EXTERNALSYM WSAENOPROTOOPT}
  939. WSAENOPROTOOPT = WSABASEERR+ 42;
  940. {$EXTERNALSYM WSAEPROTONOSUPPORT}
  941. WSAEPROTONOSUPPORT = WSABASEERR+ 43;
  942. {$EXTERNALSYM WSAESOCKTNOSUPPORT}
  943. WSAESOCKTNOSUPPORT = WSABASEERR+ 44;
  944. {$EXTERNALSYM WSAEOPNOTSUPP}
  945. WSAEOPNOTSUPP = WSABASEERR+ 45;
  946. {$EXTERNALSYM WSAEPFNOSUPPORT}
  947. WSAEPFNOSUPPORT = WSABASEERR+ 46;
  948. {$EXTERNALSYM WSAEAFNOSUPPORT}
  949. WSAEAFNOSUPPORT = WSABASEERR+ 47;
  950. {$EXTERNALSYM WSAEADDRINUSE}
  951. WSAEADDRINUSE = WSABASEERR+ 48;
  952. {$EXTERNALSYM WSAEADDRNOTAVAIL}
  953. WSAEADDRNOTAVAIL = WSABASEERR+ 49;
  954. {$EXTERNALSYM WSAENETDOWN}
  955. WSAENETDOWN = WSABASEERR+ 50;
  956. {$EXTERNALSYM WSAENETUNREACH}
  957. WSAENETUNREACH = WSABASEERR+ 51;
  958. {$EXTERNALSYM WSAENETRESET}
  959. WSAENETRESET = WSABASEERR+ 52;
  960. {$EXTERNALSYM WSAECONNABORTED}
  961. WSAECONNABORTED = WSABASEERR+ 53;
  962. {$EXTERNALSYM WSAECONNRESET}
  963. WSAECONNRESET = WSABASEERR+ 54;
  964. {$EXTERNALSYM WSAENOBUFS}
  965. WSAENOBUFS = WSABASEERR+ 55;
  966. {$EXTERNALSYM WSAEISCONN}
  967. WSAEISCONN = WSABASEERR+ 56;
  968. {$EXTERNALSYM WSAENOTCONN}
  969. WSAENOTCONN = WSABASEERR+ 57;
  970. {$EXTERNALSYM WSAESHUTDOWN}
  971. WSAESHUTDOWN = WSABASEERR+ 58;
  972. {$EXTERNALSYM WSAETOOMANYREFS}
  973. WSAETOOMANYREFS = WSABASEERR+ 59;
  974. {$EXTERNALSYM WSAETIMEDOUT}
  975. WSAETIMEDOUT = WSABASEERR+ 60;
  976. {$EXTERNALSYM WSAECONNREFUSED}
  977. WSAECONNREFUSED = WSABASEERR+ 61;
  978. {$EXTERNALSYM WSAELOOP}
  979. WSAELOOP = WSABASEERR+ 62;
  980. {$EXTERNALSYM WSAENAMETOOLONG}
  981. WSAENAMETOOLONG = WSABASEERR+ 63;
  982. {$EXTERNALSYM WSAEHOSTDOWN}
  983. WSAEHOSTDOWN = WSABASEERR+ 64;
  984. {$EXTERNALSYM WSAEHOSTUNREACH}
  985. WSAEHOSTUNREACH = WSABASEERR+ 65;
  986. {$EXTERNALSYM wsaenotempty}
  987. WSAENOTEMPTY = WSABASEERR+ 66;
  988. {$EXTERNALSYM WSAEPROCLIM}
  989. WSAEPROCLIM = WSABASEERR+ 67;
  990. {$EXTERNALSYM WSAEUSERS}
  991. WSAEUSERS = WSABASEERR+ 68;
  992. {$EXTERNALSYM WSAEDQUOT}
  993. WSAEDQUOT = WSABASEERR+ 69;
  994. {$EXTERNALSYM WSAESTALE}
  995. WSAESTALE = WSABASEERR+ 70;
  996. {$EXTERNALSYM WSAEREMOTE}
  997. WSAEREMOTE = WSABASEERR+ 71;
  998. // Extended Windows Sockets error constant definitions
  999. {$EXTERNALSYM WSASYSNOTREADY}
  1000. WSASYSNOTREADY = WSABASEERR+ 91;
  1001. {$EXTERNALSYM WSAVERNOTSUPPORTED}
  1002. WSAVERNOTSUPPORTED = WSABASEERR+ 92;
  1003. {$EXTERNALSYM WSANOTINITIALISED}
  1004. WSANOTINITIALISED = WSABASEERR+ 93;
  1005. {$EXTERNALSYM WSAEDISCON}
  1006. WSAEDISCON = WSABASEERR+101;
  1007. {$EXTERNALSYM WSAENOMORE}
  1008. WSAENOMORE = WSABASEERR+102;
  1009. {$EXTERNALSYM WSAECANCELLED}
  1010. WSAECANCELLED = WSABASEERR+103;
  1011. {$EXTERNALSYM WSAEINVALIDPROCTABLE}
  1012. WSAEINVALIDPROCTABLE = WSABASEERR+104;
  1013. {$EXTERNALSYM WSAEINVALIDPROVIDER}
  1014. WSAEINVALIDPROVIDER = WSABASEERR+105;
  1015. {$EXTERNALSYM WSAEPROVIDERFAILEDINIT}
  1016. WSAEPROVIDERFAILEDINIT = WSABASEERR+106;
  1017. {$EXTERNALSYM WSASYSCALLFAILURE}
  1018. WSASYSCALLFAILURE = WSABASEERR+107;
  1019. {$EXTERNALSYM WSASERVICE_NOT_FOUND}
  1020. WSASERVICE_NOT_FOUND = WSABASEERR+108;
  1021. {$EXTERNALSYM WSATYPE_NOT_FOUND}
  1022. WSATYPE_NOT_FOUND = WSABASEERR+109;
  1023. {$EXTERNALSYM WSA_E_NO_MORE}
  1024. WSA_E_NO_MORE = WSABASEERR+110;
  1025. {$EXTERNALSYM WSA_E_CANCELLED}
  1026. WSA_E_CANCELLED = WSABASEERR+111;
  1027. {$EXTERNALSYM WSAEREFUSED}
  1028. WSAEREFUSED = WSABASEERR+112;
  1029. {$IFDEF WINCE}
  1030. WSAEDUPLICATE_NAME = WSABASEERR+900;
  1031. {$ENDIF}
  1032. { Error return codes from gethostbyname() and gethostbyaddr()
  1033. (when using the resolver). Note that these errors are
  1034. retrieved via WSAGetLastError() and must therefore follow
  1035. the rules for avoiding clashes with error numbers from
  1036. specific implementations or language run-time systems.
  1037. For this reason the codes are based at WSABASEERR+1001.
  1038. Note also that [WSA]NO_ADDRESS is defined only for
  1039. compatibility purposes. }
  1040. // Authoritative Answer: Host not found
  1041. {$EXTERNALSYM WSAHOST_NOT_FOUND}
  1042. WSAHOST_NOT_FOUND = WSABASEERR+1001;
  1043. {$EXTERNALSYM HOST_NOT_FOUND}
  1044. HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
  1045. // Non-Authoritative: Host not found, or SERVERFAIL
  1046. {$EXTERNALSYM WSATRY_AGAIN}
  1047. WSATRY_AGAIN = WSABASEERR+1002;
  1048. {$EXTERNALSYM TRY_AGAIN}
  1049. TRY_AGAIN = WSATRY_AGAIN;
  1050. // Non recoverable errors, FORMERR, REFUSED, NOTIMP
  1051. {$EXTERNALSYM WSANO_RECOVERY}
  1052. WSANO_RECOVERY = WSABASEERR+1003;
  1053. {$EXTERNALSYM NO_RECOVERY}
  1054. NO_RECOVERY = WSANO_RECOVERY;
  1055. // Valid name, no data record of requested type
  1056. {$EXTERNALSYM WSANO_DATA}
  1057. WSANO_DATA = WSABASEERR+1004;
  1058. {$EXTERNALSYM NO_DATA}
  1059. NO_DATA = WSANO_DATA;
  1060. // no address, look for MX record
  1061. {$EXTERNALSYM WSANO_ADDRESS}
  1062. WSANO_ADDRESS = WSANO_DATA;
  1063. {$EXTERNALSYM NO_ADDRESS}
  1064. NO_ADDRESS = WSANO_ADDRESS;
  1065. // Define QOS related error return codes
  1066. {$EXTERNALSYM WSA_QOS_RECEIVERS}
  1067. WSA_QOS_RECEIVERS = WSABASEERR+1005; // at least one reserve has arrived
  1068. {$EXTERNALSYM WSA_QOS_SENDERS}
  1069. WSA_QOS_SENDERS = WSABASEERR+1006; // at least one path has arrived
  1070. {$EXTERNALSYM WSA_QOS_NO_SENDERS}
  1071. WSA_QOS_NO_SENDERS = WSABASEERR+1007; // there are no senders
  1072. {$EXTERNALSYM WSA_QOS_NO_RECEIVERS}
  1073. WSA_QOS_NO_RECEIVERS = WSABASEERR+1008; // there are no receivers
  1074. {$EXTERNALSYM WSA_QOS_REQUEST_CONFIRMED}
  1075. WSA_QOS_REQUEST_CONFIRMED = WSABASEERR+1009; // reserve has been confirmed
  1076. {$EXTERNALSYM WSA_QOS_ADMISSION_FAILURE}
  1077. WSA_QOS_ADMISSION_FAILURE = WSABASEERR+1010; // error due to lack of resources
  1078. {$EXTERNALSYM WSA_QOS_POLICY_FAILURE}
  1079. WSA_QOS_POLICY_FAILURE = WSABASEERR+1011; // rejected for administrative reasons - bad credentials
  1080. {$EXTERNALSYM WSA_QOS_BAD_STYLE}
  1081. WSA_QOS_BAD_STYLE = WSABASEERR+1012; // unknown or conflicting style
  1082. {$EXTERNALSYM WSA_QOS_BAD_OBJECT}
  1083. WSA_QOS_BAD_OBJECT = WSABASEERR+1013; // problem with some part of the filterspec or providerspecific buffer in general
  1084. {$EXTERNALSYM WSA_QOS_TRAFFIC_CTRL_ERROR}
  1085. WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR+1014; // problem with some part of the flowspec
  1086. {$EXTERNALSYM WSA_QOS_GENERIC_ERROR}
  1087. WSA_QOS_GENERIC_ERROR = WSABASEERR+1015; // general error
  1088. {$EXTERNALSYM WSA_QOS_ESERVICETYPE}
  1089. WSA_QOS_ESERVICETYPE = WSABASEERR+1016; // invalid service type in flowspec
  1090. {$EXTERNALSYM WSA_QOS_EFLOWSPEC}
  1091. WSA_QOS_EFLOWSPEC = WSABASEERR+1017; // invalid flowspec
  1092. {$EXTERNALSYM WSA_QOS_EPROVSPECBUF}
  1093. WSA_QOS_EPROVSPECBUF = WSABASEERR+1018; // invalid provider specific buffer
  1094. {$EXTERNALSYM WSA_QOS_EFILTERSTYLE}
  1095. WSA_QOS_EFILTERSTYLE = WSABASEERR+1019; // invalid filter style
  1096. {$EXTERNALSYM WSA_QOS_EFILTERTYPE}
  1097. WSA_QOS_EFILTERTYPE = WSABASEERR+1020; // invalid filter type
  1098. {$EXTERNALSYM WSA_QOS_EFILTERCOUNT}
  1099. WSA_QOS_EFILTERCOUNT = WSABASEERR+1021; // incorrect number of filters
  1100. {$EXTERNALSYM WSA_QOS_EOBJLENGTH}
  1101. WSA_QOS_EOBJLENGTH = WSABASEERR+1022; // invalid object length
  1102. {$EXTERNALSYM WSA_QOS_EFLOWCOUNT}
  1103. WSA_QOS_EFLOWCOUNT = WSABASEERR+1023; // incorrect number of flows
  1104. {$EXTERNALSYM WSA_QOS_EUNKOWNPSOBJ}
  1105. WSA_QOS_EUNKOWNPSOBJ = WSABASEERR+1024; // unknown object in provider specific buffer
  1106. {$EXTERNALSYM WSA_QOS_EPOLICYOBJ}
  1107. WSA_QOS_EPOLICYOBJ = WSABASEERR+1025; // invalid policy object in provider specific buffer
  1108. {$EXTERNALSYM WSA_QOS_EFLOWDESC}
  1109. WSA_QOS_EFLOWDESC = WSABASEERR+1026; // invalid flow descriptor in the list
  1110. {$EXTERNALSYM WSA_QOS_EPSFLOWSPEC}
  1111. WSA_QOS_EPSFLOWSPEC = WSABASEERR+1027; // inconsistent flow spec in provider specific buffer
  1112. {$EXTERNALSYM WSA_QOS_EPSFILTERSPEC}
  1113. WSA_QOS_EPSFILTERSPEC = WSABASEERR+1028; // invalid filter spec in provider specific buffer
  1114. {$EXTERNALSYM WSA_QOS_ESDMODEOBJ}
  1115. WSA_QOS_ESDMODEOBJ = WSABASEERR+1029; // invalid shape discard mode object in provider specific buffer
  1116. {$EXTERNALSYM WSA_QOS_ESHAPERATEOBJ}
  1117. WSA_QOS_ESHAPERATEOBJ = WSABASEERR+1030; // invalid shaping rate object in provider specific buffer
  1118. {$EXTERNALSYM WSA_QOS_RESERVED_PETYPE}
  1119. WSA_QOS_RESERVED_PETYPE = WSABASEERR+1031; // reserved policy element in provider specific buffer
  1120. { WinSock 2 extension -- new error codes and type definition }
  1121. {$EXTERNALSYM WSA_IO_PENDING}
  1122. WSA_IO_PENDING = ERROR_IO_PENDING;
  1123. {$EXTERNALSYM WSA_IO_INCOMPLETE}
  1124. WSA_IO_INCOMPLETE = ERROR_IO_INCOMPLETE;
  1125. {$EXTERNALSYM WSA_INVALID_HANDLE}
  1126. WSA_INVALID_HANDLE = ERROR_INVALID_HANDLE;
  1127. {$EXTERNALSYM WSA_INVALID_PARAMETER}
  1128. WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER;
  1129. {$EXTERNALSYM WSA_NOT_ENOUGH_MEMORY}
  1130. WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY;
  1131. {$EXTERNALSYM WSA_OPERATION_ABORTED}
  1132. WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED;
  1133. {$EXTERNALSYM WSA_INVALID_EVENT}
  1134. WSA_INVALID_EVENT = WSAEVENT(nil);
  1135. {$EXTERNALSYM WSA_MAXIMUM_WAIT_EVENTS}
  1136. WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
  1137. {$EXTERNALSYM WSA_WAIT_FAILED}
  1138. WSA_WAIT_FAILED = $FFFFFFFF;
  1139. {$EXTERNALSYM WSA_WAIT_EVENT_0}
  1140. WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
  1141. {$EXTERNALSYM WSA_WAIT_IO_COMPLETION}
  1142. WSA_WAIT_IO_COMPLETION = WAIT_IO_COMPLETION;
  1143. {$EXTERNALSYM WSA_WAIT_TIMEOUT}
  1144. WSA_WAIT_TIMEOUT = WAIT_TIMEOUT;
  1145. {$EXTERNALSYM WSA_INFINITE}
  1146. WSA_INFINITE = INFINITE;
  1147. { Windows Sockets errors redefined as regular Berkeley error constants.
  1148. These are commented out in Windows NT to avoid conflicts with errno.h.
  1149. Use the WSA constants instead. }
  1150. {$EXTERNALSYM EWOULDBLOCK}
  1151. EWOULDBLOCK = WSAEWOULDBLOCK;
  1152. {$EXTERNALSYM EINPROGRESS}
  1153. EINPROGRESS = WSAEINPROGRESS;
  1154. {$EXTERNALSYM EALREADY}
  1155. EALREADY = WSAEALREADY;
  1156. {$EXTERNALSYM ENOTSOCK}
  1157. ENOTSOCK = WSAENOTSOCK;
  1158. {$EXTERNALSYM EDESTADDRREQ}
  1159. EDESTADDRREQ = WSAEDESTADDRREQ;
  1160. {$EXTERNALSYM EMSGSIZE}
  1161. EMSGSIZE = WSAEMSGSIZE;
  1162. {$EXTERNALSYM EPROTOTYPE}
  1163. EPROTOTYPE = WSAEPROTOTYPE;
  1164. {$EXTERNALSYM ENOPROTOOPT}
  1165. ENOPROTOOPT = WSAENOPROTOOPT;
  1166. {$EXTERNALSYM EPROTONOSUPPORT}
  1167. EPROTONOSUPPORT = WSAEPROTONOSUPPORT;
  1168. {$EXTERNALSYM ESOCKTNOSUPPORT}
  1169. ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
  1170. {$EXTERNALSYM EOPNOTSUPP}
  1171. EOPNOTSUPP = WSAEOPNOTSUPP;
  1172. {$EXTERNALSYM EPFNOSUPPORT}
  1173. EPFNOSUPPORT = WSAEPFNOSUPPORT;
  1174. {$EXTERNALSYM EAFNOSUPPORT}
  1175. EAFNOSUPPORT = WSAEAFNOSUPPORT;
  1176. {$EXTERNALSYM EADDRINUSE}
  1177. EADDRINUSE = WSAEADDRINUSE;
  1178. {$EXTERNALSYM EADDRNOTAVAIL}
  1179. EADDRNOTAVAIL = WSAEADDRNOTAVAIL;
  1180. {$EXTERNALSYM ENETDOWN}
  1181. ENETDOWN = WSAENETDOWN;
  1182. {$EXTERNALSYM ENETUNREACH}
  1183. ENETUNREACH = WSAENETUNREACH;
  1184. {$EXTERNALSYM ENETRESET}
  1185. ENETRESET = WSAENETRESET;
  1186. {$EXTERNALSYM ECONNABORTED}
  1187. ECONNABORTED = WSAECONNABORTED;
  1188. {$EXTERNALSYM ECONNRESET}
  1189. ECONNRESET = WSAECONNRESET;
  1190. {$EXTERNALSYM ENOBUFS}
  1191. ENOBUFS = WSAENOBUFS;
  1192. {$EXTERNALSYM EISCONN}
  1193. EISCONN = WSAEISCONN;
  1194. {$EXTERNALSYM ENOTCONN}
  1195. ENOTCONN = WSAENOTCONN;
  1196. {$EXTERNALSYM ESHUTDOWN}
  1197. ESHUTDOWN = WSAESHUTDOWN;
  1198. {$EXTERNALSYM ETOOMANYREFS}
  1199. ETOOMANYREFS = WSAETOOMANYREFS;
  1200. {$EXTERNALSYM ETIMEDOUT}
  1201. ETIMEDOUT = WSAETIMEDOUT;
  1202. {$EXTERNALSYM ECONNREFUSED}
  1203. ECONNREFUSED = WSAECONNREFUSED;
  1204. {$EXTERNALSYM ELOOP}
  1205. ELOOP = WSAELOOP;
  1206. {$EXTERNALSYM ENAMETOOLONG}
  1207. ENAMETOOLONG = WSAENAMETOOLONG;
  1208. {$EXTERNALSYM EHOSTDOWN}
  1209. EHOSTDOWN = WSAEHOSTDOWN;
  1210. {$EXTERNALSYM EHOSTUNREACH}
  1211. EHOSTUNREACH = WSAEHOSTUNREACH;
  1212. {$EXTERNALSYM ENOTEMPTY}
  1213. ENOTEMPTY = WSAENOTEMPTY;
  1214. {$EXTERNALSYM EPROCLIM}
  1215. EPROCLIM = WSAEPROCLIM;
  1216. {$EXTERNALSYM EUSERS}
  1217. EUSERS = WSAEUSERS;
  1218. {$EXTERNALSYM EDQUOT}
  1219. EDQUOT = WSAEDQUOT;
  1220. {$EXTERNALSYM ESTALE}
  1221. ESTALE = WSAESTALE;
  1222. {$EXTERNALSYM EREMOTE}
  1223. EREMOTE = WSAEREMOTE;
  1224. {$EXTERNALSYM WSADESCRIPTION_LEN}
  1225. WSADESCRIPTION_LEN = 256;
  1226. {$EXTERNALSYM WSASYS_STATUS_LEN}
  1227. WSASYS_STATUS_LEN = 128;
  1228. type
  1229. {$EXTERNALSYM WSADATA}
  1230. WSADATA = record
  1231. wVersion : Word;
  1232. wHighVersion : Word;
  1233. {$IFDEF _WIN64}
  1234. iMaxSockets : Word;
  1235. iMaxUdpDg : Word;
  1236. lpVendorInfo : PIdAnsiChar;
  1237. szDescription : array[0..WSADESCRIPTION_LEN] of TIdAnsiChar;
  1238. szSystemStatus : array[0..WSASYS_STATUS_LEN] of TIdAnsiChar;
  1239. {$ELSE}
  1240. szDescription : array[0..WSADESCRIPTION_LEN] of TIdAnsiChar;
  1241. szSystemStatus : array[0..WSASYS_STATUS_LEN] of TIdAnsiChar;
  1242. iMaxSockets : Word;
  1243. iMaxUdpDg : Word;
  1244. lpVendorInfo : PIdAnsiChar;
  1245. {$ENDIF}
  1246. end;
  1247. {$NODEFINE TWSAData}
  1248. TWSAData = WSADATA;
  1249. {$NODEFINE PWSAData}
  1250. PWSAData = ^TWSAData;
  1251. {$EXTERNALSYM LPWSADATA}
  1252. LPWSADATA = PWSAData;
  1253. {$EXTERNALSYM WSAOVERLAPPED}
  1254. WSAOVERLAPPED = TOverlapped;
  1255. {$NODEFINE TWSAOverlapped}
  1256. TWSAOverlapped = WSAOVERLAPPED;
  1257. {$NODEFINE PWSAOverlapped}
  1258. PWSAOverlapped = ^TWSAOverlapped;
  1259. {$EXTERNALSYM LPWSAOVERLAPPED}
  1260. LPWSAOVERLAPPED = PWSAOverlapped;
  1261. {$IFNDEF WINCE}
  1262. {$EXTERNALSYM WSC_PROVIDER_INFO_TYPE}
  1263. {$EXTERNALSYM ProviderInfoLspCategories}
  1264. {$EXTERNALSYM ProviderInfoAudit}
  1265. WSC_PROVIDER_INFO_TYPE = (
  1266. ProviderInfoLspCategories,
  1267. ProviderInfoAudit);
  1268. {$ENDIF}
  1269. { WinSock 2 extension -- WSABUF and QOS struct, include qos.h }
  1270. { to pull in FLOWSPEC and related definitions }
  1271. {$EXTERNALSYM WSABUF}
  1272. WSABUF = record
  1273. len: u_long; { the length of the buffer }
  1274. buf: PIdAnsiChar; { the pointer to the buffer }
  1275. end;
  1276. {$NODEFINE TWSABuf}
  1277. TWSABuf = WSABUF;
  1278. {$NODEFINE PWSABuf}
  1279. PWSABuf = ^TWSABuf;
  1280. {$EXTERNALSYM LPWSABUF}
  1281. LPWSABUF = PWSABUF;
  1282. {$EXTERNALSYM SERVICETYPE}
  1283. SERVICETYPE = ULONG;
  1284. {$NODEFINE TServiceType}
  1285. TServiceType = SERVICETYPE;
  1286. {$EXTERNALSYM FLOWSPEC}
  1287. FLOWSPEC = record
  1288. TokenRate, // In Bytes/sec
  1289. TokenBucketSize, // In Bytes
  1290. PeakBandwidth, // In Bytes/sec
  1291. Latency, // In microseconds
  1292. DelayVariation : ULONG; // In microseconds
  1293. ServiceType : TServiceType;
  1294. MaxSduSize, MinimumPolicedSize : ULONG;// In Bytes
  1295. end;
  1296. {$NODEFINE TFlowSpec}
  1297. TFlowSpec = FLOWSPEC;
  1298. {$EXTERNALSYM PFLOWSPEC}
  1299. PFLOWSPEC = ^TFlowSpec;
  1300. {$EXTERNALSYM LPFLOWSPEC}
  1301. LPFLOWSPEC = PFLOWSPEC;
  1302. {$EXTERNALSYM QOS}
  1303. QOS = record
  1304. SendingFlowspec: TFlowSpec; { the flow spec for data sending }
  1305. ReceivingFlowspec: TFlowSpec; { the flow spec for data receiving }
  1306. ProviderSpecific: TWSABuf; { additional provider specific stuff }
  1307. end;
  1308. {$NODEFINE TQualityOfService}
  1309. TQualityOfService = QOS;
  1310. {$NODEFINE PQOS}
  1311. PQOS = ^QOS;
  1312. {$EXTERNALSYM LPQOS}
  1313. LPQOS = PQOS;
  1314. const
  1315. {$EXTERNALSYM SERVICETYPE_NOTRAFFIC}
  1316. SERVICETYPE_NOTRAFFIC = $00000000; // No data in this direction
  1317. {$EXTERNALSYM SERVICETYPE_BESTEFFORT}
  1318. SERVICETYPE_BESTEFFORT = $00000001; // Best Effort
  1319. {$EXTERNALSYM SERVICETYPE_CONTROLLEDLOAD}
  1320. SERVICETYPE_CONTROLLEDLOAD = $00000002; // Controlled Load
  1321. {$EXTERNALSYM SERVICETYPE_GUARANTEED}
  1322. SERVICETYPE_GUARANTEED = $00000003; // Guaranteed
  1323. {$EXTERNALSYM SERVICETYPE_NETWORK_UNAVAILABLE}
  1324. SERVICETYPE_NETWORK_UNAVAILABLE = $00000004; // Used to notify change to user
  1325. {$EXTERNALSYM SERVICETYPE_GENERAL_INFORMATION}
  1326. SERVICETYPE_GENERAL_INFORMATION = $00000005; // corresponds to "General Parameters" defined by IntServ
  1327. {$EXTERNALSYM SERVICETYPE_NOCHANGE}
  1328. SERVICETYPE_NOCHANGE = $00000006; // used to indicate that the flow spec contains no change from any previous one
  1329. // to turn on immediate traffic control, OR this flag with the ServiceType field in the FLOWSPEC
  1330. {$EXTERNALSYM SERVICE_IMMEDIATE_TRAFFIC_CONTROL}
  1331. SERVICE_IMMEDIATE_TRAFFIC_CONTROL = $80000000;
  1332. // WinSock 2 extension -- manifest constants for return values of the condition function
  1333. {$EXTERNALSYM CF_ACCEPT}
  1334. CF_ACCEPT = $0000;
  1335. {$EXTERNALSYM CF_REJECT}
  1336. CF_REJECT = $0001;
  1337. {$EXTERNALSYM CF_DEFER}
  1338. CF_DEFER = $0002;
  1339. // WinSock 2 extension -- manifest constants for shutdown()
  1340. {$EXTERNALSYM SD_RECEIVE}
  1341. SD_RECEIVE = $00;
  1342. {$EXTERNALSYM SD_SEND}
  1343. SD_SEND = $01;
  1344. {$EXTERNALSYM SD_BOTH}
  1345. SD_BOTH = $02;
  1346. // WinSock 2 extension -- data type and manifest constants for socket groups
  1347. {$EXTERNALSYM SG_UNCONSTRAINED_GROUP}
  1348. SG_UNCONSTRAINED_GROUP = $01;
  1349. {$EXTERNALSYM SG_CONSTRAINED_GROUP}
  1350. SG_CONSTRAINED_GROUP = $02;
  1351. type
  1352. {$EXTERNALSYM GROUP}
  1353. GROUP = DWORD;
  1354. {$EXTERNALSYM PGROUP}
  1355. PGROUP = ^GROUP;
  1356. // WinSock 2 extension -- data type for WSAEnumNetworkEvents()
  1357. {$EXTERNALSYM WSANETWORKEVENTS}
  1358. WSANETWORKEVENTS = record
  1359. lNetworkEvents: LongInt;
  1360. iErrorCode: Array[0..FD_MAX_EVENTS-1] of Integer;
  1361. end;
  1362. {$NODEFINE TWSANetworkEvents}
  1363. TWSANetworkEvents = WSANETWORKEVENTS;
  1364. {$NODEFINE PWSANetworkEvents}
  1365. PWSANetworkEvents = ^TWSANetworkEvents;
  1366. {$EXTERNALSYM LPWSANETWORKEVENTS}
  1367. LPWSANETWORKEVENTS = PWSANetworkEvents;
  1368. //TransmitFile types used for the TransmitFile API function in WinNT/2000/XP
  1369. //not sure why its defined in WinCE when TransmitFile is not available.
  1370. {$IFNDEF NO_REDECLARE}
  1371. {$EXTERNALSYM TRANSMIT_FILE_BUFFERS}
  1372. TRANSMIT_FILE_BUFFERS = record
  1373. Head: Pointer;
  1374. HeadLength: DWORD;
  1375. Tail: Pointer;
  1376. TailLength: DWORD;
  1377. end;
  1378. {$NODEFINE TTransmitFileBuffers}
  1379. TTransmitFileBuffers = TRANSMIT_FILE_BUFFERS;
  1380. {$NODEFINE PTransmitFileBuffers}
  1381. PTransmitFileBuffers = ^TTransmitFileBuffers;
  1382. {$ENDIF}
  1383. {$EXTERNALSYM LPTRANSMIT_FILE_BUFFERS}
  1384. LPTRANSMIT_FILE_BUFFERS = PTransmitFileBuffers;
  1385. const
  1386. {$EXTERNALSYM TP_ELEMENT_MEMORY}
  1387. TP_ELEMENT_MEMORY = 1;
  1388. {$EXTERNALSYM TP_ELEMENT_FILE}
  1389. TP_ELEMENT_FILE = 2;
  1390. {$EXTERNALSYM TP_ELEMENT_EOP}
  1391. TP_ELEMENT_EOP = 4;
  1392. {$EXTERNALSYM TP_DISCONNECT}
  1393. TP_DISCONNECT = TF_DISCONNECT;
  1394. {$EXTERNALSYM TP_REUSE_SOCKET}
  1395. TP_REUSE_SOCKET = TF_REUSE_SOCKET;
  1396. {$EXTERNALSYM TP_USE_DEFAULT_WORKER}
  1397. TP_USE_DEFAULT_WORKER = TF_USE_DEFAULT_WORKER;
  1398. {$EXTERNALSYM TP_USE_SYSTEM_THREAD}
  1399. TP_USE_SYSTEM_THREAD = TF_USE_SYSTEM_THREAD;
  1400. {$EXTERNALSYM TP_USE_KERNEL_APC}
  1401. TP_USE_KERNEL_APC = TF_USE_KERNEL_APC;
  1402. type
  1403. {$EXTERNALSYM TRANSMIT_PACKETS_ELEMENT}
  1404. TRANSMIT_PACKETS_ELEMENT = record
  1405. dwElFlags: ULONG;
  1406. cLength: ULONG;
  1407. case Integer of
  1408. 1: (nFileOffset: TLargeInteger;
  1409. hFile: THandle);
  1410. 2: (pBuffer: Pointer);
  1411. end;
  1412. {$NODEFINE TTransmitPacketsElement}
  1413. TTransmitPacketsElement = TRANSMIT_PACKETS_ELEMENT;
  1414. {$NODEFINE PTransmitPacketsElement}
  1415. PTransmitPacketsElement = ^TTransmitPacketsElement;
  1416. {$NODEFINE LPTransmitPacketsElement}
  1417. LPTransmitPacketsElement = PTransmitPacketsElement;
  1418. {$EXTERNALSYM PTRANSMIT_PACKETS_ELEMENT}
  1419. PTRANSMIT_PACKETS_ELEMENT = ^TTransmitPacketsElement;
  1420. {$EXTERNALSYM LPTRANSMIT_PACKETS_ELEMENT}
  1421. LPTRANSMIT_PACKETS_ELEMENT = PTRANSMIT_PACKETS_ELEMENT;
  1422. // WinSock 2 extension -- WSAPROTOCOL_INFO structure
  1423. {$IFNDEF HAS_LPGUID}
  1424. type
  1425. {$IFNDEF HAS_PGUID}
  1426. {$NODEFINE PGUID}
  1427. PGUID = ^TGUID;
  1428. {$ENDIF}
  1429. {$EXTERNALSYM LPGUID}
  1430. LPGUID = PGUID;
  1431. {$ENDIF}
  1432. // WinSock 2 extension -- WSAPROTOCOL_INFO manifest constants
  1433. const
  1434. {$EXTERNALSYM MAX_PROTOCOL_CHAIN}
  1435. MAX_PROTOCOL_CHAIN = 7;
  1436. {$EXTERNALSYM BASE_PROTOCOL}
  1437. BASE_PROTOCOL = 1;
  1438. {$EXTERNALSYM LAYERED_PROTOCOL}
  1439. LAYERED_PROTOCOL = 0;
  1440. {$EXTERNALSYM WSAPROTOCOL_LEN}
  1441. WSAPROTOCOL_LEN = 255;
  1442. type
  1443. {$EXTERNALSYM WSAPROTOCOLCHAIN}
  1444. WSAPROTOCOLCHAIN = record
  1445. ChainLen: Integer; // the length of the chain,
  1446. // length = 0 means layered protocol,
  1447. // length = 1 means base protocol,
  1448. // length > 1 means protocol chain
  1449. ChainEntries: Array[0..MAX_PROTOCOL_CHAIN-1] of DWORD; // a list of dwCatalogEntryIds
  1450. end;
  1451. {$NODEFINE TWSAProtocolChain}
  1452. TWSAProtocolChain = WSAPROTOCOLCHAIN;
  1453. {$EXTERNALSYM LPWSAPROTOCOLCHAIN}
  1454. LPWSAPROTOCOLCHAIN = ^TWSAProtocolChain;
  1455. type
  1456. {$EXTERNALSYM WSAPROTOCOL_INFOA}
  1457. WSAPROTOCOL_INFOA = record
  1458. dwServiceFlags1: DWORD;
  1459. dwServiceFlags2: DWORD;
  1460. dwServiceFlags3: DWORD;
  1461. dwServiceFlags4: DWORD;
  1462. dwProviderFlags: DWORD;
  1463. ProviderId: TGUID;
  1464. dwCatalogEntryId: DWORD;
  1465. ProtocolChain: TWSAProtocolChain;
  1466. iVersion: Integer;
  1467. iAddressFamily: Integer;
  1468. iMaxSockAddr: Integer;
  1469. iMinSockAddr: Integer;
  1470. iSocketType: Integer;
  1471. iProtocol: Integer;
  1472. iProtocolMaxOffset: Integer;
  1473. iNetworkByteOrder: Integer;
  1474. iSecurityScheme: Integer;
  1475. dwMessageSize: DWORD;
  1476. dwProviderReserved: DWORD;
  1477. szProtocol: Array[0..WSAPROTOCOL_LEN+1-1] of TIdAnsiChar;
  1478. end;
  1479. {$NODEFINE TWSAProtocol_InfoA}
  1480. TWSAProtocol_InfoA = WSAPROTOCOL_INFOA;
  1481. {$NODEFINE PWSAProtocol_InfoA}
  1482. PWSAProtocol_InfoA = ^WSAPROTOCOL_INFOA;
  1483. {$EXTERNALSYM LPWSAPROTOCOL_INFOA}
  1484. LPWSAPROTOCOL_INFOA = PWSAProtocol_InfoA;
  1485. {$EXTERNALSYM WSAPROTOCOL_INFOW}
  1486. WSAPROTOCOL_INFOW = record
  1487. dwServiceFlags1: DWORD;
  1488. dwServiceFlags2: DWORD;
  1489. dwServiceFlags3: DWORD;
  1490. dwServiceFlags4: DWORD;
  1491. dwProviderFlags: DWORD;
  1492. ProviderId: TGUID;
  1493. dwCatalogEntryId: DWORD;
  1494. ProtocolChain: TWSAProtocolChain;
  1495. iVersion: Integer;
  1496. iAddressFamily: Integer;
  1497. iMaxSockAddr: Integer;
  1498. iMinSockAddr: Integer;
  1499. iSocketType: Integer;
  1500. iProtocol: Integer;
  1501. iProtocolMaxOffset: Integer;
  1502. iNetworkByteOrder: Integer;
  1503. iSecurityScheme: Integer;
  1504. dwMessageSize: DWORD;
  1505. dwProviderReserved: DWORD;
  1506. szProtocol: Array[0..WSAPROTOCOL_LEN+1-1] of WideChar;
  1507. end;
  1508. {$NODEFINE TWSAProtocol_InfoW}
  1509. TWSAProtocol_InfoW = WSAPROTOCOL_INFOW;
  1510. {$NODEFINE PWSAProtocol_InfoW}
  1511. PWSAProtocol_InfoW = ^TWSAProtocol_InfoW;
  1512. {$EXTERNALSYM LPWSAPROTOCOL_INFOW}
  1513. LPWSAPROTOCOL_INFOW = PWSAProtocol_InfoW;
  1514. {$EXTERNALSYM WSAPROTOCOL_INFO}
  1515. {$EXTERNALSYM LPWSAPROTOCOL_INFO}
  1516. {$NODEFINE TWSAProtocol_Info}
  1517. {$NODEFINE PWSAProtocol_Info}
  1518. {$IFDEF UNICODE}
  1519. WSAPROTOCOL_INFO = TWSAProtocol_InfoW;
  1520. TWSAProtocol_Info = TWSAProtocol_InfoW;
  1521. PWSAProtocol_Info = PWSAProtocol_InfoW;
  1522. LPWSAPROTOCOL_INFO = PWSAProtocol_InfoW;
  1523. {$ELSE}
  1524. WSAPROTOCOL_INFO = TWSAProtocol_InfoA;
  1525. TWSAProtocol_Info = TWSAProtocol_InfoA;
  1526. PWSAProtocol_Info = PWSAProtocol_InfoA;
  1527. LPWSAPROTOCOL_INFO = PWSAProtocol_InfoA;
  1528. {$ENDIF}
  1529. const
  1530. // flag bit definitions for dwProviderFlags
  1531. {$EXTERNALSYM PFL_MULTIPLE_PROTO_ENTRIES}
  1532. PFL_MULTIPLE_PROTO_ENTRIES = $00000001;
  1533. {$EXTERNALSYM PFL_RECOMMENTED_PROTO_ENTRY}
  1534. PFL_RECOMMENTED_PROTO_ENTRY = $00000002;
  1535. {$EXTERNALSYM PFL_HIDDEN}
  1536. PFL_HIDDEN = $00000004;
  1537. {$EXTERNALSYM PFL_MATCHES_PROTOCOL_ZERO}
  1538. PFL_MATCHES_PROTOCOL_ZERO = $00000008;
  1539. // flag bit definitions for dwServiceFlags1
  1540. {$EXTERNALSYM XP1_CONNECTIONLESS}
  1541. XP1_CONNECTIONLESS = $00000001;
  1542. {$EXTERNALSYM XP1_GUARANTEED_DELIVERY}
  1543. XP1_GUARANTEED_DELIVERY = $00000002;
  1544. {$EXTERNALSYM XP1_GUARANTEED_ORDER}
  1545. XP1_GUARANTEED_ORDER = $00000004;
  1546. {$EXTERNALSYM XP1_MESSAGE_ORIENTED}
  1547. XP1_MESSAGE_ORIENTED = $00000008;
  1548. {$EXTERNALSYM XP1_PSEUDO_STREAM}
  1549. XP1_PSEUDO_STREAM = $00000010;
  1550. {$EXTERNALSYM XP1_GRACEFUL_CLOSE}
  1551. XP1_GRACEFUL_CLOSE = $00000020;
  1552. {$EXTERNALSYM XP1_EXPEDITED_DATA}
  1553. XP1_EXPEDITED_DATA = $00000040;
  1554. {$EXTERNALSYM XP1_CONNECT_DATA}
  1555. XP1_CONNECT_DATA = $00000080;
  1556. {$EXTERNALSYM XP1_DISCONNECT_DATA}
  1557. XP1_DISCONNECT_DATA = $00000100;
  1558. {$EXTERNALSYM XP1_SUPPORT_BROADCAST}
  1559. XP1_SUPPORT_BROADCAST = $00000200;
  1560. {$EXTERNALSYM XP1_SUPPORT_MULTIPOINT}
  1561. XP1_SUPPORT_MULTIPOINT = $00000400;
  1562. {$EXTERNALSYM XP1_MULTIPOINT_CONTROL_PLANE}
  1563. XP1_MULTIPOINT_CONTROL_PLANE = $00000800;
  1564. {$EXTERNALSYM XP1_MULTIPOINT_DATA_PLANE}
  1565. XP1_MULTIPOINT_DATA_PLANE = $00001000;
  1566. {$EXTERNALSYM XP1_QOS_SUPPORTED}
  1567. XP1_QOS_SUPPORTED = $00002000;
  1568. {$EXTERNALSYM XP1_INTERRUPT}
  1569. XP1_INTERRUPT = $00004000;
  1570. {$EXTERNALSYM XP1_UNI_SEND}
  1571. XP1_UNI_SEND = $00008000;
  1572. {$EXTERNALSYM XP1_UNI_RECV}
  1573. XP1_UNI_RECV = $00010000;
  1574. {$EXTERNALSYM XP1_IFS_HANDLES}
  1575. XP1_IFS_HANDLES = $00020000;
  1576. {$EXTERNALSYM XP1_PARTIAL_MESSAGE}
  1577. XP1_PARTIAL_MESSAGE = $00040000;
  1578. {$EXTERNALSYM BIGENDIAN}
  1579. BIGENDIAN = $0000;
  1580. {$EXTERNALSYM LITTLEENDIAN}
  1581. LITTLEENDIAN = $0001;
  1582. {$EXTERNALSYM SECURITY_PROTOCOL_NONE}
  1583. SECURITY_PROTOCOL_NONE = $0000;
  1584. // WinSock 2 extension -- manifest constants for WSAJoinLeaf()
  1585. {$EXTERNALSYM JL_SENDER_ONLY}
  1586. JL_SENDER_ONLY = $01;
  1587. {$EXTERNALSYM JL_RECEIVER_ONLY}
  1588. JL_RECEIVER_ONLY = $02;
  1589. {$EXTERNALSYM JL_BOTH}
  1590. JL_BOTH = $04;
  1591. // WinSock 2 extension -- manifest constants for WSASocket()
  1592. {$EXTERNALSYM WSA_FLAG_OVERLAPPED}
  1593. WSA_FLAG_OVERLAPPED = $01;
  1594. {$EXTERNALSYM WSA_FLAG_MULTIPOINT_C_ROOT}
  1595. WSA_FLAG_MULTIPOINT_C_ROOT = $02;
  1596. {$EXTERNALSYM WSA_FLAG_MULTIPOINT_C_LEAF}
  1597. WSA_FLAG_MULTIPOINT_C_LEAF = $04;
  1598. {$EXTERNALSYM WSA_FLAG_MULTIPOINT_D_ROOT}
  1599. WSA_FLAG_MULTIPOINT_D_ROOT = $08;
  1600. {$EXTERNALSYM WSA_FLAG_MULTIPOINT_D_LEAF}
  1601. WSA_FLAG_MULTIPOINT_D_LEAF = $10;
  1602. // WinSock 2 extension -- manifest constants for WSAIoctl()
  1603. {$EXTERNALSYM IOC_UNIX}
  1604. IOC_UNIX = $00000000;
  1605. {$EXTERNALSYM IOC_WS2}
  1606. IOC_WS2 = $08000000;
  1607. {$EXTERNALSYM IOC_PROTOCOL}
  1608. IOC_PROTOCOL = $10000000;
  1609. {$EXTERNALSYM IOC_VENDOR}
  1610. IOC_VENDOR = $18000000;
  1611. {$IFNDEF WINCE}
  1612. ///*
  1613. // * WSK-specific IO control codes are Winsock2 codes with the highest-order
  1614. // * 3 bits of the Vendor/AddressFamily-specific field set to 1.
  1615. // */
  1616. {$EXTERNALSYM IOC_WSK}
  1617. IOC_WSK = IOC_WS2 or $07000000;
  1618. {$ENDIF}
  1619. {$EXTERNALSYM SIO_ASSOCIATE_HANDLE}
  1620. SIO_ASSOCIATE_HANDLE = DWORD(IOC_IN or IOC_WS2 or 1);
  1621. {$EXTERNALSYM SIO_ENABLE_CIRCULAR_QUEUEING}
  1622. SIO_ENABLE_CIRCULAR_QUEUEING = DWORD(IOC_VOID or IOC_WS2 or 2);
  1623. {$EXTERNALSYM SIO_FIND_ROUTE}
  1624. SIO_FIND_ROUTE = DWORD(IOC_OUT or IOC_WS2 or 3);
  1625. {$EXTERNALSYM SIO_FLUSH}
  1626. SIO_FLUSH = DWORD(IOC_VOID or IOC_WS2 or 4);
  1627. {$EXTERNALSYM SIO_GET_BROADCAST_ADDRESS}
  1628. SIO_GET_BROADCAST_ADDRESS = DWORD(IOC_OUT or IOC_WS2 or 5);
  1629. {$EXTERNALSYM SIO_GET_EXTENSION_FUNCTION_POINTER}
  1630. SIO_GET_EXTENSION_FUNCTION_POINTER = DWORD(IOC_INOUT or IOC_WS2 or 6);
  1631. {$EXTERNALSYM SIO_GET_QOS}
  1632. SIO_GET_QOS = DWORD(IOC_INOUT or IOC_WS2 or 7);
  1633. {$EXTERNALSYM SIO_GET_GROUP_QOS}
  1634. SIO_GET_GROUP_QOS = DWORD(IOC_INOUT or IOC_WS2 or 8);
  1635. {$EXTERNALSYM SIO_MULTIPOINT_LOOPBACK}
  1636. SIO_MULTIPOINT_LOOPBACK = DWORD(IOC_IN or IOC_WS2 or 9);
  1637. {$EXTERNALSYM SIO_MULTICAST_SCOPE}
  1638. SIO_MULTICAST_SCOPE = DWORD(IOC_IN or IOC_WS2 or 10);
  1639. {$EXTERNALSYM SIO_SET_QOS}
  1640. SIO_SET_QOS = DWORD(IOC_IN or IOC_WS2 or 11);
  1641. {$EXTERNALSYM SIO_SET_GROUP_QOS}
  1642. SIO_SET_GROUP_QOS = DWORD(IOC_IN or IOC_WS2 or 12);
  1643. {$EXTERNALSYM SIO_TRANSLATE_HANDLE}
  1644. SIO_TRANSLATE_HANDLE = DWORD(IOC_INOUT or IOC_WS2 or 13);
  1645. {$EXTERNALSYM SIO_ROUTING_INTERFACE_QUERY}
  1646. SIO_ROUTING_INTERFACE_QUERY = DWORD(IOC_INOUT or IOC_WS2 or 20);
  1647. {$EXTERNALSYM SIO_ROUTING_INTERFACE_CHANGE}
  1648. SIO_ROUTING_INTERFACE_CHANGE = DWORD(IOC_IN or IOC_WS2 or 21);
  1649. {$EXTERNALSYM SIO_ADDRESS_LIST_QUERY}
  1650. SIO_ADDRESS_LIST_QUERY = DWORD(IOC_OUT or IOC_WS2 or 22); // see below SOCKET_ADDRESS_LIST
  1651. {$EXTERNALSYM SIO_ADDRESS_LIST_CHANGE}
  1652. SIO_ADDRESS_LIST_CHANGE = DWORD(IOC_VOID or IOC_WS2 or 23);
  1653. {$EXTERNALSYM SIO_QUERY_TARGET_PNP_HANDLE}
  1654. SIO_QUERY_TARGET_PNP_HANDLE = DWORD(IOC_OUT or IOC_WS2 or 24);
  1655. {$EXTERNALSYM SIO_NSP_NOTIFY_CHANGE}
  1656. SIO_NSP_NOTIFY_CHANGE = DWORD(IOC_IN or IOC_WS2 or 25);
  1657. {$EXTERNALSYM SIO_ADDRESS_LIST_SORT}
  1658. SIO_ADDRESS_LIST_SORT = DWORD(IOC_INOUT or IOC_WS2 or 25);
  1659. {$EXTERNALSYM SIO_QUERY_RSS_PROCESSOR_INFO}
  1660. SIO_QUERY_RSS_PROCESSOR_INFO = DWORD(IOC_INOUT or IOC_WS2 or 37);
  1661. {$IFNDEF WINCE}
  1662. {$EXTERNALSYM SIO_RESERVED_1}
  1663. SIO_RESERVED_1 = DWORD(IOC_IN or IOC_WS2 or 26);
  1664. {$EXTERNALSYM SIO_RESERVED_2}
  1665. SIO_RESERVED_2 = DWORD(IOC_IN or IOC_WS2 or 33);
  1666. {$ENDIF}
  1667. // WinSock 2 extension -- manifest constants for SIO_TRANSLATE_HANDLE ioctl
  1668. {$EXTERNALSYM TH_NETDEV}
  1669. TH_NETDEV = $00000001;
  1670. {$EXTERNALSYM TH_TAPI}
  1671. TH_TAPI = $00000002;
  1672. type
  1673. // Manifest constants and type definitions related to name resolution and
  1674. // registration (RNR) API
  1675. {$IFNDEF NO_REDECLARE}
  1676. {$EXTERNALSYM BLOB}
  1677. BLOB = record
  1678. cbSize : U_LONG;
  1679. pBlobData : PBYTE;
  1680. end;
  1681. {$NODEFINE TBLOB}
  1682. TBLOB = BLOB;
  1683. {$NODEFINE PBLOB}
  1684. PBLOB = ^TBLOB;
  1685. {$ENDIF}
  1686. {$EXTERNALSYM LPBLOB}
  1687. LPBLOB = PBLOB;
  1688. {$EXTERNALSYM RIO_BUFFERID}
  1689. RIO_BUFFERID = Pointer;
  1690. {$EXTERNALSYM RIO_CQ}
  1691. RIO_CQ = Pointer;
  1692. {$EXTERNALSYM RIO_RQ}
  1693. RIO_RQ = Pointer;
  1694. {$EXTERNALSYM PRIO_BUFFERID}
  1695. PRIO_BUFFERID = ^RIO_BUFFERID;
  1696. {$EXTERNALSYM _RIORESULT}
  1697. _RIORESULT = record
  1698. Status : LONG;
  1699. BytesTransferred : ULONG;
  1700. SocketContext : ULONGLONG;
  1701. RequestContext : ULONGLONG;
  1702. end;
  1703. {$EXTERNALSYM RIORESULT}
  1704. RIORESULT = _RIORESULT;
  1705. {$EXTERNALSYM PRIORESULT}
  1706. PRIORESULT = ^RIORESULT;
  1707. {$EXTERNALSYM _RIO_BUF}
  1708. _RIO_BUF = record
  1709. BufferId : RIO_BUFFERID;
  1710. Offset : ULONG;
  1711. Length : ULONG;
  1712. end;
  1713. {$EXTERNALSYM RIO_BUF}
  1714. RIO_BUF = _RIO_BUF;
  1715. {$EXTERNALSYM PRIO_BUF}
  1716. PRIO_BUF = ^RIO_BUF;
  1717. {$EXTERNALSYM _RIO_CMSG_BUFFER}
  1718. _RIO_CMSG_BUFFER = record
  1719. TotalLength : ULONG;
  1720. //* followed by CMSG_HDR */
  1721. end;
  1722. {$EXTERNALSYM RIO_CMSG_BUFFER}
  1723. RIO_CMSG_BUFFER = _RIO_CMSG_BUFFER;
  1724. {$EXTERNALSYM PRIO_CMSG_BUFFER}
  1725. PRIO_CMSG_BUFFER = ^RIO_CMSG_BUFFER;
  1726. // Service Install Flags
  1727. const
  1728. {$EXTERNALSYM SERVICE_MULTIPLE}
  1729. SERVICE_MULTIPLE = $00000001;
  1730. // & name spaces
  1731. {$EXTERNALSYM NS_ALL}
  1732. NS_ALL = 0;
  1733. {$EXTERNALSYM NS_SAP}
  1734. NS_SAP = 1;
  1735. {$EXTERNALSYM NS_NDS}
  1736. NS_NDS = 2;
  1737. {$EXTERNALSYM NS_PEER_BROWSE}
  1738. NS_PEER_BROWSE = 3;
  1739. {$EXTERNALSYM NS_SLP}
  1740. NS_SLP = 5;
  1741. {$EXTERNALSYM NS_DHCP}
  1742. NS_DHCP = 6;
  1743. {$EXTERNALSYM NS_TCPIP_LOCAL}
  1744. NS_TCPIP_LOCAL = 10;
  1745. {$EXTERNALSYM NS_TCPIP_HOSTS}
  1746. NS_TCPIP_HOSTS = 11;
  1747. {$EXTERNALSYM NS_DNS}
  1748. NS_DNS = 12;
  1749. {$EXTERNALSYM NS_NETBT}
  1750. NS_NETBT = 13;
  1751. {$EXTERNALSYM NS_WINS}
  1752. NS_WINS = 14;
  1753. {$EXTERNALSYM NS_NLA}
  1754. NS_NLA = 15; //* Network Location Awareness*/ - WindowsXP
  1755. {$EXTERNALSYM NS_BTH}
  1756. NS_BTH = 16; //* Bluetooth SDP Namespace */ - Windows Vista
  1757. {$EXTERNALSYM NS_NBP}
  1758. NS_NBP = 20;
  1759. {$EXTERNALSYM NS_MS}
  1760. NS_MS = 30;
  1761. {$EXTERNALSYM NS_STDA}
  1762. NS_STDA = 31;
  1763. {$EXTERNALSYM NS_NTDS}
  1764. NS_NTDS = 32;
  1765. //Windows Vista namespaces
  1766. {$EXTERNALSYM NS_EMAIL}
  1767. NS_EMAIL = 37;
  1768. {$EXTERNALSYM NS_PNRPNAME}
  1769. NS_PNRPNAME = 38;
  1770. {$EXTERNALSYM NS_PNRPCLOUD}
  1771. NS_PNRPCLOUD = 39;
  1772. //
  1773. {$EXTERNALSYM NS_X500}
  1774. NS_X500 = 40;
  1775. {$EXTERNALSYM NS_NIS}
  1776. NS_NIS = 41;
  1777. {$EXTERNALSYM NS_NISPLUS}
  1778. NS_NISPLUS = 42;
  1779. {$EXTERNALSYM NS_WRQ}
  1780. NS_WRQ = 50;
  1781. {$EXTERNALSYM NS_NETDES}
  1782. NS_NETDES = 60; // Network Designers Limited
  1783. { Resolution flags for WSAGetAddressByName().
  1784. Note these are also used by the 1.1 API GetAddressByName, so leave them around. }
  1785. {$EXTERNALSYM RES_UNUSED_1}
  1786. RES_UNUSED_1 = $00000001;
  1787. {$EXTERNALSYM RES_FLUSH_CACHE}
  1788. RES_FLUSH_CACHE = $00000002;
  1789. {$EXTERNALSYM RES_SERVICE}
  1790. RES_SERVICE = $00000004;
  1791. {$EXTERNALSYM RIO_MSG_DONT_NOTIFY}
  1792. RIO_MSG_DONT_NOTIFY = $00000001;
  1793. {$EXTERNALSYM RIO_MSG_DEFER}
  1794. RIO_MSG_DEFER = $00000002;
  1795. {$EXTERNALSYM RIO_MSG_WAITALL}
  1796. RIO_MSG_WAITALL = $00000004;
  1797. {$EXTERNALSYM RIO_MSG_COMMIT_ONLY}
  1798. RIO_MSG_COMMIT_ONLY = $00000008;
  1799. {$EXTERNALSYM RIO_INVALID_BUFFERID}
  1800. RIO_INVALID_BUFFERID = RIO_BUFFERID($FFFFFFFF);
  1801. {$EXTERNALSYM RIO_INVALID_CQ}
  1802. RIO_INVALID_CQ = RIO_CQ(0);
  1803. {$EXTERNALSYM RIO_INVALID_RQ}
  1804. RIO_INVALID_RQ = RIO_RQ(0);
  1805. {$EXTERNALSYM RIO_MAX_CQ_SIZE}
  1806. RIO_MAX_CQ_SIZE = $8000000;
  1807. {$EXTERNALSYM RIO_CORRUPT_CQ}
  1808. RIO_CORRUPT_CQ = $FFFFFFFF;
  1809. { Well known value names for Service Types }
  1810. {$EXTERNALSYM SERVICE_TYPE_VALUE_IPXPORTA}
  1811. SERVICE_TYPE_VALUE_IPXPORTA : PIdAnsiChar = 'IpxSocket'; {Do not Localize}
  1812. {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPIDA}
  1813. SERVICE_TYPE_VALUE_SAPIDA : PIdAnsiChar = 'SapId'; {Do not Localize}
  1814. {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORTA}
  1815. SERVICE_TYPE_VALUE_TCPPORTA : PIdAnsiChar = 'TcpPort'; {Do not Localize}
  1816. {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORTA}
  1817. SERVICE_TYPE_VALUE_UDPPORTA : PIdAnsiChar = 'UdpPort'; {Do not Localize}
  1818. {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTIDA}
  1819. SERVICE_TYPE_VALUE_OBJECTIDA : PIdAnsiChar = 'ObjectId'; {Do not Localize}
  1820. {$EXTERNALSYM SERVICE_TYPE_VALUE_IPXPORTW}
  1821. SERVICE_TYPE_VALUE_IPXPORTW : PWideChar = 'IpxSocket'; {Do not Localize}
  1822. {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPIDW}
  1823. SERVICE_TYPE_VALUE_SAPIDW : PWideChar = 'SapId'; {Do not Localize}
  1824. {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORTW}
  1825. SERVICE_TYPE_VALUE_TCPPORTW : PWideChar = 'TcpPort'; {Do not Localize}
  1826. {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORTW}
  1827. SERVICE_TYPE_VALUE_UDPPORTW : PWideChar = 'UdpPort'; {Do not Localize}
  1828. {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTIDW}
  1829. SERVICE_TYPE_VALUE_OBJECTIDW : PWideChar = 'ObjectId'; {Do not Localize}
  1830. {$EXTERNALSYM SERVICE_TYPE_VALUE_SAPID}
  1831. {$EXTERNALSYM SERVICE_TYPE_VALUE_TCPPORT}
  1832. {$EXTERNALSYM SERVICE_TYPE_VALUE_UDPPORT}
  1833. {$EXTERNALSYM SERVICE_TYPE_VALUE_OBJECTID}
  1834. {$IFDEF UNICODE}
  1835. SERVICE_TYPE_VALUE_SAPID : PWideChar = 'SapId'; {Do not Localize}
  1836. SERVICE_TYPE_VALUE_TCPPORT : PWideChar = 'TcpPort'; {Do not Localize}
  1837. SERVICE_TYPE_VALUE_UDPPORT : PWideChar = 'UdpPort'; {Do not Localize}
  1838. SERVICE_TYPE_VALUE_OBJECTID : PWideChar = 'ObjectId'; {Do not Localize}
  1839. {$ELSE}
  1840. SERVICE_TYPE_VALUE_SAPID : PIdAnsiChar = 'SapId'; {Do not Localize}
  1841. SERVICE_TYPE_VALUE_TCPPORT : PIdAnsiChar = 'TcpPort'; {Do not Localize}
  1842. SERVICE_TYPE_VALUE_UDPPORT : PIdAnsiChar = 'UdpPort'; {Do not Localize}
  1843. SERVICE_TYPE_VALUE_OBJECTID : PIdAnsiChar = 'ObjectId'; {Do not Localize}
  1844. {$ENDIF}
  1845. // SockAddr Information
  1846. type
  1847. {$EXTERNALSYM SOCKET_ADDRESS}
  1848. SOCKET_ADDRESS = record
  1849. lpSockaddr : PSOCKADDR;
  1850. iSockaddrLength : Integer;
  1851. end;
  1852. {$NODEFINE TSocket_Address}
  1853. TSocket_Address = SOCKET_ADDRESS;
  1854. {$EXTERNALSYM PSOCKET_ADDRESS}
  1855. PSOCKET_ADDRESS = ^TSocket_Address;
  1856. {$EXTERNALSYM SOCKET_ADDRESS_LIST}
  1857. SOCKET_ADDRESS_LIST = record
  1858. iAddressCount : Integer;
  1859. Address : SOCKET_ADDRESS;
  1860. end;
  1861. {$NODEFINE TSocket_Address_List}
  1862. TSocket_Address_List = SOCKET_ADDRESS_LIST;
  1863. {$EXTERNALSYM PSOCKET_ADDRESS_LIST}
  1864. PSOCKET_ADDRESS_LIST = ^TSocket_Address_List;
  1865. {$EXTERNALSYM LPSOCKET_ADDRESS_LIST}
  1866. LPSOCKET_ADDRESS_LIST = PSOCKET_ADDRESS_LIST;
  1867. // CSAddr Information
  1868. {$EXTERNALSYM CSADDR_INFO}
  1869. CSADDR_INFO = record
  1870. LocalAddr,
  1871. RemoteAddr : TSocket_Address;
  1872. iSocketType,
  1873. iProtocol : Integer;
  1874. end;
  1875. {$NODEFINE TCSAddr_Info}
  1876. TCSAddr_Info = CSADDR_INFO;
  1877. {$EXTERNALSYM PCSADDR_INFO}
  1878. PCSADDR_INFO = ^TCSAddr_Info;
  1879. {$EXTERNALSYM LPCSADDR_INFO}
  1880. LPCSADDR_INFO = PCSADDR_INFO;
  1881. // Address Family/Protocol Tuples
  1882. {$EXTERNALSYM AFPROTOCOLS}
  1883. AFPROTOCOLS = record
  1884. iAddressFamily : Integer;
  1885. iProtocol : Integer;
  1886. end;
  1887. {$NODEFINE TAFProtocols}
  1888. TAFProtocols = AFPROTOCOLS;
  1889. {$EXTERNALSYM PAFPROTOCOLS}
  1890. PAFPROTOCOLS = ^TAFProtocols;
  1891. {$EXTERNALSYM LPAFPROTOCOLS}
  1892. LPAFPROTOCOLS = PAFPROTOCOLS;
  1893. // Client Query API Typedefs
  1894. // The comparators
  1895. {$EXTERNALSYM WSAECOMPARATOR}
  1896. WSAECOMPARATOR = (COMP_EQUAL {= 0}, COMP_NOTLESS);
  1897. {$NODEFINE TWSAEComparator}
  1898. TWSAEComparator = WSAECOMPARATOR;
  1899. {$EXTERNALSYM PWSAECOMPARATOR}
  1900. PWSAECOMPARATOR = ^WSAECOMPARATOR;
  1901. {$EXTERNALSYM WSAVERSION}
  1902. WSAVERSION = record
  1903. dwVersion : DWORD;
  1904. ecHow : TWSAEComparator;
  1905. end;
  1906. {$NODEFINE TWSAVersion}
  1907. TWSAVersion = WSAVERSION;
  1908. {$EXTERNALSYM PWSAVERSION}
  1909. PWSAVERSION = ^TWSAVersion;
  1910. {$EXTERNALSYM LPWSAVERSION}
  1911. LPWSAVERSION = PWSAVERSION;
  1912. {$EXTERNALSYM WSAQUERYSETA}
  1913. WSAQUERYSETA = record
  1914. dwSize : DWORD;
  1915. lpszServiceInstanceName : PIdAnsiChar;
  1916. lpServiceClassId : PGUID;
  1917. lpVersion : LPWSAVERSION;
  1918. lpszComment : PIdAnsiChar;
  1919. dwNameSpace : DWORD;
  1920. lpNSProviderId : PGUID;
  1921. lpszContext : PIdAnsiChar;
  1922. dwNumberOfProtocols : DWORD;
  1923. lpafpProtocols : LPAFPROTOCOLS;
  1924. lpszQueryString : PIdAnsiChar;
  1925. dwNumberOfCsAddrs : DWORD;
  1926. lpcsaBuffer : LPCSADDR_INFO;
  1927. dwOutputFlags : DWORD;
  1928. lpBlob : LPBLOB;
  1929. end;
  1930. {$NODEFINE TWSAQuerySetA}
  1931. TWSAQuerySetA = WSAQUERYSETA;
  1932. {$EXTERNALSYM PWSAQUERYSETA}
  1933. PWSAQUERYSETA = ^TWSAQuerySetA;
  1934. {$EXTERNALSYM LPWSAQUERYSETA}
  1935. LPWSAQUERYSETA = PWSAQUERYSETA;
  1936. {$EXTERNALSYM WSAQUERYSETW}
  1937. WSAQUERYSETW = record
  1938. dwSize : DWORD;
  1939. lpszServiceInstanceName : PWideChar;
  1940. lpServiceClassId : PGUID;
  1941. lpVersion : LPWSAVERSION;
  1942. lpszComment : PWideChar;
  1943. dwNameSpace : DWORD;
  1944. lpNSProviderId : PGUID;
  1945. lpszContext : PWideChar;
  1946. dwNumberOfProtocols : DWORD;
  1947. lpafpProtocols : LPAFPROTOCOLS;
  1948. lpszQueryString : PWideChar;
  1949. dwNumberOfCsAddrs : DWORD;
  1950. lpcsaBuffer : LPCSADDR_INFO;
  1951. dwOutputFlags : DWORD;
  1952. lpBlob : LPBLOB;
  1953. end;
  1954. {$NODEFINE TWSAQuerySetW}
  1955. TWSAQuerySetW = WSAQUERYSETW;
  1956. {$EXTERNALSYM PWSAQUERYSETW}
  1957. PWSAQUERYSETW = ^TWSAQuerySetW;
  1958. {$EXTERNALSYM LPWSAQUERYSETW}
  1959. LPWSAQUERYSETW = PWSAQUERYSETW;
  1960. {$NODEFINE TWSAQuerySet}
  1961. {$EXTERNALSYM PWSAQUERYSET}
  1962. {$EXTERNALSYM LPWSAQUERYSET}
  1963. {$IFDEF UNICODE}
  1964. TWSAQuerySet = TWSAQuerySetW;
  1965. PWSAQUERYSET = PWSAQUERYSETW;
  1966. LPWSAQUERYSET = LPWSAQUERYSETW;
  1967. {$ELSE}
  1968. TWSAQuerySet = TWSAQuerySetA;
  1969. PWSAQUERYSET = PWSAQUERYSETA;
  1970. LPWSAQUERYSET = LPWSAQUERYSETA;
  1971. {$ENDIF}
  1972. const
  1973. {$EXTERNALSYM LUP_DEEP}
  1974. LUP_DEEP = $0001;
  1975. {$EXTERNALSYM LUP_CONTAINERS}
  1976. LUP_CONTAINERS = $0002;
  1977. {$EXTERNALSYM LUP_NOCONTAINERS}
  1978. LUP_NOCONTAINERS = $0004;
  1979. {$EXTERNALSYM LUP_NEAREST}
  1980. LUP_NEAREST = $0008;
  1981. {$EXTERNALSYM LUP_RETURN_NAME}
  1982. LUP_RETURN_NAME = $0010;
  1983. {$EXTERNALSYM LUP_RETURN_TYPE}
  1984. LUP_RETURN_TYPE = $0020;
  1985. {$EXTERNALSYM LUP_RETURN_VERSION}
  1986. LUP_RETURN_VERSION = $0040;
  1987. {$EXTERNALSYM LUP_RETURN_COMMENT}
  1988. LUP_RETURN_COMMENT = $0080;
  1989. {$EXTERNALSYM LUP_RETURN_ADDR}
  1990. LUP_RETURN_ADDR = $0100;
  1991. {$EXTERNALSYM LUP_RETURN_BLOB}
  1992. LUP_RETURN_BLOB = $0200;
  1993. {$EXTERNALSYM LUP_RETURN_ALIASES}
  1994. LUP_RETURN_ALIASES = $0400;
  1995. {$EXTERNALSYM LUP_RETURN_QUERY_STRING}
  1996. LUP_RETURN_QUERY_STRING = $0800;
  1997. {$EXTERNALSYM LUP_RETURN_ALL}
  1998. LUP_RETURN_ALL = $0FF0;
  1999. {$EXTERNALSYM LUP_RES_SERVICE}
  2000. LUP_RES_SERVICE = $8000;
  2001. {$EXTERNALSYM LUP_FLUSHCACHE}
  2002. LUP_FLUSHCACHE = $1000;
  2003. {$EXTERNALSYM LUP_FLUSHPREVIOUS}
  2004. LUP_FLUSHPREVIOUS = $2000;
  2005. // Return flags
  2006. {$EXTERNALSYM RESULT_IS_ALIAS}
  2007. RESULT_IS_ALIAS = $0001;
  2008. //These are not supported in WinCE 4.2 but are available in later versions.
  2009. {$EXTERNALSYM RESULT_IS_ADDED}
  2010. RESULT_IS_ADDED = $0010;
  2011. {$EXTERNALSYM RESULT_IS_CHANGED}
  2012. RESULT_IS_CHANGED = $0020;
  2013. {$EXTERNALSYM RESULT_IS_DELETED}
  2014. RESULT_IS_DELETED = $0040;
  2015. {$EXTERNALSYM MAX_NATURAL_ALIGNMENT}
  2016. {$IFDEF _WIN64}
  2017. MAX_NATURAL_ALIGNMENT = SizeOf(Int64);
  2018. {$ELSE}
  2019. MAX_NATURAL_ALIGNMENT = SizeOf(DWORD);
  2020. {$ENDIF}
  2021. // WSARecvMsg flags
  2022. {$EXTERNALSYM MSG_TRUNC}
  2023. MSG_TRUNC = $0100;
  2024. {$EXTERNALSYM MSG_CTRUNC}
  2025. MSG_CTRUNC = $0200;
  2026. {$EXTERNALSYM MSG_BCAST}
  2027. MSG_BCAST = $0400;
  2028. {$EXTERNALSYM MSG_MCAST}
  2029. MSG_MCAST = $0800;
  2030. {$IFNDEF WINCE}
  2031. //Windows Vista WSAPoll
  2032. //* Event flag definitions for WSAPoll(). */
  2033. {$EXTERNALSYM POLLRDNORM}
  2034. POLLRDNORM = $0100;
  2035. {$EXTERNALSYM POLLRDBAND}
  2036. POLLRDBAND = $0200;
  2037. {$EXTERNALSYM POLLIN}
  2038. POLLIN = (POLLRDNORM or POLLRDBAND);
  2039. {$EXTERNALSYM POLLPRI}
  2040. POLLPRI = $0400;
  2041. {$EXTERNALSYM POLLWRNORM}
  2042. POLLWRNORM = $0010;
  2043. {$EXTERNALSYM POLLOUT}
  2044. POLLOUT = (POLLWRNORM);
  2045. {$EXTERNALSYM POLLWRBAND}
  2046. POLLWRBAND = $0020;
  2047. {$EXTERNALSYM POLLERR}
  2048. POLLERR = $0001;
  2049. {$EXTERNALSYM POLLHUP}
  2050. POLLHUP = $0002;
  2051. {$EXTERNALSYM POLLNVAL}
  2052. POLLNVAL = $0004;
  2053. {$ENDIF}
  2054. type
  2055. // Service Address Registration and Deregistration Data Types.
  2056. {$EXTERNALSYM WSAESETSERVICEOP}
  2057. WSAESETSERVICEOP = (RNRSERVICE_REGISTER{=0}, RNRSERVICE_DEREGISTER, RNRSERVICE_DELETE);
  2058. {$NODEFINE TWSAESetServiceOp}
  2059. TWSAESetServiceOp = WSAESETSERVICEOP;
  2060. { Service Installation/Removal Data Types. }
  2061. {$EXTERNALSYM WSANSCLASSINFOA}
  2062. WSANSCLASSINFOA = record
  2063. lpszName : PIdAnsiChar;
  2064. dwNameSpace : DWORD;
  2065. dwValueType : DWORD;
  2066. dwValueSize : DWORD;
  2067. lpValue : Pointer;
  2068. end;
  2069. {$NODEFINE TWSANSClassInfoA}
  2070. TWSANSClassInfoA = WSANSCLASSINFOA;
  2071. {$EXTERNALSYM PWSANSClassInfoA}
  2072. PWSANSCLASSINFOA = ^TWSANSClassInfoA;
  2073. {$EXTERNALSYM LPWSANSCLASSINFOA}
  2074. LPWSANSCLASSINFOA = PWSANSCLASSINFOA;
  2075. {$EXTERNALSYM WSANSCLASSINFOW}
  2076. WSANSCLASSINFOW = record
  2077. lpszName : PWideChar;
  2078. dwNameSpace : DWORD;
  2079. dwValueType : DWORD;
  2080. dwValueSize : DWORD;
  2081. lpValue : Pointer;
  2082. end;
  2083. {$NODEFINE TWSANSClassInfoW}
  2084. TWSANSClassInfoW = WSANSCLASSINFOW;
  2085. {$EXTERNALSYM PWSANSClassInfoW}
  2086. PWSANSCLASSINFOW = ^TWSANSClassInfoW;
  2087. {$EXTERNALSYM LPWSANSCLASSINFOW}
  2088. LPWSANSCLASSINFOW = PWSANSCLASSINFOW;
  2089. {$NODEFINE TWSANSClassInfo}
  2090. {$EXTERNALSYM WSANSCLASSINFO}
  2091. {$EXTERNALSYM PWSANSCLASSINFO}
  2092. {$EXTERNALSYM LPWSANSCLASSINFO}
  2093. {$IFDEF UNICODE}
  2094. TWSANSClassInfo = TWSANSClassInfoW;
  2095. WSANSCLASSINFO = TWSANSClassInfoW;
  2096. PWSANSCLASSINFO = PWSANSCLASSINFOW;
  2097. LPWSANSCLASSINFO = LPWSANSCLASSINFOW;
  2098. {$ELSE}
  2099. TWSANSClassInfo = TWSANSClassInfoA;
  2100. WSANSCLASSINFO = TWSANSClassInfoA;
  2101. PWSANSCLASSINFO = PWSANSCLASSINFOA;
  2102. LPWSANSCLASSINFO = LPWSANSCLASSINFOA;
  2103. {$ENDIF // UNICODE}
  2104. {$EXTERNALSYM WSASERVICECLASSINFOA}
  2105. WSASERVICECLASSINFOA = record
  2106. lpServiceClassId : PGUID;
  2107. lpszServiceClassName : PIdAnsiChar;
  2108. dwCount : DWORD;
  2109. lpClassInfos : LPWSANSCLASSINFOA;
  2110. end;
  2111. {$NODEFINE TWSAServiceClassInfoA}
  2112. TWSAServiceClassInfoA = WSASERVICECLASSINFOA;
  2113. {$EXTERNALSYM PWSASERVICECLASSINFOA}
  2114. PWSASERVICECLASSINFOA = ^TWSAServiceClassInfoA;
  2115. {$EXTERNALSYM LPWSASERVICECLASSINFOA}
  2116. LPWSASERVICECLASSINFOA = PWSASERVICECLASSINFOA;
  2117. {$EXTERNALSYM WSASERVICECLASSINFOW}
  2118. WSASERVICECLASSINFOW = record
  2119. lpServiceClassId : PGUID;
  2120. lpszServiceClassName : PWideChar;
  2121. dwCount : DWORD;
  2122. lpClassInfos : LPWSANSCLASSINFOW;
  2123. end;
  2124. {$NODEFINE TWSAServiceClassInfoW}
  2125. TWSAServiceClassInfoW = WSASERVICECLASSINFOW;
  2126. {$EXTERNALSYM PWSASERVICECLASSINFOW}
  2127. PWSASERVICECLASSINFOW = ^TWSAServiceClassInfoW;
  2128. {$EXTERNALSYM LPWSASERVICECLASSINFOW}
  2129. LPWSASERVICECLASSINFOW = PWSASERVICECLASSINFOW;
  2130. {$NODEFINE TWSAServiceClassInfo}
  2131. {$EXTERNALSYM WSASERVICECLASSINFO}
  2132. {$EXTERNALSYM PWSASERVICECLASSINFO}
  2133. {$EXTERNALSYM LPWSASERVICECLASSINFO}
  2134. {$IFDEF UNICODE}
  2135. TWSAServiceClassInfo = TWSAServiceClassInfoW;
  2136. WSASERVICECLASSINFO = TWSAServiceClassInfoW;
  2137. PWSASERVICECLASSINFO = PWSASERVICECLASSINFOW;
  2138. LPWSASERVICECLASSINFO = LPWSASERVICECLASSINFOW;
  2139. {$ELSE}
  2140. TWSAServiceClassInfo = TWSAServiceClassInfoA;
  2141. WSASERVICECLASSINFO = TWSAServiceClassInfoA;
  2142. PWSASERVICECLASSINFO = PWSASERVICECLASSINFOA;
  2143. LPWSASERVICECLASSINFO = LPWSASERVICECLASSINFOA;
  2144. {$ENDIF}
  2145. {$EXTERNALSYM WSANAMESPACE_INFOA}
  2146. WSANAMESPACE_INFOA = record
  2147. NSProviderId : TGUID;
  2148. dwNameSpace : DWORD;
  2149. fActive : DWORD{Bool};
  2150. dwVersion : DWORD;
  2151. lpszIdentifier : PIdAnsiChar;
  2152. end;
  2153. {$NODEFINE TWSANameSpace_InfoA}
  2154. TWSANameSpace_InfoA = WSANAMESPACE_INFOA;
  2155. {$EXTERNALSYM PWSANAMESPACE_INFOA}
  2156. PWSANAMESPACE_INFOA = ^TWSANameSpace_InfoA;
  2157. {$EXTERNALSYM LPWSANAMESPACE_INFOA}
  2158. LPWSANAMESPACE_INFOA = PWSANAMESPACE_INFOA;
  2159. {$EXTERNALSYM WSANAMESPACE_INFOW}
  2160. WSANAMESPACE_INFOW = record
  2161. NSProviderId : TGUID;
  2162. dwNameSpace : DWORD;
  2163. fActive : DWORD{Bool};
  2164. dwVersion : DWORD;
  2165. lpszIdentifier : PWideChar;
  2166. end;
  2167. {$NODEFINE TWSANameSpace_InfoW}
  2168. TWSANameSpace_InfoW = WSANAMESPACE_INFOW;
  2169. {$EXTERNALSYM PWSANAMESPACE_INFOW}
  2170. PWSANAMESPACE_INFOW = ^TWSANameSpace_InfoW;
  2171. {$EXTERNALSYM LPWSANAMESPACE_INFOW}
  2172. LPWSANAMESPACE_INFOW = PWSANAMESPACE_INFOW;
  2173. {$IFNDEF WINCE}
  2174. {$EXTERNALSYM WSANAMESPACE_INFOEXW}
  2175. WSANAMESPACE_INFOEXW = record
  2176. NSProviderId : TGUID;
  2177. dwNameSpace : DWord;
  2178. fActive : LongBool;
  2179. lpszIdentifier : LPWSTR;
  2180. ProviderSpecific : BLOB;
  2181. end;
  2182. {$NODEFINE TWSANameSpace_InfoExW}
  2183. TWSANameSpace_InfoExW = WSANAMESPACE_INFOEXW;
  2184. {$EXTERNALSYM PWSANAMESPACE_INFOEXW}
  2185. PWSANAMESPACE_INFOEXW = ^TWSANameSpace_InfoExW;
  2186. {$EXTERNALSYM LPWSANAMESPACE_INFOEXW}
  2187. LPWSANAMESPACE_INFOEXW = PWSANAMESPACE_INFOEXW;
  2188. {$EXTERNALSYM WSANAMESPACE_INFOEXA}
  2189. WSANAMESPACE_INFOEXA = record
  2190. NSProviderId : TGUID;
  2191. dwNameSpace : DWord;
  2192. fActive : LongBool;
  2193. lpszIdentifier : LPSTR;
  2194. ProviderSpecific : BLOB;
  2195. end;
  2196. {$NODEFINE TWSANameSpace_InfoExA}
  2197. TWSANameSpace_InfoExA = WSANAMESPACE_INFOEXA;
  2198. {$EXTERNALSYM PWSANAMESPACE_INFOEXA}
  2199. PWSANAMESPACE_INFOEXA = ^TWSANameSpace_InfoExA;
  2200. {$EXTERNALSYM LPWSANAMESPACE_INFOEXA}
  2201. LPWSANAMESPACE_INFOEXA = PWSANAMESPACE_INFOEXA;
  2202. {$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSEXW}
  2203. LPFN_WSAENUMNAMESPACEPROVIDERSEXW = function (var lpdwBufferLength : DWord;
  2204. lpnspBuffer : PWSANAMESPACE_INFOEXW): Integer; stdcall;
  2205. {$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSEXA}
  2206. LPFN_WSAENUMNAMESPACEPROVIDERSEXA = function (var lpdwBufferLength : DWord;
  2207. lpnspBuffer : PWSANAMESPACE_INFOEXA): Integer; stdcall;
  2208. {$NODEFINE TWSANameSpace_InfoEx}
  2209. {$EXTERNALSYM WSANAMESPACE_INFOEX}
  2210. {$EXTERNALSYM PWSANAMESPACE_INFOEX}
  2211. {$EXTERNALSYM LPWSANAMESPACE_INFOEX}
  2212. {$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSEX}
  2213. {$IFDEF UNICODE}
  2214. WSANAMESPACE_INFOEX = WSANAMESPACE_INFOEXW;
  2215. TWSANameSpace_InfoEx = TWSANameSpace_InfoExW;
  2216. PWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEXW;
  2217. LPWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEX;
  2218. LPFN_WSAENUMNAMESPACEPROVIDERSEX = LPFN_WSAENUMNAMESPACEPROVIDERSEXW;
  2219. {$ELSE}
  2220. WSANAMESPACE_INFOEX = WSANAMESPACE_INFOEXA;
  2221. TWSANameSpace_InfoEx = TWSANameSpace_InfoExA;
  2222. PWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEXA;
  2223. LPWSANAMESPACE_INFOEX = PWSANAMESPACE_INFOEX;
  2224. LPFN_WSAENUMNAMESPACEPROVIDERSEX = LPFN_WSAENUMNAMESPACEPROVIDERSEXA;
  2225. {$ENDIF}
  2226. {$ENDIF} // WINCE
  2227. {$NODEFINE TWSANameSpace_Info}
  2228. {$EXTERNALSYM WSANAMESPACE_INFO}
  2229. {$EXTERNALSYM PWSANAMESPACE_INFO}
  2230. {$EXTERNALSYM LPWSANAMESPACE_INFO}
  2231. {$IFDEF UNICODE}
  2232. TWSANameSpace_Info = TWSANameSpace_InfoW;
  2233. WSANAMESPACE_INFO = TWSANameSpace_InfoW;
  2234. PWSANAMESPACE_INFO = PWSANAMESPACE_INFOW;
  2235. LPWSANAMESPACE_INFO = LPWSANAMESPACE_INFOW;
  2236. {$ELSE}
  2237. TWSANameSpace_Info = TWSANameSpace_InfoA;
  2238. WSANAMESPACE_INFO = TWSANameSpace_InfoA;
  2239. PWSANAMESPACE_INFO = PWSANAMESPACE_INFOA;
  2240. LPWSANAMESPACE_INFO = LPWSANAMESPACE_INFOA;
  2241. {$ENDIF}
  2242. {$IFDEF WINCE}
  2243. {$EXTERNALSYM DSCP_TRAFFIC_TYPE}
  2244. {$EXTERNALSYM DSCPTypeNotSet}
  2245. {$EXTERNALSYM DSCPBestEffort}
  2246. {$EXTERNALSYM DSCPBackground}
  2247. {$EXTERNALSYM DSCPExcellentEffort}
  2248. {$EXTERNALSYM DSCPVideo}
  2249. {$EXTERNALSYM DSCPAudio}
  2250. {$EXTERNALSYM DSCPControl}
  2251. {$EXTERNALSYM NumDSCPTrafficTypes}
  2252. DSCP_TRAFFIC_TYPE = (
  2253. DSCPTypeNotSet = 0,
  2254. DSCPBestEffort = 1,
  2255. DSCPBackground = 2,
  2256. DSCPExcellentEffort = 3,
  2257. DSCPVideo = 4,
  2258. DSCPAudio = 5,
  2259. DSCPControl = 6);
  2260. // Define NumDSCPTrafficTypes as DSCPControl
  2261. //because FPC warns that enumerations must be descending.
  2262. //The original definition for DSCP_TRAFFIC_TYPE is:
  2263. //
  2264. ///* differential service traffic types */
  2265. //typedef enum _DSCP_TRAFFIC_TYPE
  2266. //{
  2267. // DSCPTypeNotSet = 0,
  2268. // DSCPBestEffort = 1,
  2269. // DSCPBackground = 2,
  2270. // DSCPExcellentEffort = 3,
  2271. // DSCPVideo = 4,
  2272. // DSCPAudio = 5,
  2273. // DSCPControl = 6,
  2274. // NumDSCPTrafficTypes = 6
  2275. //} //DSCP_TRAFFIC_TYPE;
  2276. const
  2277. NumDSCPTrafficTypes : DSCP_TRAFFIC_TYPE = DSCPControl;
  2278. type
  2279. {$ENDIF}
  2280. {$EXTERNALSYM WSAMSG}
  2281. WSAMSG = record
  2282. name : PSOCKADDR; ///* Remote address */
  2283. namelen : Integer; ///* Remote address length *
  2284. lpBuffers : LPWSABUF; // /* Data buffer array */
  2285. dwBufferCount : DWord; // /* Number of elements in the array */
  2286. Control : WSABUF; // /* Control buffer */
  2287. dwFlags : DWord; // /* Flags */
  2288. end;
  2289. {$NODEFINE TWSAMSG}
  2290. TWSAMSG = WSAMSG;
  2291. {$EXTERNALSYM PWSAMSG}
  2292. PWSAMSG = ^TWSAMSG;
  2293. {$EXTERNALSYM LPWSAMSG}
  2294. LPWSAMSG = PWSAMSG;
  2295. {$EXTERNALSYM _WSACMSGHDR}
  2296. _WSACMSGHDR = record
  2297. cmsg_len: SIZE_T;
  2298. cmsg_level: Integer;
  2299. cmsg_type: Integer;
  2300. { followed by UCHAR cmsg_data[] }
  2301. end;
  2302. {$EXTERNALSYM WSACMSGHDR}
  2303. WSACMSGHDR = _WSACMSGHDR;
  2304. {$EXTERNALSYM cmsghdr}
  2305. cmsghdr = _WSACMSGHDR;
  2306. {$NODEFINE TWSACMsgHdr}
  2307. TWSACMsgHdr = WSACMSGHDR;
  2308. {$EXTERNALSYM PWSACMSGHDR}
  2309. PWSACMSGHDR = ^TWSACMsgHdr;
  2310. {$EXTERNALSYM LPWSACMSGHDR}
  2311. LPWSACMSGHDR = PWSACMSGHDR;
  2312. {$EXTERNALSYM PCMSGHDR}
  2313. PCMSGHDR = ^CMSGHDR;
  2314. {$IFNDEF WINCE}
  2315. {$EXTERNALSYM WSAPOLLFD}
  2316. WSAPOLLFD = record
  2317. fd : TSocket;
  2318. events : SHORT;
  2319. revents : SHORT;
  2320. end;
  2321. {$NODEFINE TWSAPOLLFD}
  2322. TWSAPOLLFD = WSAPOLLFD;
  2323. {$EXTERNALSYM PWSAPOLLFD}
  2324. PWSAPOLLFD = ^TWSAPOLLFD;
  2325. {$EXTERNALSYM LPWSAPOLLFD}
  2326. LPWSAPOLLFD = PWSAPOLLFD;
  2327. {$ENDIF}
  2328. { WinSock 2 extensions -- data types for the condition function in }
  2329. { WSAAccept() and overlapped I/O completion routine. }
  2330. type
  2331. {$EXTERNALSYM LPCONDITIONPROC}
  2332. LPCONDITIONPROC = function(lpCallerId: LPWSABUF; lpCallerData: LPWSABUF; lpSQOS, pGQOS: LPQOS;
  2333. lpCalleeId,lpCalleeData: LPWSABUF; g: PGROUP; dwCallbackData: DWORD_PTR): Integer; stdcall;
  2334. {$EXTERNALSYM LPWSAOVERLAPPED_COMPLETION_ROUTINE}
  2335. LPWSAOVERLAPPED_COMPLETION_ROUTINE = procedure(dwError, cbTransferred: DWORD;
  2336. lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD); stdcall;
  2337. {$EXTERNALSYM WSACOMPLETIONTYPE}
  2338. {$EXTERNALSYM NSP_NOTIFY_IMMEDIATELY}
  2339. {$EXTERNALSYM NSP_NOTIFY_HWND}
  2340. {$EXTERNALSYM NSP_NOTIFY_EVENT}
  2341. {$EXTERNALSYM NSP_NOTIFY_PORT}
  2342. {$EXTERNALSYM NSP_NOTIFY_APC}
  2343. WSACOMPLETIONTYPE = (
  2344. NSP_NOTIFY_IMMEDIATELY,
  2345. NSP_NOTIFY_HWND,
  2346. NSP_NOTIFY_EVENT,
  2347. NSP_NOTIFY_PORT,
  2348. NSP_NOTIFY_APC);
  2349. {$EXTERNALSYM WSACOMPLETION_WINDOWMESSAGE}
  2350. WSACOMPLETION_WINDOWMESSAGE = record
  2351. hWnd : HWND;
  2352. uMsg : UINT;
  2353. context : WPARAM;
  2354. end;
  2355. {$EXTERNALSYM WSACOMPLETION_EVENT}
  2356. WSACOMPLETION_EVENT = record
  2357. lpOverlapped : LPWSAOVERLAPPED;
  2358. end;
  2359. {$EXTERNALSYM WSACOMPLETION_APC}
  2360. WSACOMPLETION_APC = record
  2361. lpOverlapped : LPWSAOVERLAPPED;
  2362. lpfnCompletionProc : LPWSAOVERLAPPED_COMPLETION_ROUTINE;
  2363. end;
  2364. {$EXTERNALSYM WSACOMPLETION_PORT}
  2365. WSACOMPLETION_PORT = record
  2366. lpOverlapped : LPWSAOVERLAPPED;
  2367. hPort : THandle;
  2368. Key : ULONG_PTR;
  2369. end;
  2370. {$EXTERNALSYM WSACOMPLETION_UNION}
  2371. WSACOMPLETION_union = record
  2372. case Integer of
  2373. 0: (WindowMessage : WSACOMPLETION_WINDOWMESSAGE);
  2374. 1: (Event : WSACOMPLETION_EVENT);
  2375. 2: (Apc : WSACOMPLETION_APC);
  2376. 3: (Port : WSACOMPLETION_PORT);
  2377. end;
  2378. {$EXTERNALSYM WSACOMPLETION}
  2379. WSACOMPLETION = record
  2380. _Type : WSACOMPLETIONTYPE;
  2381. Parameters : WSACOMPLETION_union;
  2382. end;
  2383. {$EXTERNALSYM PWSACOMPLETION}
  2384. PWSACOMPLETION = ^WSACOMPLETION;
  2385. {$EXTERNALSYM LPWSACOMPLETION}
  2386. LPWSACOMPLETION = PWSACOMPLETION;
  2387. {$IFNDEF WINCE}
  2388. {$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_TYPE}
  2389. {$EXTERNALSYM RIO_EVENT_COMPLETION}
  2390. {$EXTERNALSYM RIO_IOCP_COMPLETION}
  2391. {$IFNDEF HAS_ENUM_ELEMENT_VALUES}
  2392. {$NODEFINE rnctUnused}
  2393. {$ENDIF}
  2394. // The Pascal compiler in Delphi/BCB prior to v6 does not
  2395. // support specifying values for individual enum items
  2396. _RIO_NOTIFICATION_COMPLETION_TYPE = (
  2397. {$IFDEF HAS_ENUM_ELEMENT_VALUES}
  2398. RIO_EVENT_COMPLETION = 1,
  2399. RIO_IOCP_COMPLETION = 2
  2400. {$ELSE}
  2401. rnctUnused, // do not use
  2402. RIO_EVENT_COMPLETION,
  2403. RIO_IOCP_COMPLETION
  2404. {$ENDIF}
  2405. );
  2406. {$EXTERNALSYM RIO_NOTIFICATION_COMPLETION_TYPE}
  2407. RIO_NOTIFICATION_COMPLETION_TYPE = _RIO_NOTIFICATION_COMPLETION_TYPE;
  2408. {$EXTERNALSYM PRIO_NOTIFICATION_COMPLETION_TYPE}
  2409. PRIO_NOTIFICATION_COMPLETION_TYPE = ^RIO_NOTIFICATION_COMPLETION_TYPE;
  2410. {$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION}
  2411. {$EXTERNALSYM RIO_NOTIFICATION_COMPLETION}
  2412. {$EXTERNALSYM PRIO_NOTIFICATION_COMPLETION}
  2413. {$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_UNION}
  2414. {$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_IOCP}
  2415. {$EXTERNALSYM _RIO_NOTIFICATION_COMPLETION_EVENT}
  2416. _RIO_NOTIFICATION_COMPLETION_EVENT = record
  2417. EventHandle : THandle;
  2418. NotifyReset : BOOL;
  2419. end;
  2420. _RIO_NOTIFICATION_COMPLETION_IOCP = record
  2421. IocpHandle : THANDLE;
  2422. CompletionKey : PVOID;
  2423. Overlapped : PVOID;
  2424. end;
  2425. _RIO_NOTIFICATION_COMPLETION_UNION = record
  2426. case Integer of
  2427. 0 : (Event : _RIO_NOTIFICATION_COMPLETION_EVENT);
  2428. 1 : (Iocp : _RIO_NOTIFICATION_COMPLETION_IOCP);
  2429. end;
  2430. _RIO_NOTIFICATION_COMPLETION = record
  2431. _Type : RIO_NOTIFICATION_COMPLETION_TYPE;
  2432. a : _RIO_NOTIFICATION_COMPLETION_UNION;
  2433. end;
  2434. {$EXTERNALSYM RIO_NOTIFICATION_COMPLETION}
  2435. RIO_NOTIFICATION_COMPLETION = _RIO_NOTIFICATION_COMPLETION;
  2436. {$EXTERNALSYM PRIO_NOTIFICATION_COMPLETION}
  2437. PRIO_NOTIFICATION_COMPLETION = ^RIO_NOTIFICATION_COMPLETION;
  2438. {$ENDIF}
  2439. type
  2440. {$IFDEF INCL_WINSOCK_API_TYPEDEFS}
  2441. {$EXTERNALSYM LPFN_WSASTARTUP}
  2442. LPFN_WSASTARTUP = function(const wVersionRequired: WORD; out WSData: TWSAData): Integer; stdcall;
  2443. {$EXTERNALSYM LPFN_WSACLEANUP}
  2444. LPFN_WSACLEANUP = function: Integer; stdcall;
  2445. {$EXTERNALSYM LPFN_ACCEPT}
  2446. LPFN_ACCEPT = function(const s: TSocket; AAddr: PSOCKADDR; addrlen: PInteger): TSocket; stdcall;
  2447. {$EXTERNALSYM LPFN_BIND}
  2448. LPFN_BIND = function(const s: TSocket; const name: PSOCKADDR; const namelen: Integer): Integer; stdcall;
  2449. {$EXTERNALSYM LPFN_CLOSESOCKET}
  2450. LPFN_CLOSESOCKET = function(const s: TSocket): Integer; stdcall;
  2451. {$EXTERNALSYM LPFN_CONNECT}
  2452. LPFN_CONNECT = function(const s: TSocket; const name: PSOCKADDR; const namelen: Integer): Integer; stdcall;
  2453. {$EXTERNALSYM lpfn_IOCTLSOCKET}
  2454. LPFN_IOCTLSOCKET = function(const s: TSocket; const cmd: DWORD; var arg: u_long): Integer; stdcall;
  2455. {$EXTERNALSYM LPFN_GETPEERNAME}
  2456. LPFN_GETPEERNAME = function(const s: TSocket; const name: PSOCKADDR; var namelen: Integer): Integer; stdcall;
  2457. {$EXTERNALSYM LPFN_GETSOCKNAME}
  2458. LPFN_GETSOCKNAME = function(const s: TSocket; const name: PSOCKADDR; var namelen: Integer): Integer; stdcall;
  2459. {$EXTERNALSYM LPFN_GETSOCKOPT}
  2460. LPFN_GETSOCKOPT = function(const s: TSocket; const level, optname: Integer; optval: PIdAnsiChar; var optlen: Integer): Integer; stdcall;
  2461. {$EXTERNALSYM LPFN_HTONL}
  2462. LPFN_HTONL = function(hostlong: u_long): u_long; stdcall;
  2463. {$EXTERNALSYM LPFN_HTONS}
  2464. LPFN_HTONS = function(hostshort: u_short): u_short; stdcall;
  2465. {$EXTERNALSYM LPFN_INET_ADDR}
  2466. LPFN_INET_ADDR = function(cp: PIdAnsiChar): u_long; stdcall;
  2467. {$EXTERNALSYM LPFN_INET_NTOA}
  2468. LPFN_INET_NTOA = function(inaddr: TInAddr): PIdAnsiChar; stdcall;
  2469. {$EXTERNALSYM LPFN_LISTEN}
  2470. LPFN_LISTEN = function(const s: TSocket; backlog: Integer): Integer; stdcall;
  2471. {$EXTERNALSYM LPFN_NTOHL}
  2472. LPFN_NTOHL = function(netlong: u_long): u_long; stdcall;
  2473. {$EXTERNALSYM LPFN_NTOHS}
  2474. LPFN_NTOHS = function(netshort: u_short): u_short; stdcall;
  2475. {$EXTERNALSYM LPFN_RECV}
  2476. LPFN_RECV = function(const s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  2477. {$EXTERNALSYM LPFN_RECVFROM}
  2478. LPFN_RECVFROM = function(const s: TSocket; var Buf; len, flags: Integer; from: PSOCKADDR; fromlen: PInteger): Integer; stdcall;
  2479. {$EXTERNALSYM LPFN_SELECT}
  2480. LPFN_SELECT = function(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Integer; stdcall;
  2481. {$EXTERNALSYM LPFN_SEND}
  2482. LPFN_SEND = function(const s: TSocket; const Buf; len, flags: Integer): Integer; stdcall;
  2483. {$EXTERNALSYM LPFN_SENDTO}
  2484. LPFN_SENDTO = function(const s: TSocket; const Buf; const len, flags: Integer; const addrto: PSOCKADDR; const tolen: Integer): Integer; stdcall;
  2485. {$EXTERNALSYM LPFN_SETSOCKOPT}
  2486. LPFN_SETSOCKOPT = function(const s: TSocket; const level, optname: Integer; optval: PIdAnsiChar; const optlen: Integer): Integer; stdcall;
  2487. {$EXTERNALSYM LPFN_SHUTDOWN}
  2488. LPFN_SHUTDOWN = function(const s: TSocket; const how: Integer): Integer; stdcall;
  2489. {$EXTERNALSYM LPFN_SOCKET}
  2490. LPFN_SOCKET = function(const af, istruct, protocol: Integer): TSocket; stdcall;
  2491. {$EXTERNALSYM LPFN_GETHOSTBYADDR}
  2492. LPFN_GETHOSTBYADDR = function(AAddr: Pointer; const len, addrtype: Integer): PHostEnt; stdcall;
  2493. {$EXTERNALSYM LPFN_GETHOSTBYNAME}
  2494. LPFN_GETHOSTBYNAME = function(name: PIdAnsiChar): PHostEnt; stdcall;
  2495. {$EXTERNALSYM LPFN_GETHOSTNAME}
  2496. LPFN_GETHOSTNAME = function(name: PIdAnsiChar; len: Integer): Integer; stdcall;
  2497. {$IFDEF WINCE}
  2498. // WinCE specific for setting the host name
  2499. {$EXTERNALSYM LPFN_SETHOSTNAME}
  2500. LPFN_SETHOSTNAME = function(pName : PIdAnsiChar; len : Integer) : Integer; stdcall;
  2501. {$ENDIF}
  2502. {$EXTERNALSYM LPFN_GETSERVBYPORT}
  2503. LPFN_GETSERVBYPORT = function(const port: Integer; const proto: PIdAnsiChar): PServEnt; stdcall;
  2504. {$EXTERNALSYM LPFN_GETSERVBYNAME}
  2505. LPFN_GETSERVBYNAME = function(const name, proto: PIdAnsiChar): PServEnt; stdcall;
  2506. {$EXTERNALSYM LPFN_GETPROTOBYNUMBER}
  2507. LPFN_GETPROTOBYNUMBER = function(const proto: Integer): PProtoEnt; stdcall;
  2508. {$EXTERNALSYM LPFN_GETPROTOBYNAME}
  2509. LPFN_GETPROTOBYNAME = function(const name: PIdAnsiChar): PProtoEnt; stdcall;
  2510. {$EXTERNALSYM LPFN_WSASETLASTERROR}
  2511. LPFN_WSASETLASTERROR = procedure(const iError: Integer); stdcall;
  2512. {$EXTERNALSYM LPFN_WSAGETLASTERROR}
  2513. LPFN_WSAGETLASTERROR = function: Integer; stdcall;
  2514. {$IFNDEF WINCE}
  2515. {$EXTERNALSYM LPFN_WSACANCELASYNCREQUEST}
  2516. LPFN_WSACANCELASYNCREQUEST = function(hAsyncTaskHandle: THandle): Integer; stdcall;
  2517. {$EXTERNALSYM LPFN_WSAISBLOCKING}
  2518. LPFN_WSAISBLOCKING = function: BOOL; stdcall;
  2519. {$EXTERNALSYM LPFN_WSAUNHOOKBLOCKINGHOOK}
  2520. LPFN_WSAUNHOOKBLOCKINGHOOK = function: Integer; stdcall;
  2521. {$EXTERNALSYM LPFN_WSASETBLOCKINGHOOK}
  2522. LPFN_WSASETBLOCKINGHOOK = function(lpBlockFunc: TFarProc): TFarProc; stdcall;
  2523. {$EXTERNALSYM LPFN_WSACANCELBLOCKINGCALL}
  2524. LPFN_WSACANCELBLOCKINGCALL = function: Integer; stdcall;
  2525. {$EXTERNALSYM LPFN_WSAASYNCGETSERVBYNAME}
  2526. LPFN_WSAASYNCGETSERVBYNAME = function(HWindow: HWND; wMsg: u_int; name, proto, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  2527. {$EXTERNALSYM LPFN_WSAASYNCGETSERVBYPORT}
  2528. LPFN_WSAASYNCGETSERVBYPORT = function(HWindow: HWND; wMsg, port: u_int; proto, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  2529. {$EXTERNALSYM LPFN_WSAASYNCGETPROTOBYNAME}
  2530. LPFN_WSAASYNCGETPROTOBYNAME = function(HWindow: HWND; wMsg: u_int; name, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  2531. {$EXTERNALSYM LPFN_WSAASYNCGETPROTOBYNUMBER}
  2532. LPFN_WSAASYNCGETPROTOBYNUMBER = function(HWindow: HWND; wMsg: u_int; number: Integer; buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  2533. {$EXTERNALSYM LPFN_WSAASYNCGETHOSTBYNAME}
  2534. LPFN_WSAASYNCGETHOSTBYNAME = function(HWindow: HWND; wMsg: u_int; name, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  2535. {$EXTERNALSYM LPFN_WSAASYNCGETHOSTBYADDR}
  2536. LPFN_WSAASYNCGETHOSTBYADDR = function(HWindow: HWND; wMsg: u_int; AAddr: PIdAnsiChar; len, istruct: Integer; buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  2537. {$EXTERNALSYM LPFN_WSAASYNCSELECT}
  2538. LPFN_WSAASYNCSELECT = function(const s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
  2539. {$ENDIF}
  2540. {$EXTERNALSYM LPFN___WSAFDISSET}
  2541. LPFN___WSAFDISSET = function(const s: TSocket; var FDSet: TFDSet): Bool; stdcall;
  2542. // WinSock 2 API new function prototypes
  2543. {$EXTERNALSYM LPFN_WSAACCEPT}
  2544. LPFN_WSAACCEPT = function(const s : TSocket; AAddr : PSOCKADDR; addrlen : PInteger; lpfnCondition : LPCONDITIONPROC; const dwCallbackData : DWORD): TSocket; stdcall;
  2545. {$EXTERNALSYM LPFN_WSAENUMPROTOCOLSA}
  2546. LPFN_WSAENUMPROTOCOLSA = function(lpiProtocols : PInteger; lpProtocolBuffer : LPWSAPROTOCOL_INFOA; var lpdwBufferLength : DWORD) : Integer; stdcall;
  2547. {$EXTERNALSYM LPFN_WSAENUMPROTOCOLSW}
  2548. LPFN_WSAENUMPROTOCOLSW = function(lpiProtocols : PInteger; lpProtocolBuffer : LPWSAPROTOCOL_INFOW; var lpdwBufferLength : DWORD) : Integer; stdcall;
  2549. {$EXTERNALSYM LPFN_WSAGETOVERLAPPEDRESULT}
  2550. LPFN_WSAGETOVERLAPPEDRESULT = function(const s : TSocket; AOverlapped: Pointer; lpcbTransfer : LPDWORD; fWait : BOOL; var lpdwFlags : DWORD) : WordBool; stdcall;
  2551. {$EXTERNALSYM LPFN_WSAIOCTL}
  2552. LPFN_WSAIOCTL = function(const s : TSocket; dwIoControlCode : DWORD; lpvInBuffer : Pointer; cbInBuffer : DWORD; lpvOutBuffer : Pointer; cbOutBuffer : DWORD;
  2553. lpcbBytesReturned : LPDWORD; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
  2554. {$EXTERNALSYM LPFN_WSARECVFROM}
  2555. LPFN_WSARECVFROM = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD;
  2556. lpFrom : PSOCKADDR; lpFromlen : PInteger; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  2557. {$EXTERNALSYM LPFN_TRANSMITFILE}
  2558. LPFN_TRANSMITFILE = function(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite, nNumberOfBytesPerSend: DWORD;
  2559. lpOverlapped: POverlapped; lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
  2560. {$EXTERNALSYM LPFN_ACCEPTEX}
  2561. LPFN_ACCEPTEX = function(sListenSocket, sAcceptSocket: TSocket;
  2562. lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
  2563. dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
  2564. lpOverlapped: POverlapped): BOOL; stdcall;
  2565. {$IFNDEF WINCE}
  2566. {$EXTERNALSYM LPFN_WSACONNECTBYLIST}
  2567. LPFN_WSACONNECTBYLIST = function(const s : TSocket; SocketAddressList : PSOCKET_ADDRESS_LIST;
  2568. var LocalAddressLength : DWORD; LocalAddress : LPSOCKADDR;
  2569. var RemoteAddressLength : DWORD; RemoteAddress : LPSOCKADDR;
  2570. timeout : Ptimeval; Reserved : LPWSAOVERLAPPED):LongBool; stdcall;
  2571. {$EXTERNALSYM LPFN_WSACONNECTBYNAMEA}
  2572. LPFN_WSACONNECTBYNAMEA = function(const s : TSOCKET;
  2573. nodename : PIdAnsiChar; servicename : PIdAnsiChar;
  2574. var LocalAddressLength : DWORD; LocalAddress : LPSOCKADDR;
  2575. var RemoteAddressLength : DWORD; RemoteAddress : LPSOCKADDR;
  2576. timeout : Ptimeval; Reserved : LPWSAOVERLAPPED) : Integer; stdcall;
  2577. {$EXTERNALSYM LPFN_WSACONNECTBYNAMEW}
  2578. LPFN_WSACONNECTBYNAMEW = function(const s : TSOCKET;
  2579. nodename : PWChar; servicename : PWChar;
  2580. var LocalAddressLength : DWORD; LocalAddress : LPSOCKADDR;
  2581. var RemoteAddressLength : DWORD; RemoteAddress : LPSOCKADDR;
  2582. timeout : Ptimeval; Reserved : LPWSAOVERLAPPED) : Integer; stdcall;
  2583. {$EXTERNALSYM LPFN_WSACONNECTBYNAME}
  2584. {$IFDEF UNICODE}
  2585. LPFN_WSACONNECTBYNAME = LPFN_WSACONNECTBYNAMEW;
  2586. {$ELSE}
  2587. LPFN_WSACONNECTBYNAME = LPFN_WSACONNECTBYNAMEA;
  2588. {$ENDIF}
  2589. {$ENDIF}
  2590. {$EXTERNALSYM LPFN_WSAENUMPROTOCOLS}
  2591. {wince}
  2592. {$IFDEF UNICODE}
  2593. LPFN_WSAENUMPROTOCOLS = LPFN_WSAENUMPROTOCOLSW;
  2594. {$ELSE}
  2595. LPFN_WSAENUMPROTOCOLS = LPFN_WSAENUMPROTOCOLSA;
  2596. {$ENDIF}
  2597. {$EXTERNALSYM LPFN_WSACLOSEEVENT}
  2598. LPFN_WSACLOSEEVENT = function(const hEvent : WSAEVENT) : WordBool; stdcall;
  2599. {$EXTERNALSYM LPFN_WSACONNECT}
  2600. LPFN_WSACONNECT = function(const s : TSocket; const name : PSOCKADDR; const namelen : Integer; lpCallerData, lpCalleeData : LPWSABUF; lpSQOS, lpGQOS : LPQOS) : Integer; stdcall;
  2601. {$EXTERNALSYM LPFN_WSACREATEEVENT}
  2602. LPFN_WSACREATEEVENT = function: WSAEVENT; stdcall;
  2603. {$IFNDEF WINCE}
  2604. {$EXTERNALSYM LPFN_WSADUPLICATESOCKETA}
  2605. LPFN_WSADUPLICATESOCKETA = function(const s : TSocket; const dwProcessId : DWORD; lpProtocolInfo : LPWSAPROTOCOL_INFOA) : Integer; stdcall;
  2606. {$EXTERNALSYM LPFN_WSADUPLICATESOCKETW}
  2607. LPFN_WSADUPLICATESOCKETW = function(const s : TSocket; const dwProcessId : DWORD; lpProtocolInfo : LPWSAPROTOCOL_INFOW) : Integer; stdcall;
  2608. {$EXTERNALSYM LPFN_WSADUPLICATESOCKET}
  2609. {$IFDEF UNICODE}
  2610. LPFN_WSADUPLICATESOCKET = LPFN_WSADUPLICATESOCKETW;
  2611. {$ELSE}
  2612. LPFN_WSADUPLICATESOCKET = LPFN_WSADUPLICATESOCKETA;
  2613. {$ENDIF}
  2614. {$ENDIF}
  2615. {$EXTERNALSYM LPFN_WSAENUMNETWORKEVENTS}
  2616. LPFN_WSAENUMNETWORKEVENTS = function(const s : TSocket; const hEventObject : WSAEVENT; lpNetworkEvents : LPWSANETWORKEVENTS) :Integer; stdcall;
  2617. {$EXTERNALSYM LPFN_WSAEVENTSELECT}
  2618. LPFN_WSAEVENTSELECT = function(const s : TSocket; const hEventObject : WSAEVENT; lNetworkEvents : LongInt): Integer; stdcall;
  2619. {$EXTERNALSYM LPFN_WSAGETQOSBYNAME}
  2620. LPFN_WSAGETQOSBYNAME = function(const s : TSocket; lpQOSName : LPWSABUF; lpQOS : LPQOS): WordBool; stdcall;
  2621. {$EXTERNALSYM LPFN_WSAHTONL}
  2622. LPFN_WSAHTONL = function(const s : TSocket; hostlong : u_long; var lpnetlong : DWORD): Integer; stdcall;
  2623. {$EXTERNALSYM LPFN_WSAHTONS}
  2624. LPFN_WSAHTONS = function(const s : TSocket; hostshort : u_short; var lpnetshort : WORD): Integer; stdcall;
  2625. {$EXTERNALSYM LPFN_WSAJOINLEAF}
  2626. LPFN_WSAJOINLEAF = function(const s : TSocket; name : PSOCKADDR; namelen : Integer; lpCallerData, lpCalleeData : LPWSABUF;
  2627. lpSQOS,lpGQOS : LPQOS; dwFlags : DWORD) : TSocket; stdcall;
  2628. {$EXTERNALSYM LPFN_WSANTOHL}
  2629. LPFN_WSANTOHL = function(const s : TSocket; netlong : u_long; var lphostlong : DWORD): Integer; stdcall;
  2630. {$EXTERNALSYM LPFN_WSANTOHS}
  2631. LPFN_WSANTOHS = function(const s : TSocket; netshort : u_short; var lphostshort : WORD): Integer; stdcall;
  2632. {$EXTERNALSYM LPFN_WSARECV}
  2633. LPFN_WSARECV = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD;
  2634. lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  2635. {$EXTERNALSYM LPFN_WSARECVDISCONNECT}
  2636. LPFN_WSARECVDISCONNECT = function(const s : TSocket; lpInboundDisconnectData : LPWSABUF): Integer; stdcall;
  2637. {$EXTERNALSYM LPFN_WSARESETEVENT}
  2638. LPFN_WSARESETEVENT = function(hEvent : WSAEVENT): WordBool; stdcall;
  2639. {$EXTERNALSYM LPFN_WSASEND}
  2640. LPFN_WSASEND = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD;
  2641. lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  2642. {$EXTERNALSYM LPFN_WSASENDDISCONNECT}
  2643. LPFN_WSASENDDISCONNECT = function(const s : TSocket; lpOutboundDisconnectData : LPWSABUF): Integer; stdcall;
  2644. {$EXTERNALSYM LPFN_WSASENDTO}
  2645. LPFN_WSASENDTO = function(const s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD;
  2646. lpTo : LPSOCKADDR; iTolen : Integer; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  2647. {$EXTERNALSYM LPFN_WSASETEVENT}
  2648. LPFN_WSASETEVENT = function(hEvent : WSAEVENT): WordBool; stdcall;
  2649. {$EXTERNALSYM LPFN_WSASOCKETA}
  2650. LPFN_WSASOCKETA = function(af, iType, protocol : Integer; lpProtocolInfo : LPWSAPROTOCOL_INFOA; g : GROUP; dwFlags : DWORD): TSocket; stdcall;
  2651. {$EXTERNALSYM LPFN_WSASOCKETW}
  2652. LPFN_WSASOCKETW = function(af, iType, protocol : Integer; lpProtocolInfo : LPWSAPROTOCOL_INFOW; g : GROUP; dwFlags : DWORD): TSocket; stdcall;
  2653. {$EXTERNALSYM LPFN_WSASOCKET}
  2654. {$IFDEF UNICODE}
  2655. LPFN_WSASOCKET = LPFN_WSASOCKETW;
  2656. {$ELSE}
  2657. LPFN_WSASOCKET = LPFN_WSASOCKETA;
  2658. {$ENDIF}
  2659. {$EXTERNALSYM LPFN_WSAWAITFORMULTIPLEEVENTS}
  2660. LPFN_WSAWAITFORMULTIPLEEVENTS = function(cEvents : DWORD; lphEvents : PWSAEVENT; fWaitAll : LongBool;
  2661. dwTimeout : DWORD; fAlertable : LongBool): DWORD; stdcall;
  2662. {$EXTERNALSYM LPFN_WSAADDRESSTOSTRINGA}
  2663. LPFN_WSAADDRESSTOSTRINGA = function(lpsaAddress : PSOCKADDR; const dwAddressLength : DWORD; const lpProtocolInfo : LPWSAPROTOCOL_INFOA;
  2664. const lpszAddressString : PIdAnsiChar; var lpdwAddressStringLength : DWORD): Integer; stdcall;
  2665. {$EXTERNALSYM LPFN_WSAADDRESSTOSTRINGW}
  2666. LPFN_WSAADDRESSTOSTRINGW = function(lpsaAddress : PSOCKADDR; const dwAddressLength : DWORD; const lpProtocolInfo : LPWSAPROTOCOL_INFOW;
  2667. const lpszAddressString : PWideChar; var lpdwAddressStringLength : DWORD): Integer; stdcall;
  2668. {$EXTERNALSYM LPFN_WSAADDRESSTOSTRING}
  2669. {$IFDEF UNICODE}
  2670. LPFN_WSAADDRESSTOSTRING = LPFN_WSAADDRESSTOSTRINGW;
  2671. {$ELSE}
  2672. LPFN_WSAADDRESSTOSTRING = LPFN_WSAADDRESSTOSTRINGA;
  2673. {$ENDIF}
  2674. {$EXTERNALSYM LPFN_WSASTRINGTOADDRESSA}
  2675. LPFN_WSASTRINGTOADDRESSA = function(const AddressString : PIdAnsiChar; const AddressFamily: Integer; const lpProtocolInfo : LPWSAPROTOCOL_INFOA;
  2676. var lpAddress : TSockAddr; var lpAddressLength : Integer): Integer; stdcall;
  2677. {$EXTERNALSYM LPFN_WSASTRINGTOADDRESSW}
  2678. LPFN_WSASTRINGTOADDRESSW = function(const AddressString : PWideChar; const AddressFamily: Integer; const lpProtocolInfo : LPWSAPROTOCOL_INFOW;
  2679. var lpAddress : TSockAddr; var lpAddressLength : Integer): Integer; stdcall;
  2680. {$EXTERNALSYM LPFN_WSASTRINGTOADDRESS}
  2681. {$IFDEF UNICODE}
  2682. LPFN_WSASTRINGTOADDRESS = LPFN_WSASTRINGTOADDRESSW;
  2683. {$ELSE}
  2684. LPFN_WSASTRINGTOADDRESS = LPFN_WSASTRINGTOADDRESSA;
  2685. {$ENDIF}
  2686. // Registration and Name Resolution API functions
  2687. {$EXTERNALSYM LPFN_WSALOOKUPSERVICEBEGINA}
  2688. LPFN_WSALOOKUPSERVICEBEGINA = function(var qsRestrictions : TWSAQuerySetA; const dwControlFlags : DWORD; var hLookup : THandle): Integer; stdcall;
  2689. {$EXTERNALSYM LPFN_WSALOOKUPSERVICEBEGINw}
  2690. LPFN_WSALOOKUPSERVICEBEGINW = function(var qsRestrictions : TWSAQuerySetW; const dwControlFlags : DWORD; var hLookup : THandle): Integer; stdcall;
  2691. {$EXTERNALSYM LPFN_WSALOOKUPSERVICEBEGIN}
  2692. {$IFDEF UNICODE}
  2693. LPFN_WSALOOKUPSERVICEBEGIN = LPFN_WSALOOKUPSERVICEBEGINW;
  2694. {$ELSE}
  2695. LPFN_WSALOOKUPSERVICEBEGIN = LPFN_WSALOOKUPSERVICEBEGINA;
  2696. {$ENDIF}
  2697. {$EXTERNALSYM LPFN_WSALOOKUPSERVICENEXTA}
  2698. LPFN_WSALOOKUPSERVICENEXTA = function(const hLookup : THandle; const dwControlFlags : DWORD; var dwBufferLength : DWORD; lpqsResults : PWSAQUERYSETA): Integer; stdcall;
  2699. {$EXTERNALSYM LPFN_WSALOOKUPSERVICENEXTW}
  2700. LPFN_WSALOOKUPSERVICENEXTW = function(const hLookup : THandle; const dwControlFlags : DWORD; var dwBufferLength : DWORD; lpqsResults : PWSAQUERYSETW): Integer; stdcall;
  2701. {$EXTERNALSYM LPFN_WSALOOKUPSERVICENEXT}
  2702. {$IFDEF UNICODE}
  2703. LPFN_WSALOOKUPSERVICENEXT = LPFN_WSALOOKUPSERVICENEXTW;
  2704. {$ELSE}
  2705. LPFN_WSALOOKUPSERVICENEXT = LPFN_WSALOOKUPSERVICENEXTA;
  2706. {$ENDIF}
  2707. //WinCE 4.20 doesn't support WSANSPIoctl but later versions do.
  2708. {$EXTERNALSYM LPFN_WSANSPIOCTL}
  2709. LPFN_WSANSPIOCTL = function(const hLookup : THANDLE; const dwControlCode : DWORD; lpvInBuffer : Pointer; var cbInBuffer : DWORD; lpvOutBuffer : Pointer; var cbOutBuffer : DWORD; var lpcbBytesReturned : DWORD; lpCompletion : LPWSACOMPLETION) : Integer; stdcall;
  2710. {$EXTERNALSYM LPFN_WSALOOKUPSERVICEEND}
  2711. LPFN_WSALOOKUPSERVICEEND = function(const hLookup : THandle): Integer; stdcall;
  2712. {$EXTERNALSYM LPFN_WSAINSTALLSERVICECLASSA}
  2713. LPFN_WSAINSTALLSERVICECLASSA = function(const lpServiceClassInfo : LPWSASERVICECLASSINFOA) : Integer; stdcall;
  2714. {$EXTERNALSYM LPFN_WSAINSTALLSERVICECLASSW}
  2715. LPFN_WSAINSTALLSERVICECLASSW = function(const lpServiceClassInfo : LPWSASERVICECLASSINFOW) : Integer; stdcall;
  2716. {$EXTERNALSYM LPFN_WSAINSTALLSERVICECLASS}
  2717. {$IFDEF UNICODE}
  2718. LPFN_WSAINSTALLSERVICECLASS = LPFN_WSAINSTALLSERVICECLASSW;
  2719. {$ELSE}
  2720. LPFN_WSAINSTALLSERVICECLASS = LPFN_WSAINSTALLSERVICECLASSA;
  2721. {$ENDIF}
  2722. {$EXTERNALSYM LPFN_WSAREMOVESERVICECLASS}
  2723. LPFN_WSAREMOVESERVICECLASS = function(const lpServiceClassId : LPGUID) : Integer; stdcall;
  2724. {$EXTERNALSYM LPFN_WSAGETSERVICECLASSINFOA}
  2725. LPFN_WSAGETSERVICECLASSINFOA = function(const lpProviderId : LPGUID; const lpServiceClassId : LPGUID; var lpdwBufSize : DWORD;
  2726. lpServiceClassInfo : LPWSASERVICECLASSINFOA): Integer; stdcall;
  2727. {$EXTERNALSYM LPFN_WSAGETSERVICECLASSINFOW}
  2728. LPFN_WSAGETSERVICECLASSINFOW = function(const lpProviderId : LPGUID; const lpServiceClassId : LPGUID; var lpdwBufSize : DWORD;
  2729. lpServiceClassInfo : LPWSASERVICECLASSINFOW): Integer; stdcall;
  2730. {$EXTERNALSYM LPFN_WSAGETSERVICECLASSINFO}
  2731. {$IFDEF UNICODE}
  2732. LPFN_WSAGETSERVICECLASSINFO = LPFN_WSAGETSERVICECLASSINFOW;
  2733. {$ELSE}
  2734. LPFN_WSAGETSERVICECLASSINFO = LPFN_WSAGETSERVICECLASSINFOA;
  2735. {$ENDIF}
  2736. {$ENDIF}
  2737. {$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSA}
  2738. LPFN_WSAENUMNAMESPACEPROVIDERSA = function(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOA): Integer; stdcall;
  2739. {$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERSW}
  2740. LPFN_WSAENUMNAMESPACEPROVIDERSW = function(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOW): Integer; stdcall;
  2741. {$EXTERNALSYM LPFN_WSAENUMNAMESPACEPROVIDERS}
  2742. {$IFDEF UNICODE}
  2743. LPFN_WSAENUMNAMESPACEPROVIDERS = LPFN_WSAENUMNAMESPACEPROVIDERSW;
  2744. {$ELSE}
  2745. LPFN_WSAENUMNAMESPACEPROVIDERS = LPFN_WSAENUMNAMESPACEPROVIDERSA;
  2746. {$ENDIF}
  2747. {$EXTERNALSYM LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA}
  2748. LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA = function(const lpServiceClassId: LPGUID; lpszServiceClassName: PIdAnsiChar; var lpdwBufferLength: DWORD): Integer; stdcall;
  2749. {$EXTERNALSYM LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW}
  2750. LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW = function(const lpServiceClassId: LPGUID; lpszServiceClassName: PWideChar; var lpdwBufferLength: DWORD): Integer; stdcall;
  2751. {$EXTERNALSYM LPFN_WSAGETSERVICECLASSNAMEBYCLASSID}
  2752. {$IFDEF UNICODE}
  2753. LPFN_WSAGETSERVICECLASSNAMEBYCLASSID = LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW;
  2754. {$ELSE}
  2755. LPFN_WSAGETSERVICECLASSNAMEBYCLASSID = LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA;
  2756. {$ENDIF}
  2757. {$EXTERNALSYM LPFN_WSASETSERVICEA}
  2758. LPFN_WSASETSERVICEA = function(const lpqsRegInfo: LPWSAQUERYSETA; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
  2759. {$EXTERNALSYM LPFN_WSASETSERVICEW}
  2760. LPFN_WSASETSERVICEW = function(const lpqsRegInfo: LPWSAQUERYSETW; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
  2761. {$EXTERNALSYM LPFN_WSASETSERVICE}
  2762. {$IFDEF UNICODE}
  2763. LPFN_WSASETSERVICE = LPFN_WSASETSERVICEW;
  2764. {$ELSE}
  2765. LPFN_WSASETSERVICE = LPFN_WSASETSERVICEA;
  2766. {$ENDIF}
  2767. {$EXTERNALSYM LPFN_WSAPROVIDERCONFIGCHANGE}
  2768. LPFN_WSAPROVIDERCONFIGCHANGE = function(var lpNotificationHandle : THandle; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
  2769. //microsoft specific extension
  2770. {$EXTERNALSYM LPFN_GETACCEPTEXSOCKADDRS}
  2771. LPFN_GETACCEPTEXSOCKADDRS = procedure(lpOutputBuffer: Pointer;
  2772. dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
  2773. var LocalSockaddr: TSockAddr; var LocalSockaddrLength: Integer;
  2774. var RemoteSockaddr: TSockAddr; var RemoteSockaddrLength: Integer); stdcall;
  2775. {$IFNDEF WINCE}
  2776. //This is defined in the Windows Mobile 6 Standard SDK Refresh
  2777. //but I'm not sure what .DLL the function is in. I also couldn't find a WSAID
  2778. //constant for it.
  2779. {$EXTERNALSYM LPFN_WSARECVEX}
  2780. LPFN_WSARECVEX = function(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
  2781. {$ENDIF}
  2782. //Windows Server 2003, Windows Vista
  2783. {$EXTERNALSYM LPFN_CONNECTEX}
  2784. LPFN_CONNECTEX = function(const s : TSocket; const name: PSOCKADDR; const namelen: Integer; lpSendBuffer : Pointer; dwSendDataLength : DWORD; var lpdwBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED) : BOOL; stdcall;
  2785. {$EXTERNALSYM LPFN_DISCONNECTEX}
  2786. LPFN_DISCONNECTEX = function(const hSocket : TSocket; AOverlapped: Pointer; const dwFlags : DWORD; const dwReserved : DWORD) : BOOL; stdcall;
  2787. {$EXTERNALSYM LPFN_WSARECVMSG} //XP and Server 2003 only
  2788. LPFN_WSARECVMSG = function(const s : TSocket; lpMsg : LPWSAMSG; var lpNumberOfBytesRecvd : DWORD; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  2789. {$EXTERNALSYM LPFN_TRANSMITPACKETS}
  2790. LPFN_TRANSMITPACKETS = function(s: TSocket; lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT; nElementCount: DWORD; nSendSize: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD): BOOL; stdcall;
  2791. //Windows Vista, Windows Server 2008
  2792. {$IFNDEF WINCE}
  2793. {$EXTERNALSYM LPFN_WSASENDMSG}
  2794. LPFN_WSASENDMSG = function(const s : TSocket; lpMsg : LPWSAMSG; const dwFlags : DWORD; var lpNumberOfBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
  2795. {$EXTERNALSYM LPFN_WSAPOLL}
  2796. LPFN_WSAPOLL = function(fdarray : LPWSAPOLLFD; const nfds : u_long; const timeout : Integer) : Integer; stdcall;
  2797. {$EXTERNALSYM LPFN_RIORECEIVE}
  2798. LPFN_RIORECEIVE = function (SocketQueue : RIO_RQ;
  2799. pData : PRIO_BUF;
  2800. const DataBufferCount : ULONG;
  2801. Flags : DWORD;
  2802. RequestContext : PVOID) : BOOL stdcall;
  2803. {$EXTERNALSYM LPFN_RIORECEIVEEX}
  2804. LPFN_RIORECEIVEEX = function (SocketQueu : RIO_RQ;
  2805. pData : PRIO_BUF;
  2806. const DataBufferCount : ULONG;
  2807. pLocalAddress, pRemoteAddress, pControlContext, pFlags : PRIO_BUF;
  2808. const Flags : DWORD; RequestContext : PVOID) : Integer stdcall;
  2809. {$EXTERNALSYM LPFN_RIOSEND}
  2810. LPFN_RIOSEND = function(SocketQueue : RIO_RQ;
  2811. pData : PRIO_BUF;
  2812. const DataBufferCount : ULONG;
  2813. const Flags : DWORD;
  2814. const RequestContext : PVOID) : Boolean stdcall;
  2815. {$EXTERNALSYM LPFN_RIOSENDEX}
  2816. LPFN_RIOSENDEX = function (SocketQueue : RIO_RQ;
  2817. pData : PRIO_BUF;
  2818. const DataBufferCount : ULONG;
  2819. pLocalAddress, pRemoteAddress, pControlContext, pFlags : PRIO_BUF;
  2820. const Flags : DWORD;
  2821. RequestContext : PVOID) : Boolean stdcall;
  2822. {$EXTERNALSYM LPFN_RIOCREATECOMPLETIONQUEUE}
  2823. LPFN_RIOCREATECOMPLETIONQUEUE = function (const QueueSize : DWORD;
  2824. NotificationCompletion : PRIO_NOTIFICATION_COMPLETION) : RIO_CQ stdcall;
  2825. {$EXTERNALSYM LPFN_RIOCREATEREQUESTQUEUE}
  2826. LPFN_RIOCREATEREQUESTQUEUE = function (const Socket : TSOCKET;
  2827. const MaxOutstandingReceive, MaxReceiveDataBuffers, MaxOutstandingSend, MaxSendDataBuffers : ULONG;
  2828. const ReceiveCQ, SendCQ : RIO_CQ; SocketContext : PVOID) : RIO_RQ stdcall;
  2829. {$EXTERNALSYM LPFN_RIODEQUEUECOMPLETION}
  2830. LPFN_RIODEQUEUECOMPLETION = function (const CQ : RIO_CQ; _Array : PRIORESULT; const ArraySize : ULONG) : ULONG stdcall;
  2831. {$EXTERNALSYM LPFN_RIODEREGISTERBUFFER}
  2832. LPFN_RIODEREGISTERBUFFER = procedure (const BufferId : RIO_BUFFERID) stdcall;
  2833. {$EXTERNALSYM LPFN_RIONOTIFY}
  2834. LPFN_RIONOTIFY = function (CQ : RIO_CQ) : Integer stdcall;
  2835. {$EXTERNALSYM LPFN_RIOREGISTERBUFFER}
  2836. LPFN_RIOREGISTERBUFFER = function (DataBuffer : PIdAnsiChar; const DataLength : DWORD) : BOOL stdcall;
  2837. {$EXTERNALSYM LPFN_RIORESIZECOMPLETIONQUEUE}
  2838. LPFN_RIORESIZECOMPLETIONQUEUE = function(const CQ : RIO_CQ; const QueueSize : DWORD) : BOOL stdcall;
  2839. {$EXTERNALSYM LPFN_RIORESIZEREQUESTQUEUE}
  2840. LPFN_RIORESIZEREQUESTQUEUE = function(const RQ : RIO_RQ; const MaxOutstandingReceive, MaxOutstandingSend : DWORD) : BOOL stdcall;
  2841. {$EXTERNALSYM LPFN_RIOCLOSECOMPLETIONQUEUE}
  2842. LPFN_RIOCLOSECOMPLETIONQUEUE = procedure (const CQ : RIO_CQ) stdcall;
  2843. {$EXTERNALSYM _RIO_EXTENSION_FUNCTION_TABLE}
  2844. _RIO_EXTENSION_FUNCTION_TABLE = record
  2845. cbSize : DWORD;
  2846. RIOReceive : LPFN_RIORECEIVE;
  2847. RIOReceiveEx : LPFN_RIORECEIVEEX;
  2848. RIOSend : LPFN_RIOSEND;
  2849. RIOSendEx : LPFN_RIOSENDEX;
  2850. RIOCloseCompletionQueue : LPFN_RIOCLOSECOMPLETIONQUEUE;
  2851. RIOCreateCompletionQueue : LPFN_RIOCREATECOMPLETIONQUEUE;
  2852. RIOCreateRequestQueue : LPFN_RIOCREATEREQUESTQUEUE;
  2853. RIODequeueCompletion : LPFN_RIODEQUEUECOMPLETION;
  2854. RIODeregisterBuffer : LPFN_RIODEREGISTERBUFFER;
  2855. RIONotify : LPFN_RIONOTIFY;
  2856. RIORegisterBuffer : LPFN_RIOREGISTERBUFFER;
  2857. RIOResizeCompletionQueue : LPFN_RIORESIZECOMPLETIONQUEUE;
  2858. RIOResizeRequestQueue : LPFN_RIORESIZEREQUESTQUEUE;
  2859. end;
  2860. {$EXTERNALSYM RIO_EXTENSION_FUNCTION_TABLE}
  2861. RIO_EXTENSION_FUNCTION_TABLE = _RIO_EXTENSION_FUNCTION_TABLE;
  2862. {$EXTERNALSYM PRIO_EXTENSION_FUNCTION_TABLE}
  2863. PRIO_EXTENSION_FUNCTION_TABLE = ^RIO_EXTENSION_FUNCTION_TABLE;
  2864. {$ENDIF} // $IFDEF INCL_WINSOCK_API_TYPEDEFS
  2865. const
  2866. //GUID's for Microsoft extensions
  2867. {$EXTERNALSYM WSAID_ACCEPTEX}
  2868. WSAID_ACCEPTEX: TGuid = (D1:$b5367df1;D2:$cbac;D3:$11cf;D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
  2869. {$EXTERNALSYM WSAID_CONNECTEX}
  2870. WSAID_CONNECTEX: TGuid = (D1:$25a207b9;D2:$ddf3;D3:$4660;D4:($8e,$e9,$76,$e5,$8c,$74,$06,$3e));
  2871. {$EXTERNALSYM WSAID_DISCONNECTEX}
  2872. WSAID_DISCONNECTEX: TGuid = (D1:$7fda2e11;D2:$8630;D3:$436f;D4:($a0,$31,$f5,$36,$a6,$ee,$c1,$57));
  2873. {$EXTERNALSYM WSAID_GETACCEPTEXSOCKADDRS}
  2874. WSAID_GETACCEPTEXSOCKADDRS: TGuid = (D1:$b5367df2;D2:$cbac;D3:$11cf;D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
  2875. {$EXTERNALSYM WSAID_TRANSMITFILE}
  2876. WSAID_TRANSMITFILE: TGuid = (D1:$b5367df0; D2:$cbac; D3:$11cf; D4:($95, $ca, $00, $80, $5f, $48, $a1, $92));
  2877. {$EXTERNALSYM WSAID_TRANSMITPACKETS}
  2878. WSAID_TRANSMITPACKETS: TGuid = (D1:$d9689da0;D2:$1f90;D3:$11d3;D4:($99,$71,$00,$c0,$4f,$68,$c8,$76));
  2879. {$IFNDEF WINCE}
  2880. {$EXTERNALSYM WSAID_WSAPOLL}
  2881. WSAID_WSAPOLL: TGuid = (D1:$18C76F85;D2:$DC66;D3:$4964;D4:($97,$2E,$23,$C2,$72,$38,$31,$2B));
  2882. {$ENDIF}
  2883. {$EXTERNALSYM WSAID_WSARECVMSG}
  2884. WSAID_WSARECVMSG: TGuid = (D1:$f689d7c8;D2:$6f1f;D3:$436b;D4:($8a,$53,$e5,$4f,$e3,$51,$c3,$22));
  2885. {$IFNDEF WINCE}
  2886. {$EXTERNALSYM WSAID_WSASENDMSG}
  2887. WSAID_WSASENDMSG : TGuid = (D1:$a441e712;D2:$754f;D3:$43ca;D4:($84,$a7,$0d,$ee,$44,$cf,$60,$6d));
  2888. {$EXTERNALSYM WSAID_MULTIPLE_RIO}
  2889. WSAID_MULTIPLE_RIO : TGuid = (D1:$8509e081;D2:$96dd;D3:$4005;D4:($b1,$65,$9e,$2e,$e8,$c7,$9e,$3f));
  2890. {$ENDIF}
  2891. {$IFDEF WS2_DLL_FUNC_VARS}
  2892. var
  2893. {$EXTERNALSYM WSAStartup}
  2894. WSAStartup : LPFN_WSASTARTUP = nil;
  2895. {$EXTERNALSYM WSACleanup}
  2896. WSACleanup : LPFN_WSACLEANUP = nil;
  2897. {$EXTERNALSYM accept}
  2898. accept : LPFN_ACCEPT = nil;
  2899. {$EXTERNALSYM bind}
  2900. bind : LPFN_BIND = nil;
  2901. {$EXTERNALSYM closesocket}
  2902. closesocket : LPFN_CLOSESOCKET = nil;
  2903. {$EXTERNALSYM connect}
  2904. connect : LPFN_CONNECT = nil;
  2905. {$EXTERNALSYM ioctlsocket}
  2906. ioctlsocket : LPFN_IOCTLSOCKET = nil;
  2907. {$EXTERNALSYM getpeername}
  2908. getpeername : LPFN_GETPEERNAME = nil;
  2909. {$EXTERNALSYM getsockname}
  2910. getsockname : LPFN_GETSOCKNAME = nil;
  2911. {$EXTERNALSYM getsockopt}
  2912. getsockopt : LPFN_GETSOCKOPT = nil;
  2913. {$EXTERNALSYM htonl}
  2914. htonl : LPFN_HTONL = nil;
  2915. {$EXTERNALSYM htons}
  2916. htons : LPFN_HTONS = nil;
  2917. {$EXTERNALSYM inet_addr}
  2918. inet_addr : LPFN_INET_ADDR = nil;
  2919. {$EXTERNALSYM inet_ntoa}
  2920. inet_ntoa : LPFN_INET_NTOA = nil;
  2921. {$EXTERNALSYM listen}
  2922. listen : LPFN_LISTEN = nil;
  2923. {$EXTERNALSYM ntohl}
  2924. ntohl : LPFN_NTOHL = nil;
  2925. {$EXTERNALSYM ntohs}
  2926. ntohs : LPFN_NTOHS = nil;
  2927. {$EXTERNALSYM recv}
  2928. recv : LPFN_RECV = nil;
  2929. {$EXTERNALSYM recvfrom}
  2930. recvfrom : LPFN_RECVFROM = nil;
  2931. {$EXTERNALSYM select}
  2932. select : LPFN_SELECT = nil;
  2933. {$EXTERNALSYM send}
  2934. send : LPFN_SEND = nil;
  2935. {$EXTERNALSYM sendto}
  2936. sendto : LPFN_SENDTO = nil;
  2937. {$EXTERNALSYM setsockopt}
  2938. setsockopt : LPFN_SETSOCKOPT = nil;
  2939. {$EXTERNALSYM shutdown}
  2940. shutdown : LPFN_SHUTDOWN = nil;
  2941. {$EXTERNALSYM socket}
  2942. socket : LPFN_SOCKET = nil;
  2943. {$EXTERNALSYM gethostbyaddr}
  2944. gethostbyaddr : LPFN_GETHOSTBYADDR = nil;
  2945. {$EXTERNALSYM gethostbyname}
  2946. gethostbyname : LPFN_GETHOSTBYNAME = nil;
  2947. {$EXTERNALSYM gethostname}
  2948. gethostname : LPFN_GETHOSTNAME = nil;
  2949. {$IFDEF WINCE}
  2950. {$EXTERNALSYM sethostname}
  2951. sethostname : LPFN_SETHOSTNAME = nil;
  2952. {$ENDIF}
  2953. {$EXTERNALSYM getservbyport}
  2954. getservbyport : LPFN_GETSERVBYPORT = nil;
  2955. {$EXTERNALSYM getservbyname}
  2956. getservbyname : LPFN_GETSERVBYNAME = nil;
  2957. {$EXTERNALSYM getprotobynumber}
  2958. getprotobynumber : LPFN_GETPROTOBYNUMBER = nil;
  2959. {$EXTERNALSYM getprotobyname}
  2960. getprotobyname : LPFN_GETPROTOBYNAME = nil;
  2961. {$EXTERNALSYM WSASetLastError}
  2962. WSASetLastError : LPFN_WSASETLASTERROR = nil;
  2963. {$EXTERNALSYM WSAGetLastError}
  2964. WSAGetLastError : LPFN_WSAGETLASTERROR = nil;
  2965. {$IFNDEF WINCE}
  2966. {$EXTERNALSYM WSAIsblocking}
  2967. WSAIsBlocking : LPFN_WSAISBLOCKING = nil;
  2968. {$EXTERNALSYM WSAUnhookBlockingHook}
  2969. WSAUnhookBlockingHook : LPFN_WSAUNHOOKBLOCKINGHOOK = nil;
  2970. {$EXTERNALSYM WSASetBlockingHook}
  2971. WSASetBlockingHook : LPFN_WSASETBLOCKINGHOOK = nil;
  2972. {$EXTERNALSYM WSACancelBlockingCall}
  2973. WSACancelBlockingCall : LPFN_WSACANCELBLOCKINGCALL = nil;
  2974. {$EXTERNALSYM WSAAsyncGetServByName}
  2975. WSAAsyncGetServByName : LPFN_WSAASYNCGETSERVBYNAME = nil;
  2976. {$EXTERNALSYM WSAAsyncGetServByPort}
  2977. WSAAsyncGetServByPort : LPFN_WSAASYNCGETSERVBYPORT = nil;
  2978. {$EXTERNALSYM WSAAsyncGetProtoByName}
  2979. WSAAsyncGetProtoByName : LPFN_WSAASYNCGETPROTOBYNAME = nil;
  2980. {$EXTERNALSYM WSAAsyncGetProtoByNumber}
  2981. WSAAsyncGetProtoByNumber : LPFN_WSAASYNCGETPROTOBYNUMBER = nil;
  2982. {$EXTERNALSYM WSAAsyncGetHostByName}
  2983. WSAAsyncGetHostByName : LPFN_WSAASYNCGETHOSTBYNAME = nil;
  2984. {$EXTERNALSYM WSAAsyncGetHostByAddr}
  2985. WSAAsyncGetHostByAddr : LPFN_WSAASYNCGETHOSTBYADDR = nil;
  2986. {$EXTERNALSYM WSACancelAsyncRequest}
  2987. WSACancelAsyncRequest : LPFN_WSACANCELASYNCREQUEST = nil;
  2988. {$EXTERNALSYM WSAAsyncSelect}
  2989. WSAAsyncSelect : LPFN_WSAASYNCSELECT = nil;
  2990. {$ENDIF}
  2991. {$EXTERNALSYM __WSAFDIsSet}
  2992. __WSAFDIsSet : LPFN___WSAFDISSET = nil;
  2993. {$EXTERNALSYM WSAAccept}
  2994. WSAAccept : LPFN_WSAACCEPT = nil;
  2995. {$EXTERNALSYM WSAAddressToStringA}
  2996. WSAAddressToStringA : LPFN_WSAADDRESSTOSTRINGA = nil;
  2997. {$EXTERNALSYM WSAAddressToStringW}
  2998. WSAAddressToStringW : LPFN_WSAADDRESSTOSTRINGW = nil;
  2999. {$EXTERNALSYM WSAAddressToString}
  3000. WSAAddressToString : LPFN_WSAADDRESSTOSTRING = nil;
  3001. {$EXTERNALSYM WSACloseEvent}
  3002. WSACloseEvent : LPFN_WSACLOSEEVENT = nil;
  3003. {$EXTERNALSYM WSAConnect}
  3004. WSAConnect : LPFN_WSACONNECT = nil;
  3005. {$EXTERNALSYM WSACreateEvent}
  3006. WSACreateEvent : LPFN_WSACREATEEVENT = nil;
  3007. {$IFNDEF WINCE}
  3008. {$EXTERNALSYM WSADuplicateSocketA}
  3009. WSADuplicateSocketA : LPFN_WSADUPLICATESOCKETA = nil;
  3010. {$EXTERNALSYM WSADuplicateSocketW}
  3011. WSADuplicateSocketW : LPFN_WSADUPLICATESOCKETW = nil;
  3012. {$EXTERNALSYM WSADuplicateSocket}
  3013. WSADuplicateSocket : LPFN_WSADUPLICATESOCKET = nil;
  3014. {$ENDIF}
  3015. {$EXTERNALSYM WSAEnumNetworkEvents}
  3016. WSAEnumNetworkEvents : LPFN_WSAENUMNETWORKEVENTS = nil;
  3017. {$EXTERNALSYM WSAEnumProtocolsA}
  3018. WSAEnumProtocolsA : LPFN_WSAENUMPROTOCOLSA = nil;
  3019. {$EXTERNALSYM WSAEnumProtocolsW}
  3020. WSAEnumProtocolsW : LPFN_WSAENUMPROTOCOLSW = nil;
  3021. {$EXTERNALSYM WSAEnumProtocols}
  3022. WSAEnumProtocols : LPFN_WSAENUMPROTOCOLS = nil;
  3023. {$EXTERNALSYM WSAEnumNameSpaceProvidersA}
  3024. WSAEnumNameSpaceProvidersA : LPFN_WSAENUMNAMESPACEPROVIDERSA = nil;
  3025. {$EXTERNALSYM WSAEnumNameSpaceProvidersW}
  3026. WSAEnumNameSpaceProvidersW : LPFN_WSAENUMNAMESPACEPROVIDERSW = nil;
  3027. {$EXTERNALSYM WSAEnumNameSpaceProviders}
  3028. WSAEnumNameSpaceProviders : LPFN_WSAENUMNAMESPACEPROVIDERS = nil;
  3029. {$EXTERNALSYM WSAEventSelect}
  3030. WSAEventSelect : LPFN_WSAEVENTSELECT = nil;
  3031. {$EXTERNALSYM WSAGetOverlappedResult}
  3032. WSAGetOverlappedResult : LPFN_WSAGETOVERLAPPEDRESULT = nil;
  3033. {$EXTERNALSYM WSAGetQosByName}
  3034. WSAGetQosByName : LPFN_WSAGETQOSBYNAME = nil;
  3035. {$EXTERNALSYM WSAGetServiceClassInfoA}
  3036. WSAGetServiceClassInfoA : LPFN_WSAGETSERVICECLASSINFOA = nil;
  3037. {$EXTERNALSYM WSAGetServiceClassInfoW}
  3038. WSAGetServiceClassInfoW : LPFN_WSAGETSERVICECLASSINFOW = nil;
  3039. {$EXTERNALSYM WSAGetServiceClassInfo}
  3040. WSAGetServiceClassInfo : LPFN_WSAGETSERVICECLASSINFO = nil;
  3041. {$EXTERNALSYM WSAGetServiceClassNameByClassIdA}
  3042. WSAGetServiceClassNameByClassIdA : LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA = nil;
  3043. {$EXTERNALSYM WSAGetServiceClassNameByClassIdW}
  3044. WSAGetServiceClassNameByClassIdW : LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW = nil;
  3045. {$EXTERNALSYM WSAGetServiceClassNameByClassId}
  3046. WSAGetServiceClassNameByClassId : LPFN_WSAGETSERVICECLASSNAMEBYCLASSID = nil;
  3047. {$EXTERNALSYM WSAHtonl}
  3048. WSAHtonl : LPFN_WSAHTONL = nil;
  3049. {$EXTERNALSYM WSAHtons}
  3050. WSAHtons : LPFN_WSAHTONS = nil;
  3051. {$EXTERNALSYM WSAIoctl}
  3052. WSAIoctl : LPFN_WSAIOCTL = nil;
  3053. {$EXTERNALSYM WSAInstallServiceClassA}
  3054. WSAInstallServiceClassA : LPFN_WSAINSTALLSERVICECLASSA = nil;
  3055. {$EXTERNALSYM WSAInstallServiceClassW}
  3056. WSAInstallServiceClassW : LPFN_WSAINSTALLSERVICECLASSW = nil;
  3057. {$EXTERNALSYM WSAInstallServiceClass}
  3058. WSAInstallServiceClass : LPFN_WSAINSTALLSERVICECLASS = nil;
  3059. {$EXTERNALSYM WSAJoinLeaf}
  3060. WSAJoinLeaf : LPFN_WSAJOINLEAF = nil;
  3061. {$EXTERNALSYM WSALookupServiceBeginA}
  3062. WSALookupServiceBeginA : LPFN_WSALOOKUPSERVICEBEGINA = nil;
  3063. {$EXTERNALSYM WSALookupServiceBeginW}
  3064. WSALookupServiceBeginW : LPFN_WSALOOKUPSERVICEBEGINW = nil;
  3065. {$EXTERNALSYM WSALookupServiceBegin}
  3066. WSALookupServiceBegin : LPFN_WSALOOKUPSERVICEBEGIN = nil;
  3067. {$EXTERNALSYM WSALookupServiceEnd}
  3068. WSALookupServiceEnd : LPFN_WSALOOKUPSERVICEEND = nil;
  3069. {$EXTERNALSYM WSALookupServiceNextA}
  3070. WSALookupServiceNextA : LPFN_WSALOOKUPSERVICENEXTA = nil;
  3071. {$EXTERNALSYM WSALookupServiceNextW}
  3072. WSALookupServiceNextW : LPFN_WSALOOKUPSERVICENEXTW = nil;
  3073. {$EXTERNALSYM WSALookupServiceNext}
  3074. WSALookupServiceNext : LPFN_WSALOOKUPSERVICENEXT = nil;
  3075. {$EXTERNALSYM WSANtohl}
  3076. WSANtohl : LPFN_WSANTOHL = nil;
  3077. {$EXTERNALSYM WSANtohs}
  3078. WSANtohs : LPFN_WSANTOHS = nil;
  3079. {$EXTERNALSYM WSARecv}
  3080. WSARecv : LPFN_WSARECV = nil;
  3081. {$EXTERNALSYM WSARecvDisconnect}
  3082. WSARecvDisconnect : LPFN_WSARECVDISCONNECT = nil;
  3083. {$EXTERNALSYM WSARecvFrom}
  3084. WSARecvFrom : LPFN_WSARECVFROM = nil;
  3085. {$EXTERNALSYM WSARemoveServiceClass}
  3086. WSARemoveServiceClass : LPFN_WSAREMOVESERVICECLASS = nil;
  3087. {$EXTERNALSYM WSAResetEvent}
  3088. WSAResetEvent : LPFN_WSARESETEVENT = nil;
  3089. {$EXTERNALSYM WSASend}
  3090. WSASend : LPFN_WSASEND = nil;
  3091. {$EXTERNALSYM WSASendDisconnect}
  3092. WSASendDisconnect : LPFN_WSASENDDISCONNECT = nil;
  3093. {$EXTERNALSYM WSASendTo}
  3094. WSASendTo : LPFN_WSASENDTO = nil;
  3095. {$EXTERNALSYM WSASetEvent}
  3096. WSASetEvent : LPFN_WSASETEVENT = nil;
  3097. {$EXTERNALSYM WSASetServiceA}
  3098. WSASetServiceA : LPFN_WSASETSERVICEA = nil;
  3099. {$EXTERNALSYM WSASetServiceW}
  3100. WSASetServiceW : LPFN_WSASETSERVICEW = nil;
  3101. {$EXTERNALSYM WSASetService}
  3102. WSASetService : LPFN_WSASETSERVICE = nil;
  3103. {$EXTERNALSYM WSASocketA}
  3104. WSASocketA : LPFN_WSASOCKETA = nil;
  3105. {$EXTERNALSYM WSASocketW}
  3106. WSASocketW : LPFN_WSASOCKETW = nil;
  3107. {$EXTERNALSYM WSASocket}
  3108. WSASocket : LPFN_WSASOCKET = nil;
  3109. {$EXTERNALSYM WSAStringToAddressA}
  3110. WSAStringToAddressA : LPFN_WSASTRINGTOADDRESSA = nil;
  3111. {$EXTERNALSYM WSAStringToAddressW}
  3112. WSAStringToAddressW : LPFN_WSASTRINGTOADDRESSW = nil;
  3113. {$EXTERNALSYM WSAStringToAddress}
  3114. WSAStringToAddress : LPFN_WSASTRINGTOADDRESS = nil;
  3115. {$EXTERNALSYM WSAWaitForMultipleEvents}
  3116. WSAWaitForMultipleEvents : LPFN_WSAWAITFORMULTIPLEEVENTS = nil;
  3117. {$EXTERNALSYM WSAProviderConfigChange}
  3118. WSAProviderConfigChange : LPFN_WSAPROVIDERCONFIGCHANGE = nil;
  3119. {$EXTERNALSYM TransmitFile}
  3120. TransmitFile : LPFN_TRANSMITFILE = nil;
  3121. {$EXTERNALSYM AcceptEx}
  3122. AcceptEx : LPFN_ACCEPTEX = nil;
  3123. {$EXTERNALSYM GetAcceptExSockaddrs}
  3124. GetAcceptExSockaddrs : LPFN_GETACCEPTEXSOCKADDRS = nil;
  3125. {$IFNDEF WINCE}
  3126. //This is defined in the Windows Mobile 6 Standard SDK Refresh
  3127. //but I'm not sure what .DLL the function is in. I also couldn't find a WSAID
  3128. //constant for it.
  3129. {$EXTERNALSYM WSARecvEx}
  3130. WSARecvEx : LPFN_WSARECVEX = nil;
  3131. {$ENDIF}
  3132. {$EXTERNALSYM ConnectEx}
  3133. ConnectEx : LPFN_CONNECTEX = nil;
  3134. {$EXTERNALSYM DisconnectEx}
  3135. DisconnectEx : LPFN_DISCONNECTEX = nil;
  3136. {$EXTERNALSYM WSARecvMsg}
  3137. WSARecvMsg : LPFN_WSARECVMSG = nil;
  3138. {$EXTERNALSYM TransmitPackets}
  3139. TransmitPackets : LPFN_TRANSMITPACKETS = nil;
  3140. {$IFNDEF WINCE}
  3141. //Windows Vista, Windows Server 2008
  3142. {$EXTERNALSYM WSASendMsg}
  3143. WSASendMsg: LPFN_WSASENDMSG = nil;
  3144. {$EXTERNALSYM WSAPoll}
  3145. WSAPoll: LPFN_WSAPOLL = nil;
  3146. {$ENDIF}
  3147. //WSANSPIoctl is not supported in WinCE 4.20 but is supported in later versions.
  3148. {$EXTERNALSYM WSANSPIoctl}
  3149. WSANSPIoctl : LPFN_WSANSPIOCTL = nil;
  3150. {$ENDIF} // $IFDEF WS2_DLL_FUNC_VARS
  3151. { Macros }
  3152. {$EXTERNALSYM WSAMakeSyncReply}
  3153. function WSAMakeSyncReply(Buflen, AError: Word): Longint;
  3154. {$EXTERNALSYM WSAMakeSelectReply}
  3155. function WSAMakeSelectReply(Event, AError: Word): Longint;
  3156. {$EXTERNALSYM WSAGetAsyncBuflen}
  3157. function WSAGetAsyncBuflen(Param: LPARAM): Word;
  3158. {$EXTERNALSYM WSAGetAsyncError}
  3159. function WSAGetAsyncError(Param: LPARAM): Word;
  3160. {$EXTERNALSYM WSAGetSelectEvent}
  3161. function WSAGetSelectEvent(Param: LPARAM): Word;
  3162. {$EXTERNALSYM WSAGetSelectError}
  3163. function WSAGetSelectError(Param: LPARAM): Word;
  3164. {$EXTERNALSYM FD_CLR}
  3165. procedure FD_CLR(ASocket: TSocket; var FDSet: TFDSet);
  3166. {$EXTERNALSYM FD_ISSET}
  3167. function FD_ISSET(ASocket: TSocket; var FDSet: TFDSet): Boolean;
  3168. {$EXTERNALSYM FD_SET}
  3169. procedure FD_SET(ASocket: TSocket; var FDSet: TFDSet);
  3170. {$EXTERNALSYM FD_ZERO}
  3171. procedure FD_ZERO(var FDSet: TFDSet);
  3172. {$IFNDEF WINCE}
  3173. //Posix aliases for helper macros
  3174. // #define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
  3175. {$EXTERNALSYM CMSGHDR_ALIGN}
  3176. function CMSGHDR_ALIGN(const Alength: SIZE_T): SIZE_T;
  3177. // #define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
  3178. {$EXTERNALSYM CMSGDATA_ALIGN}
  3179. function CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
  3180. //#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
  3181. {$EXTERNALSYM CMSG_FIRSTHDR}
  3182. function CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
  3183. // #define CMSG_NXTHDR WSA_CMSG_NXTHDR
  3184. {$EXTERNALSYM CMSG_NXTHDR}
  3185. function CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
  3186. // #define CMSG_SPACE WSA_CMSG_SPACE
  3187. {$EXTERNALSYM CMSG_SPACE}
  3188. function CMSG_SPACE(const Alength: PtrUInt): PtrUInt;
  3189. // #define CMSG_LEN WSA_CMSG_LEN
  3190. {$EXTERNALSYM CMSG_LEN}
  3191. function CMSG_LEN(const Alength: SIZE_T): SIZE_T;
  3192. //
  3193. {$EXTERNALSYM WSA_CMSGHDR_ALIGN}
  3194. function WSA_CMSGHDR_ALIGN(const Alength: PtrUInt): PtrUInt;
  3195. {$EXTERNALSYM WSA_CMSGDATA_ALIGN}
  3196. function WSA_CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
  3197. {$EXTERNALSYM WSA_CMSG_FIRSTHDR}
  3198. function WSA_CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
  3199. // #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
  3200. {$EXTERNALSYM WSA_CMSG_NXTHDR}
  3201. function WSA_CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
  3202. {$EXTERNALSYM WSA_CMSG_DATA}
  3203. function WSA_CMSG_DATA(const cmsg: LPWSACMSGHDR): PByte;
  3204. {$EXTERNALSYM WSA_CMSG_SPACE}
  3205. function WSA_CMSG_SPACE(const Alength: SIZE_T): SIZE_T;
  3206. {$EXTERNALSYM WSA_CMSG_LEN}
  3207. function WSA_CMSG_LEN(const Alength: SIZE_T): SIZE_T;
  3208. {$ENDIF}
  3209. //=============================================================
  3210. {
  3211. WS2TCPIP.H - WinSock2 Extension for TCP/IP protocols
  3212. This file contains TCP/IP specific information for use
  3213. by WinSock2 compatible applications.
  3214. Copyright (c) 1995-1999 Microsoft Corporation
  3215. To provide the backward compatibility, all the TCP/IP
  3216. specific definitions that were included in the WINSOCK.H
  3217. file are now included in WINSOCK2.H file. WS2TCPIP.H
  3218. file includes only the definitions introduced in the
  3219. "WinSock 2 Protocol-Specific Annex" document.
  3220. Rev 0.3 Nov 13, 1995
  3221. Rev 0.4 Dec 15, 1996
  3222. }
  3223. type
  3224. // Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP
  3225. {$EXTERNALSYM ip_mreq}
  3226. ip_mreq = record
  3227. imr_multiaddr : TInAddr; // IP multicast address of group
  3228. imr_interface : TInAddr; // local IP address of interface
  3229. end;
  3230. // Argument structure for IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP,
  3231. // IP_BLOCK_SOURCE, and IP_UNBLOCK_SOURCE
  3232. {$EXTERNALSYM ip_mreq_source}
  3233. ip_mreq_source = record
  3234. imr_multiaddr: TInAddr; // IP multicast address of group
  3235. imr_sourceaddr: TInAddr; // IP address of source
  3236. imr_interface: TInAddr; // local IP address of interface
  3237. end;
  3238. // Argument structure for SIO_{GET,SET}_MULTICAST_FILTER
  3239. {$EXTERNALSYM ip_msfilter}
  3240. ip_msfilter = record
  3241. imsf_multiaddr: TInAddr; // IP multicast address of group
  3242. imsf_interface: TInAddr; // local IP address of interface
  3243. imsf_fmode: u_long; // filter mode - INCLUDE or EXCLUDE
  3244. imsf_numsrc: u_long; // number of sources in src_list
  3245. imsf_slist: Array[0..0] of TInAddr;
  3246. end;
  3247. {$EXTERNALSYM IP_MSFILTER_SIZE}
  3248. function IP_MSFILTER_SIZE(const numsrc: DWORD): PtrUInt;
  3249. // TCP/IP specific Ioctl codes
  3250. const
  3251. {$EXTERNALSYM SIO_GET_INTERFACE_LIST}
  3252. SIO_GET_INTERFACE_LIST = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 127; {Do not Localize}
  3253. // New IOCTL with address size independent address array
  3254. {$EXTERNALSYM SIO_GET_INTERFACE_LIST_EX}
  3255. SIO_GET_INTERFACE_LIST_EX = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 126; {Do not Localize}
  3256. {$EXTERNALSYM SIO_SET_MULTICAST_FILTER}
  3257. SIO_SET_MULTICAST_FILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 125; {Do not Localize}
  3258. {$EXTERNALSYM SIO_GET_MULTICAST_FILTER}
  3259. SIO_GET_MULTICAST_FILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or (124 or IOC_IN); {Do not Localize}
  3260. {$EXTERNALSYM SIOCSIPMSFILTER}
  3261. SIOCSIPMSFILTER = SIO_SET_MULTICAST_FILTER;
  3262. {$EXTERNALSYM SIOCGIPMSFILTER}
  3263. SIOCGIPMSFILTER = SIO_GET_MULTICAST_FILTER;
  3264. //
  3265. // Protocol independent ioctls for setting and retrieving multicast filters.
  3266. //
  3267. {$EXTERNALSYM SIOCSMSFILTER}
  3268. SIOCSMSFILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 126; {Do not Localize}
  3269. {$EXTERNALSYM SIOCGMSFILTER}
  3270. SIOCGMSFILTER = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or (127 or IOC_IN); {Do not Localize}
  3271. {$IFNDEF WINCE}
  3272. //Windows 2008 and Windows Vista SP1 additions
  3273. {$EXTERNALSYM SIO_IDEAL_SEND_BACKLOG_QUERY}
  3274. SIO_IDEAL_SEND_BACKLOG_QUERY = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('t') shl 8) or 123;
  3275. {$EXTERNALSYM SIO_IDEAL_SEND_BACKLOG_CHANGE}
  3276. SIO_IDEAL_SEND_BACKLOG_CHANGE = IOC_VOID or (Ord('t') shl 8) or 122;
  3277. {$ENDIF}
  3278. {$IFNDEF WINCE}
  3279. // Options for use with [gs]etsockopt at the IP level.
  3280. {$EXTERNALSYM IP_OPTIONS}
  3281. IP_OPTIONS = 1; // set/get IP options
  3282. {$EXTERNALSYM IP_HDRINCL}
  3283. IP_HDRINCL = 2; // header is included with data
  3284. {$EXTERNALSYM IP_TOS}
  3285. IP_TOS = 3; // IP type of service and preced
  3286. {$EXTERNALSYM IP_TTL}
  3287. IP_TTL = 4; // IP time to live
  3288. {$EXTERNALSYM IP_MULTICAST_IF}
  3289. IP_MULTICAST_IF = 9; // set/get IP multicast i/f
  3290. {$EXTERNALSYM IP_MULTICAST_TTL}
  3291. IP_MULTICAST_TTL = 10; // set/get IP multicast ttl
  3292. {$EXTERNALSYM IP_MULTICAST_LOOP}
  3293. IP_MULTICAST_LOOP = 11; // set/get IP multicast loopback
  3294. {$EXTERNALSYM IP_ADD_MEMBERSHIP}
  3295. IP_ADD_MEMBERSHIP = 12; // add an IP group membership
  3296. {$EXTERNALSYM IP_DROP_MEMBERSHIP}
  3297. IP_DROP_MEMBERSHIP = 13; // drop an IP group membership
  3298. {$ELSE}
  3299. {$EXTERNALSYM IP_TOS}
  3300. IP_TOS = 8; //* IP type of service and preced*/
  3301. {$EXTERNALSYM IP_TTL}
  3302. IP_TTL = 7; //* IP time to live */
  3303. {$EXTERNALSYM IP_MULTICAST_IF}
  3304. IP_MULTICAST_IF = 2; //* set/get IP multicast i/f */
  3305. {$EXTERNALSYM IP_MULTICAST_TTL}
  3306. IP_MULTICAST_TTL = 3; //* set/get IP multicast ttl */
  3307. {$EXTERNALSYM IP_MULTICAST_LOOP}
  3308. IP_MULTICAST_LOOP = 4; //*set/get IP multicast loopback */
  3309. {$EXTERNALSYM IP_ADD_MEMBERSHIP}
  3310. IP_ADD_MEMBERSHIP = 5; //* add an IP group membership */
  3311. {$EXTERNALSYM IP_DROP_MEMBERSHIP}
  3312. IP_DROP_MEMBERSHIP = 6; //* drop an IP group membership */
  3313. //JPM Notes. IP_HDRINCL is not supported in WinCE 4.0.
  3314. {$EXTERNALSYM IP_HDRINCL}
  3315. IP_HDRINCL = 9; //* header is included with data */
  3316. {$ENDIF}
  3317. {$EXTERNALSYM IP_DONTFRAGMENT}
  3318. IP_DONTFRAGMENT = 14; // don't fragment IP datagrams {Do not Localize}
  3319. {$EXTERNALSYM IP_ADD_SOURCE_MEMBERSHIP}
  3320. IP_ADD_SOURCE_MEMBERSHIP = 15; // join IP group/source
  3321. {$EXTERNALSYM IP_DROP_SOURCE_MEMBERSHIP}
  3322. IP_DROP_SOURCE_MEMBERSHIP = 16; // leave IP group/source
  3323. {$EXTERNALSYM IP_BLOCK_SOURCE}
  3324. IP_BLOCK_SOURCE = 17; // block IP group/source
  3325. {$EXTERNALSYM IP_UNBLOCK_SOURCE}
  3326. IP_UNBLOCK_SOURCE = 18; // unblock IP group/source
  3327. {$EXTERNALSYM IP_PKTINFO}
  3328. IP_PKTINFO = 19; // receive packet information for ipv4
  3329. {$EXTERNALSYM IP_RECEIVE_BROADCAST}
  3330. IP_RECEIVE_BROADCAST = 22; // Allow/block broadcast reception.
  3331. {$EXTERNALSYM IP_RECVIF}
  3332. IP_RECVIF = 24; // Receive arrival interface.
  3333. {$EXTERNALSYM IP_RECVDSTADDR}
  3334. IP_RECVDSTADDR = 25; // Receive destination address.
  3335. {$EXTERNALSYM IP_IFLIST}
  3336. IP_IFLIST = 28; // Enable/Disable an interface list.
  3337. {$EXTERNALSYM IP_ADD_IFLIST}
  3338. IP_ADD_IFLIST = 29; // Add an interface list entry.
  3339. {$EXTERNALSYM IP_DEL_IFLIST}
  3340. IP_DEL_IFLIST = 30; // Delete an interface list entry.
  3341. {$EXTERNALSYM IP_UNICAST_IF}
  3342. IP_UNICAST_IF = 31; // IP unicast interface.
  3343. {$EXTERNALSYM IP_RTHDR}
  3344. IP_RTHDR = 32; // Set/get IPv6 routing header.
  3345. {$EXTERNALSYM IP_GET_IFLIST}
  3346. IP_GET_IFLIST = 33; // Get an interface list.
  3347. {$EXTERNALSYM IP_RECVRTHDR}
  3348. IP_RECVRTHDR = 38; // Receive the routing header.
  3349. {$EXTERNALSYM IP_TCLASS}
  3350. IP_TCLASS = 39; // Packet traffic class.
  3351. {$EXTERNALSYM IP_RECVTCLASS}
  3352. IP_RECVTCLASS = 40; // Receive packet traffic class.
  3353. {$EXTERNALSYM IP_ORIGINAL_ARRIVAL_IF}
  3354. IP_ORIGINAL_ARRIVAL_IF = 47; // Original Arrival Interface Index. (Windows 7)
  3355. {$IFDEF WINCE}
  3356. {$EXTERNALSYM IP_DSCP_TRAFFIC_TYPE}
  3357. IP_DSCP_TRAFFIC_TYPE = 100; //* differential services */
  3358. {$EXTERNALSYM IP_RELOAD_DSCP_MAPPINGS}
  3359. IP_RELOAD_DSCP_MAPPINGS = 101; //* reload DSCP registry mappings */
  3360. {$ENDIF}
  3361. {$EXTERNALSYM IP_DEFAULT_MULTICAST_TTL}
  3362. IP_DEFAULT_MULTICAST_TTL = 1; // normally limit m'casts to 1 hop {Do not Localize}
  3363. {$EXTERNALSYM IP_DEFAULT_MULTICAST_LOOP}
  3364. IP_DEFAULT_MULTICAST_LOOP = 1; // normally hear sends if a member
  3365. {$EXTERNALSYM IP_MAX_MEMBERSHIPS}
  3366. IP_MAX_MEMBERSHIPS = 20; // per socket; must fit in one mbuf
  3367. // Option to use with [gs]etsockopt at the IPPROTO_IPV6 level
  3368. {$EXTERNALSYM IPV6_HDRINCL}
  3369. IPV6_HDRINCL = 2; // Header is included with data
  3370. {$EXTERNALSYM IPV6_UNICAST_HOPS}
  3371. IPV6_UNICAST_HOPS = 4; // Set/get IP unicast hop limit
  3372. {$EXTERNALSYM IPV6_MULTICAST_IF}
  3373. IPV6_MULTICAST_IF = 9; // Set/get IP multicast interface
  3374. {$EXTERNALSYM IPV6_MULTICAST_HOPS}
  3375. IPV6_MULTICAST_HOPS = 10; // Set/get IP multicast ttl
  3376. {$EXTERNALSYM IPV6_MULTICAST_LOOP}
  3377. IPV6_MULTICAST_LOOP = 11; // Set/get IP multicast loopback
  3378. {$EXTERNALSYM IPV6_ADD_MEMBERSHIP}
  3379. IPV6_ADD_MEMBERSHIP = 12; // Add an IP group membership
  3380. {$EXTERNALSYM IPV6_DROP_MEMBERSHIP}
  3381. IPV6_DROP_MEMBERSHIP = 13; // Drop an IP group membership
  3382. {$EXTERNALSYM IPV6_JOIN_GROUP}
  3383. IPV6_JOIN_GROUP = IPV6_ADD_MEMBERSHIP;
  3384. {$EXTERNALSYM IPV6_LEAVE_GROUP}
  3385. IPV6_LEAVE_GROUP = IPV6_DROP_MEMBERSHIP;
  3386. {$EXTERNALSYM IPV6_PKTINFO}
  3387. IPV6_PKTINFO = 19; // Receive packet information for ipv6
  3388. {$EXTERNALSYM IPV6_HOPLIMIT}
  3389. IPV6_HOPLIMIT = 21; // Receive packet hop limit
  3390. //Note that IPV6_PROTECTION_LEVEL is not supported for WinCE 4.2
  3391. {$EXTERNALSYM IPV6_PROTECTION_LEVEL}
  3392. IPV6_PROTECTION_LEVEL = 23; // Set/get IPv6 protection level
  3393. {$EXTERNALSYM IPV6_RECVIF}
  3394. IPV6_RECVIF = 24; // Receive arrival interface.
  3395. {$EXTERNALSYM IPV6_RECVDSTADDR}
  3396. IPV6_RECVDSTADDR = 25; // Receive destination address.
  3397. {$EXTERNALSYM IPV6_CHECKSUM}
  3398. IPV6_CHECKSUM = 26; // Offset to checksum for raw IP socket send.
  3399. {$EXTERNALSYM IPV6_V6ONLY}
  3400. IPV6_V6ONLY = 27; // Treat wildcard bind as AF_INET6-only.
  3401. {$EXTERNALSYM IPV6_IFLIST}
  3402. IPV6_IFLIST = 28; // Enable/Disable an interface list.
  3403. {$EXTERNALSYM IPV6_ADD_IFLIST}
  3404. IPV6_ADD_IFLIST = 29; // Add an interface list entry.
  3405. {$EXTERNALSYM IPV6_DEL_IFLIST}
  3406. IPV6_DEL_IFLIST = 30; // Delete an interface list entry.
  3407. {$EXTERNALSYM IPV6_UNICAST_IF}
  3408. IPV6_UNICAST_IF = 31; // IP unicast interface.
  3409. {$EXTERNALSYM IPV6_RTHDR}
  3410. IPV6_RTHDR = 32; // Set/get IPv6 routing header.
  3411. {$EXTERNALSYM IPV6_GET_IFLIST}
  3412. IPV6_GET_IFLIST = 33; // Get an interface list.
  3413. {$EXTERNALSYM IPV6_RECVRTHDR}
  3414. IPV6_RECVRTHDR = 38; // Receive the routing header.
  3415. {$EXTERNALSYM IPV6_TCLASS}
  3416. IPV6_TCLASS = 39; // Packet traffic class.
  3417. {$EXTERNALSYM IPV6_RECVTCLASS}
  3418. IPV6_RECVTCLASS = 40; // Receive packet traffic class.
  3419. {$EXTERNALSYM IPV6_ECN}
  3420. IPV6_ECN = 50; // Receive ECN codepoints in the IP header.
  3421. {$EXTERNALSYM IPV6_PKTINFO_EX}
  3422. IPV6_PKTINFO_EX = 51; // Receive extended packet information.
  3423. {$EXTERNALSYM IPV6_WFP_REDIRECT_RECORDS}
  3424. IPV6_WFP_REDIRECT_RECORDS = 60; // WFP's Connection Redirect Records
  3425. {$EXTERNALSYM IPV6_WFP_REDIRECT_CONTEXT}
  3426. IPV6_WFP_REDIRECT_CONTEXT = 70; // WFP's Connection Redirect Context
  3427. // Option to use with [gs]etsockopt at the IPPROTO_UDP level
  3428. {$EXTERNALSYM UDP_NOCHECKSUM}
  3429. UDP_NOCHECKSUM = 1;
  3430. {$EXTERNALSYM UDP_CHECKSUM_COVERAGE}
  3431. UDP_CHECKSUM_COVERAGE = 20; // Set/get UDP-Lite checksum coverage
  3432. // Option to use with [gs]etsockopt at the IPPROTO_TCP level
  3433. {$EXTERNALSYM TCP_EXPEDITED_1122}
  3434. TCP_EXPEDITED_1122 = $0002;
  3435. {$EXTERNALSYM TCP_KEEPALIVE}
  3436. TCP_KEEPALIVE = 3;
  3437. {$EXTERNALSYM TCP_MAXSEG}
  3438. TCP_MAXSEG = 4;
  3439. {$EXTERNALSYM TCP_MAXRT}
  3440. TCP_MAXRT = 5;
  3441. {$EXTERNALSYM TCP_STDURG}
  3442. TCP_STDURG = 6;
  3443. {$EXTERNALSYM TCP_NOURG}
  3444. TCP_NOURG = 7;
  3445. {$EXTERNALSYM TCP_ATMARK}
  3446. TCP_ATMARK = 8;
  3447. {$EXTERNALSYM TCP_NOSYNRETRIES}
  3448. TCP_NOSYNRETRIES = 9;
  3449. {$EXTERNALSYM TCP_TIMESTAMPS}
  3450. TCP_TIMESTAMPS = 10;
  3451. {$EXTERNALSYM TCP_OFFLOAD_PREFERENCE}
  3452. TCP_OFFLOAD_PREFERENCE = 11;
  3453. {$EXTERNALSYM TCP_CONGESTION_ALGORITHM}
  3454. TCP_CONGESTION_ALGORITHM = 12;
  3455. {$EXTERNALSYM TCP_DELAY_FIN_ACK}
  3456. TCP_DELAY_FIN_ACK = 13;
  3457. {$EXTERNALSYM TCP_MAXRTMS}
  3458. TCP_MAXRTMS = 14;
  3459. // IPv6 definitions
  3460. type
  3461. {$EXTERNALSYM IN6_ADDR}
  3462. IN6_ADDR = record
  3463. case Integer of
  3464. 0: (s6_bytes: array[0..15] of u_char);
  3465. 1: (s6_words: array[0..7] of u_short);
  3466. end;
  3467. {$NODEFINE TIn6Addr}
  3468. TIn6Addr = IN6_ADDR;
  3469. {$NODEFINE PIn6Addr}
  3470. PIn6Addr = ^TIn6Addr;
  3471. {$EXTERNALSYM PIN6_ADDR}
  3472. PIN6_ADDR = PIn6Addr;
  3473. {$EXTERNALSYM LPIN6_ADDR}
  3474. LPIN6_ADDR = PIN6_ADDR;
  3475. {$IFNDEF WINCE}
  3476. {$IFNDEF NO_REDECLARE}
  3477. // Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP
  3478. {$EXTERNALSYM ipv6_mreq}
  3479. ipv6_mreq = record
  3480. ipv6mr_multiaddr: TIn6Addr; // IPv6 multicast address
  3481. ipv6mr_interface: u_int; // Interface index
  3482. end;
  3483. {$NODEFINE TIPv6_MReq}
  3484. TIPv6_MReq = IPV6_MREQ;
  3485. {$NODEFINE PIPv6_MReq}
  3486. PIPv6_MReq = ^TIPv6_MReq;
  3487. {$ENDIF}
  3488. {$ENDIF}
  3489. {$EXTERNALSYM SCOPE_LEVEL}
  3490. // The Pascal compiler in Delphi/BCB prior to v6 does not
  3491. // support specifying values for individual enum items
  3492. SCOPE_LEVEL = (
  3493. {$IFDEF HAS_ENUM_ELEMENT_VALUES}
  3494. ScopeLevelInterface = 1,
  3495. ScopeLevelLink = 2,
  3496. ScopeLevelSubnet = 3,
  3497. ScopeLevelAdmin = 4,
  3498. ScopeLevelSite = 5,
  3499. ScopeLevelOrganization = 8,
  3500. ScopeLevelGlobal = 14,
  3501. ScopeLevelCount = 16
  3502. {$ELSE}
  3503. slUnused0, // do not use
  3504. ScopeLevelInterface,
  3505. ScopeLevelLink,
  3506. ScopeLevelSubnet,
  3507. ScopeLevelAdmin,
  3508. ScopeLevelSite,
  3509. slUnused6, // do not use
  3510. slUnused7, // do not use
  3511. ScopeLevelOrganization,
  3512. slUnused9, // do not use
  3513. slUnused10, // do not use
  3514. slUnused11, // do not use
  3515. slUnused12, // do not use
  3516. slUnused13, // do not use
  3517. ScopeLevelGlobal,
  3518. slUnused15, // do not use
  3519. ScopeLevelCount
  3520. {$ENDIF}
  3521. );
  3522. // Old IPv6 socket address structure (retained for sockaddr_gen definition below)
  3523. {$EXTERNALSYM sockaddr_in6_old}
  3524. sockaddr_in6_old = record
  3525. sin6_family : short; // AF_INET6
  3526. sin6_port : u_short; // Transport level port number
  3527. sin6_flowinfo : u_long; // IPv6 flow information
  3528. sin6_addr : TIn6Addr; // IPv6 address
  3529. end;
  3530. // IPv6 socket address structure, RFC 2553
  3531. {$IFDEF WINCE}
  3532. {$EXTERNALSYM SOCKADDR_IN6}
  3533. SOCKADDR_IN6 = record
  3534. sin6_family : short; // AF_INET6
  3535. sin6_port : u_short; // Transport level port number
  3536. sin6_flowinfo : u_long; // IPv6 flow information
  3537. sin6_addr : TIn6Addr; // IPv6 address
  3538. sin6_scope_id : u_long; // set of interfaces for a scope
  3539. end;
  3540. {$ELSE}
  3541. {$EXTERNALSYM ADDRESS_FAMILY}
  3542. ADDRESS_FAMILY = USHORT;
  3543. //
  3544. // IPv6 socket address structure, RFC 3493.
  3545. //
  3546. //
  3547. // NB: The LH version of sockaddr_in6 has the struct tag sockaddr_in6 rather
  3548. // than sockaddr_in6_lh. This is to make sure that standard sockets apps
  3549. // that conform to RFC 2553 (Basic Socket Interface Extensions for IPv6).
  3550. //
  3551. {$EXTERNALSYM SCOPE_ID}
  3552. SCOPE_ID = record
  3553. // union {
  3554. // struct {
  3555. // ULONG Zone : 28;
  3556. // ULONG Level : 4;
  3557. // };
  3558. // ULONG Value;
  3559. // };
  3560. Value : ULONG;
  3561. end;
  3562. {$EXTERNALSYM PSCOPE_ID}
  3563. PSCOPE_ID = ^SCOPE_ID;
  3564. {$EXTERNALSYM SCOPEID_UNSPECIFIED_INIT}
  3565. function SCOPEID_UNSPECIFIED_INIT: SCOPE_ID;
  3566. type
  3567. {$EXTERNALSYM sockaddr_in6_union}
  3568. sockaddr_in6_union = record
  3569. case Integer of
  3570. 0 : (sin6_scope_id : ULONG); // Set of interfaces for a scope.
  3571. 1 : (sin6_scope_struct : SCOPE_ID);
  3572. end;
  3573. {$EXTERNALSYM SOCKADDR_IN6_LH}
  3574. SOCKADDR_IN6_LH = record
  3575. sin6_family : ADDRESS_FAMILY; // AF_INET6.
  3576. sin6_port : USHORT; // Transport level port number.
  3577. sin6_flowinfo : ULONG; // IPv6 flow information.
  3578. sin6_addr : IN6_ADDR; // IPv6 address.
  3579. a : sockaddr_in6_union;
  3580. end;
  3581. {$EXTERNALSYM SOCKADDR_IN6_W2KSP1}
  3582. SOCKADDR_IN6_W2KSP1 = record
  3583. sin6_family : short; //* AF_INET6 */
  3584. sin6_port : USHORT; //* Transport level port number */
  3585. sin6_flowinfo : ULONG; //* IPv6 flow information */
  3586. sin6_addr : in6_addr; //* IPv6 address */
  3587. sin6_scope_id : ULONG; //* set of interfaces for a scope */
  3588. end;
  3589. {$EXTERNALSYM PSOCKADDR_IN6_LH}
  3590. PSOCKADDR_IN6_LH = ^SOCKADDR_IN6_LH;
  3591. {$EXTERNALSYM SOCKADDR_IN6}
  3592. SOCKADDR_IN6 = SOCKADDR_IN6_LH;
  3593. {$ENDIF}
  3594. {$NODEFINE TSockAddrIn6}
  3595. TSockAddrIn6 = SOCKADDR_IN6;
  3596. {$NODEFINE PSockAddrIn6}
  3597. PSockAddrIn6 = ^TSockAddrIn6;
  3598. {$EXTERNALSYM PSOCKADDR_IN6}
  3599. PSOCKADDR_IN6 = PSockAddrIn6;
  3600. {$EXTERNALSYM LPSOCKADDR_IN6}
  3601. LPSOCKADDR_IN6 = PSOCKADDR_IN6;
  3602. {$EXTERNALSYM sockaddr_gen}
  3603. sockaddr_gen = record
  3604. case Integer of
  3605. 1 : ( Address : TSockAddr; );
  3606. 2 : ( AddressIn : TSockAddrIn; );
  3607. 3 : ( AddressIn6 : sockaddr_in6_old; );
  3608. end;
  3609. {$NODEFINE TSockAddrGen}
  3610. TSockAddrGen = sockaddr_gen;
  3611. // Structure to keep interface specific information
  3612. {$EXTERNALSYM INTERFACE_INFO}
  3613. INTERFACE_INFO = record
  3614. iiFlags : u_long; // Interface flags
  3615. iiAddress : TSockAddrGen; // Interface address
  3616. iiBroadcastAddress : TSockAddrGen; // Broadcast address
  3617. iiNetmask : TSockAddrGen; // Network mask
  3618. end;
  3619. {$NODEFINE TInterface_Info}
  3620. TInterface_Info = INTERFACE_INFO;
  3621. {$EXTERNALSYM PINTERFACE_INFO}
  3622. PINTERFACE_INFO = ^TInterface_Info;
  3623. {$EXTERNALSYM LPINTERFACE_INFO}
  3624. LPINTERFACE_INFO = PINTERFACE_INFO;
  3625. // New structure that does not have dependency on the address size
  3626. {$EXTERNALSYM INTERFACE_INFO_EX}
  3627. INTERFACE_INFO_EX = record
  3628. iiFlags : u_long; // Interface flags
  3629. iiAddress : TSocket_Address; // Interface address
  3630. iiBroadcastAddress : TSocket_Address; // Broadcast address
  3631. iiNetmask : TSocket_Address; // Network mask
  3632. end;
  3633. {$NODEFINE TInterface_Info_Ex}
  3634. TInterface_Info_Ex = INTERFACE_INFO_EX;
  3635. {$EXTERNALSYM PINTERFACE_INFO_EX}
  3636. PINTERFACE_INFO_EX = ^TInterface_Info_Ex;
  3637. {$EXTERNALSYM LPINTERFACE_INFO_EX}
  3638. LPINTERFACE_INFO_EX = PINTERFACE_INFO_EX;
  3639. // Macro that works for both IPv4 and IPv6
  3640. {$EXTERNALSYM SS_PORT}
  3641. function SS_PORT(ssp: PSockAddrIn): u_short;
  3642. {$EXTERNALSYM IN6ADDR_ANY_INIT}
  3643. function IN6ADDR_ANY_INIT: TIn6Addr;
  3644. {$EXTERNALSYM IN6ADDR_LOOPBACK_INIT}
  3645. function IN6ADDR_LOOPBACK_INIT: TIn6Addr;
  3646. {$EXTERNALSYM IN6ADDR_ALLNODESONNODE_INIT}
  3647. function IN6ADDR_ALLNODESONNODE_INIT : TIn6Addr;
  3648. {$EXTERNALSYM IN6ADDR_ALLNODESONLINK_INIT}
  3649. function IN6ADDR_ALLNODESONLINK_INIT : TIn6Addr;
  3650. {$EXTERNALSYM IN6ADDR_ALLROUTERSONLINK_INIT}
  3651. function IN6ADDR_ALLROUTERSONLINK_INIT : TIn6Addr;
  3652. {$EXTERNALSYM IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT}
  3653. function IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT : TIn6Addr;
  3654. {$EXTERNALSYM IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT}
  3655. function IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT : TIn6Addr;
  3656. {$EXTERNALSYM IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT}
  3657. function IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT : TIn6Addr;
  3658. {$EXTERNALSYM IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT}
  3659. function IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT : TIn6Addr;
  3660. {$EXTERNALSYM IN6ADDR_SETANY}
  3661. procedure IN6ADDR_SETANY(sa: PSockAddrIn6);
  3662. {$EXTERNALSYM IN6ADDR_SETLOOPBACK}
  3663. procedure IN6ADDR_SETLOOPBACK(sa: PSockAddrIn6);
  3664. {$EXTERNALSYM IN6ADDR_ISANY}
  3665. function IN6ADDR_ISANY(sa: PSockAddrIn6): Boolean;
  3666. {$EXTERNALSYM IN6ADDR_ISLOOPBACK}
  3667. function IN6ADDR_ISLOOPBACK(sa: PSockAddrIn6): Boolean;
  3668. {$EXTERNALSYM IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST}
  3669. function IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(const a : PIn6Addr) : Boolean;
  3670. {$EXTERNALSYM IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST}
  3671. function IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(const a: PIn6Addr) : Boolean;
  3672. {$EXTERNALSYM IN6_IS_ADDR_ANYCAST}
  3673. function IN6_IS_ADDR_ANYCAST(const a: PIn6Addr) : Boolean;
  3674. {$EXTERNALSYM IN6_ADDR_EQUAL}
  3675. function IN6_ADDR_EQUAL(const a: PIn6Addr; const b: PIn6Addr): Boolean;
  3676. {$EXTERNALSYM IN6_IS_ADDR_UNSPECIFIED}
  3677. function IN6_IS_ADDR_UNSPECIFIED(const a: PIn6Addr): Boolean;
  3678. {$EXTERNALSYM IN6_IS_ADDR_LOOPBACK}
  3679. function IN6_IS_ADDR_LOOPBACK(const a: PIn6Addr): Boolean;
  3680. {$EXTERNALSYM IN6_IS_ADDR_MULTICAST}
  3681. function IN6_IS_ADDR_MULTICAST(const a: PIn6Addr): Boolean;
  3682. {$EXTERNALSYM IN6_IS_ADDR_EUI64}
  3683. function IN6_IS_ADDR_EUI64(const a : PIn6Addr) : Boolean;
  3684. {$EXTERNALSYM IN6_IS_ADDR_LINKLOCAL}
  3685. function IN6_IS_ADDR_LINKLOCAL(const a: PIn6Addr): Boolean;
  3686. {$EXTERNALSYM IN6_IS_ADDR_SITELOCAL}
  3687. function IN6_IS_ADDR_SITELOCAL(const a: PIn6Addr): Boolean;
  3688. {$EXTERNALSYM IN6_IS_ADDR_V4MAPPED}
  3689. function IN6_IS_ADDR_V4MAPPED(const a: PIn6Addr): Boolean;
  3690. {$EXTERNALSYM IN6_IS_ADDR_V4COMPAT}
  3691. function IN6_IS_ADDR_V4COMPAT(const a: PIn6Addr): Boolean;
  3692. {$EXTERNALSYM IN6_IS_ADDR_V4TRANSLATED}
  3693. function IN6_IS_ADDR_V4TRANSLATED(const a: PIn6Addr): Boolean;
  3694. {$EXTERNALSYM IN6_IS_ADDR_MC_NODELOCAL}
  3695. function IN6_IS_ADDR_MC_NODELOCAL(const a: PIn6Addr): Boolean;
  3696. {$EXTERNALSYM IN6_IS_ADDR_MC_LINKLOCAL}
  3697. function IN6_IS_ADDR_MC_LINKLOCAL(const a: PIn6Addr): Boolean;
  3698. {$EXTERNALSYM IN6_IS_ADDR_MC_SITELOCAL}
  3699. function IN6_IS_ADDR_MC_SITELOCAL(const a: PIn6Addr): Boolean;
  3700. {$EXTERNALSYM IN6_IS_ADDR_MC_ORGLOCAL}
  3701. function IN6_IS_ADDR_MC_ORGLOCAL(const a: PIn6Addr): Boolean;
  3702. {$EXTERNALSYM IN6_IS_ADDR_MC_GLOBAL}
  3703. function IN6_IS_ADDR_MC_GLOBAL(const a: PIn6Addr): Boolean;
  3704. {$EXTERNALSYM IN6_SET_ADDR_UNSPECIFIED}
  3705. procedure IN6_SET_ADDR_UNSPECIFIED(a : PIN6_ADDR);
  3706. // Possible flags for the iiFlags - bitmask
  3707. const
  3708. {$EXTERNALSYM IFF_UP}
  3709. IFF_UP = $00000001; // Interface is up
  3710. {$EXTERNALSYM IFF_BROADCAST}
  3711. IFF_BROADCAST = $00000002; // Broadcast is supported
  3712. {$EXTERNALSYM IFF_LOOPBACK}
  3713. IFF_LOOPBACK = $00000004; // this is loopback interface
  3714. {$EXTERNALSYM IFF_POINTTOPOINT}
  3715. IFF_POINTTOPOINT = $00000008; // this is point-to-point interface
  3716. {$EXTERNALSYM IFF_MULTICAST}
  3717. IFF_MULTICAST = $00000010; // multicast is supported
  3718. type
  3719. {$EXTERNALSYM MULTICAST_MODE_TYPE}
  3720. {$EXTERNALSYM MCAST_INCLUDE}
  3721. {$EXTERNALSYM MCAST_EXCLUDE}
  3722. MULTICAST_MODE_TYPE = (MCAST_INCLUDE, MCAST_EXCLUDE);
  3723. {$EXTERNALSYM GROUP_FILTER}
  3724. GROUP_FILTER = record
  3725. gf_interface : PULONG; // Interface index.
  3726. gf_group : SOCKADDR_STORAGE; // Multicast address.
  3727. gf_fmode : MULTICAST_MODE_TYPE; // Filter mode.
  3728. gf_numsrc : ULONG; // Number of sources.
  3729. gf_slist : SOCKADDR_STORAGE; //gf_slist[1] : SOCKADDR_STORAGE; // Source address.
  3730. end;
  3731. {$EXTERNALSYM PGROUP_FILTER}
  3732. PGROUP_FILTER = ^GROUP_FILTER;
  3733. {$EXTERNALSYM GROUP_REQ}
  3734. GROUP_REQ = record
  3735. gr_interface : ULONG; // Interface index.
  3736. gr_group : SOCKADDR_STORAGE; // Multicast address.
  3737. end;
  3738. {$EXTERNALSYM PGROUP_REQ}
  3739. PGROUP_REQ = ^GROUP_REQ;
  3740. {$EXTERNALSYM GROUP_SOURCE_REQ}
  3741. GROUP_SOURCE_REQ = record
  3742. gsr_interface : ULONG; // Interface index.
  3743. gsr_group : SOCKADDR_STORAGE; // Group address.
  3744. gsr_source : SOCKADDR_STORAGE; // Source address.
  3745. end;
  3746. {$EXTERNALSYM PGROUP_SOURCE_REQ}
  3747. PGROUP_SOURCE_REQ = ^GROUP_SOURCE_REQ;
  3748. {$EXTERNALSYM GROUP_FILTER_SIZE}
  3749. function GROUP_FILTER_SIZE(const numsrc : DWord) : PtrUInt;
  3750. type
  3751. {$EXTERNALSYM WSAQUERYSET2}
  3752. WSAQUERYSET2 = record
  3753. dwSize : DWORD;
  3754. lpszServiceInstanceName : LPTSTR;
  3755. lpVersion : LPWSAVERSION;
  3756. lpszComment : LPTSTR;
  3757. dwNameSpace : DWORD;
  3758. lpNSProviderId : LPGUID;
  3759. lpszContext : LPTSTR;
  3760. dwNumberOfProtocols : DWORD;
  3761. lpafpProtocols : LPAFPROTOCOLS;
  3762. lpszQueryString : LPTSTR;
  3763. dwNumberOfCsAddrs : DWORD;
  3764. lpcsaBuffer : LPCSADDR_INFO;
  3765. dwOutputFlags : DWORD;
  3766. lpBlob : LPBLOB;
  3767. end;
  3768. {$EXTERNALSYM PWSAQUERYSET2}
  3769. PWSAQUERYSET2 = ^WSAQUERYSET2;
  3770. {$EXTERNALSYM LPWSAQUERYSET2}
  3771. LPWSAQUERYSET2 = PWSAQUERYSET2;
  3772. {$EXTERNALSYM NAPI_PROVIDER_TYPE}
  3773. {$EXTERNALSYM ProviderType_Application}
  3774. {$EXTERNALSYM ProviderType_Service}
  3775. {$IFNDEF HAS_ENUM_ELEMENT_VALUES}
  3776. {$NODEFINE nptUnused}
  3777. {$ENDIF}
  3778. // The Pascal compiler in Delphi/BCB prior to v6 does not
  3779. // support specifying values for individual enum items
  3780. NAPI_PROVIDER_TYPE = (
  3781. {$IFDEF HAS_ENUM_ELEMENT_VALUES}
  3782. ProviderType_Application = 1,
  3783. {$ELSE}
  3784. nptUnused, // Do not use
  3785. ProviderType_Application,
  3786. {$ENDIF}
  3787. ProviderType_Service);
  3788. {$EXTERNALSYM NAPI_DOMAIN_DESCRIPTION_BLOB}
  3789. NAPI_DOMAIN_DESCRIPTION_BLOB = record
  3790. AuthLevel : DWORD;
  3791. cchDomainName : DWORD;
  3792. OffsetNextDomainDescription : DWORD;
  3793. OffsetThisDomainName : DWORD;
  3794. end;
  3795. {$EXTERNALSYM PNAPI_DOMAIN_DESCRIPTION_BLOB}
  3796. PNAPI_DOMAIN_DESCRIPTION_BLOB = ^NAPI_DOMAIN_DESCRIPTION_BLOB;
  3797. {$EXTERNALSYM NAPI_PROVIDER_LEVEL}
  3798. {$EXTERNALSYM PROVIDERLEVEL_NONE}
  3799. {$EXTERNALSYM PROVIDERLEVEL_SECONDARY}
  3800. {$EXTERNALSYM PROVIDERLEVEL_PRIMARY}
  3801. NAPI_PROVIDER_LEVEL = (
  3802. PROVIDERLEVEL_NONE,
  3803. PROVIDERLEVEL_SECONDARY,
  3804. PROVIDERLEVEL_PRIMARY
  3805. );
  3806. {$EXTERNALSYM NAPI_PROVIDER_INSTALLATION_BLOB}
  3807. NAPI_PROVIDER_INSTALLATION_BLOB = record
  3808. dwVersion : DWORD;
  3809. dwProviderType : DWORD;
  3810. fSupportsWildCard : DWORD;
  3811. cDomains : DWORD;
  3812. OffsetFirstDomain : DWORD;
  3813. end;
  3814. {$EXTERNALSYM PNAPI_PROVIDER_INSTALLATION_BLOB}
  3815. PNAPI_PROVIDER_INSTALLATION_BLOB = ^NAPI_PROVIDER_INSTALLATION_BLOB;
  3816. {$IFNDEF NOREDECLARE}
  3817. {$EXTERNALSYM SERVICE_ADDRESS}
  3818. SERVICE_ADDRESS = record
  3819. dwAddressType : DWORD;
  3820. dwAddressFlags : DWORD;
  3821. dwAddressLength : DWORD;
  3822. dwPrincipalLength : DWORD;
  3823. lpAddress : PByte;
  3824. lpPrincipal : PByte;
  3825. end;
  3826. {$ENDIF}
  3827. {$EXTERNALSYM PSERVICE_ADDRESS}
  3828. PSERVICE_ADDRESS = ^SERVICE_ADDRESS;
  3829. {$EXTERNALSYM LPSERVICE_ADDRESS}
  3830. LPSERVICE_ADDRESS = PSERVICE_ADDRESS;
  3831. {$IFNDEF NOREDECLARE}
  3832. {$EXTERNALSYM SERVICE_ADDRESSES}
  3833. SERVICE_ADDRESSES = record
  3834. dwAddressCount : DWORD;
  3835. //#ifdef MIDL_PASS
  3836. // [size_is(dwAddressCount)] SERVICE_ADDRESS Addressses[*];
  3837. //#else // MIDL_PASS
  3838. // SERVICE_ADDRESS Addresses[1] ;
  3839. //#endif // MIDL_PASS
  3840. Addresses : SERVICE_ADDRESS;
  3841. end;
  3842. {$EXTERNALSYM PSERVICE_ADDRESSES}
  3843. PSERVICE_ADDRESSES = ^SERVICE_ADDRESSES;
  3844. {$EXTERNALSYM LPSERVICE_ADDRESSES}
  3845. LPSERVICE_ADDRESSES = PSERVICE_ADDRESSES;
  3846. {$ENDIF}
  3847. {$IFNDEF VCL_2007_OR_ABOVE}
  3848. const
  3849. {$EXTERNALSYM RESOURCEDISPLAYTYPE_GENERIC}
  3850. RESOURCEDISPLAYTYPE_GENERIC = $00000000;
  3851. {$EXTERNALSYM RESOURCEDISPLAYTYPE_DOMAIN}
  3852. RESOURCEDISPLAYTYPE_DOMAIN = $00000001;
  3853. {$EXTERNALSYM RESOURCEDISPLAYTYPE_SERVER}
  3854. RESOURCEDISPLAYTYPE_SERVER = $00000002;
  3855. {$EXTERNALSYM RESOURCEDISPLAYTYPE_SHARE}
  3856. RESOURCEDISPLAYTYPE_SHARE = $00000003;
  3857. {$EXTERNALSYM RESOURCEDISPLAYTYPE_FILE}
  3858. RESOURCEDISPLAYTYPE_FILE = $00000004;
  3859. {$EXTERNALSYM RESOURCEDISPLAYTYPE_GROUP}
  3860. RESOURCEDISPLAYTYPE_GROUP = $00000005;
  3861. {$EXTERNALSYM RESOURCEDISPLAYTYPE_NETWORK}
  3862. RESOURCEDISPLAYTYPE_NETWORK = $00000006;
  3863. {$EXTERNALSYM RESOURCEDISPLAYTYPE_ROOT}
  3864. RESOURCEDISPLAYTYPE_ROOT = $00000007;
  3865. {$EXTERNALSYM RESOURCEDISPLAYTYPE_SHAREADMIN}
  3866. RESOURCEDISPLAYTYPE_SHAREADMIN = $00000008;
  3867. {$EXTERNALSYM RESOURCEDISPLAYTYPE_DIRECTORY}
  3868. RESOURCEDISPLAYTYPE_DIRECTORY = $00000009;
  3869. {$EXTERNALSYM RESOURCEDISPLAYTYPE_TREE}
  3870. RESOURCEDISPLAYTYPE_TREE = $0000000A;
  3871. {$EXTERNALSYM RESOURCEDISPLAYTYPE_NDSCONTAINER}
  3872. RESOURCEDISPLAYTYPE_NDSCONTAINER = $0000000B;
  3873. {$ENDIF}
  3874. type
  3875. {$EXTERNALSYM SERVICE_TYPE_VALUE_ABSA}
  3876. SERVICE_TYPE_VALUE_ABSA = record
  3877. dwNameSpace : DWORD;
  3878. dwValueType : DWORD;
  3879. dwValueSize : DWORD;
  3880. lpValueName : LPSTR;
  3881. lpValue : Pointer;
  3882. end;
  3883. {$EXTERNALSYM PSERVICE_TYPE_VALUE_ABSA}
  3884. PSERVICE_TYPE_VALUE_ABSA = ^SERVICE_TYPE_VALUE_ABSA;
  3885. {$EXTERNALSYM LPSERVICE_TYPE_VALUE_ABSA}
  3886. LPSERVICE_TYPE_VALUE_ABSA = PSERVICE_TYPE_VALUE_ABSA;
  3887. {$EXTERNALSYM SERVICE_INFOA}
  3888. SERVICE_INFOA = record
  3889. lpServiceType : LPGUID;
  3890. lpServiceName : PIdAnsiChar;
  3891. lpComment : PIdAnsiChar;
  3892. lpLocale : PIdAnsiChar;
  3893. dwDisplayHint : DWORD;
  3894. dwVersion : DWORD;
  3895. dwTime : DWORD;
  3896. lpMachineName : PIdAnsiChar;
  3897. lpServiceAddress : LPSERVICE_ADDRESSES;
  3898. ServiceSpecificInfo : BLOB;
  3899. end;
  3900. {$EXTERNALSYM SERVICE_INFOW}
  3901. SERVICE_INFOW = record
  3902. lpServiceType : LPGUID;
  3903. lpServiceName : PWideChar;
  3904. lpComment : PWideChar;
  3905. lpLocale : PWideChar;
  3906. dwDisplayHint : DWORD;
  3907. dwVersion : DWORD;
  3908. dwTime : DWORD;
  3909. lpMachineName : PWideChar;
  3910. lpServiceAddress : LPSERVICE_ADDRESSES;
  3911. ServiceSpecificInfo : BLOB;
  3912. end;
  3913. {$EXTERNALSYM SOCKET_USAGE_TYPE}
  3914. {$EXTERNALSYM SYSTEM_CRITICAL_SOCKET}
  3915. {$IFNDEF HAS_ENUM_ELEMENT_VALUES}
  3916. {$NODEFINE sutUnused}
  3917. {$ENDIF}
  3918. // The Pascal compiler in Delphi/BCB prior to v6 does not
  3919. // support specifying values for individual enum items
  3920. SOCKET_USAGE_TYPE = (
  3921. {$IFDEF HAS_ENUM_ELEMENT_VALUES}
  3922. SYSTEM_CRITICAL_SOCKET = 1
  3923. {$ELSE}
  3924. sutUnused, // do not use
  3925. SYSTEM_CRITICAL_SOCKET
  3926. {$ENDIF}
  3927. );
  3928. {$EXTERNALSYM SOCKET_SECURITY_PROTOCOL}
  3929. {$EXTERNALSYM SOCKET_SECURITY_PROTOCOL_DEFAULT}
  3930. {$EXTERNALSYM SOCKET_SECURITY_PROTOCOL_IPSEC}
  3931. {$EXTERNALSYM SOCKET_SECURITY_PROTOCOL_IPSEC2}
  3932. SOCKET_SECURITY_PROTOCOL = (
  3933. SOCKET_SECURITY_PROTOCOL_DEFAULT,
  3934. SOCKET_SECURITY_PROTOCOL_IPSEC,
  3935. SOCKET_SECURITY_PROTOCOL_IPSEC2);
  3936. {$IFNDEF NO_REDECLARE}
  3937. {$EXTERNALSYM SERVICE_INFO}
  3938. {$IFDEF UNICODE}
  3939. SERVICE_INFO = SERVICE_INFOW;
  3940. {$ELSE}
  3941. SERVICE_INFO = SERVICE_INFOA;
  3942. {$ENDIF}
  3943. {$ENDIF}
  3944. {$EXTERNALSYM NS_SERVICE_INFOA}
  3945. NS_SERVICE_INFOA = record
  3946. dwNameSpace : DWORD;
  3947. ServiceInfo : SERVICE_INFOA;
  3948. end;
  3949. {$EXTERNALSYM PNS_SERVICE_INFOA}
  3950. PNS_SERVICE_INFOA = ^NS_SERVICE_INFOA;
  3951. {$EXTERNALSYM LPNS_SERVICE_INFOA}
  3952. LPNS_SERVICE_INFOA = NS_SERVICE_INFOA;
  3953. {$EXTERNALSYM NS_SERVICE_INFOW}
  3954. NS_SERVICE_INFOW = record
  3955. dwNameSpace : DWORD;
  3956. ServiceInfo : SERVICE_INFOW;
  3957. end;
  3958. {$EXTERNALSYM PNS_SERVICE_INFOW}
  3959. PNS_SERVICE_INFOW = ^NS_SERVICE_INFOW;
  3960. {$EXTERNALSYM LPNS_SERVICE_INFOW}
  3961. LPNS_SERVICE_INFOW = NS_SERVICE_INFOW;
  3962. {$IFNDEF NO_REDECLARE}
  3963. {$EXTERNALSYM NS_SERVICE_INFO}
  3964. {$EXTERNALSYM PNS_SERVICE_INFO}
  3965. {$EXTERNALSYM LPNS_SERVICE_INFO}
  3966. {$IFDEF UNICODE}
  3967. NS_SERVICE_INFO = NS_SERVICE_INFOW;
  3968. PNS_SERVICE_INFO = PNS_SERVICE_INFOW;
  3969. LPNS_SERVICE_INFO = LPNS_SERVICE_INFOW;
  3970. {$ELSE}
  3971. NS_SERVICE_INFO = NS_SERVICE_INFOA;
  3972. PNS_SERVICE_INFO = PNS_SERVICE_INFOA;
  3973. LPNS_SERVICE_INFO = LPNS_SERVICE_INFOA;
  3974. {$ENDIF}
  3975. {$ENDIF}
  3976. {$IFNDEF WINCE}
  3977. type
  3978. // structure for IP_PKTINFO option
  3979. {$EXTERNALSYM IN_PKTINFO}
  3980. IN_PKTINFO = record
  3981. ipi_addr : TInAddr; // destination IPv4 address
  3982. ipi_ifindex : UINT; // received interface index
  3983. end;
  3984. {$NODEFINE TInPktInfo}
  3985. TInPktInfo = IN_PKTINFO;
  3986. {$NODEFINE PInPktInfo}
  3987. PInPktInfo = ^IN_PKTINFO;
  3988. // structure for IPV6_PKTINFO option
  3989. {$EXTERNALSYM IN6_PKTINFO}
  3990. IN6_PKTINFO = record
  3991. ipi6_addr : TIn6Addr; // destination IPv6 address
  3992. ipi6_ifindex : UINT; // received interface index
  3993. end;
  3994. {$NODEFINE TIn6PktInfo}
  3995. TIn6PktInfo = IN6_PKTINFO;
  3996. {$NODEFINE PIn6PktInfo}
  3997. PIn6PktInfo = ^TIn6PktInfo;
  3998. {$ENDIF}
  3999. // Error codes from getaddrinfo()
  4000. const
  4001. {$EXTERNALSYM EAI_AGAIN}
  4002. EAI_AGAIN = WSATRY_AGAIN;
  4003. {$EXTERNALSYM EAI_BADFLAGS}
  4004. EAI_BADFLAGS = WSAEINVAL;
  4005. {$EXTERNALSYM EAI_FAIL}
  4006. EAI_FAIL = WSANO_RECOVERY;
  4007. {$EXTERNALSYM EAI_FAMILY}
  4008. EAI_FAMILY = WSAEAFNOSUPPORT;
  4009. {$EXTERNALSYM EAI_MEMORY}
  4010. EAI_MEMORY = WSA_NOT_ENOUGH_MEMORY;
  4011. // {$EXTERNALSYM EAI_NODATA}
  4012. // EAI_NODATA = WSANO_DATA;
  4013. {$EXTERNALSYM EAI_NONAME}
  4014. EAI_NONAME = WSAHOST_NOT_FOUND;
  4015. {$EXTERNALSYM EAI_SERVICE}
  4016. EAI_SERVICE = WSATYPE_NOT_FOUND;
  4017. {$EXTERNALSYM EAI_SOCKTYPE}
  4018. EAI_SOCKTYPE = WSAESOCKTNOSUPPORT;
  4019. // DCR_FIX: EAI_NODATA remove or fix
  4020. //
  4021. // EAI_NODATA was removed from rfc2553bis
  4022. // need to find out from the authors why and
  4023. // determine the error for "no records of this type"
  4024. // temporarily, we'll keep #define to avoid changing
  4025. // code that could change back; use NONAME
  4026. {$EXTERNALSYM EAI_NODATA}
  4027. EAI_NODATA = EAI_NONAME;
  4028. // Structure used in getaddrinfo() call
  4029. type
  4030. {$NODEFINE PAddrInfo}
  4031. PAddrInfo = ^ADDRINFO;
  4032. {$NODEFINE PPaddrinfo}
  4033. PPaddrinfo = ^PAddrInfo;
  4034. {$NODEFINE PPaddrinfoW}
  4035. PPaddrinfoW = ^PAddrInfoW;
  4036. {$EXTERNALSYM ADDRINFO}
  4037. ADDRINFO = record
  4038. ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
  4039. ai_family : Integer; // PF_xxx
  4040. ai_socktype : Integer; // SOCK_xxx
  4041. ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
  4042. ai_addrlen : size_t; // Length of ai_addr
  4043. ai_canonname : PIdAnsiChar; // Canonical name for nodename
  4044. ai_addr : PSOCKADDR; // Binary address
  4045. ai_next : PAddrInfo; // Next structure in linked list
  4046. end;
  4047. {$NODEFINE TAddrInfo}
  4048. TAddrInfo = ADDRINFO;
  4049. {$EXTERNALSYM LPADDRINFO}
  4050. LPADDRINFO = PAddrInfo;
  4051. {$NODEFINE PAddrInfoW}
  4052. PAddrInfoW = ^ADDRINFOW;
  4053. {$EXTERNALSYM ADDRINFOW}
  4054. ADDRINFOW = record
  4055. ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
  4056. ai_family : Integer; // PF_xxx
  4057. ai_socktype : Integer; // SOCK_xxx
  4058. ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
  4059. ai_addrlen : size_t; // Length of ai_addr
  4060. ai_canonname : PWideChar; // Canonical name for nodename
  4061. ai_addr : PSOCKADDR; // Binary address
  4062. ai_next : PAddrInfoW; // Next structure in linked list
  4063. end;
  4064. {$NODEFINE TAddrInfoW}
  4065. TAddrInfoW = ADDRINFOW;
  4066. {$EXTERNALSYM LPADDRINFOW}
  4067. LPADDRINFOW = PAddrInfoW;
  4068. // Flags used in "hints" argument to getaddrinfo()
  4069. const
  4070. {$EXTERNALSYM AI_PASSIVE}
  4071. AI_PASSIVE = $00000001; // Socket address will be used in bind() call
  4072. {$EXTERNALSYM AI_CANONNAME}
  4073. AI_CANONNAME = $00000002; // Return canonical name in first ai_canonname
  4074. {$EXTERNALSYM AI_NUMERICHOST}
  4075. AI_NUMERICHOST = $00000004; // Nodename must be a numeric address string
  4076. {$EXTERNALSYM AI_NUMERICSERV}
  4077. AI_NUMERICSERV = $00000008; // Servicename must be a numeric port number
  4078. {$EXTERNALSYM AI_ALL}
  4079. AI_ALL = $00000100; // Query both IP6 and IP4 with AI_V4MAPPED
  4080. {$EXTERNALSYM AI_ADDRCONFIG}
  4081. AI_ADDRCONFIG = $00000400; // Resolution only if global address configured
  4082. {$EXTERNALSYM AI_V4MAPPED}
  4083. AI_V4MAPPED = $00000800; // On v6 failure, query v4 and convert to V4MAPPED format (Vista or later)
  4084. {$EXTERNALSYM AI_NON_AUTHORITATIVE}
  4085. AI_NON_AUTHORITATIVE = $00004000; // LUP_NON_AUTHORITATIVE (Vista or later)
  4086. {$EXTERNALSYM AI_SECURE}
  4087. AI_SECURE = $00008000; // LUP_SECURE (Vista or later and applies only to NS_EMAIL namespace.)
  4088. {$EXTERNALSYM AI_RETURN_PREFERRED_NAMES}
  4089. AI_RETURN_PREFERRED_NAMES = $00010000; // LUP_RETURN_PREFERRED_NAMES (Vista or later and applies only to NS_EMAIL namespace.)
  4090. {$EXTERNALSYM AI_FQDN}
  4091. AI_FQDN = $00020000; // Return the FQDN in ai_canonname (Windows 7 or later)
  4092. {$EXTERNALSYM AI_FILESERVER}
  4093. AI_FILESERVER = $00040000; // Resolving fileserver name resolution (Windows 7 or later)
  4094. {$EXTERNALSYM AI_DISABLE_IDN_ENCODING}
  4095. AI_DISABLE_IDN_ENCODING = $00080000; // Disable Internationalized Domain Names handling
  4096. type
  4097. {$EXTERNALSYM PADDRINFOEXA}
  4098. PADDRINFOEXA = ^TAddrInfoEXA;
  4099. {$EXTERNALSYM ADDRINFOEXA}
  4100. ADDRINFOEXA = record
  4101. ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
  4102. ai_family : Integer; // PF_xxx
  4103. ai_socktype : Integer; // SOCK_xxx
  4104. ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
  4105. ai_addrlen : size_t; // Length of ai_addr
  4106. ai_canonname : PIdAnsiChar; // Canonical name for nodename
  4107. ai_addr : Psockaddr; // Binary address
  4108. ai_blob : Pointer;
  4109. ai_bloblen : size_t;
  4110. ai_provider : LPGUID;
  4111. ai_next : PADDRINFOEXA; // Next structure in linked list
  4112. end;
  4113. {$NODEFINE TAddrInfoEXA}
  4114. TAddrInfoExA = ADDRINFOEXA;
  4115. {$EXTERNALSYM LPADDRINFOEXA}
  4116. LPADDRINFOEXA = PADDRINFOEXA;
  4117. {$EXTERNALSYM PADDRINFOEXW}
  4118. PADDRINFOEXW = ^TAddrInfoEXW;
  4119. {$EXTERNALSYM ADDRINFOEXW}
  4120. ADDRINFOEXW = record
  4121. ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
  4122. ai_family : Integer; // PF_xxx
  4123. ai_socktype : Integer; // SOCK_xxx
  4124. ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
  4125. ai_addrlen : size_t; // Length of ai_addr
  4126. ai_canonname : PWideChar; // Canonical name for nodename
  4127. ai_addr : Psockaddr; // Binary address
  4128. ai_blob : Pointer;
  4129. ai_bloblen : size_t;
  4130. ai_provider : LPGUID;
  4131. ai_next : PADDRINFOEXW; // Next structure in linked list
  4132. end;
  4133. {$NODEFINE TAddrInfoExW}
  4134. TAddrInfoExW = ADDRINFOEXW;
  4135. {$EXTERNALSYM LPADDRINFOEXW}
  4136. LPADDRINFOEXW = PADDRINFOEXW;
  4137. {$EXTERNALSYM Paddrinfoex2A}
  4138. Paddrinfoex2A = ^addrinfoex2A;
  4139. {$EXTERNALSYM addrinfoex2A}
  4140. addrinfoex2A = record
  4141. ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
  4142. ai_family : Integer; // PF_xxx
  4143. ai_socktype : Integer; // SOCK_xxx
  4144. ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
  4145. ai_addrlen : size_t; // Length of ai_addr
  4146. ai_canonname : PIdAnsiChar; // Canonical name for nodename
  4147. ai_addr : Psockaddr; // Binary address
  4148. ai_blob : Pointer;
  4149. ai_bloblen : size_t;
  4150. ai_provider : LPGUID;
  4151. ai_next : Paddrinfoex2A; // Next structure in linked list
  4152. ai_version : Integer;
  4153. ai_fqdn : PIdAnsiChar;
  4154. end;
  4155. {$NODEFINE TAddrInfoEx2A}
  4156. TAddrInfoEx2A = addrinfoex2A;
  4157. {$EXTERNALSYM LPADDRINFOEX2A}
  4158. LPADDRINFOEX2A = Paddrinfoex2A;
  4159. {$EXTERNALSYM Paddrinfoex2W}
  4160. Paddrinfoex2W = ^addrinfoex2W;
  4161. {$EXTERNALSYM addrinfoex2W}
  4162. addrinfoex2W = record
  4163. ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
  4164. ai_family : Integer; // PF_xxx
  4165. ai_socktype : Integer; // SOCK_xxx
  4166. ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6
  4167. ai_addrlen : size_t; // Length of ai_addr
  4168. ai_canonname : PWideChar; // Canonical name for nodename
  4169. ai_addr : Psockaddr; //_Field_size_bytes_(ai_addrlen) // Binary address
  4170. ai_blob : Pointer; //_Field_size_(ai_bloblen)
  4171. ai_bloblen : size_t;
  4172. ai_provider : LPGUID;
  4173. ai_next : Paddrinfoex2W; // Next structure in linked list
  4174. ai_version : Integer;
  4175. ai_fqdn : PWideChar;
  4176. end;
  4177. {$NODEFINE TAddrInfoEx2W}
  4178. TAddrInfoEx2W = addrinfoex2W;
  4179. {$EXTERNALSYM LPADDRINFOEX2W}
  4180. LPADDRINFOEX2W = Paddrinfoex2W;
  4181. var
  4182. {$EXTERNALSYM scopeid_unspecified}
  4183. scopeid_unspecified: {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  4184. // RLebeau: the in4addr_any, _in4addr_loopback, and _in4addr_broadcast variables
  4185. // clash with the IN4ADDR_ANY, IN4ADDR_LOOPBACK, and IN4ADDR_BROADCAST constants
  4186. {$EXTERNALSYM in4addr_any}
  4187. {$NODEFINE _in4addr_any}
  4188. _in4addr_any: TInAddr;
  4189. {$EXTERNALSYM in4addr_loopback}
  4190. {$NODEFINE _in4addr_loopback}
  4191. _in4addr_loopback: TInAddr;
  4192. {$EXTERNALSYM in4addr_broadcast}
  4193. {$NODEFINE _in4addr_broadcast}
  4194. _in4addr_broadcast: TInAddr;
  4195. {$EXTERNALSYM in4addr_allnodesonlink}
  4196. in4addr_allnodesonlink: TInAddr;
  4197. {$EXTERNALSYM in4addr_allroutersonlink}
  4198. in4addr_allroutersonlink: TInAddr;
  4199. {$EXTERNALSYM in4addr_alligmpv3routersonlink}
  4200. in4addr_alligmpv3routersonlink: TInAddr;
  4201. {$EXTERNALSYM in4addr_allteredohostsonlink}
  4202. in4addr_allteredohostsonlink: TInAddr;
  4203. {$EXTERNALSYM in4addr_linklocalprefix}
  4204. in4addr_linklocalprefix: TInAddr;
  4205. {$EXTERNALSYM in4addr_multicastprefix}
  4206. in4addr_multicastprefix: TInAddr;
  4207. {$EXTERNALSYM in6addr_any}
  4208. in6addr_any: TIn6Addr;
  4209. {$EXTERNALSYM in6addr_loopback}
  4210. in6addr_loopback: TIn6Addr;
  4211. {$EXTERNALSYM in6addr_allnodesonnode}
  4212. in6addr_allnodesonnode: TIn6Addr;
  4213. {$EXTERNALSYM in6addr_allnodesonlink}
  4214. in6addr_allnodesonlink: TIn6Addr;
  4215. {$EXTERNALSYM in6addr_allroutersonlink}
  4216. in6addr_allroutersonlink: TIn6Addr;
  4217. {$EXTERNALSYM in6addr_solicitednodemulticastprefix}
  4218. in6addr_solicitednodemulticastprefix: TIn6Addr;
  4219. {$EXTERNALSYM in6addr_v4mappedprefix}
  4220. in6addr_v4mappedprefix: TIn6Addr;
  4221. {$EXTERNALSYM in6addr_6to4prefix}
  4222. in6addr_6to4prefix: TIn6Addr;
  4223. {$EXTERNALSYM in6addr_teredoprefix}
  4224. in6addr_teredoprefix: TIn6Addr;
  4225. //=============================================================
  4226. {
  4227. wsipx.h
  4228. Microsoft Windows
  4229. Copyright (C) Microsoft Corporation, 1992-1999.
  4230. Windows Sockets include file for IPX/SPX. This file contains all
  4231. standardized IPX/SPX information. Include this header file after
  4232. winsock.h.
  4233. To open an IPX socket, call socket() with an address family of
  4234. AF_IPX, a socket type of SOCK_DGRAM, and protocol NSPROTO_IPX.
  4235. Note that the protocol value must be specified, it cannot be 0.
  4236. All IPX packets are sent with the packet type field of the IPX
  4237. header set to 0.
  4238. To open an SPX or SPXII socket, call socket() with an address
  4239. family of AF_IPX, socket type of SOCK_SEQPACKET or SOCK_STREAM,
  4240. and protocol of NSPROTO_SPX or NSPROTO_SPXII. If SOCK_SEQPACKET
  4241. is specified, then the end of message bit is respected, and
  4242. recv() calls are not completed until a packet is received with
  4243. the end of message bit set. If SOCK_STREAM is specified, then
  4244. the end of message bit is not respected, and recv() completes
  4245. as soon as any data is received, regardless of the setting of the
  4246. end of message bit. Send coalescing is never performed, and sends
  4247. smaller than a single packet are always sent with the end of
  4248. message bit set. Sends larger than a single packet are packetized
  4249. with the end of message bit set on only the last packet of the
  4250. send.
  4251. }
  4252. // This is the structure of the SOCKADDR structure for IPX and SPX.
  4253. type
  4254. {$EXTERNALSYM SOCKADDR_IPX}
  4255. SOCKADDR_IPX = record
  4256. sa_family : u_short;
  4257. sa_netnum : Array [0..3] of TIdAnsiChar;
  4258. sa_nodenum : Array [0..5] of TIdAnsiChar;
  4259. sa_socket : u_short;
  4260. end;
  4261. {$NODEFINE TSockAddrIPX}
  4262. TSockAddrIPX = SOCKADDR_IPX;
  4263. {$NODEFINE PSockAddrIPX}
  4264. PSockAddrIPX = ^TSockAddrIPX;
  4265. {$EXTERNALSYM PSOCKADDR_IPX}
  4266. PSOCKADDR_IPX = PSockAddrIPX;
  4267. {$EXTERNALSYM LPSOCKADDR_IPX}
  4268. LPSOCKADDR_IPX = PSOCKADDR_IPX;
  4269. // Protocol families used in the "protocol" parameter of the socket() API.
  4270. const
  4271. {$EXTERNALSYM NSPROTO_IPX}
  4272. NSPROTO_IPX = 1000;
  4273. {$EXTERNALSYM NSPROTO_SPX}
  4274. NSPROTO_SPX = 1256;
  4275. {$EXTERNALSYM NSPROTO_SPXII}
  4276. NSPROTO_SPXII = 1257;
  4277. //=============================================================
  4278. {
  4279. wsnwlink.h
  4280. Microsoft Windows
  4281. Copyright (C) Microsoft Corporation, 1992-1999.
  4282. Microsoft-specific extensions to the Windows NT IPX/SPX Windows
  4283. Sockets interface. These extensions are provided for use as
  4284. necessary for compatibility with existing applications. They are
  4285. otherwise not recommended for use, as they are only guaranteed to
  4286. work over the Microsoft IPX/SPX stack. An application which
  4287. uses these extensions may not work over other IPX/SPX
  4288. implementations. Include this header file after winsock.h and
  4289. wsipx.h.
  4290. To open an IPX socket where a particular packet type is sent in
  4291. the IPX header, specify NSPROTO_IPX + n as the protocol parameter
  4292. of the socket() API. For example, to open an IPX socket that
  4293. sets the packet type to 34, use the following socket() call:
  4294. s = socket(AF_IPX, SOCK_DGRAM, NSPROTO_IPX + 34);
  4295. }
  4296. // Below are socket option that may be set or retrieved by specifying
  4297. // the appropriate manifest in the "optname" parameter of getsockopt()
  4298. // or setsockopt(). Use NSPROTO_IPX as the "level" argument for the
  4299. // call.
  4300. const
  4301. // Set/get the IPX packet type. The value specified in the
  4302. // optval argument will be set as the packet type on every IPX
  4303. // packet sent from this socket. The optval parameter of
  4304. // getsockopt()/setsockopt() points to an int.
  4305. {$EXTERNALSYM IPX_PTYPE}
  4306. IPX_PTYPE = $4000;
  4307. // Set/get the receive filter packet type. Only IPX packets with
  4308. // a packet type equal to the value specified in the optval
  4309. // argument will be returned; packets with a packet type that
  4310. // does not match are discarded. optval points to an int.
  4311. {$EXTERNALSYM IPX_FILTERPTYPE}
  4312. IPX_FILTERPTYPE = $4001;
  4313. // Stop filtering on packet type set with IPX_FILTERPTYPE.
  4314. {$EXTERNALSYM IPX_STOPFILTERPTYPE}
  4315. IPX_STOPFILTERPTYPE = $4003;
  4316. // Set/get the value of the datastream field in the SPX header on
  4317. // every packet sent. optval points to an int.
  4318. {$EXTERNALSYM IPX_DSTYPE}
  4319. IPX_DSTYPE = $4002;
  4320. // Enable extended addressing. On sends, adds the element
  4321. // "unsigned char sa_ptype" to the SOCKADDR_IPX structure,
  4322. // making the total length 15 bytes. On receives, add both
  4323. // the sa_ptype and "unsigned char sa_flags" to the SOCKADDR_IPX
  4324. // structure, making the total length 16 bytes. The current
  4325. // bits defined in sa_flags are:
  4326. // 0x01 - the received frame was sent as a broadcast
  4327. // 0x02 - the received frame was sent from this machine
  4328. // optval points to a BOOL.
  4329. {$EXTERNALSYM IPX_EXTENDED_ADDRESS}
  4330. IPX_EXTENDED_ADDRESS = $4004;
  4331. // Send protocol header up on all receive packets. optval points
  4332. // to a BOOL.
  4333. {$EXTERNALSYM IPX_RECVHDR}
  4334. IPX_RECVHDR = $4005;
  4335. // Get the maximum data size that can be sent. Not valid with
  4336. // setsockopt(). optval points to an int where the value is
  4337. // returned.
  4338. {$EXTERNALSYM IPX_MAXSIZE}
  4339. IPX_MAXSIZE = $4006;
  4340. // Query information about a specific adapter that IPX is bound
  4341. // to. In a system with n adapters they are numbered 0 through n-1.
  4342. // Callers can issue the IPX_MAX_ADAPTER_NUM getsockopt() to find
  4343. // out the number of adapters present, or call IPX_ADDRESS with
  4344. // increasing values of adapternum until it fails. Not valid
  4345. // with setsockopt(). optval points to an instance of the
  4346. // IPX_ADDRESS_DATA structure with the adapternum filled in.
  4347. {$EXTERNALSYM IPX_ADDRESS}
  4348. IPX_ADDRESS = $4007;
  4349. type
  4350. {$EXTERNALSYM IPX_ADDRESS_DATA}
  4351. IPX_ADDRESS_DATA = record
  4352. adapternum : Integer; // input: 0-based adapter number
  4353. netnum : Array [0..3] of Byte; // output: IPX network number
  4354. nodenum : Array [0..5] of Byte; // output: IPX node address
  4355. wan : Boolean; // output: TRUE = adapter is on a wan link
  4356. status : Boolean; // output: TRUE = wan link is up (or adapter is not wan)
  4357. maxpkt : Integer; // output: max packet size, not including IPX header
  4358. linkspeed : ULONG; // output: link speed in 100 bytes/sec (i.e. 96 == 9600 bps)
  4359. end;
  4360. {$NODEFINE TIPXAddressData}
  4361. TIPXAddressData = IPX_ADDRESS_DATA;
  4362. {$NODEFINE PIPXAddressData}
  4363. PIPXAddressData = ^TIPXAddressData;
  4364. {$EXTERNALSYM PIPX_ADDRESS_DATA}
  4365. PIPX_ADDRESS_DATA = PIPXAddressData;
  4366. const
  4367. // Query information about a specific IPX network number. If the
  4368. // network is in IPX's cache it will return the information directly, {Do not Localize}
  4369. // otherwise it will issue RIP requests to find it. Not valid with
  4370. // setsockopt(). optval points to an instance of the IPX_NETNUM_DATA
  4371. // structure with the netnum filled in.
  4372. {$EXTERNALSYM IPX_GETNETINFO}
  4373. IPX_GETNETINFO = $4008;
  4374. type
  4375. {$EXTERNALSYM IPX_NETNUM_DATA}
  4376. IPX_NETNUM_DATA = record
  4377. netnum : Array [0..3] of Byte; // input: IPX network number
  4378. hopcount : Word; // output: hop count to this network, in machine order
  4379. netdelay : Word; // output: tick count to this network, in machine order
  4380. cardnum : Integer; // output: 0-based adapter number used to route to this net;
  4381. // can be used as adapternum input to IPX_ADDRESS
  4382. router : Array [0..5] of Byte; // output: MAC address of the next hop router, zeroed if
  4383. // the network is directly attached
  4384. end;
  4385. {$NODEFINE TIPXNetNumData}
  4386. TIPXNetNumData = IPX_NETNUM_DATA;
  4387. {$NODEFINE PIPXNetNumData}
  4388. PIPXNetNumData = ^TIPXNetNumData;
  4389. {$EXTERNALSYM PIPX_NETNUM_DATA}
  4390. PIPX_NETNUM_DATA = PIPXNetNumData;
  4391. const
  4392. // Like IPX_GETNETINFO except it does not issue RIP requests. If the
  4393. // network is in IPX's cache it will return the information, otherwise {Do not Localize}
  4394. // it will fail (see also IPX_RERIPNETNUMBER which always forces a
  4395. // re-RIP). Not valid with setsockopt(). optval points to an instance of
  4396. // the IPX_NETNUM_DATA structure with the netnum filled in.
  4397. {$EXTERNALSYM IPX_GETNETINFO_NORIP}
  4398. IPX_GETNETINFO_NORIP = $4009;
  4399. // Get information on a connected SPX socket. optval points
  4400. // to an instance of the IPX_SPXCONNSTATUS_DATA structure.
  4401. // *** All numbers are in Novell (high-low) order. ***
  4402. {$EXTERNALSYM IPX_SPXGETCONNECTIONSTATUS}
  4403. IPX_SPXGETCONNECTIONSTATUS = $400B;
  4404. type
  4405. {$EXTERNALSYM IPX_SPXCONNSTATUS_DATA}
  4406. IPX_SPXCONNSTATUS_DATA = record
  4407. ConnectionState : Byte;
  4408. WatchDogActive : Byte;
  4409. LocalConnectionId : Word;
  4410. RemoteConnectionId : Word;
  4411. LocalSequenceNumber : Word;
  4412. LocalAckNumber : Word;
  4413. LocalAllocNumber : Word;
  4414. RemoteAckNumber : Word;
  4415. RemoteAllocNumber : Word;
  4416. LocalSocket : Word;
  4417. ImmediateAddress : Array [0..5] of Byte;
  4418. RemoteNetwork : Array [0..3] of Byte;
  4419. RemoteNode : Array [0..5] of Byte;
  4420. RemoteSocket : Word;
  4421. RetransmissionCount : Word;
  4422. EstimatedRoundTripDelay : Word; // In milliseconds
  4423. RetransmittedPackets : Word;
  4424. SuppressedPacket : Word;
  4425. end;
  4426. {$NODEFINE TIPXSPXConnStatusData}
  4427. TIPXSPXConnStatusData = IPX_SPXCONNSTATUS_DATA;
  4428. {$NODEFINE PIPXSPXConnStatusData}
  4429. PIPXSPXConnStatusData = ^TIPXSPXConnStatusData;
  4430. {$EXTERNALSYM PIPX_SPXCONNSTATUS_DATA}
  4431. PIPX_SPXCONNSTATUS_DATA = PIPXSPXConnStatusData;
  4432. const
  4433. // Get notification when the status of an adapter that IPX is
  4434. // bound to changes. Typically this will happen when a wan line
  4435. // goes up or down. Not valid with setsockopt(). optval points
  4436. // to a buffer which contains an IPX_ADDRESS_DATA structure
  4437. // followed immediately by a HANDLE to an unsignaled event.
  4438. //
  4439. // When the getsockopt() query is submitted, it will complete
  4440. // successfully. However, the IPX_ADDRESS_DATA pointed to by
  4441. // optval will not be updated at that point. Instead the
  4442. // request is queued internally inside the transport.
  4443. //
  4444. // When the status of an adapter changes, IPX will locate a
  4445. // queued getsockopt() query and fill in all the fields in the
  4446. // IPX_ADDRESS_DATA structure. It will then signal the event
  4447. // pointed to by the HANDLE in the optval buffer. This handle
  4448. // should be obtained before calling getsockopt() by calling
  4449. // CreateEvent(). If multiple getsockopts() are submitted at
  4450. // once, different events must be used.
  4451. //
  4452. // The event is used because the call needs to be asynchronous
  4453. // but currently getsockopt() does not support this.
  4454. //
  4455. // WARNING: In the current implementation, the transport will
  4456. // only signal one queued query for each status change. Therefore
  4457. // only one service which uses this query should be running at
  4458. // once.
  4459. {$EXTERNALSYM IPX_ADDRESS_NOTIFY}
  4460. IPX_ADDRESS_NOTIFY = $400C;
  4461. // Get the maximum number of adapters present. If this call returns
  4462. // n then the adapters are numbered 0 through n-1. Not valid
  4463. // with setsockopt(). optval points to an int where the value
  4464. // is returned.
  4465. {$EXTERNALSYM IPX_MAX_ADAPTER_NUM}
  4466. IPX_MAX_ADAPTER_NUM = $400D;
  4467. // Like IPX_GETNETINFO except it forces IPX to re-RIP even if the
  4468. // network is in its cache (but not if it is directly attached to).
  4469. // Not valid with setsockopt(). optval points to an instance of
  4470. // the IPX_NETNUM_DATA structure with the netnum filled in.
  4471. {$EXTERNALSYM IPX_RERIPNETNUMBER}
  4472. IPX_RERIPNETNUMBER = $400E;
  4473. // A hint that broadcast packets may be received. The default is
  4474. // TRUE. Applications that do not need to receive broadcast packets
  4475. // should set this sockopt to FALSE which may cause better system
  4476. // performance (note that it does not necessarily cause broadcasts
  4477. // to be filtered for the application). Not valid with getsockopt().
  4478. // optval points to a BOOL.
  4479. {$EXTERNALSYM IPX_RECEIVE_BROADCAST}
  4480. IPX_RECEIVE_BROADCAST = $400F;
  4481. // On SPX connections, don't delay before sending ack. Applications {Do not Localize}
  4482. // that do not tend to have back-and-forth traffic over SPX should
  4483. // set this; it will increase the number of acks sent but will remove
  4484. // delays in sending acks. optval points to a BOOL.
  4485. {$EXTERNALSYM IPX_IMMEDIATESPXACK}
  4486. IPX_IMMEDIATESPXACK = $4010;
  4487. //=============================================================
  4488. // wsnetbs.h
  4489. // Copyright (c) 1994-1999, Microsoft Corp. All rights reserved.
  4490. //
  4491. // Windows Sockets include file for NETBIOS. This file contains all
  4492. // standardized NETBIOS information. Include this header file after
  4493. // winsock.h.
  4494. // To open a NetBIOS socket, call the socket() function as follows:
  4495. //
  4496. // s = socket( AF_NETBIOS, {SOCK_SEQPACKET|SOCK_DGRAM}, -Lana );
  4497. //
  4498. // where Lana is the NetBIOS Lana number of interest. For example, to
  4499. // open a socket for Lana 2, specify -2 as the "protocol" parameter
  4500. // to the socket() function.
  4501. // This is the structure of the SOCKADDR structure for NETBIOS.
  4502. const
  4503. {$EXTERNALSYM NETBIOS_NAME_LENGTH}
  4504. NETBIOS_NAME_LENGTH = 16;
  4505. type
  4506. {$EXTERNALSYM SOCKADDR_NB}
  4507. SOCKADDR_NB = record
  4508. snb_family : short;
  4509. snb_type : u_short;
  4510. snb_name : array[0..NETBIOS_NAME_LENGTH-1] of TIdAnsiChar;
  4511. end;
  4512. {$NODEFINE TSockAddrNB}
  4513. TSockAddrNB = SOCKADDR_NB;
  4514. {$NODEFINE PSockAddrNB}
  4515. PSockAddrNB = ^TSockAddrNB;
  4516. {$EXTERNALSYM PSOCKADDR_NB}
  4517. PSOCKADDR_NB = PSockAddrNB;
  4518. {$EXTERNALSYM LPSOCKADDR_NB}
  4519. LPSOCKADDR_NB = PSOCKADDR_NB;
  4520. // Bit values for the snb_type field of SOCKADDR_NB.
  4521. const
  4522. {$EXTERNALSYM NETBIOS_UNIQUE_NAME}
  4523. NETBIOS_UNIQUE_NAME = $0000;
  4524. {$EXTERNALSYM NETBIOS_GROUP_NAME}
  4525. NETBIOS_GROUP_NAME = $0001;
  4526. {$EXTERNALSYM NETBIOS_TYPE_QUICK_UNIQUE}
  4527. NETBIOS_TYPE_QUICK_UNIQUE = $0002;
  4528. {$EXTERNALSYM NETBIOS_TYPE_QUICK_GROUP}
  4529. NETBIOS_TYPE_QUICK_GROUP = $0003;
  4530. // A macro convenient for setting up NETBIOS SOCKADDRs.
  4531. {$EXTERNALSYM SET_NETBIOS_SOCKADDR}
  4532. procedure SET_NETBIOS_SOCKADDR(snb : PSockAddrNB; const SnbType : Word; const Name : PIdAnsiChar; const Port : TIdAnsiChar);
  4533. //=============================================================
  4534. // Copyright 1997 - 1998 Microsoft Corporation
  4535. //
  4536. // Module Name:
  4537. //
  4538. // ws2atm.h
  4539. //
  4540. // Abstract:
  4541. //
  4542. // Winsock 2 ATM Annex definitions.
  4543. const
  4544. {$EXTERNALSYM ATMPROTO_AALUSER}
  4545. ATMPROTO_AALUSER = $00; // User-defined AAL
  4546. {$EXTERNALSYM ATMPROTO_AAL1}
  4547. ATMPROTO_AAL1 = $01; // AAL 1
  4548. {$EXTERNALSYM ATMPROTO_AAL2}
  4549. ATMPROTO_AAL2 = $02; // AAL 2
  4550. {$EXTERNALSYM ATMPROTO_AAL34}
  4551. ATMPROTO_AAL34 = $03; // AAL 3/4
  4552. {$EXTERNALSYM ATMPROTO_AAL5}
  4553. ATMPROTO_AAL5 = $05; // AAL 5
  4554. {$EXTERNALSYM SAP_FIELD_ABSENT}
  4555. SAP_FIELD_ABSENT = $FFFFFFFE;
  4556. {$EXTERNALSYM SAP_FIELD_ANY}
  4557. SAP_FIELD_ANY = $FFFFFFFF;
  4558. {$EXTERNALSYM SAP_FIELD_ANY_AESA_SEL}
  4559. SAP_FIELD_ANY_AESA_SEL = $FFFFFFFA;
  4560. {$EXTERNALSYM SAP_FIELD_ANY_AESA_REST}
  4561. SAP_FIELD_ANY_AESA_REST = $FFFFFFFB;
  4562. // values used for AddressType in struct ATM_ADDRESS
  4563. {$EXTERNALSYM ATM_E164}
  4564. ATM_E164 = $01; // E.164 addressing scheme
  4565. {$EXTERNALSYM ATM_NSAP}
  4566. ATM_NSAP = $02; // NSAP-style ATM Endsystem Address scheme
  4567. {$EXTERNALSYM ATM_AESA}
  4568. ATM_AESA = $02; // NSAP-style ATM Endsystem Address scheme
  4569. {$EXTERNALSYM ATM_ADDR_SIZE}
  4570. ATM_ADDR_SIZE = 20;
  4571. type
  4572. {$EXTERNALSYM ATM_ADDRESS}
  4573. ATM_ADDRESS = record
  4574. AddressType : DWORD; // E.164 or NSAP-style ATM Endsystem Address
  4575. NumofDigits : DWORD; // number of digits;
  4576. Addr : Array[0..ATM_ADDR_SIZE-1] of Byte; // IA5 digits for E164, BCD encoding for NSAP
  4577. // format as defined in the ATM Forum UNI 3.1
  4578. end;
  4579. // values used for Layer2Protocol in B-LLI
  4580. const
  4581. {$EXTERNALSYM BLLI_L2_ISO_1745}
  4582. BLLI_L2_ISO_1745 = $01; // Basic mode ISO 1745
  4583. {$EXTERNALSYM BLLI_L2_Q921}
  4584. BLLI_L2_Q921 = $02; // CCITT Rec. Q.921
  4585. {$EXTERNALSYM BLLI_L2_X25L}
  4586. BLLI_L2_X25L = $06; // CCITT Rec. X.25, link layer
  4587. {$EXTERNALSYM BLLI_L2_X25M}
  4588. BLLI_L2_X25M = $07; // CCITT Rec. X.25, multilink
  4589. {$EXTERNALSYM BLLI_L2_ELAPB}
  4590. BLLI_L2_ELAPB = $08; // Extended LAPB; for half duplex operation
  4591. {$EXTERNALSYM BLLI_L2_HDLC_NRM}
  4592. BLLI_L2_HDLC_NRM = $09; // HDLC NRM (ISO 4335)
  4593. {$EXTERNALSYM BLLI_L2_HDLC_ABM}
  4594. BLLI_L2_HDLC_ABM = $0A; // HDLC ABM (ISO 4335)
  4595. {$EXTERNALSYM BLLI_L2_HDLC_ARM}
  4596. BLLI_L2_HDLC_ARM = $0B; // HDLC ARM (ISO 4335)
  4597. {$EXTERNALSYM BLLI_L2_LLC}
  4598. BLLI_L2_LLC = $0C; // LAN logical link control (ISO 8802/2)
  4599. {$EXTERNALSYM BLLI_L2_X75}
  4600. BLLI_L2_X75 = $0D; // CCITT Rec. X.75, single link procedure
  4601. {$EXTERNALSYM BLLI_L2_Q922}
  4602. BLLI_L2_Q922 = $0E; // CCITT Rec. Q.922
  4603. {$EXTERNALSYM BLLI_L2_USER_SPECIFIED}
  4604. BLLI_L2_USER_SPECIFIED = $10; // User Specified
  4605. {$EXTERNALSYM BLLI_L2_ISO_7776}
  4606. BLLI_L2_ISO_7776 = $11; // ISO 7776 DTE-DTE operation
  4607. // values used for Layer3Protocol in B-LLI
  4608. {$EXTERNALSYM BLLI_L3_X25}
  4609. BLLI_L3_X25 = $06; // CCITT Rec. X.25, packet layer
  4610. {$EXTERNALSYM BLLI_L3_ISO_8208}
  4611. BLLI_L3_ISO_8208 = $07; // ISO/IEC 8208 (X.25 packet layer for DTE
  4612. {$EXTERNALSYM BLLI_L3_X223}
  4613. BLLI_L3_X223 = $08; // X.223/ISO 8878
  4614. {$EXTERNALSYM BLLI_L3_SIO_8473}
  4615. BLLI_L3_SIO_8473 = $09; // ISO/IEC 8473 (OSI connectionless)
  4616. {$EXTERNALSYM BLLI_L3_T70}
  4617. BLLI_L3_T70 = $0A; // CCITT Rec. T.70 min. network layer
  4618. {$EXTERNALSYM BLLI_L3_ISO_TR9577}
  4619. BLLI_L3_ISO_TR9577 = $0B; // ISO/IEC TR 9577 Network Layer Protocol ID
  4620. {$EXTERNALSYM BLLI_L3_USER_SPECIFIED}
  4621. BLLI_L3_USER_SPECIFIED = $10; // User Specified
  4622. // values used for Layer3IPI in B-LLI
  4623. {$EXTERNALSYM BLLI_L3_IPI_SNAP}
  4624. BLLI_L3_IPI_SNAP = $80; // IEEE 802.1 SNAP identifier
  4625. {$EXTERNALSYM BLLI_L3_IPI_IP}
  4626. BLLI_L3_IPI_IP = $CC; // Internet Protocol (IP) identifier
  4627. type
  4628. {$EXTERNALSYM ATM_BLLI}
  4629. ATM_BLLI = record
  4630. // Identifies the layer-two protocol.
  4631. // Corresponds to the User information layer 2 protocol field in the B-LLI information element.
  4632. // A value of SAP_FIELD_ABSENT indicates that this field is not used, and a value of SAP_FIELD_ANY means wildcard.
  4633. Layer2Protocol : DWORD; // User information layer 2 protocol
  4634. // Identifies the user-specified layer-two protocol.
  4635. // Only used if the Layer2Protocol parameter is set to BLLI_L2_USER_SPECIFIED.
  4636. // The valid values range from zero-127.
  4637. // Corresponds to the User specified layer 2 protocol information field in the B-LLI information element.
  4638. Layer2UserSpecifiedProtocol : DWORD; // User specified layer 2 protocol information
  4639. // Identifies the layer-three protocol.
  4640. // Corresponds to the User information layer 3 protocol field in the B-LLI information element.
  4641. // A value of SAP_FIELD_ABSENT indicates that this field is not used, and a value of SAP_FIELD_ANY means wildcard.
  4642. Layer3Protocol : DWORD; // User information layer 3 protocol
  4643. // Identifies the user-specified layer-three protocol.
  4644. // Only used if the Layer3Protocol parameter is set to BLLI_L3_USER_SPECIFIED.
  4645. // The valid values range from zero-127.
  4646. // Corresponds to the User specified layer 3 protocol information field in the B-LLI information element.
  4647. Layer3UserSpecifiedProtocol : DWORD; // User specified layer 3 protocol information
  4648. // Identifies the layer-three Initial Protocol Identifier.
  4649. // Only used if the Layer3Protocol parameter is set to BLLI_L3_ISO_TR9577.
  4650. // Corresponds to the ISO/IEC TR 9577 Initial Protocol Identifier field in the B-LLI information element.
  4651. Layer3IPI : DWORD; // ISO/IEC TR 9577 Initial Protocol Identifier
  4652. // Identifies the 802.1 SNAP identifier.
  4653. // Only used if the Layer3Protocol parameter is set to BLLI_L3_ISO_TR9577 and Layer3IPI is set to BLLI_L3_IPI_SNAP,
  4654. // indicating an IEEE 802.1 SNAP identifier. Corresponds to the OUI and PID fields in the B-LLI information element.
  4655. SnapID : Array[0..4] of Byte; // SNAP ID consisting of OUI and PID
  4656. end;
  4657. // values used for the HighLayerInfoType field in ATM_BHLI
  4658. const
  4659. {$EXTERNALSYM BHLI_ISO}
  4660. BHLI_ISO = $00; // ISO
  4661. {$EXTERNALSYM BHLI_UserSpecific}
  4662. BHLI_UserSpecific = $01; // User Specific
  4663. {$EXTERNALSYM BHLI_HighLayerProfile}
  4664. BHLI_HighLayerProfile = $02; // High layer profile (only in UNI3.0)
  4665. {$EXTERNALSYM BHLI_VendorSpecificAppId}
  4666. BHLI_VendorSpecificAppId = $03; // Vendor-Specific Application ID
  4667. type
  4668. {$EXTERNALSYM ATM_BHLI}
  4669. ATM_BHLI = record
  4670. // Identifies the high layer information type field in the B-LLI information element.
  4671. // Note that the type BHLI_HighLayerProfile has been eliminated in UNI 3.1.
  4672. // A value of SAP_FIELD_ABSENT indicates that B-HLI is not present, and a value of SAP_FIELD_ANY means wildcard.
  4673. HighLayerInfoType : DWORD; // High Layer Information Type
  4674. // Identifies the number of bytes from one to eight in the HighLayerInfo array.
  4675. // Valid values include eight for the cases of BHLI_ISO and BHLI_UserSpecific,
  4676. // four for BHLI_HighLayerProfile, and seven for BHLI_VendorSpecificAppId.
  4677. HighLayerInfoLength : DWORD; // number of bytes in HighLayerInfo
  4678. // Identifies the high layer information field in the B-LLI information element.
  4679. // In the case of HighLayerInfoType being BHLI_VendorSpecificAppId,
  4680. // the first 3 bytes consist of a globally-administered Organizationally Unique Identifier (OUI)
  4681. // (as per IEEE standard 802-1990), followed by a 4-byte application identifier,
  4682. // which is administered by the vendor identified by the OUI.
  4683. // Value for the case of BHLI_UserSpecific is user defined and requires bilateral agreement between two end users.
  4684. HighLayerInfo : Array[0..7] of Byte; // the value dependent on the HighLayerInfoType field
  4685. end;
  4686. // A new address family, AF_ATM, is introduced for native ATM services,
  4687. // and the corresponding SOCKADDR structure, sockaddr_atm, is defined in the following.
  4688. // To open a socket for native ATM services, parameters in socket should contain
  4689. // AF_ATM, SOCK_RAW, and ATMPROTO_AAL5 or ATMPROTO_AALUSER, respectively.
  4690. {$EXTERNALSYM SOCKADDR_ATM}
  4691. SOCKADDR_ATM = record
  4692. // Identifies the address family, which is AF_ATM in this case.
  4693. satm_family : u_short;
  4694. // Identifies the ATM address that could be either in E.164 or NSAP-style ATM End Systems Address format.
  4695. // This field will be mapped to the Called Party Number IE (Information Element)
  4696. // if it is specified in bind and WSPBind for a listening socket, or in connect, WSAConnect, WSPConnect,
  4697. // WSAJoinLeaf, or WSPJoinLeaf for a connecting socket.
  4698. // It will be mapped to the Calling Party Number IE if specified in bind and WSPBind for a connecting socket.
  4699. satm_number : ATM_ADDRESS;
  4700. // Identifies the fields in the B-LLI Information Element that are used along with satm_bhli to identify an application.
  4701. // Note that the B-LLI layer two information is treated as not present
  4702. // if its Layer2Protocol field contains SAP_FIELD_ABSENT, or as a wildcard if it contains SAP_FIELD_ANY.
  4703. // Similarly, the B-LLI layer three information is treated as not present
  4704. // if its Layer3Protocol field contains SAP_FIELD_ABSENT, or as a wildcard if it contains SAP_FIELD_ANY.
  4705. satm_blli : ATM_BLLI; // B-LLI
  4706. // Identifies the fields in the B-HLI Information Element that are used along with satm_blli to identify an application.
  4707. satm_bhli : ATM_BHLI; // B-HLI
  4708. end;
  4709. {$NODEFINE TSockAddrATM}
  4710. TSockAddrATM = SOCKADDR_ATM;
  4711. {$NODEFINE PSockAddrATM}
  4712. PSockAddrATM = ^TSockAddrATM;
  4713. {$EXTERNALSYM PSOCKADDR_ATM}
  4714. PSOCKADDR_ATM = PSockAddrATM;
  4715. {$EXTERNALSYM LPSOCKADDR_ATM}
  4716. LPSOCKADDR_ATM = PSOCKADDR_ATM;
  4717. {$EXTERNALSYM Q2931_IE_TYPE}
  4718. Q2931_IE_TYPE = (
  4719. IE_AALParameters,
  4720. IE_TrafficDescriptor,
  4721. IE_BroadbandBearerCapability,
  4722. IE_BHLI,
  4723. IE_BLLI,
  4724. IE_CalledPartyNumber,
  4725. IE_CalledPartySubaddress,
  4726. IE_CallingPartyNumber,
  4727. IE_CallingPartySubaddress,
  4728. IE_Cause,
  4729. IE_QOSClass,
  4730. IE_TransitNetworkSelection);
  4731. {$EXTERNALSYM Q2931_IE}
  4732. Q2931_IE = record
  4733. IEType : Q2931_IE_TYPE;
  4734. IELength : ULONG;
  4735. IE : Array[0..0] of Byte;
  4736. end;
  4737. // manifest constants for the AALType field in struct AAL_PARAMETERS_IE
  4738. {$EXTERNALSYM AAL_TYPE}
  4739. AAL_TYPE = LongInt;
  4740. const
  4741. {$EXTERNALSYM AALTYPE_5}
  4742. AALTYPE_5 = 5; // AAL 5
  4743. {$EXTERNALSYM AALTYPE_USER}
  4744. AALTYPE_USER = 16; // user-defined AAL
  4745. // values used for the Mode field in struct AAL5_PARAMETERS
  4746. {$EXTERNALSYM AAL5_MODE_MESSAGE}
  4747. AAL5_MODE_MESSAGE = $01;
  4748. {$EXTERNALSYM AAL5_MODE_STREAMING}
  4749. AAL5_MODE_STREAMING = $02;
  4750. // values used for the SSCSType field in struct AAL5_PARAMETERS
  4751. {$EXTERNALSYM AAL5_SSCS_NULL}
  4752. AAL5_SSCS_NULL = $00;
  4753. {$EXTERNALSYM AAL5_SSCS_SSCOP_ASSURED}
  4754. AAL5_SSCS_SSCOP_ASSURED = $01;
  4755. {$EXTERNALSYM AAL5_SSCS_SSCOP_NON_ASSURED}
  4756. AAL5_SSCS_SSCOP_NON_ASSURED = $02;
  4757. {$EXTERNALSYM AAL5_SSCS_FRAME_RELAY}
  4758. AAL5_SSCS_FRAME_RELAY = $04;
  4759. type
  4760. {$EXTERNALSYM AAL5_PARAMETERS}
  4761. AAL5_PARAMETERS = record
  4762. ForwardMaxCPCSSDUSize : ULONG;
  4763. BackwardMaxCPCSSDUSize : ULONG;
  4764. Mode : Byte; // only available in UNI 3.0
  4765. SSCSType : Byte;
  4766. end;
  4767. {$EXTERNALSYM AALUSER_PARAMETERS}
  4768. AALUSER_PARAMETERS = record
  4769. UserDefined : ULONG;
  4770. end;
  4771. {$EXTERNALSYM AAL_PARAMETERS_IE}
  4772. AAL_PARAMETERS_IE = record
  4773. AALType : AAL_TYPE;
  4774. case Byte of
  4775. 0: ( AAL5Parameters : AAL5_PARAMETERS );
  4776. 1: ( AALUserParameters : AALUSER_PARAMETERS );
  4777. end;
  4778. {$EXTERNALSYM ATM_TD}
  4779. ATM_TD = record
  4780. PeakCellRate_CLP0 : ULONG;
  4781. PeakCellRate_CLP01 : ULONG;
  4782. SustainableCellRate_CLP0 : ULONG;
  4783. SustainableCellRate_CLP01 : ULONG;
  4784. MaxBurstSize_CLP0 : ULONG;
  4785. MaxBurstSize_CLP01 : ULONG;
  4786. Tagging : LongBool;
  4787. end;
  4788. {$EXTERNALSYM ATM_TRAFFIC_DESCRIPTOR_IE}
  4789. ATM_TRAFFIC_DESCRIPTOR_IE = record
  4790. _Forward : ATM_TD;
  4791. Backward : ATM_TD;
  4792. BestEffort : LongBool;
  4793. end;
  4794. // values used for the BearerClass field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
  4795. const
  4796. {$EXTERNALSYM BCOB_A}
  4797. BCOB_A = $01; // Bearer class A
  4798. {$EXTERNALSYM BCOB_C}
  4799. BCOB_C = $03; // Bearer class C
  4800. {$EXTERNALSYM BCOB_X}
  4801. BCOB_X = $10; // Bearer class X
  4802. // values used for the TrafficType field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
  4803. {$EXTERNALSYM TT_NOIND}
  4804. TT_NOIND = $00; // No indication of traffic type
  4805. {$EXTERNALSYM TT_CBR}
  4806. TT_CBR = $04; // Constant bit rate
  4807. {$EXTERNALSYM TT_VBR}
  4808. TT_VBR = $06; // Variable bit rate
  4809. // values used for the TimingRequirements field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
  4810. {$EXTERNALSYM TR_NOIND}
  4811. TR_NOIND = $00; // No timing requirement indication
  4812. {$EXTERNALSYM TR_END_TO_END}
  4813. TR_END_TO_END = $01; // End-to-end timing required
  4814. {$EXTERNALSYM TR_NO_END_TO_END}
  4815. TR_NO_END_TO_END = $02; // End-to-end timing not required
  4816. // values used for the ClippingSusceptability field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
  4817. {$EXTERNALSYM CLIP_NOT}
  4818. CLIP_NOT = $00; // Not susceptible to clipping
  4819. {$EXTERNALSYM CLIP_SUS}
  4820. CLIP_SUS = $20; // Susceptible to clipping
  4821. // values used for the UserPlaneConnectionConfig field in struct ATM_BROADBAND_BEARER_CAPABILITY_IE
  4822. {$EXTERNALSYM UP_P2P}
  4823. UP_P2P = $00; // Point-to-point connection
  4824. {$EXTERNALSYM UP_P2MP}
  4825. UP_P2MP = $01; // Point-to-multipoint connection
  4826. type
  4827. {$EXTERNALSYM ATM_BROADBAND_BEARER_CAPABILITY_IE}
  4828. ATM_BROADBAND_BEARER_CAPABILITY_IE = record
  4829. BearerClass : Byte;
  4830. TrafficType : Byte;
  4831. TimingRequirements : Byte;
  4832. ClippingSusceptability : Byte;
  4833. UserPlaneConnectionConfig : Byte;
  4834. end;
  4835. {$EXTERNALSYM ATM_BHLI_IE}
  4836. ATM_BHLI_IE = ATM_BHLI;
  4837. // values used for the Layer2Mode field in struct ATM_BLLI_IE
  4838. const
  4839. {$EXTERNALSYM BLLI_L2_MODE_NORMAL}
  4840. BLLI_L2_MODE_NORMAL = $40;
  4841. {$EXTERNALSYM BLLI_L2_MODE_EXT}
  4842. BLLI_L2_MODE_EXT = $80;
  4843. // values used for the Layer3Mode field in struct ATM_BLLI_IE
  4844. {$EXTERNALSYM BLLI_L3_MODE_NORMAL}
  4845. BLLI_L3_MODE_NORMAL = $40;
  4846. {$EXTERNALSYM BLLI_L3_MODE_EXT}
  4847. BLLI_L3_MODE_EXT = $80;
  4848. // values used for the Layer3DefaultPacketSize field in struct ATM_BLLI_IE
  4849. {$EXTERNALSYM BLLI_L3_PACKET_16}
  4850. BLLI_L3_PACKET_16 = $04;
  4851. {$EXTERNALSYM BLLI_L3_PACKET_32}
  4852. BLLI_L3_PACKET_32 = $05;
  4853. {$EXTERNALSYM BLLI_L3_PACKET_64}
  4854. BLLI_L3_PACKET_64 = $06;
  4855. {$EXTERNALSYM BLLI_L3_PACKET_128}
  4856. BLLI_L3_PACKET_128 = $07;
  4857. {$EXTERNALSYM BLLI_L3_PACKET_256}
  4858. BLLI_L3_PACKET_256 = $08;
  4859. {$EXTERNALSYM BLLI_L3_PACKET_512}
  4860. BLLI_L3_PACKET_512 = $09;
  4861. {$EXTERNALSYM BLLI_L3_PACKET_1024}
  4862. BLLI_L3_PACKET_1024 = $0A;
  4863. {$EXTERNALSYM BLLI_L3_PACKET_2048}
  4864. BLLI_L3_PACKET_2048 = $0B;
  4865. {$EXTERNALSYM BLLI_L3_PACKET_4096}
  4866. BLLI_L3_PACKET_4096 = $0C;
  4867. type
  4868. {$EXTERNALSYM ATM_BLLI_IE}
  4869. ATM_BLLI_IE = record
  4870. Layer2Protocol : DWORD; // User information layer 2 protocol
  4871. Layer2Mode : Byte;
  4872. Layer2WindowSize : Byte;
  4873. Layer2UserSpecifiedProtocol : DWORD; // User specified layer 2 protocol information
  4874. Layer3Protocol : DWORD; // User information layer 3 protocol
  4875. Layer3Mode : Byte;
  4876. Layer3DefaultPacketSize : Byte;
  4877. Layer3PacketWindowSize : Byte;
  4878. Layer3UserSpecifiedProtocol : DWORD; // User specified layer 3 protocol information
  4879. Layer3IPI : DWORD; // ISO/IEC TR 9577 Initial Protocol Identifier
  4880. SnapID : Array[0..4] of Byte; // SNAP ID consisting of OUI and PID
  4881. end;
  4882. {$EXTERNALSYM ATM_CALLED_PARTY_NUMBER_IE}
  4883. ATM_CALLED_PARTY_NUMBER_IE = ATM_ADDRESS;
  4884. {$EXTERNALSYM ATM_CALLED_PARTY_SUBADDRESS_IE}
  4885. ATM_CALLED_PARTY_SUBADDRESS_IE = ATM_ADDRESS;
  4886. // values used for the Presentation_Indication field in struct ATM_CALLING_PARTY_NUMBER_IE
  4887. const
  4888. {$EXTERNALSYM PI_ALLOWED}
  4889. PI_ALLOWED = $00;
  4890. {$EXTERNALSYM PI_RESTRICTED}
  4891. PI_RESTRICTED = $40;
  4892. {$EXTERNALSYM PI_NUMBER_NOT_AVAILABLE}
  4893. PI_NUMBER_NOT_AVAILABLE = $80;
  4894. // values used for the Screening_Indicator field in struct ATM_CALLING_PARTY_NUMBER_IE
  4895. {$EXTERNALSYM SI_USER_NOT_SCREENED}
  4896. SI_USER_NOT_SCREENED = $00;
  4897. {$EXTERNALSYM SI_USER_PASSED}
  4898. SI_USER_PASSED = $01;
  4899. {$EXTERNALSYM SI_USER_FAILED}
  4900. SI_USER_FAILED = $02;
  4901. {$EXTERNALSYM SI_NETWORK}
  4902. SI_NETWORK = $03;
  4903. type
  4904. {$EXTERNALSYM ATM_CALLING_PARTY_NUMBER_IE}
  4905. ATM_CALLING_PARTY_NUMBER_IE = record
  4906. ATM_Number : ATM_ADDRESS;
  4907. Presentation_Indication : Byte;
  4908. Screening_Indicator : Byte;
  4909. end;
  4910. {$EXTERNALSYM ATM_CALLING_PARTY_SUBADDRESS_IE}
  4911. ATM_CALLING_PARTY_SUBADDRESS_IE = ATM_ADDRESS;
  4912. // values used for the Location field in struct ATM_CAUSE_IE
  4913. const
  4914. {$EXTERNALSYM CAUSE_LOC_USER}
  4915. CAUSE_LOC_USER = $00;
  4916. {$EXTERNALSYM CAUSE_LOC_PRIVATE_LOCAL}
  4917. CAUSE_LOC_PRIVATE_LOCAL = $01;
  4918. {$EXTERNALSYM CAUSE_LOC_PUBLIC_LOCAL}
  4919. CAUSE_LOC_PUBLIC_LOCAL = $02;
  4920. {$EXTERNALSYM CAUSE_LOC_TRANSIT_NETWORK}
  4921. CAUSE_LOC_TRANSIT_NETWORK = $03;
  4922. {$EXTERNALSYM CAUSE_LOC_PUBLIC_REMOTE}
  4923. CAUSE_LOC_PUBLIC_REMOTE = $04;
  4924. {$EXTERNALSYM CAUSE_LOC_PRIVATE_REMOTE}
  4925. CAUSE_LOC_PRIVATE_REMOTE = $05;
  4926. {$EXTERNALSYM CAUSE_LOC_INTERNATIONAL_NETWORK}
  4927. CAUSE_LOC_INTERNATIONAL_NETWORK = $06;
  4928. {$EXTERNALSYM CAUSE_LOC_BEYOND_INTERWORKING}
  4929. CAUSE_LOC_BEYOND_INTERWORKING = $0A;
  4930. // values used for the Cause field in struct ATM_CAUSE_IE
  4931. {$EXTERNALSYM CAUSE_UNALLOCATED_NUMBER}
  4932. CAUSE_UNALLOCATED_NUMBER = $01;
  4933. {$EXTERNALSYM CAUSE_NO_ROUTE_TO_TRANSIT_NETWORK}
  4934. CAUSE_NO_ROUTE_TO_TRANSIT_NETWORK = $02;
  4935. {$EXTERNALSYM CAUSE_NO_ROUTE_TO_DESTINATION}
  4936. CAUSE_NO_ROUTE_TO_DESTINATION = $03;
  4937. {$EXTERNALSYM CAUSE_VPI_VCI_UNACCEPTABLE}
  4938. CAUSE_VPI_VCI_UNACCEPTABLE = $0A;
  4939. {$EXTERNALSYM CAUSE_NORMAL_CALL_CLEARING}
  4940. CAUSE_NORMAL_CALL_CLEARING = $10;
  4941. {$EXTERNALSYM CAUSE_USER_BUSY}
  4942. CAUSE_USER_BUSY = $11;
  4943. {$EXTERNALSYM CAUSE_NO_USER_RESPONDING}
  4944. CAUSE_NO_USER_RESPONDING = $12;
  4945. {$EXTERNALSYM CAUSE_CALL_REJECTED}
  4946. CAUSE_CALL_REJECTED = $15;
  4947. {$EXTERNALSYM CAUSE_NUMBER_CHANGED}
  4948. CAUSE_NUMBER_CHANGED = $16;
  4949. {$EXTERNALSYM CAUSE_USER_REJECTS_CLIR}
  4950. CAUSE_USER_REJECTS_CLIR = $17;
  4951. {$EXTERNALSYM CAUSE_DESTINATION_OUT_OF_ORDER}
  4952. CAUSE_DESTINATION_OUT_OF_ORDER = $1B;
  4953. {$EXTERNALSYM CAUSE_INVALID_NUMBER_FORMAT}
  4954. CAUSE_INVALID_NUMBER_FORMAT = $1C;
  4955. {$EXTERNALSYM CAUSE_STATUS_ENQUIRY_RESPONSE}
  4956. CAUSE_STATUS_ENQUIRY_RESPONSE = $1E;
  4957. {$EXTERNALSYM CAUSE_NORMAL_UNSPECIFIED}
  4958. CAUSE_NORMAL_UNSPECIFIED = $1F;
  4959. {$EXTERNALSYM CAUSE_VPI_VCI_UNAVAILABLE}
  4960. CAUSE_VPI_VCI_UNAVAILABLE = $23;
  4961. {$EXTERNALSYM CAUSE_NETWORK_OUT_OF_ORDER}
  4962. CAUSE_NETWORK_OUT_OF_ORDER = $26;
  4963. {$EXTERNALSYM CAUSE_TEMPORARY_FAILURE}
  4964. CAUSE_TEMPORARY_FAILURE = $29;
  4965. {$EXTERNALSYM CAUSE_ACCESS_INFORMAION_DISCARDED}
  4966. CAUSE_ACCESS_INFORMAION_DISCARDED = $2B;
  4967. {$EXTERNALSYM CAUSE_NO_VPI_VCI_AVAILABLE}
  4968. CAUSE_NO_VPI_VCI_AVAILABLE = $2D;
  4969. {$EXTERNALSYM CAUSE_RESOURCE_UNAVAILABLE}
  4970. CAUSE_RESOURCE_UNAVAILABLE = $2F;
  4971. {$EXTERNALSYM CAUSE_QOS_UNAVAILABLE}
  4972. CAUSE_QOS_UNAVAILABLE = $31;
  4973. {$EXTERNALSYM CAUSE_USER_CELL_RATE_UNAVAILABLE}
  4974. CAUSE_USER_CELL_RATE_UNAVAILABLE = $33;
  4975. {$EXTERNALSYM CAUSE_BEARER_CAPABILITY_UNAUTHORIZED}
  4976. CAUSE_BEARER_CAPABILITY_UNAUTHORIZED = $39;
  4977. {$EXTERNALSYM CAUSE_BEARER_CAPABILITY_UNAVAILABLE}
  4978. CAUSE_BEARER_CAPABILITY_UNAVAILABLE = $3A;
  4979. {$EXTERNALSYM CAUSE_OPTION_UNAVAILABLE}
  4980. CAUSE_OPTION_UNAVAILABLE = $3F;
  4981. {$EXTERNALSYM CAUSE_BEARER_CAPABILITY_UNIMPLEMENTED}
  4982. CAUSE_BEARER_CAPABILITY_UNIMPLEMENTED = $41;
  4983. {$EXTERNALSYM CAUSE_UNSUPPORTED_TRAFFIC_PARAMETERS}
  4984. CAUSE_UNSUPPORTED_TRAFFIC_PARAMETERS = $49;
  4985. {$EXTERNALSYM CAUSE_INVALID_CALL_REFERENCE}
  4986. CAUSE_INVALID_CALL_REFERENCE = $51;
  4987. {$EXTERNALSYM CAUSE_CHANNEL_NONEXISTENT}
  4988. CAUSE_CHANNEL_NONEXISTENT = $52;
  4989. {$EXTERNALSYM CAUSE_INCOMPATIBLE_DESTINATION}
  4990. CAUSE_INCOMPATIBLE_DESTINATION = $58;
  4991. {$EXTERNALSYM CAUSE_INVALID_ENDPOINT_REFERENCE}
  4992. CAUSE_INVALID_ENDPOINT_REFERENCE = $59;
  4993. {$EXTERNALSYM CAUSE_INVALID_TRANSIT_NETWORK_SELECTION}
  4994. CAUSE_INVALID_TRANSIT_NETWORK_SELECTION = $5B;
  4995. {$EXTERNALSYM CAUSE_TOO_MANY_PENDING_ADD_PARTY}
  4996. CAUSE_TOO_MANY_PENDING_ADD_PARTY = $5C;
  4997. {$EXTERNALSYM CAUSE_AAL_PARAMETERS_UNSUPPORTED}
  4998. CAUSE_AAL_PARAMETERS_UNSUPPORTED = $5D;
  4999. {$EXTERNALSYM CAUSE_MANDATORY_IE_MISSING}
  5000. CAUSE_MANDATORY_IE_MISSING = $60;
  5001. {$EXTERNALSYM CAUSE_UNIMPLEMENTED_MESSAGE_TYPE}
  5002. CAUSE_UNIMPLEMENTED_MESSAGE_TYPE = $61;
  5003. {$EXTERNALSYM CAUSE_UNIMPLEMENTED_IE}
  5004. CAUSE_UNIMPLEMENTED_IE = $63;
  5005. {$EXTERNALSYM CAUSE_INVALID_IE_CONTENTS}
  5006. CAUSE_INVALID_IE_CONTENTS = $64;
  5007. {$EXTERNALSYM CAUSE_INVALID_STATE_FOR_MESSAGE}
  5008. CAUSE_INVALID_STATE_FOR_MESSAGE = $65;
  5009. {$EXTERNALSYM CAUSE_RECOVERY_ON_TIMEOUT}
  5010. CAUSE_RECOVERY_ON_TIMEOUT = $66;
  5011. {$EXTERNALSYM CAUSE_INCORRECT_MESSAGE_LENGTH}
  5012. CAUSE_INCORRECT_MESSAGE_LENGTH = $68;
  5013. {$EXTERNALSYM CAUSE_PROTOCOL_ERROR}
  5014. CAUSE_PROTOCOL_ERROR = $6F;
  5015. // values used for the Condition portion of the Diagnostics field
  5016. // in struct ATM_CAUSE_IE, for certain Cause values
  5017. {$EXTERNALSYM CAUSE_COND_UNKNOWN}
  5018. CAUSE_COND_UNKNOWN = $00;
  5019. {$EXTERNALSYM CAUSE_COND_PERMANENT}
  5020. CAUSE_COND_PERMANENT = $01;
  5021. {$EXTERNALSYM CAUSE_COND_TRANSIENT}
  5022. CAUSE_COND_TRANSIENT = $02;
  5023. // values used for the Rejection Reason portion of the Diagnostics field
  5024. // in struct ATM_CAUSE_IE, for certain Cause values
  5025. {$EXTERNALSYM CAUSE_REASON_USER}
  5026. CAUSE_REASON_USER = $00;
  5027. {$EXTERNALSYM CAUSE_REASON_IE_MISSING}
  5028. CAUSE_REASON_IE_MISSING = $04;
  5029. {$EXTERNALSYM CAUSE_REASON_IE_INSUFFICIENT}
  5030. CAUSE_REASON_IE_INSUFFICIENT = $08;
  5031. // values used for the P-U flag of the Diagnostics field
  5032. // in struct ATM_CAUSE_IE, for certain Cause values
  5033. {$EXTERNALSYM CAUSE_PU_PROVIDER}
  5034. CAUSE_PU_PROVIDER = $00;
  5035. {$EXTERNALSYM CAUSE_PU_USER}
  5036. CAUSE_PU_USER = $08;
  5037. // values used for the N-A flag of the Diagnostics field
  5038. // in struct ATM_CAUSE_IE, for certain Cause values
  5039. {$EXTERNALSYM CAUSE_NA_NORMAL}
  5040. CAUSE_NA_NORMAL = $00;
  5041. {$EXTERNALSYM CAUSE_NA_ABNORMAL}
  5042. CAUSE_NA_ABNORMAL = $04;
  5043. type
  5044. {$EXTERNALSYM ATM_CAUSE_IE}
  5045. ATM_CAUSE_IE = record
  5046. Location : Byte;
  5047. Cause : Byte;
  5048. DiagnosticsLength : Byte;
  5049. Diagnostics : Array[0..3] of Byte;
  5050. end;
  5051. // values used for the QOSClassForward and QOSClassBackward
  5052. // field in struct ATM_QOS_CLASS_IE
  5053. const
  5054. {$EXTERNALSYM QOS_CLASS0}
  5055. QOS_CLASS0 = $00;
  5056. {$EXTERNALSYM QOS_CLASS1}
  5057. QOS_CLASS1 = $01;
  5058. {$EXTERNALSYM QOS_CLASS2}
  5059. QOS_CLASS2 = $02;
  5060. {$EXTERNALSYM QOS_CLASS3}
  5061. QOS_CLASS3 = $03;
  5062. {$EXTERNALSYM QOS_CLASS4}
  5063. QOS_CLASS4 = $04;
  5064. type
  5065. {$EXTERNALSYM ATM_QOS_CLASS_IE}
  5066. ATM_QOS_CLASS_IE = record
  5067. QOSClassForward : Byte;
  5068. QOSClassBackward : Byte;
  5069. end;
  5070. // values used for the TypeOfNetworkId field in struct ATM_TRANSIT_NETWORK_SELECTION_IE
  5071. const
  5072. {$EXTERNALSYM TNS_TYPE_NATIONAL}
  5073. TNS_TYPE_NATIONAL = $40;
  5074. // values used for the NetworkIdPlan field in struct ATM_TRANSIT_NETWORK_SELECTION_IE
  5075. {$EXTERNALSYM TNS_PLAN_CARRIER_ID_CODE}
  5076. TNS_PLAN_CARRIER_ID_CODE = $01;
  5077. type
  5078. {$EXTERNALSYM ATM_TRANSIT_NETWORK_SELECTION_IE}
  5079. ATM_TRANSIT_NETWORK_SELECTION_IE = record
  5080. TypeOfNetworkId : Byte;
  5081. NetworkIdPlan : Byte;
  5082. NetworkIdLength : Byte;
  5083. NetworkId : Array[0..0] of Byte;
  5084. end;
  5085. // ATM specific Ioctl codes
  5086. const
  5087. {$EXTERNALSYM SIO_GET_NUMBER_OF_ATM_DEVICES}
  5088. SIO_GET_NUMBER_OF_ATM_DEVICES = $50160001;
  5089. {$EXTERNALSYM SIO_GET_ATM_ADDRESS}
  5090. SIO_GET_ATM_ADDRESS = $d0160002;
  5091. {$EXTERNALSYM SIO_ASSOCIATE_PVC}
  5092. SIO_ASSOCIATE_PVC = $90160003;
  5093. {$EXTERNALSYM SIO_GET_ATM_CONNECTION_ID}
  5094. SIO_GET_ATM_CONNECTION_ID = $50160004;
  5095. // ATM Connection Identifier
  5096. type
  5097. {$EXTERNALSYM ATM_CONNECTION_ID}
  5098. ATM_CONNECTION_ID = record
  5099. DeviceNumber : DWORD;
  5100. VPI : DWORD;
  5101. VCI : DWORD;
  5102. end;
  5103. // Input buffer format for SIO_ASSOCIATE_PVC
  5104. {$EXTERNALSYM ATM_PVC_PARAMS}
  5105. ATM_PVC_PARAMS = record
  5106. PvcConnectionId : ATM_CONNECTION_ID;
  5107. PvcQos : QOS;
  5108. end;
  5109. {$NODEFINE InitializeWinSock}
  5110. procedure InitializeWinSock;
  5111. {$NODEFINE UninitializeWinSock}
  5112. procedure UninitializeWinSock;
  5113. function Winsock2Loaded: Boolean;
  5114. function WinsockHandle : TIdLibHandle;
  5115. //JPM
  5116. {
  5117. I made these symbols up so to prevent range check warnings in FreePascal.
  5118. SizeOf is a SmallInt when an expression is evaluated at run-time. This
  5119. run-time evaluation makes no sense because the compiler knows these when compiling
  5120. so it should give us the numbers.
  5121. }
  5122. const
  5123. {$EXTERNALSYM SIZE_WSACMSGHDR}
  5124. SIZE_WSACMSGHDR = DWORD(SizeOf(WSACMSGHDR));
  5125. {$EXTERNALSYM SIZE_FARPROC}
  5126. SIZE_FARPROC = DWORD(SizeOf(FARPROC));
  5127. {$EXTERNALSYM MAX_NATURAL_ALIGNMENT_SUB_1}
  5128. MAX_NATURAL_ALIGNMENT_SUB_1 = DWORD(MAX_NATURAL_ALIGNMENT - 1);
  5129. {$EXTERNALSYM SIZE_IP_MSFILTER}
  5130. SIZE_IP_MSFILTER = DWORD(SizeOf(ip_msfilter));
  5131. {$EXTERNALSYM SIZE_TINADDR}
  5132. SIZE_TINADDR = DWORD(SizeOf(TInAddr));
  5133. {$EXTERNALSYM SIZE_TIN6ADDR}
  5134. SIZE_TIN6ADDR = DWORD(SizeOf(TIn6Addr));
  5135. {$EXTERNALSYM SIZE_TSOCKADDRIN}
  5136. SIZE_TSOCKADDRIN = DWORD(SizeOf(TSockAddrIn));
  5137. {$EXTERNALSYM SIZE_TSOCKADDRIN6}
  5138. SIZE_TSOCKADDRIN6 = DWORD(SizeOf(TSockAddrIn6));
  5139. {$EXTERNALSYM SIZE_GROUP_FILTER}
  5140. SIZE_GROUP_FILTER = DWORD(SizeOf(GROUP_FILTER));
  5141. {$EXTERNALSYM SIZE_TADDRINFO}
  5142. SIZE_TADDRINFO = DWORD(SizeOf(TAddrInfo));
  5143. {$EXTERNALSYM SIZE_SOCKADDR_STORAGE}
  5144. SIZE_SOCKADDR_STORAGE = DWORD(sizeof(SOCKADDR_STORAGE));
  5145. {$IFNDEF WINCE}
  5146. {$EXTERNALSYM SIZE_TWSAMSG}
  5147. SIZE_TWSAMSG = DWORD(SizeOf(TWSAMSG));
  5148. {$ENDIF}
  5149. {$EXTERNALSYM SIZE_GUID}
  5150. SIZE_GUID = DWORD(SizeOf(TGuid));
  5151. {$EXTERNALSYM SIZE_INTEGER}
  5152. SIZE_INTEGER = DWORD(SizeOf(Integer));
  5153. //=============================================================
  5154. // Copyright (c) Microsoft Corporation. All rights reserved.
  5155. //
  5156. // Module Name:
  5157. //
  5158. // mstcpip.h
  5159. //
  5160. // Abstract:
  5161. //
  5162. // This module contains Microsoft-specific extensions to the core
  5163. // Winsock definitions.
  5164. //
  5165. // Environment:
  5166. //
  5167. // user mode or kernel mode
  5168. type
  5169. {$EXTERNALSYM TRANSPORT_SETTING_ID}
  5170. TRANSPORT_SETTING_ID = record
  5171. Guid : TGUID;
  5172. end;
  5173. {$EXTERNALSYM PTRANSPORT_SETTING_ID}
  5174. PTRANSPORT_SETTING_ID = ^TRANSPORT_SETTING_ID;
  5175. {$EXTERNALSYM _tcp_keepalive}
  5176. _tcp_keepalive = record
  5177. onoff: u_long;
  5178. keepalivetime: u_long;
  5179. keepaliveinterval: u_long;
  5180. end;
  5181. {$EXTERNALSYM TCP_INITIAL_RTO_PARAMETERS}
  5182. TCP_INITIAL_RTO_PARAMETERS = record
  5183. //
  5184. // Supplies the initial RTT in milliseconds.
  5185. //
  5186. Rtt : USHORT;
  5187. //
  5188. // Supplies the number of retransmissions attempted before the connection
  5189. // setup fails.
  5190. //
  5191. MaxSynRetransmissions : UCHAR;
  5192. end;
  5193. {$EXTERNALSYM PTCP_INITIAL_RTO_PARAMETERS}
  5194. PTCP_INITIAL_RTO_PARAMETERS = ^TCP_INITIAL_RTO_PARAMETERS;
  5195. {$EXTERNALSYM _INET_PORT_RANGE}
  5196. _INET_PORT_RANGE = record
  5197. StartPort : USHORT;
  5198. NumberOfPorts : USHORT;
  5199. end;
  5200. {$EXTERNALSYM INET_PORT_RANGE}
  5201. INET_PORT_RANGE = _INET_PORT_RANGE;
  5202. {$EXTERNALSYM PINET_PORT_RANGE}
  5203. PINET_PORT_RANGE = ^INET_PORT_RANGE;
  5204. {$EXTERNALSYM INET_PORT_RESERVATION}
  5205. INET_PORT_RESERVATION = _INET_PORT_RANGE;
  5206. {$EXTERNALSYM PINET_PORT_RESERVATION}
  5207. PINET_PORT_RESERVATION = ^INET_PORT_RESERVATION;
  5208. {$EXTERNALSYM INET_PORT_RESERVATION_TOKEN}
  5209. INET_PORT_RESERVATION_TOKEN = record
  5210. Token : ULONG64;
  5211. end;
  5212. {$EXTERNALSYM PINET_PORT_RESERVATION_TOKEN}
  5213. PINET_PORT_RESERVATION_TOKEN = ^INET_PORT_RESERVATION_TOKEN;
  5214. {$EXTERNALSYM INET_PORT_RESERVATION_INSTANCE}
  5215. INET_PORT_RESERVATION_INSTANCE = record
  5216. Reservation : INET_PORT_RESERVATION;
  5217. Token : INET_PORT_RESERVATION_TOKEN;
  5218. end;
  5219. {$EXTERNALSYM PINET_PORT_RESERVATION_INSTANCE}
  5220. PINET_PORT_RESERVATION_INSTANCE = ^INET_PORT_RESERVATION_INSTANCE;
  5221. {$EXTERNALSYM INET_PORT_RESERVATION_INFORMATION}
  5222. INET_PORT_RESERVATION_INFORMATION = record
  5223. AssignmentCount : ULONG;
  5224. OwningPid : ULONG;
  5225. end;
  5226. {$EXTERNALSYM PINET_PORT_RESERVATION_INFORMATION}
  5227. PINET_PORT_RESERVATION_INFORMATION = ^INET_PORT_RESERVATION_INFORMATION;
  5228. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS}
  5229. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_INVALID}
  5230. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED}
  5231. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED}
  5232. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR}
  5233. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR}
  5234. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED}
  5235. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE}
  5236. CONTROL_CHANNEL_TRIGGER_STATUS = (
  5237. CONTROL_CHANNEL_TRIGGER_STATUS_INVALID,
  5238. CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED,
  5239. CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED,
  5240. CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR,
  5241. CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR,
  5242. CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED,
  5243. CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE);
  5244. {$EXTERNALSYM PCONTROL_CHANNEL_TRIGGER_STATUS}
  5245. PCONTROL_CHANNEL_TRIGGER_STATUS = ^CONTROL_CHANNEL_TRIGGER_STATUS;
  5246. {$EXTERNALSYM REAL_TIME_NOTIFICATION_SETTING_INPUT}
  5247. REAL_TIME_NOTIFICATION_SETTING_INPUT = record
  5248. TransportSettingId : TRANSPORT_SETTING_ID;
  5249. BrokerEventGuid : TGUID;
  5250. end;
  5251. {$EXTERNALSYM PREAL_TIME_NOTIFICATION_SETTING_INPUT}
  5252. PREAL_TIME_NOTIFICATION_SETTING_INPUT = ^REAL_TIME_NOTIFICATION_SETTING_INPUT;
  5253. {$EXTERNALSYM REAL_TIME_NOTIFICATION_SETTING_OUTPUT}
  5254. REAL_TIME_NOTIFICATION_SETTING_OUTPUT = record
  5255. ChannelStatus : CONTROL_CHANNEL_TRIGGER_STATUS;
  5256. end;
  5257. {$EXTERNALSYM PREAL_TIME_NOTIFICATION_SETTING_OUTPUT}
  5258. PREAL_TIME_NOTIFICATION_SETTING_OUTPUT = ^REAL_TIME_NOTIFICATION_SETTING_OUTPUT;
  5259. {$EXTERNALSYM RCVALL_VALUE}
  5260. {$EXTERNALSYM RCVALL_OFF}
  5261. {$EXTERNALSYM RCVALL_ON}
  5262. {$EXTERNALSYM RCVALL_SOCKETLEVELONLY}
  5263. {$EXTERNALSYM RCVALL_IPLEVEL}
  5264. RCVALL_VALUE = (
  5265. RCVALL_OFF,
  5266. RCVALL_ON,
  5267. RCVALL_SOCKETLEVELONLY,
  5268. RCVALL_IPLEVEL
  5269. );
  5270. {$EXTERNALSYM PRCVALL_VALUE}
  5271. PRCVALL_VALUE = ^RCVALL_VALUE;
  5272. {$EXTERNALSYM RCVALL_IF}
  5273. RCVALL_IF = record
  5274. Mode : RCVALL_VALUE;
  5275. _Interface : ULONG;
  5276. end;
  5277. {$EXTERNALSYM PRCVALL_IF}
  5278. PRCVALL_IF = ^RCVALL_IF;
  5279. {$EXTERNALSYM SOCKET_SECURITY_QUERY_INFO_IPSEC2}
  5280. SOCKET_SECURITY_QUERY_INFO_IPSEC2 = record
  5281. SecurityProtocol : SOCKET_SECURITY_PROTOCOL;
  5282. Flags : ULONG;
  5283. PeerApplicationAccessTokenHandle : UINT64;
  5284. PeerMachineAccessTokenHandle : UINT64;
  5285. MmSaId : UINT64;
  5286. QmSaId : UINT64;
  5287. NegotiationWinerr : UINT32;
  5288. SaLookupContext : TGuid;
  5289. end;
  5290. {$EXTERNALSYM PSOCKET_SECURITY_QUERY_INFO_IPSEC2}
  5291. PSOCKET_SECURITY_QUERY_INFO_IPSEC2 = ^SOCKET_SECURITY_QUERY_INFO_IPSEC2;
  5292. {$EXTERNALSYM RSS_SCALABILITY_INFO}
  5293. RSS_SCALABILITY_INFO = record
  5294. RssEnabled : BOOL;
  5295. end;
  5296. {$EXTERNALSYM PRSS_SCALABILITY_INFO}
  5297. PRSS_SCALABILITY_INFO = ^RSS_SCALABILITY_INFO;
  5298. const
  5299. //
  5300. // Argument structures for SIO_QUERY_TRANSPORT_SETTING and
  5301. // SIO_QUERY_TRANSPORT_SETTING.
  5302. //
  5303. {$EXTERNALSYM CONTROL_CHANNEL_TRIGGER_STATUS_MAX}
  5304. CONTROL_CHANNEL_TRIGGER_STATUS_MAX = CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR;
  5305. //
  5306. // New WSAIoctl Options
  5307. //
  5308. {$EXTERNALSYM SIO_RCVALL}
  5309. SIO_RCVALL = (IOC_IN or IOC_VENDOR or 1);
  5310. {$EXTERNALSYM SIO_RCVALL_MCAST}
  5311. SIO_RCVALL_MCAST = (IOC_IN or IOC_VENDOR or 2);
  5312. {$EXTERNALSYM SIO_RCVALL_IGMPMCAST}
  5313. SIO_RCVALL_IGMPMCAST = (IOC_IN or IOC_VENDOR or 3);
  5314. {$EXTERNALSYM SIO_KEEPALIVE_VALS}
  5315. SIO_KEEPALIVE_VALS = (IOC_IN or IOC_VENDOR or 4);
  5316. {$EXTERNALSYM SIO_ABSORB_RTRALERT}
  5317. SIO_ABSORB_RTRALERT = (IOC_IN or IOC_VENDOR or 5);
  5318. {$EXTERNALSYM SIO_UCAST_IF}
  5319. SIO_UCAST_IF = (IOC_IN or IOC_VENDOR or 6);
  5320. {$EXTERNALSYM SIO_LIMIT_BROADCASTS}
  5321. SIO_LIMIT_BROADCASTS = (IOC_IN or IOC_VENDOR or 7);
  5322. {$EXTERNALSYM SIO_INDEX_BIND}
  5323. SIO_INDEX_BIND = (IOC_IN or IOC_VENDOR or 8);
  5324. {$EXTERNALSYM SIO_INDEX_MCASTIF}
  5325. SIO_INDEX_MCASTIF = (IOC_IN or IOC_VENDOR or 9);
  5326. {$EXTERNALSYM SIO_INDEX_ADD_MCAST}
  5327. SIO_INDEX_ADD_MCAST = (IOC_IN or IOC_VENDOR or 10);
  5328. {$EXTERNALSYM SIO_INDEX_DEL_MCAST}
  5329. SIO_INDEX_DEL_MCAST = (IOC_IN or IOC_VENDOR or 11);
  5330. // SIO_UDP_CONNRESET = _WSAIOW(IOC_VENDOR,12)
  5331. {$EXTERNALSYM SIO_RCVALL_MCAST_IF}
  5332. SIO_RCVALL_MCAST_IF = (IOC_IN or IOC_VENDOR or 13);
  5333. {$EXTERNALSYM SIO_RCVALL_IF}
  5334. SIO_RCVALL_IF = (IOC_IN or IOC_VENDOR or 14);
  5335. {$EXTERNALSYM SIO_LOOPBACK_FAST_PATH}
  5336. SIO_LOOPBACK_FAST_PATH = (IOC_IN or IOC_VENDOR or 16);
  5337. {$EXTERNALSYM SIO_TCP_INITIAL_RTO}
  5338. SIO_TCP_INITIAL_RTO = (IOC_IN or IOC_VENDOR or 17);
  5339. {$EXTERNALSYM SIO_APPLY_TRANSPORT_SETTING}
  5340. SIO_APPLY_TRANSPORT_SETTING = (IOC_IN or IOC_VENDOR or 19);
  5341. {$EXTERNALSYM SIO_QUERY_TRANSPORT_SETTING}
  5342. SIO_QUERY_TRANSPORT_SETTING = (IOC_IN or IOC_VENDOR or 20);
  5343. //
  5344. // Values for use with SIO_RCVALL* options
  5345. //
  5346. {$EXTERNALSYM RCVALL_MAX}
  5347. RCVALL_MAX = RCVALL_IPLEVEL;
  5348. //
  5349. // Parameters to configure the initial RTT.
  5350. //
  5351. {$EXTERNALSYM TCP_INITIAL_RTO_UNSPECIFIED_RTT}
  5352. TCP_INITIAL_RTO_UNSPECIFIED_RTT = USHORT(-1);
  5353. {$EXTERNALSYM TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS}
  5354. TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS = UCHAR(-1);
  5355. {$EXTERNALSYM TCP_INITIAL_RTO_DEFAULT_RTT}
  5356. TCP_INITIAL_RTO_DEFAULT_RTT = (0);
  5357. {$EXTERNALSYM TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS}
  5358. TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS = (0);
  5359. //
  5360. // TCP/UDP port management definitions.
  5361. //
  5362. {$EXTERNALSYM SIO_ACQUIRE_PORT_RESERVATION}
  5363. SIO_ACQUIRE_PORT_RESERVATION = (IOC_IN or IOC_VENDOR or 100);
  5364. {$EXTERNALSYM SIO_RELEASE_PORT_RESERVATION}
  5365. SIO_RELEASE_PORT_RESERVATION = (IOC_IN or IOC_VENDOR or 101);
  5366. {$EXTERNALSYM SIO_ASSOCIATE_PORT_RESERVATION}
  5367. SIO_ASSOCIATE_PORT_RESERVATION = (IOC_IN or IOC_VENDOR or 102);
  5368. {$EXTERNALSYM INVALID_PORT_RESERVATION_TOKEN}
  5369. INVALID_PORT_RESERVATION_TOKEN = ULONG64(0);
  5370. //
  5371. // Secure socket API type definitions.
  5372. //
  5373. {$EXTERNALSYM SIO_SET_SECURITY}
  5374. SIO_SET_SECURITY = (IOC_IN or IOC_VENDOR or 200);
  5375. {$EXTERNALSYM SIO_QUERY_SECURITY}
  5376. SIO_QUERY_SECURITY = (IOC_INOUT or IOC_VENDOR or 201);
  5377. {$EXTERNALSYM SIO_SET_PEER_TARGET_NAME}
  5378. SIO_SET_PEER_TARGET_NAME = (IOC_IN or IOC_VENDOR or 202);
  5379. {$EXTERNALSYM SIO_DELETE_PEER_TARGET_NAME}
  5380. SIO_DELETE_PEER_TARGET_NAME = (IOC_IN or IOC_VENDOR or 203);
  5381. //
  5382. // WFP Proxy Connection Tracking API type definitions.
  5383. //
  5384. {$EXTERNALSYM SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS}
  5385. SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS = (IOC_IN or IOC_VENDOR or 220);
  5386. {$EXTERNALSYM SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT}
  5387. SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT = (IOC_IN or IOC_VENDOR or 221);
  5388. {$EXTERNALSYM SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS}
  5389. SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS = (IOC_IN or IOC_VENDOR or 222);
  5390. {$EXTERNALSYM SIO_SOCKET_USAGE_NOTIFICATION}
  5391. SIO_SOCKET_USAGE_NOTIFICATION = (IOC_IN or IOC_VENDOR or 204);
  5392. // Flags for generic security settings
  5393. {$EXTERNALSYM SOCKET_SETTINGS_GUARANTEE_ENCRYPTION}
  5394. SOCKET_SETTINGS_GUARANTEE_ENCRYPTION = $1;
  5395. {$EXTERNALSYM SOCKET_SETTINGS_ALLOW_INSECURE}
  5396. SOCKET_SETTINGS_ALLOW_INSECURE = $2;
  5397. // Flags specific to IPsec security settings.
  5398. // NOTE: these flags must be specified under the
  5399. // SOCKET_SECURITY_SETTINGS_IPSEC->IpsecFlags field.
  5400. {$EXTERNALSYM SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION}
  5401. SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION = $1;
  5402. {$EXTERNALSYM SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION}
  5403. SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION = $2;
  5404. {$EXTERNALSYM SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED}
  5405. SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED = $4;
  5406. {$EXTERNALSYM SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT}
  5407. SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT = $8;
  5408. {$EXTERNALSYM SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE}
  5409. SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE = $1;
  5410. {$EXTERNALSYM SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID}
  5411. SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID = $1;
  5412. {$EXTERNALSYM SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID}
  5413. SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID = $2;
  5414. // Flags corresponding to the security query info
  5415. {$EXTERNALSYM SOCKET_INFO_CONNECTION_SECURED}
  5416. SOCKET_INFO_CONNECTION_SECURED = $1;
  5417. {$EXTERNALSYM SOCKET_INFO_CONNECTION_ENCRYPTED}
  5418. SOCKET_INFO_CONNECTION_ENCRYPTED = $2;
  5419. {$EXTERNALSYM SOCKET_INFO_CONNECTION_IMPERSONATED}
  5420. SOCKET_INFO_CONNECTION_IMPERSONATED = $4;
  5421. //
  5422. // WFP ALE endpoint handle query type definition
  5423. //
  5424. {$EXTERNALSYM SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE}
  5425. SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE = (IOC_OUT or IOC_VENDOR or 205);
  5426. //
  5427. // Scalability type definitions
  5428. //
  5429. {$EXTERNALSYM SIO_QUERY_RSS_SCALABILITY_INFO}
  5430. SIO_QUERY_RSS_SCALABILITY_INFO = (IOC_OUT or IOC_VENDOR or 210);
  5431. // GUID definition for use with Secure Sockets API
  5432. // aec2ef9c-3a4d-4d3e-8842-239942e39a47
  5433. {$EXTERNALSYM SOCKET_DEFAULT2_QM_POLICY}
  5434. SOCKET_DEFAULT2_QM_POLICY : TGuid = (D1:$aec2ef9c;D2:$3a4d;D3:$4d3e;D4:($88,$42,$23,$99,$42,$e3,$9a,$47));
  5435. // GUID definition for use with Real Time Notification setting API.
  5436. // 6b59819a-5cae-492d-a901-2a3c2c50164f
  5437. {$EXTERNALSYM REAL_TIME_NOTIFICATION_CAPABILITY)}
  5438. REAL_TIME_NOTIFICATION_CAPABILITY : TGuid = (D1:$6b59819a;D2:$5cae;D3:$492d;D4:($a9, $01, $2a, $3c, $2c, $50, $16, $4f));
  5439. //
  5440. // Microsoft-specific IPv4 definitions.
  5441. //
  5442. {$EXTERNALSYM IN4ADDR_ANY}
  5443. IN4ADDR_ANY = INADDR_ANY;
  5444. {$EXTERNALSYM IN4ADDR_LOOPBACK}
  5445. IN4ADDR_LOOPBACK = $0100007f;
  5446. {$EXTERNALSYM IN4ADDR_BROADCAST}
  5447. IN4ADDR_BROADCAST = INADDR_BROADCAST;
  5448. {$EXTERNALSYM IN4ADDR_NONE}
  5449. IN4ADDR_NONE = INADDR_NONE;
  5450. {$EXTERNALSYM IN4ADDR_ANY_INIT}
  5451. function IN4ADDR_ANY_INIT: TInAddr;
  5452. {$EXTERNALSYM IN4ADDR_LOOPBACK_INIT}
  5453. function IN4ADDR_LOOPBACK_INIT: TInAddr;
  5454. {$EXTERNALSYM IN4ADDR_BROADCAST_INIT}
  5455. function IN4ADDR_BROADCAST_INIT: TInAddr;
  5456. {$EXTERNALSYM IN4ADDR_ALLNODESONLINK_INIT}
  5457. function IN4ADDR_ALLNODESONLINK_INIT: TInAddr;
  5458. {$EXTERNALSYM IN4ADDR_ALLROUTERSONLINK_INIT}
  5459. function IN4ADDR_ALLROUTERSONLINK_INIT: TInAddr;
  5460. {$EXTERNALSYM IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT}
  5461. function IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT: TInAddr;
  5462. {$EXTERNALSYM IN4ADDR_ALLTEREDONODESONLINK_INIT}
  5463. function IN4ADDR_ALLTEREDONODESONLINK_INIT: TInAddr;
  5464. {$EXTERNALSYM IN4ADDR_LINKLOCALPREFIX_INIT}
  5465. function IN4ADDR_LINKLOCALPREFIX_INIT: TInAddr;
  5466. {$EXTERNALSYM IN4ADDR_MULTICASTPREFIX_INIT}
  5467. function IN4ADDR_MULTICASTPREFIX_INIT: TInAddr;
  5468. const
  5469. {$EXTERNALSYM IN4ADDR_LOOPBACKPREFIX_LENGTH}
  5470. IN4ADDR_LOOPBACKPREFIX_LENGTH = 8;
  5471. {$EXTERNALSYM IN4ADDR_LINKLOCALPREFIX_LENGTH}
  5472. IN4ADDR_LINKLOCALPREFIX_LENGTH = 16;
  5473. {$EXTERNALSYM IN4ADDR_MULTICASTPREFIX_LENGTH}
  5474. IN4ADDR_MULTICASTPREFIX_LENGTH = 4;
  5475. {$EXTERNALSYM IN6ADDR_LINKLOCALPREFIX_LENGTH}
  5476. IN6ADDR_LINKLOCALPREFIX_LENGTH = 64;
  5477. {$EXTERNALSYM IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH}
  5478. IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH = 104;
  5479. {$EXTERNALSYM IN6ADDR_V4MAPPEDPREFIX_LENGTH}
  5480. IN6ADDR_V4MAPPEDPREFIX_LENGTH = 96;
  5481. {$EXTERNALSYM IN6ADDR_6TO4PREFIX_LENGTH}
  5482. IN6ADDR_6TO4PREFIX_LENGTH = 16;
  5483. {$EXTERNALSYM IN6ADDR_TEREDOPREFIX_LENGTH}
  5484. IN6ADDR_TEREDOPREFIX_LENGTH = 32;
  5485. //=============================================================
  5486. implementation
  5487. //=============================================================
  5488. uses
  5489. IdResourceStrings
  5490. {$IFDEF HAS_AnsiStrings_StrLen}, AnsiStrings{$ENDIF}
  5491. ;
  5492. // (c) March 2001, "Alex Konshin"<[email protected]>
  5493. var
  5494. hWinSockDll : TIdLibHandle = IdNilHandle; // WS2_32.DLL handle
  5495. {$IFNDEF WINCE}
  5496. hMSWSockDll : TIdLibHandle = IdNilHandle; // MSWSOCK.DLL handle
  5497. {$ENDIF}
  5498. function WinsockHandle : TIdLibHandle;
  5499. begin
  5500. Result := hWinSockDll;
  5501. end;
  5502. function Winsock2Loaded : Boolean;
  5503. begin
  5504. Result := hWinSockDll <> IdNilHandle;
  5505. end;
  5506. procedure InitializeWinSock;
  5507. var
  5508. LData: TWSAData;
  5509. LError: DWORD;
  5510. begin
  5511. if hWinSockDll = IdNilHandle then begin
  5512. hWinSockDll := SafeLoadLibrary(WINSOCK2_DLL);
  5513. if hWinSockDll <> IdNilHandle then begin
  5514. LError := WSAStartup($202, LData);
  5515. if LError = 0 then begin
  5516. Exit;
  5517. end;
  5518. Windows.FreeLibrary(hWinSockDll);
  5519. hWinSockDll := IdNilHandle;
  5520. end else begin
  5521. LError := Windows.GetLastError;
  5522. end;
  5523. raise EIdWinsockStubError.Build(LError, RSWinsockLoadError, [WINSOCK2_DLL]);
  5524. end;
  5525. end;
  5526. {$IFNDEF WINCE}
  5527. procedure LoadMSWSock;
  5528. {$IFDEF USE_INLINE}inline;{$ENDIF}
  5529. begin
  5530. if hMSWSockDll = IdNilHandle then begin
  5531. hMSWSockDll := SafeLoadLibrary(MSWSOCK_DLL);
  5532. if hMSWSockDll = IdNilHandle then begin
  5533. raise EIdWinsockStubError.Build(Windows.GetLastError, RSWinsockLoadError, [MSWSOCK_DLL]);
  5534. end;
  5535. end;
  5536. end;
  5537. {$ENDIF}
  5538. procedure UninitializeWinSock;
  5539. begin
  5540. {$IFNDEF WINCE}
  5541. if hMSWSockDll <> IdNilHandle then
  5542. begin
  5543. FreeLibrary(hMSWSockDll);
  5544. hMSWSockDll := IdNilHandle;
  5545. end;
  5546. {$ENDIF}
  5547. if hWinSockDll <> IdNilHandle then
  5548. begin
  5549. WSACleanup;
  5550. FreeLibrary(hWinSockDll);
  5551. hWinSockDll := IdNilHandle;
  5552. end;
  5553. end;
  5554. constructor EIdWinsockStubError.Build(AWin32Error: DWORD; const ATitle: String; AArgs: array of const);
  5555. begin
  5556. FTitle := IndyFormat(ATitle, AArgs);
  5557. FWin32Error := AWin32Error;
  5558. if AWin32Error = 0 then begin
  5559. inherited Create(FTitle);
  5560. end else
  5561. begin
  5562. FWin32ErrorMessage := SysUtils.SysErrorMessage(AWin32Error);
  5563. inherited Create(FTitle + ': ' + FWin32ErrorMessage); {Do not Localize}
  5564. end;
  5565. end;
  5566. { IMPORTANT!!!
  5567. WindowsCE only has a Unicode (WideChar) version of GetProcAddress. We could use
  5568. a version of GetProcAddress in the FreePascal dynlibs unit but that does a
  5569. conversion from ASCII to Unicode which might not be necessary since most calls
  5570. pass a constant anyway.
  5571. }
  5572. function FixupStub(hDll: TIdLibHandle; const AName:{$IFDEF WINCE}TIdUnicodeString{$ELSE}string{$ENDIF}): Pointer;
  5573. {$IFDEF USE_INLINE}inline;{$ENDIF}
  5574. begin
  5575. if hDll = IdNilHandle then begin
  5576. raise EIdWinsockStubError.Build(WSANOTINITIALISED, RSWinsockCallError, [AName]);
  5577. end;
  5578. Result := Windows.GetProcAddress(hDll, {$IFDEF WINCE}PWideChar{$ELSE}PChar{$ENDIF}(AName));
  5579. if Result = nil then begin
  5580. raise EIdWinsockStubError.Build(WSAEINVAL, RSWinsockCallError, [AName]);
  5581. end;
  5582. end;
  5583. function FixupStubEx(hSocket: TSocket; const AName: string; const AGuid: TGUID): Pointer;
  5584. var
  5585. LBytesSend: DWORD;
  5586. begin
  5587. // RLebeau: in XE4+, PDWORD is NOT defined as ^DWORD, so we have to use a type-cast!
  5588. if WSAIoctl(hSocket, SIO_GET_EXTENSION_FUNCTION_POINTER, @AGuid, DWORD(SIZE_GUID),
  5589. @Result, SIZE_FARPROC, PDWORD(@LBytesSend), nil, nil) <> 0 then
  5590. begin
  5591. raise EIdWinsockStubError.Build(WSAGetLastError, RSWinsockCallError, [AName]);
  5592. end;
  5593. end;
  5594. function Stub_WSAStartup(const wVersionRequired: word; out WSData: TWSAData): Integer; stdcall;
  5595. begin
  5596. @WSAStartup := FixupStub(hWinSockDll, 'WSAStartup'); {Do not Localize}
  5597. Result := WSAStartup(wVersionRequired, WSData);
  5598. end;
  5599. function Stub_WSACleanup: Integer; stdcall;
  5600. begin
  5601. @WSACleanup := FixupStub(hWinSockDll, 'WSACleanup'); {Do not Localize}
  5602. Result := WSACleanup;
  5603. end;
  5604. function Stub_accept(const s: TSocket; AAddr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
  5605. begin
  5606. @accept := FixupStub(hWinSockDll, 'accept'); {Do not Localize}
  5607. Result := accept(s, AAddr, addrlen);
  5608. end;
  5609. function Stub_bind(const s: TSocket; const name: PSockAddr; const namelen: Integer): Integer; stdcall;
  5610. begin
  5611. @bind := FixupStub(hWinSockDll, 'bind'); {Do not Localize}
  5612. Result := bind(s, name, namelen);
  5613. end;
  5614. function Stub_closesocket(const s: TSocket): Integer; stdcall;
  5615. begin
  5616. @closesocket := FixupStub(hWinSockDll, 'closesocket'); {Do not Localize}
  5617. Result := closesocket(s);
  5618. end;
  5619. function Stub_connect(const s: TSocket; const name: PSockAddr; const namelen: Integer): Integer; stdcall;
  5620. begin
  5621. @connect := FixupStub(hWinSockDll, 'connect'); {Do not Localize}
  5622. Result := connect(s, name, namelen);
  5623. end;
  5624. function Stub_ioctlsocket(const s: TSocket; const cmd: DWORD; var arg: u_long): Integer; stdcall;
  5625. begin
  5626. @ioctlsocket := FixupStub(hWinSockDll, 'ioctlsocket'); {Do not Localize}
  5627. Result := ioctlsocket(s, cmd, arg);
  5628. end;
  5629. function Stub_getpeername(const s: TSocket; const name: PSockAddr; var namelen: Integer): Integer; stdcall;
  5630. begin
  5631. @getpeername := FixupStub(hWinSockDll, 'getpeername'); {Do not Localize}
  5632. Result := getpeername(s, name, namelen);
  5633. end;
  5634. function Stub_getsockname(const s: TSocket; const name: PSockAddr; var namelen: Integer): Integer; stdcall;
  5635. begin
  5636. @getsockname := FixupStub(hWinSockDll, 'getsockname'); {Do not Localize}
  5637. Result := getsockname(s, name, namelen);
  5638. end;
  5639. function Stub_getsockopt(const s: TSocket; const level, optname: Integer; optval: PIdAnsiChar; var optlen: Integer): Integer; stdcall;
  5640. begin
  5641. @getsockopt := FixupStub(hWinSockDll, 'getsockopt'); {Do not Localize}
  5642. Result := getsockopt(s, level, optname, optval, optlen);
  5643. end;
  5644. function Stub_htonl(hostlong: u_long): u_long; stdcall;
  5645. begin
  5646. @htonl := FixupStub(hWinSockDll, 'htonl'); {Do not Localize}
  5647. Result := htonl(hostlong);
  5648. end;
  5649. function Stub_htons(hostshort: u_short): u_short; stdcall;
  5650. begin
  5651. @htons := FixupStub(hWinSockDll, 'htons'); {Do not Localize}
  5652. Result := htons(hostshort);
  5653. end;
  5654. function Stub_inet_addr(cp: PIdAnsiChar): u_long; stdcall;
  5655. begin
  5656. @inet_addr := FixupStub(hWinSockDll, 'inet_addr'); {Do not Localize}
  5657. Result := inet_addr(cp);
  5658. end;
  5659. function Stub_inet_ntoa(inaddr: TInAddr): PIdAnsiChar; stdcall;
  5660. begin
  5661. @inet_ntoa := FixupStub(hWinSockDll, 'inet_ntoa'); {Do not Localize}
  5662. Result := inet_ntoa(inaddr);
  5663. end;
  5664. function Stub_listen(const s: TSocket; backlog: Integer): Integer; stdcall;
  5665. begin
  5666. @listen := FixupStub(hWinSockDll, 'listen'); {Do not Localize}
  5667. Result := listen(s, backlog);
  5668. end;
  5669. function Stub_ntohl(netlong: u_long): u_long; stdcall;
  5670. begin
  5671. @ntohl := FixupStub(hWinSockDll, 'ntohl'); {Do not Localize}
  5672. Result := ntohl(netlong);
  5673. end;
  5674. function Stub_ntohs(netshort: u_short): u_short; stdcall;
  5675. begin
  5676. @ntohs := FixupStub(hWinSockDll, 'ntohs'); {Do not Localize}
  5677. Result := ntohs(netshort);
  5678. end;
  5679. function Stub_recv(const s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  5680. begin
  5681. @recv := FixupStub(hWinSockDll, 'recv'); {Do not Localize}
  5682. Result := recv(s, Buf, len, flags);
  5683. end;
  5684. function Stub_recvfrom(const s: TSocket; var Buf; len, flags: Integer; from: PSockAddr; fromlen: PInteger): Integer; stdcall;
  5685. begin
  5686. @recvfrom := FixupStub(hWinSockDll, 'recvfrom'); {Do not Localize}
  5687. Result := recvfrom(s, Buf, len, flags, from, fromlen);
  5688. end;
  5689. function Stub_select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Integer; stdcall;
  5690. begin
  5691. @select := FixupStub(hWinSockDll, 'select'); {Do not Localize}
  5692. Result := select(nfds, readfds, writefds, exceptfds, timeout);
  5693. end;
  5694. function Stub_send(const s: TSocket; const Buf; len, flags: Integer): Integer; stdcall;
  5695. begin
  5696. @send := FixupStub(hWinSockDll, 'send'); {Do not Localize}
  5697. Result := send(s, Buf, len, flags);
  5698. end;
  5699. function Stub_sendto(const s: TSocket; const Buf; const len, flags: Integer; const addrto: PSockAddr; const tolen: Integer): Integer; stdcall;
  5700. begin
  5701. @sendto := FixupStub(hWinSockDll, 'sendto'); {Do not Localize}
  5702. Result := sendto(s, Buf, len, flags, addrto, tolen);
  5703. end;
  5704. function Stub_setsockopt(const s: TSocket; const level, optname: Integer; optval: PIdAnsiChar; const optlen: Integer): Integer; stdcall;
  5705. begin
  5706. @setsockopt := FixupStub(hWinSockDll, 'setsockopt'); {Do not Localize}
  5707. Result := setsockopt(s, level, optname, optval, optlen);
  5708. end;
  5709. function Stub_shutdown(const s: TSocket; const how: Integer): Integer; stdcall;
  5710. begin
  5711. @shutdown := FixupStub(hWinSockDll, 'shutdown'); {Do not Localize}
  5712. Result := shutdown(s, how);
  5713. end;
  5714. function Stub_socket(const af, istruct, protocol: Integer): TSocket; stdcall;
  5715. begin
  5716. @socket := FixupStub(hWinSockDll, 'socket'); {Do not Localize}
  5717. Result := socket(af, istruct, protocol);
  5718. end;
  5719. function Stub_gethostbyaddr(AAddr: Pointer; const len, addrtype: Integer): PHostEnt; stdcall;
  5720. begin
  5721. @gethostbyaddr := FixupStub(hWinSockDll, 'gethostbyaddr'); {Do not Localize}
  5722. Result := gethostbyaddr(AAddr, len, addrtype);
  5723. end;
  5724. function Stub_gethostbyname(name: PIdAnsiChar): PHostEnt; stdcall;
  5725. begin
  5726. @gethostbyname := FixupStub(hWinSockDll, 'gethostbyname'); {Do not Localize}
  5727. Result := gethostbyname(name);
  5728. end;
  5729. {$IFDEF WINCE}
  5730. function Stub_sethostname(pName : PIdAnsiChar; cName : Integer) : Integer; stdcall;
  5731. begin
  5732. @sethostname := FixupStub(hWinSockDll, 'sethostname'); {Do not Localize}
  5733. Result := sethostname(pName, cName);
  5734. end;
  5735. {$ENDIF}
  5736. function Stub_gethostname(name: PIdAnsiChar; len: Integer): Integer; stdcall;
  5737. begin
  5738. @gethostname := FixupStub(hWinSockDll, 'gethostname'); {Do not Localize}
  5739. Result := gethostname(name, len);
  5740. end;
  5741. function Stub_getservbyport(const port: Integer; const proto: PIdAnsiChar): PServEnt; stdcall;
  5742. begin
  5743. @getservbyport := FixupStub(hWinSockDll, 'getservbyport'); {Do not Localize}
  5744. Result := getservbyport(port, proto);
  5745. end;
  5746. function Stub_getservbyname(const name, proto: PIdAnsiChar): PServEnt; stdcall;
  5747. begin
  5748. @getservbyname := FixupStub(hWinSockDll, 'getservbyname'); {Do not Localize}
  5749. Result := getservbyname(name, proto);
  5750. end;
  5751. function Stub_getprotobynumber(const proto: Integer): PProtoEnt; stdcall;
  5752. begin
  5753. @getprotobynumber := FixupStub(hWinSockDll, 'getprotobynumber'); {Do not Localize}
  5754. Result := getprotobynumber(proto);
  5755. end;
  5756. function Stub_getprotobyname(const name: PIdAnsiChar): PProtoEnt; stdcall;
  5757. begin
  5758. @getprotobyname := FixupStub(hWinSockDll, 'getprotobyname'); {Do not Localize}
  5759. Result := getprotobyname(name);
  5760. end;
  5761. procedure Stub_WSASetLastError(const iError: Integer); stdcall;
  5762. begin
  5763. @WSASetLastError := FixupStub(hWinSockDll, 'WSASetLastError'); {Do not Localize}
  5764. WSASetLastError(iError);
  5765. end;
  5766. function Stub_WSAGetLastError: Integer; stdcall;
  5767. begin
  5768. @WSAGetLastError := FixupStub(hWinSockDll, 'WSAGetLastError'); {Do not Localize}
  5769. Result := WSAGetLastError;
  5770. end;
  5771. {$IFNDEF WINCE}
  5772. function Stub_WSAIsBlocking: BOOL; stdcall;
  5773. begin
  5774. @WSAIsBlocking := FixupStub(hWinSockDll, 'WSAIsBlocking'); {Do not Localize}
  5775. Result := WSAIsBlocking;
  5776. end;
  5777. function Stub_WSAUnhookBlockingHook: Integer; stdcall;
  5778. begin
  5779. @WSAUnhookBlockingHook := FixupStub(hWinSockDll, 'WSAUnhookBlockingHook'); {Do not Localize}
  5780. Result := WSAUnhookBlockingHook;
  5781. end;
  5782. function Stub_WSASetBlockingHook(lpBlockFunc: TFarProc): TFarProc; stdcall;
  5783. begin
  5784. @WSASetBlockingHook := FixupStub(hWinSockDll, 'WSASetBlockingHook'); {Do not Localize}
  5785. Result := WSASetBlockingHook(lpBlockFunc);
  5786. end;
  5787. function Stub_WSACancelBlockingCall: Integer; stdcall;
  5788. begin
  5789. @WSACancelBlockingCall := FixupStub(hWinSockDll, 'WSACancelBlockingCall'); {Do not Localize}
  5790. Result := WSACancelBlockingCall;
  5791. end;
  5792. function Stub_WSAAsyncGetServByName(HWindow: HWND; wMsg: u_int; name, proto, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  5793. begin
  5794. @WSAAsyncGetServByName := FixupStub(hWinSockDll, 'WSAAsyncGetServByName'); {Do not Localize}
  5795. Result := WSAAsyncGetServByName(HWindow, wMsg, name, proto, buf, buflen);
  5796. end;
  5797. function Stub_WSAAsyncGetServByPort(HWindow: HWND; wMsg, port: u_int; proto, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  5798. begin
  5799. @WSAAsyncGetServByPort := FixupStub(hWinSockDll, 'WSAAsyncGetServByPort'); {Do not Localize}
  5800. Result := WSAAsyncGetServByPort(HWindow, wMsg, port, proto, buf, buflen);
  5801. end;
  5802. function Stub_WSAAsyncGetProtoByName(HWindow: HWND; wMsg: u_int; name, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  5803. begin
  5804. @WSAAsyncGetProtoByName := FixupStub(hWinSockDll, 'WSAAsyncGetProtoByName'); {Do not Localize}
  5805. Result := WSAAsyncGetProtoByName(HWindow, wMsg, name, buf, buflen);
  5806. end;
  5807. function Stub_WSAAsyncGetProtoByNumber(HWindow: HWND; wMsg: u_int; number: Integer; buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  5808. begin
  5809. @WSAAsyncGetProtoByNumber := FixupStub(hWinSockDll, 'WSAAsyncGetProtoByNumber'); {Do not Localize}
  5810. Result := WSAAsyncGetProtoByNumber(HWindow, wMsg, number, buf, buflen);
  5811. end;
  5812. function Stub_WSAAsyncGetHostByName(HWindow: HWND; wMsg: u_int; name, buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  5813. begin
  5814. @WSAAsyncGetHostByName := FixupStub(hWinSockDll, 'WSAAsyncGetHostByName'); {Do not Localize}
  5815. Result := WSAAsyncGetHostByName(HWindow, wMsg, name, buf, buflen);
  5816. end;
  5817. function Stub_WSAAsyncGetHostByAddr(HWindow: HWND; wMsg: u_int; AAddr: PIdAnsiChar; len, istruct: Integer; buf: PIdAnsiChar; buflen: Integer): THandle; stdcall;
  5818. begin
  5819. @WSAAsyncGetHostByAddr := FixupStub(hWinSockDll, 'WSAAsyncGetHostByAddr'); {Do not Localize}
  5820. Result := WSAAsyncGetHostByAddr(HWindow, wMsg, AAddr, len, istruct, buf, buflen);
  5821. end;
  5822. function Stub_WSACancelAsyncRequest(hAsyncTaskHandle: THandle): Integer; stdcall;
  5823. begin
  5824. @WSACancelAsyncRequest := FixupStub(hWinSockDll, 'WSACancelAsyncRequest'); {Do not Localize}
  5825. Result := WSACancelAsyncRequest(hAsyncTaskHandle);
  5826. end;
  5827. function Stub_WSAAsyncSelect(const s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
  5828. begin
  5829. @WSAAsyncSelect := FixupStub(hWinSockDll, 'WSAAsyncSelect'); {Do not Localize}
  5830. Result := WSAAsyncSelect(s, HWindow, wMsg, lEvent);
  5831. end;
  5832. {$ENDIF}
  5833. function Stub___WSAFDIsSet(const s: TSocket; var FDSet: TFDSet): Bool; stdcall;
  5834. begin
  5835. @__WSAFDIsSet := FixupStub(hWinSockDll, '__WSAFDIsSet'); {Do not Localize}
  5836. Result := __WSAFDIsSet(s, FDSet);
  5837. end;
  5838. function Stub_WSAAccept(const s: TSocket; AAddr: PSockAddr; addrlen: PInteger; lpfnCondition: LPCONDITIONPROC; const dwCallbackData: DWORD): TSocket; stdcall;
  5839. begin
  5840. @WSAAccept := FixupStub(hWinSockDll, 'WSAAccept'); {Do not Localize}
  5841. Result := WSAAccept(s, AAddr, addrlen, lpfnCondition, dwCallbackData);
  5842. end;
  5843. function Stub_WSACloseEvent(const hEvent: wsaevent): WordBool; stdcall;
  5844. begin
  5845. @WSACloseEvent := FixupStub(hWinSockDll, 'WSACloseEvent'); {Do not Localize}
  5846. Result := WSACloseEvent(hEvent);
  5847. end;
  5848. function Stub_WSAConnect(const s: TSocket; const name: PSockAddr; const namelen: Integer; lpCallerData, lpCalleeData: LPWSABUF; lpSQOS, lpGQOS: LPQOS): Integer; stdcall;
  5849. begin
  5850. @WSAConnect := FixupStub(hWinSockDll, 'WSAConnect'); {Do not Localize}
  5851. Result := WSAConnect(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS);
  5852. end;
  5853. function Stub_WSACreateEvent: wsaevent; stdcall;
  5854. begin
  5855. @WSACreateEvent := FixupStub(hWinSockDll, 'WSACreateEvent'); {Do not Localize}
  5856. Result := WSACreateEvent;
  5857. end;
  5858. {$IFNDEF WINCE}
  5859. function Stub_WSADuplicateSocketA(const s: TSocket; const dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOA): Integer; stdcall;
  5860. begin
  5861. @WSADuplicateSocketA := FixupStub(hWinSockDll, 'WSADuplicateSocketA'); {Do not Localize}
  5862. Result := WSADuplicateSocketA(s, dwProcessId, lpProtocolInfo);
  5863. end;
  5864. function Stub_WSADuplicateSocketW(const s: TSocket; const dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFOW): Integer; stdcall;
  5865. begin
  5866. @WSADuplicateSocketW := FixupStub(hWinSockDll, 'WSADuplicateSocketW'); {Do not Localize}
  5867. Result := WSADuplicateSocketW(s, dwProcessId, lpProtocolInfo);
  5868. end;
  5869. function Stub_WSADuplicateSocket(const s: TSocket; const dwProcessId: DWORD; lpProtocolInfo: LPWSAPROTOCOL_INFO): Integer; stdcall;
  5870. begin
  5871. {$IFDEF UNICODE}
  5872. @WSADuplicateSocket := FixupStub(hWinSockDll, 'WSADuplicateSocketW'); {Do not Localize}
  5873. {$ELSE}
  5874. @WSADuplicateSocket := FixupStub(hWinSockDll, 'WSADuplicateSocketA'); {Do not Localize}
  5875. {$ENDIF}
  5876. Result := WSADuplicateSocket(s, dwProcessId, lpProtocolInfo);
  5877. end;
  5878. {$ENDIF}
  5879. function Stub_WSAEnumNetworkEvents(const s: TSocket; const hEventObject: WSAEVENT; lpNetworkEvents: LPWSANETWORKEVENTS): Integer; stdcall;
  5880. begin
  5881. @WSAEnumNetworkEvents := FixupStub(hWinSockDll, 'WSAEnumNetworkEvents'); {Do not Localize}
  5882. Result := WSAEnumNetworkEvents(s, hEventObject, lpNetworkEvents);
  5883. end;
  5884. function Stub_WSAEnumProtocolsA(lpiProtocols: PInteger; lpProtocolBuffer: LPWSAPROTOCOL_INFOA; var lpdwBufferLength: DWORD): Integer; stdcall;
  5885. begin
  5886. @WSAEnumProtocolsA := FixupStub(hWinSockDll, 'WSAEnumProtocolsA'); {Do not Localize}
  5887. Result := WSAEnumProtocolsA(lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
  5888. end;
  5889. function Stub_WSAEnumProtocolsW(lpiProtocols: PInteger; lpProtocolBuffer: LPWSAPROTOCOL_INFOW; var lpdwBufferLength: DWORD): Integer; stdcall;
  5890. begin
  5891. @WSAEnumProtocolsW := FixupStub(hWinSockDll, 'WSAEnumProtocolsW'); {Do not Localize}
  5892. Result := WSAEnumProtocolsW(lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
  5893. end;
  5894. function Stub_WSAEnumProtocols(lpiProtocols: PInteger; lpProtocolBuffer: LPWSAPROTOCOL_INFO; var lpdwBufferLength: DWORD): Integer; stdcall;
  5895. begin
  5896. {$IFDEF UNICODE}
  5897. @WSAEnumProtocols := FixupStub(hWinSockDll, 'WSAEnumProtocolsW'); {Do not Localize}
  5898. {$ELSE}
  5899. @WSAEnumProtocols := FixupStub(hWinSockDll, 'WSAEnumProtocolsA'); {Do not Localize}
  5900. {$ENDIF}
  5901. Result := WSAEnumProtocols(lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
  5902. end;
  5903. function Stub_WSAEventSelect(const s: TSocket; const hEventObject: WSAEVENT; lNetworkEvents: LongInt): Integer; stdcall;
  5904. begin
  5905. @WSAEventSelect := FixupStub(hWinSockDll, 'WSAEventSelect'); {Do not Localize}
  5906. Result := WSAEventSelect(s, hEventObject, lNetworkEvents);
  5907. end;
  5908. function Stub_WSAGetOverlappedResult(const s: TSocket; AOverlapped: Pointer; lpcbTransfer: LPDWORD; fWait: BOOL; var lpdwFlags: DWORD): WordBool; stdcall;
  5909. begin
  5910. @WSAGetOverlappedResult := FixupStub(hWinSockDll, 'WSAGetOverlappedResult'); {Do not Localize}
  5911. Result := WSAGetOverlappedResult(s, AOverlapped, lpcbTransfer, fWait, lpdwFlags);
  5912. end;
  5913. {$IFNDEF WINCE}
  5914. function Stub_WSAGetQOSByName(const s: TSocket; lpQOSName: LPWSABUF; lpQOS: LPQOS): WordBool; stdcall;
  5915. begin
  5916. @WSAGetQOSByName := FixupStub(hWinSockDll, 'WSAGetQOSByName'); {Do not Localize}
  5917. Result := WSAGetQOSByName(s, lpQOSName, lpQOS);
  5918. end;
  5919. {$ENDIF}
  5920. function Stub_WSAHtonl(const s: TSocket; hostlong: u_long; var lpnetlong: DWORD): Integer; stdcall;
  5921. begin
  5922. @WSAHtonl := FixupStub(hWinSockDll, 'WSAHtonl'); {Do not Localize}
  5923. Result := WSAHtonl(s, hostlong, lpnetlong);
  5924. end;
  5925. function Stub_WSAHtons(const s: TSocket; hostshort: u_short; var lpnetshort: WORD): Integer; stdcall;
  5926. begin
  5927. @WSAHtons := FixupStub(hWinSockDll, 'WSAHtons'); {Do not Localize}
  5928. Result := WSAHtons(s, hostshort, lpnetshort);
  5929. end;
  5930. function Stub_WSAIoctl(const s: TSocket; dwIoControlCode: DWORD; lpvInBuffer: Pointer; cbInBuffer: DWORD; lpvOutBuffer: Pointer; cbOutBuffer: DWORD; lpcbBytesReturned: LPDWORD; AOverlapped: Pointer; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  5931. begin
  5932. @WSAIoctl := FixupStub(hWinSockDll, 'WSAIoctl'); {Do not Localize}
  5933. Result := WSAIoctl(s, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, AOverlapped, lpCompletionRoutine);
  5934. end;
  5935. function Stub_WSAJoinLeaf(const s: TSocket; name: PSockAddr; namelen: Integer; lpCallerData, lpCalleeData: LPWSABUF; lpSQOS, lpGQOS: LPQOS; dwFlags: DWORD): TSocket; stdcall;
  5936. begin
  5937. @WSAJoinLeaf := FixupStub(hWinSockDll, 'WSAJoinLeaf'); {Do not Localize}
  5938. Result := WSAJoinLeaf(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, dwFlags);
  5939. end;
  5940. function Stub_WSANtohl(const s: TSocket; netlong: u_long; var lphostlong: DWORD): Integer; stdcall;
  5941. begin
  5942. @WSANtohl := FixupStub(hWinSockDll, 'WSANtohl'); {Do not Localize}
  5943. Result := WSANtohl(s, netlong, lphostlong);
  5944. end;
  5945. function Stub_WSANtohs(const s: TSocket; netshort: u_short; var lphostshort: WORD): Integer; stdcall;
  5946. begin
  5947. @WSANtohs := FixupStub(hWinSockDll, 'WSANtohs'); {Do not Localize}
  5948. Result := WSANtohs(s, netshort, lphostshort);
  5949. end;
  5950. function Stub_WSARecv(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  5951. begin
  5952. @WSARecv := FixupStub(hWinSockDll, 'WSARecv'); {Do not Localize}
  5953. Result := WSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, AOverlapped, lpCompletionRoutine);
  5954. end;
  5955. function Stub_WSARecvDisconnect(const s: TSocket; lpInboundDisconnectData: LPWSABUF): Integer; stdcall;
  5956. begin
  5957. @WSARecvDisconnect := FixupStub(hWinSockDll, 'WSARecvDisconnect'); {Do not Localize}
  5958. Result := WSARecvDisconnect(s, lpInboundDisconnectData);
  5959. end;
  5960. function Stub_WSARecvFrom(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; lpFrom: PSockAddr; lpFromlen: PInteger; AOverlapped: Pointer; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  5961. begin
  5962. @WSARecvFrom := FixupStub(hWinSockDll, 'WSARecvFrom'); {Do not Localize}
  5963. Result := WSARecvFrom(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpFrom, lpFromlen, AOverlapped, lpCompletionRoutine);
  5964. end;
  5965. function Stub_WSAResetEvent(hEvent: wsaevent): WordBool; stdcall;
  5966. begin
  5967. @WSAResetEvent := FixupStub(hWinSockDll, 'WSAResetEvent'); {Do not Localize}
  5968. Result := WSAResetEvent(hEvent);
  5969. end;
  5970. function Stub_WSASend(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesSent: DWORD; dwFlags: DWORD; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  5971. begin
  5972. @WSASend := FixupStub(hWinSockDll, 'WSASend'); {Do not Localize}
  5973. Result := WSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, AOverlapped, lpCompletionRoutine);
  5974. end;
  5975. {$IFNDEF WINCE}
  5976. function Stub_WSASendDisconnect(const s: TSocket; lpOutboundDisconnectData: LPWSABUF): Integer; stdcall;
  5977. begin
  5978. @WSASendDisconnect := FixupStub(hWinSockDll, 'WSASendDisconnect'); {Do not Localize}
  5979. Result := WSASendDisconnect(s, lpOutboundDisconnectData);
  5980. end;
  5981. {$ENDIF}
  5982. function Stub_WSASendTo(const s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesSent: DWORD; dwFlags: DWORD; lpTo: PSOCKADDR; iTolen: Integer; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  5983. begin
  5984. @WSASendTo := FixupStub(hWinSockDll, 'WSASendTo'); {Do not Localize}
  5985. Result := WSASendTo(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpTo, iTolen, AOverlapped, lpCompletionRoutine);
  5986. end;
  5987. function Stub_WSASetEvent(hEvent: WSAEVENT): WordBool; stdcall;
  5988. begin
  5989. @WSASetEvent := FixupStub(hWinSockDll, 'WSASetEvent'); {Do not Localize}
  5990. Result := WSASetEvent(hEvent);
  5991. end;
  5992. function Stub_WSASocketA(af, iType, protocol: Integer; lpProtocolInfo: LPWSAPROTOCOL_INFOA; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
  5993. begin
  5994. @WSASocketA := FixupStub(hWinSockDll, 'WSASocketA'); {Do not Localize}
  5995. Result := WSASocketA(af, iType, protocol, lpProtocolInfo, g, dwFlags);
  5996. end;
  5997. function Stub_WSASocketW(af, iType, protocol: Integer; lpProtocolInfo: LPWSAPROTOCOL_INFOW; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
  5998. begin
  5999. @WSASocketW := FixupStub(hWinSockDll, 'WSASocketW'); {Do not Localize}
  6000. Result := WSASocketW(af, iType, protocol, lpProtocolInfo, g, dwFlags);
  6001. end;
  6002. function Stub_WSASocket(af, iType, protocol: Integer; lpProtocolInfo: LPWSAPROTOCOL_INFO; g: GROUP; dwFlags: DWORD): TSocket; stdcall;
  6003. begin
  6004. {$IFDEF UNICODE}
  6005. @WSASocket := FixupStub(hWinSockDll, 'WSASocketW'); {Do not Localize}
  6006. {$ELSE}
  6007. @WSASocket := FixupStub(hWinSockDll, 'WSASocketA'); {Do not Localize}
  6008. {$ENDIF}
  6009. Result := WSASocket(af, iType, protocol, lpProtocolInfo, g, dwFlags);
  6010. end;
  6011. function Stub_WSAWaitForMultipleEvents(cEvents: DWORD; lphEvents: Pwsaevent; fWaitAll: LongBool; dwTimeout: DWORD; fAlertable: LongBool): DWORD; stdcall;
  6012. begin
  6013. @WSAWaitForMultipleEvents := FixupStub(hWinSockDll, 'WSAWaitForMultipleEvents'); {Do not Localize}
  6014. Result := WSAWaitForMultipleEvents(cEvents, lphEvents, fWaitAll, dwTimeout, fAlertable);
  6015. end;
  6016. function Stub_WSAAddressToStringA(lpsaAddress: PSockAddr; const dwAddressLength: DWORD; const lpProtocolInfo: LPWSAPROTOCOL_INFOA; const lpszAddressString: PIdAnsiChar; var lpdwAddressStringLength: DWORD): Integer; stdcall;
  6017. begin
  6018. @WSAAddressToStringA := FixupStub(hWinSockDll, 'WSAAddressToStringA'); {Do not Localize}
  6019. Result := WSAAddressToStringA(lpsaAddress, dwAddressLength, lpProtocolInfo, lpszAddressString, lpdwAddressStringLength);
  6020. end;
  6021. function Stub_WSAAddressToStringW(lpsaAddress: PSockAddr; const dwAddressLength: DWORD; const lpProtocolInfo: LPWSAPROTOCOL_INFOW; const lpszAddressString: PWideChar; var lpdwAddressStringLength: DWORD): Integer; stdcall;
  6022. begin
  6023. @WSAAddressToStringW := FixupStub(hWinSockDll, 'WSAAddressToStringW'); {Do not Localize}
  6024. Result := WSAAddressToStringW(lpsaAddress, dwAddressLength, lpProtocolInfo, lpszAddressString, lpdwAddressStringLength);
  6025. end;
  6026. function Stub_WSAAddressToString(lpsaAddress: PSockAddr; const dwAddressLength: DWORD; const lpProtocolInfo: LPWSAPROTOCOL_INFO;
  6027. const lpszAddressString: PIdPlatformChar; var lpdwAddressStringLength: DWORD): Integer; stdcall;
  6028. begin
  6029. {$IFDEF UNICODE}
  6030. @WSAAddressToString := FixupStub(hWinSockDll, 'WSAAddressToStringW'); {Do not Localize}
  6031. {$ELSE}
  6032. @WSAAddressToString := FixupStub(hWinSockDll, 'WSAAddressToStringA'); {Do not Localize}
  6033. {$ENDIF}
  6034. Result := WSAAddressToString(lpsaAddress, dwAddressLength, lpProtocolInfo, lpszAddressString, lpdwAddressStringLength);
  6035. end;
  6036. function Stub_WSAStringToAddressA(const AddressString: PIdAnsiChar; const AddressFamily: Integer; const lpProtocolInfo: LPWSAPROTOCOL_INFOA; var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
  6037. begin
  6038. @WSAStringToAddressA := FixupStub(hWinSockDll, 'WSAStringToAddressA'); {Do not Localize}
  6039. Result := WSAStringToAddressA(AddressString, AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength);
  6040. end;
  6041. function Stub_WSAStringToAddressW(const AddressString: PWideChar; const AddressFamily: Integer; const lpProtocolInfo: LPWSAPROTOCOL_INFOW; var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
  6042. begin
  6043. @WSAStringToAddressW := FixupStub(hWinSockDll, 'WSAStringToAddressW'); {Do not Localize}
  6044. Result := WSAStringToAddressW(AddressString, AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength);
  6045. end;
  6046. function Stub_WSAStringToAddress (const AddressString: PIdPlatformChar;
  6047. const AddressFamily: Integer; const lpProtocolInfo: LPWSAProtocol_Info;
  6048. var lpAddress: TSockAddr; var lpAddressLength: Integer): Integer; stdcall;
  6049. begin
  6050. {$IFDEF UNICODE}
  6051. @WSAStringToAddress := FixupStub(hWinSockDll, 'WSAStringToAddressW'); {Do not Localize}
  6052. {$ELSE}
  6053. @WSAStringToAddress := FixupStub(hWinSockDll, 'WSAStringToAddressA'); {Do not Localize}
  6054. {$ENDIF}
  6055. Result := WSAStringToAddress(AddressString, AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength);
  6056. end;
  6057. function Stub_WSALookupServiceBeginA(var qsRestrictions: TWSAQuerySetA; const dwControlFlags: DWORD; var hLookup: THandle): Integer; stdcall;
  6058. begin
  6059. @WSALookupServiceBeginA := FixupStub(hWinSockDll, 'WSALookupServiceBeginA'); {Do not Localize}
  6060. Result := WSALookupServiceBeginA(qsRestrictions, dwControlFlags, hLookup);
  6061. end;
  6062. function Stub_WSALookupServiceBeginW(var qsRestrictions: TWSAQuerySetW; const dwControlFlags: DWORD; var hLookup: THandle): Integer; stdcall;
  6063. begin
  6064. @WSALookupServiceBeginW := FixupStub(hWinSockDll, 'WSALookupServiceBeginW'); {Do not Localize}
  6065. Result := WSALookupServiceBeginW(qsRestrictions, dwControlFlags, hLookup);
  6066. end;
  6067. function Stub_WSALookupServiceBegin(var qsRestrictions: TWSAQuerySet; const dwControlFlags: DWORD; var hLookup: THandle): Integer; stdcall;
  6068. begin
  6069. {$IFDEF UNICODE}
  6070. @WSALookupServiceBegin := FixupStub(hWinSockDll, 'WSALookupServiceBeginW'); {Do not Localize}
  6071. {$ELSE}
  6072. @WSALookupServiceBegin := FixupStub(hWinSockDll, 'WSALookupServiceBeginA'); {Do not Localize}
  6073. {$ENDIF}
  6074. Result := WSALookupServiceBegin(qsRestrictions, dwControlFlags, hLookup);
  6075. end;
  6076. function Stub_WSALookupServiceNextA(const hLookup: THandle; const dwControlFlags: DWORD; var dwBufferLength: DWORD; lpqsResults: LPWSAQUERYSETA): Integer; stdcall;
  6077. begin
  6078. @WSALookupServiceNextA := FixupStub(hWinSockDll, 'WSALookupServiceNextA'); {Do not Localize}
  6079. Result := WSALookupServiceNextA(hLookup, dwControlFlags, dwBufferLength, lpqsResults);
  6080. end;
  6081. function Stub_WSALookupServiceNextW(const hLookup: THandle; const dwControlFlags: DWORD; var dwBufferLength: DWORD; lpqsResults: LPWSAQUERYSETW): Integer; stdcall;
  6082. begin
  6083. @WSALookupServiceNextW := FixupStub(hWinSockDll, 'WSALookupServiceNextW'); {Do not Localize}
  6084. Result := WSALookupServiceNextW(hLookup, dwControlFlags, dwBufferLength, lpqsResults);
  6085. end;
  6086. function Stub_WSALookupServiceNext(const hLookup: THandle; const dwControlFlags: DWORD; var dwBufferLength: DWORD; lpqsResults: LPWSAQUERYSET): Integer; stdcall;
  6087. begin
  6088. {$IFDEF UNICODE}
  6089. @WSALookupServiceNext := FixupStub(hWinSockDll, 'WSALookupServiceNextW'); {Do not Localize}
  6090. {$ELSE}
  6091. @WSALookupServiceNext := FixupStub(hWinSockDll, 'WSALookupServiceNextA'); {Do not Localize}
  6092. {$ENDIF}
  6093. Result := WSALookupServiceNext(hLookup, dwControlFlags, dwBufferLength, lpqsResults);
  6094. end;
  6095. function Stub_WSALookupServiceEnd(const hLookup: THandle): Integer; stdcall;
  6096. begin
  6097. @WSALookupServiceEnd := FixupStub(hWinSockDll, 'WSALookupServiceEnd'); {Do not Localize}
  6098. Result := WSALookupServiceEnd(hLookup);
  6099. end;
  6100. function Stub_WSANSPIoctl(const hLookup : THANDLE; const dwControlCode : DWORD;
  6101. lpvInBuffer : Pointer; var cbInBuffer : DWORD; lpvOutBuffer : Pointer;
  6102. var cbOutBuffer : DWORD; var lpcbBytesReturned : DWORD;
  6103. lpCompletion : LPWSACOMPLETION) : Integer; stdcall;
  6104. begin
  6105. @WSANSPIoctl := FixupStub(hWinSockDLL, 'WSANSPIoctl'); {Do not Localize}
  6106. Result := WSANSPIoctl(hLookup,dwControlCode,lpvInBuffer,cbInBuffer,lpvOutBuffer,
  6107. cbOutBuffer, lpcbBytesReturned,lpCompletion);
  6108. end;
  6109. function Stub_WSAInstallServiceClassA(const lpServiceClassInfo: LPWSASERVICECLASSINFOA): Integer; stdcall;
  6110. begin
  6111. @WSAInstallServiceClassA := FixupStub(hWinSockDll, 'WSAInstallServiceClassA'); {Do not Localize}
  6112. Result := WSAInstallServiceClassA(lpServiceClassInfo);
  6113. end;
  6114. function Stub_WSAInstallServiceClassW(const lpServiceClassInfo: LPWSASERVICECLASSINFOW): Integer; stdcall;
  6115. begin
  6116. @WSAInstallServiceClassW := FixupStub(hWinSockDll, 'WSAInstallServiceClassW'); {Do not Localize}
  6117. Result := WSAInstallServiceClassW(lpServiceClassInfo);
  6118. end;
  6119. function Stub_WSAInstallServiceClass(const lpServiceClassInfo: LPWSASERVICECLASSINFO): Integer; stdcall;
  6120. begin
  6121. {$IFDEF UNICODE}
  6122. @WSAInstallServiceClass := FixupStub(hWinSockDll, 'WSAInstallServiceClassW'); {Do not Localize}
  6123. {$ELSE}
  6124. @WSAInstallServiceClass := FixupStub(hWinSockDll, 'WSAInstallServiceClassA'); {Do not Localize}
  6125. {$ENDIF}
  6126. Result := WSAInstallServiceClass(lpServiceClassInfo);
  6127. end;
  6128. function Stub_WSARemoveServiceClass(const lpServiceClassId: PGUID): Integer; stdcall;
  6129. begin
  6130. @WSARemoveServiceClass := FixupStub(hWinSockDll, 'WSARemoveServiceClass'); {Do not Localize}
  6131. Result := WSARemoveServiceClass(lpServiceClassId);
  6132. end;
  6133. function Stub_WSAGetServiceClassInfoA(const lpProviderId: PGUID; const lpServiceClassId: PGUID; var lpdwBufSize: DWORD; lpServiceClassInfo: LPWSASERVICECLASSINFOA): Integer; stdcall;
  6134. begin
  6135. @WSAGetServiceClassInfoA := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoA'); {Do not Localize}
  6136. Result := WSAGetServiceClassInfoA(lpProviderId, lpServiceClassId, lpdwBufSize, lpServiceClassInfo);
  6137. end;
  6138. function Stub_WSAGetServiceClassInfoW(const lpProviderId: PGUID; const lpServiceClassId: PGUID; var lpdwBufSize: DWORD; lpServiceClassInfo: LPWSASERVICECLASSINFOW): Integer; stdcall;
  6139. begin
  6140. @WSAGetServiceClassInfoW := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoW'); {Do not Localize}
  6141. Result := WSAGetServiceClassInfoW(lpProviderId, lpServiceClassId, lpdwBufSize, lpServiceClassInfo);
  6142. end;
  6143. function Stub_WSAGetServiceClassInfo(const lpProviderId: PGUID; const lpServiceClassId: PGUID; var lpdwBufSize: DWORD; lpServiceClassInfo: LPWSASERVICECLASSINFO): Integer; stdcall;
  6144. begin
  6145. {$IFDEF UNICODE}
  6146. @WSAGetServiceClassInfo := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoW'); {Do not Localize}
  6147. {$ELSE}
  6148. @WSAGetServiceClassInfo := FixupStub(hWinSockDll, 'WSAGetServiceClassInfoA'); {Do not Localize}
  6149. {$ENDIF}
  6150. Result := WSAGetServiceClassInfo(lpProviderId, lpServiceClassId, lpdwBufSize, lpServiceClassInfo);
  6151. end;
  6152. function Stub_WSAEnumNameSpaceProvidersA(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOA): Integer; stdcall;
  6153. begin
  6154. @WSAEnumNameSpaceProvidersA := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersA'); {Do not Localize}
  6155. Result := WSAEnumNameSpaceProvidersA(lpdwBufferLength, lpnspBuffer);
  6156. end;
  6157. function Stub_WSAEnumNameSpaceProvidersW(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFOW): Integer; stdcall;
  6158. begin
  6159. @WSAEnumNameSpaceProvidersW := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersW'); {Do not Localize}
  6160. Result := WSAEnumNameSpaceProvidersW(lpdwBufferLength, lpnspBuffer);
  6161. end;
  6162. function Stub_WSAEnumNameSpaceProviders(var lpdwBufferLength: DWORD; const lpnspBuffer: LPWSANAMESPACE_INFO): Integer; stdcall;
  6163. begin
  6164. {$IFDEF UNICODE}
  6165. @WSAEnumNameSpaceProviders := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersW'); {Do not Localize}
  6166. {$ELSE}
  6167. @WSAEnumNameSpaceProviders := FixupStub(hWinSockDll, 'WSAEnumNameSpaceProvidersA'); {Do not Localize}
  6168. {$ENDIF}
  6169. Result := WSAEnumNameSpaceProviders(lpdwBufferLength, lpnspBuffer);
  6170. end;
  6171. function Stub_WSAGetServiceClassNameByClassIdA(const lpServiceClassId: PGUID; lpszServiceClassName: PIdAnsiChar; var lpdwBufferLength: DWORD): Integer; stdcall;
  6172. begin
  6173. @WSAGetServiceClassNameByClassIdA := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdA'); {Do not Localize}
  6174. Result := WSAGetServiceClassNameByClassIdA(lpServiceClassId, lpszServiceClassName, lpdwBufferLength);
  6175. end;
  6176. function Stub_WSAGetServiceClassNameByClassIdW(const lpServiceClassId: PGUID; lpszServiceClassName: PWideChar; var lpdwBufferLength: DWORD): Integer; stdcall;
  6177. begin
  6178. @WSAGetServiceClassNameByClassIdW := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdW'); {Do not Localize}
  6179. Result := WSAGetServiceClassNameByClassIdW(lpServiceClassId, lpszServiceClassName, lpdwBufferLength);
  6180. end;
  6181. function Stub_WSAGetServiceClassNameByClassId(const lpServiceClassId: PGUID;
  6182. lpszServiceClassName: PIdPlatformChar; var lpdwBufferLength: DWORD): Integer; stdcall;
  6183. begin
  6184. {$IFDEF UNICODE}
  6185. @WSAGetServiceClassNameByClassId := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdW'); {Do not Localize}
  6186. {$ELSE}
  6187. @WSAGetServiceClassNameByClassId := FixupStub(hWinSockDll, 'WSAGetServiceClassNameByClassIdA'); {Do not Localize}
  6188. {$ENDIF}
  6189. Result := WSAGetServiceClassNameByClassId(lpServiceClassId, lpszServiceClassName, lpdwBufferLength);
  6190. end;
  6191. function Stub_WSASetServiceA(const lpqsRegInfo: LPWSAQUERYSETA; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
  6192. begin
  6193. @WSASetServiceA := FixupStub(hWinSockDll, 'WSASetServiceA'); {Do not Localize}
  6194. Result := WSASetServiceA(lpqsRegInfo, essoperation, dwControlFlags);
  6195. end;
  6196. function Stub_WSASetServiceW(const lpqsRegInfo: LPWSAQUERYSETW; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
  6197. begin
  6198. @WSASetServiceW := FixupStub(hWinSockDll, 'WSASetServiceW'); {Do not Localize}
  6199. Result := WSASetServiceW(lpqsRegInfo, essoperation, dwControlFlags);
  6200. end;
  6201. function Stub_WSASetService(const lpqsRegInfo: LPWSAQUERYSET; const essoperation: WSAESETSERVICEOP; const dwControlFlags: DWORD): Integer; stdcall;
  6202. begin
  6203. {$IFDEF UNICODE}
  6204. @WSASetService := FixupStub(hWinSockDll, 'WSASetServiceW'); {Do not Localize}
  6205. {$ELSE}
  6206. @WSASetService := FixupStub(hWinSockDll, 'WSASetServiceA'); {Do not Localize}
  6207. {$ENDIF}
  6208. Result := WSASetService(lpqsRegInfo, essoperation, dwControlFlags);
  6209. end;
  6210. function Stub_WSAProviderConfigChange(var lpNotificationHandle: THandle; AOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  6211. begin
  6212. @WSAProviderConfigChange := FixupStub(hWinSockDll, 'WSAProviderConfigChange'); {Do not Localize}
  6213. Result := WSAProviderConfigChange(lpNotificationHandle, AOverlapped, lpCompletionRoutine);
  6214. end;
  6215. function Stub_TransmitFile(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite: DWORD;
  6216. nNumberOfBytesPerSend: DWORD; lpOverlapped: POverlapped;
  6217. lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
  6218. begin
  6219. @TransmitFile := FixupStubEx(hSocket, 'TransmitFile', WSAID_TRANSMITFILE); {Do not localize}
  6220. Result := TransmitFile(hSocket, hFile, nNumberOfBytesToWrite, nNumberOfBytesPerSend, lpOverlapped, lpTransmitBuffers, dwReserved);
  6221. end;
  6222. {RLebeau 1/26/2006 - loading GetAcceptExSockaddrs() at the same time as AcceptEx().
  6223. This is because GetAcceptExSockaddrs() is not passed a SOCKET that can be passed to
  6224. WSAIoCtrl() to get the function pointer. Also, GetAcceptExSockaddrs() is needed to
  6225. parse AcceptEx()'s return data, so there is no point in calling AcceptEx() unless
  6226. its data can be parsed afterwards.}
  6227. function Stub_AcceptEx(sListenSocket, sAcceptSocket: TSocket;
  6228. lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
  6229. dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
  6230. lpOverlapped: POverlapped): BOOL; stdcall;
  6231. begin
  6232. {RLebeau - loading GetAcceptExSockaddrs() first in case it fails}
  6233. @GetAcceptExSockaddrs := FixupStubEx(sListenSocket, 'GetAcceptExSockaddrs', WSAID_GETACCEPTEXSOCKADDRS); {Do not localize}
  6234. @AcceptEx := FixupStubEx(sListenSocket, 'AcceptEx', WSAID_ACCEPTEX); {Do not localize}
  6235. Result := AcceptEx(sListenSocket, sAcceptSocket, lpOutputBuffer, dwReceiveDataLength,
  6236. dwLocalAddressLength, dwRemoteAddressLength, lpdwBytesReceived, lpOverlapped);
  6237. end;
  6238. {$IFNDEF WINCE}
  6239. function Stub_WSARecvEx(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
  6240. begin
  6241. LoadMSWSock;
  6242. @WSARecvEx := FixupStub(hMSWSockDll, 'WSARecvEx'); {Do not localize}
  6243. Result := WSARecvEx(s, buf, len, flags);
  6244. end;
  6245. {$ENDIF}
  6246. function Stub_ConnectEx(const s : TSocket; const name: PSockAddr; const namelen: Integer; lpSendBuffer : Pointer;
  6247. dwSendDataLength : DWORD; var lpdwBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED) : BOOL; stdcall;
  6248. begin
  6249. @ConnectEx := FixupStubEx(s, 'ConnectEx', WSAID_CONNECTEX); {Do not localize}
  6250. Result := ConnectEx(s, name, namelen, lpSendBuffer, dwSendDataLength, lpdwBytesSent, lpOverlapped);
  6251. end;
  6252. function Stub_DisconnectEx(const s : TSocket; AOverlapped: Pointer; const dwFlags : DWord; const dwReserved : DWORD) : BOOL; stdcall;
  6253. begin
  6254. @DisconnectEx := FixupStubEx(s, 'DisconnectEx', WSAID_DISCONNECTEX); {Do not localize}
  6255. Result := DisconnectEx(s, AOverlapped, dwFlags, dwReserved);
  6256. end;
  6257. function Stub_WSARecvMsg(const s : TSocket; lpMsg : LPWSAMSG; var lpNumberOfBytesRecvd : DWORD; AOverlapped: Pointer; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
  6258. begin
  6259. @WSARecvMsg := FixupStubEx(s, 'WSARecvMsg', WSAID_WSARECVMSG); {Do not localize}
  6260. Result := WSARecvMsg(s, lpMsg, lpNumberOfBytesRecvd, AOverlapped, lpCompletionRoutine);
  6261. end;
  6262. function Stub_TransmitPackets(s: TSocket; lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT;
  6263. nElementCount: DWORD; nSendSize: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD): BOOL; stdcall;
  6264. begin
  6265. @TransmitPackets := FixupStubEx(s, 'TransmitPackets', WSAID_TRANSMITPACKETS); {Do not localize}
  6266. Result := TransmitPackets(s, lpPacketArray, nElementCount, nSendSize, lpOverlapped, dwFlags);
  6267. end;
  6268. {$IFNDEF WINCE}
  6269. function Stub_WSASendMsg(const s : TSocket; lpMsg : LPWSAMSG; const dwFlags : DWORD; var lpNumberOfBytesSent : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) : Integer; stdcall;
  6270. begin
  6271. @WSASendMsg := FixupStubEx(s, 'WSASendMsg', WSAID_WSASENDMSG); {Do not localize}
  6272. Result := WSASendMsg(s, lpMsg, dwFlags, lpNumberOfBytesSent, lpOverlapped, lpCompletionRoutine);
  6273. end;
  6274. function Stub_WSAPoll(fdarray : LPWSAPOLLFD; const nfds : u_long; const timeout : Integer) : Integer; stdcall;
  6275. begin
  6276. @WSAPoll := FixupStubEx(fdarray.fd, 'WSAPoll', WSAID_WSAPOLL); {Do not localize}
  6277. Result := WSAPoll(fdarray, nfds, timeout);
  6278. end;
  6279. {$ENDIF}
  6280. procedure InitializeStubs;
  6281. {Alphabetize these so we can more easily determine what's available on a platform.
  6282. by section in Winsock SDK reference}
  6283. begin
  6284. accept := Stub_accept;
  6285. bind := Stub_bind;
  6286. closesocket := Stub_closesocket;
  6287. connect := Stub_connect;
  6288. ioctlsocket := Stub_ioctlsocket;
  6289. getpeername := Stub_getpeername;
  6290. getsockname := Stub_getsockname;
  6291. getsockopt := Stub_getsockopt;
  6292. htonl := Stub_htonl;
  6293. htons := Stub_htons;
  6294. inet_addr := Stub_inet_addr;
  6295. inet_ntoa := Stub_inet_ntoa;
  6296. listen := Stub_listen;
  6297. ntohl := Stub_ntohl;
  6298. ntohs := Stub_ntohs;
  6299. recv := Stub_recv;
  6300. recvfrom := Stub_recvfrom;
  6301. select := Stub_select;
  6302. send := Stub_send;
  6303. sendto := Stub_sendto;
  6304. {$IFDEF WINCE}
  6305. sethostname := Stub_sethostname;
  6306. {$ENDIF}
  6307. setsockopt := Stub_setsockopt;
  6308. shutdown := Stub_shutdown;
  6309. socket := Stub_socket;
  6310. gethostbyaddr := Stub_gethostbyaddr;
  6311. gethostbyname := Stub_gethostbyname;
  6312. gethostname := Stub_gethostname;
  6313. getservbyport := Stub_getservbyport;
  6314. getservbyname := Stub_getservbyname;
  6315. getprotobynumber := Stub_getprotobynumber;
  6316. getprotobyname := Stub_getprotobyname;
  6317. //extensions
  6318. __WSAFDIsSet := Stub___WSAFDIsSet;
  6319. {$IFNDEF WINCE}
  6320. AcceptEx := Stub_AcceptEx;
  6321. //GetAcceptExSockaddrs is loaded by Stub_AcceptEx
  6322. ConnectEx := Stub_ConnectEx;
  6323. DisconnectEx := Stub_DisconnectEx;
  6324. TransmitFile := Stub_TransmitFile;
  6325. TransmitPackets := Stub_TransmitPackets;
  6326. {$ENDIF}
  6327. WSAAccept := Stub_WSAAccept;
  6328. {$IFNDEF WINCE}
  6329. WSACancelAsyncRequest := Stub_WSACancelAsyncRequest;
  6330. WSAAsyncGetHostByAddr := Stub_WSAAsyncGetHostByAddr;
  6331. WSAAsyncGetHostByName := Stub_WSAAsyncGetHostByName;
  6332. WSAAsyncGetProtoByName := Stub_WSAAsyncGetProtoByName;
  6333. WSAAsyncGetProtoByNumber := Stub_WSAAsyncGetProtoByNumber;
  6334. WSAAsyncGetServByName := Stub_WSAAsyncGetServByName;
  6335. WSAAsyncGetServByPort := Stub_WSAAsyncGetServByPort;
  6336. WSAAsyncSelect := Stub_WSAAsyncSelect;
  6337. {$ENDIF}
  6338. WSAAddressToStringA := Stub_WSAAddressToStringA;
  6339. WSAAddressToStringW := Stub_WSAAddressToStringW;
  6340. WSAAddressToString := Stub_WSAAddressToString;
  6341. {$IFNDEF WINCE}
  6342. WSACancelBlockingCall := Stub_WSACancelBlockingCall;
  6343. {$ENDIF}
  6344. WSACleanup := Stub_WSACleanup;
  6345. WSACloseEvent := Stub_WSACloseEvent;
  6346. WSAConnect := Stub_WSAConnect;
  6347. WSACreateEvent := Stub_WSACreateEvent;
  6348. {$IFNDEF WINCE}
  6349. WSADuplicateSocketA := Stub_WSADuplicateSocketA;
  6350. WSADuplicateSocketW := Stub_WSADuplicateSocketW;
  6351. WSADuplicateSocket := Stub_WSADuplicateSocket;
  6352. {$ENDIF}
  6353. WSAEnumNameSpaceProvidersA := Stub_WSAEnumNameSpaceProvidersA;
  6354. WSAEnumNameSpaceProvidersW := Stub_WSAEnumNameSpaceProvidersW;
  6355. WSAEnumNameSpaceProviders := Stub_WSAEnumNameSpaceProviders;
  6356. WSAEnumNetworkEvents := Stub_WSAEnumNetworkEvents;
  6357. WSAEnumProtocolsA := Stub_WSAEnumProtocolsA;
  6358. WSAEnumProtocolsW := Stub_WSAEnumProtocolsW;
  6359. WSAEnumProtocols := Stub_WSAEnumProtocols;
  6360. WSAEventSelect := Stub_WSAEventSelect;
  6361. WSAGetLastError := Stub_WSAGetLastError;
  6362. WSAGetOverlappedResult := Stub_WSAGetOverlappedResult;
  6363. {$IFNDEF WINCE}
  6364. WSAGetQOSByName := Stub_WSAGetQOSByName;
  6365. WSAGetServiceClassInfoA := Stub_WSAGetServiceClassInfoA;
  6366. WSAGetServiceClassInfoW := Stub_WSAGetServiceClassInfoW;
  6367. WSAGetServiceClassInfo := Stub_WSAGetServiceClassInfo;
  6368. WSAGetServiceClassNameByClassIdA := Stub_WSAGetServiceClassNameByClassIdA;
  6369. WSAGetServiceClassNameByClassIdW := Stub_WSAGetServiceClassNameByClassIdW;
  6370. WSAGetServiceClassNameByClassId := Stub_WSAGetServiceClassNameByClassId;
  6371. {$ENDIF}
  6372. WSAHtonl := Stub_WSAHtonl;
  6373. WSAHtons := Stub_WSAHtons;
  6374. {$IFNDEF WINCE}
  6375. WSAInstallServiceClassA := Stub_WSAInstallServiceClassA;
  6376. WSAInstallServiceClassW := Stub_WSAInstallServiceClassW;
  6377. WSAInstallServiceClass := Stub_WSAInstallServiceClass;
  6378. {$ENDIF}
  6379. WSAIoctl := Stub_WSAIoctl;
  6380. {$IFNDEF WINCE}
  6381. WSAIsBlocking := Stub_WSAIsBlocking;
  6382. {$ENDIF}
  6383. WSAJoinLeaf := Stub_WSAJoinLeaf;
  6384. WSALookupServiceBeginA := Stub_WSALookupServiceBeginA;
  6385. WSALookupServiceBeginW := Stub_WSALookupServiceBeginW;
  6386. WSALookupServiceBegin := Stub_WSALookupServiceBegin;
  6387. WSALookupServiceEnd := Stub_WSALookupServiceEnd;
  6388. WSALookupServiceNextA := Stub_WSALookupServiceNextA;
  6389. WSALookupServiceNextW := Stub_WSALookupServiceNextW;
  6390. WSALookupServiceNext := Stub_WSALookupServiceNext;
  6391. // WSANSPIoctl is not supported in WinCE 4.20 but is in later versions.
  6392. WSANSPIoctl := Stub_WSANSPIoctl;
  6393. WSANtohl := Stub_WSANtohl;
  6394. WSANtohs := Stub_WSANtohs;
  6395. {$IFNDEF WINCE}
  6396. WSAPoll := Stub_WSAPoll;
  6397. WSAProviderConfigChange := Stub_WSAProviderConfigChange;
  6398. {$ENDIF}
  6399. WSARecv := Stub_WSARecv;
  6400. {$IFNDEF WINCE}
  6401. WSARecvDisconnect := Stub_WSARecvDisconnect;
  6402. WSARecvEx := Stub_WSARecvEx;
  6403. {$ENDIF}
  6404. WSARecvFrom := Stub_WSARecvFrom;
  6405. WSARecvMsg := Stub_WSARecvMsg;
  6406. WSARemoveServiceClass := Stub_WSARemoveServiceClass;
  6407. WSAResetEvent := Stub_WSAResetEvent;
  6408. WSASend := Stub_WSASend;
  6409. {$IFNDEF WINCE}
  6410. WSASendDisconnect := Stub_WSASendDisconnect;
  6411. WSASendMsg := Stub_WSASendMsg;
  6412. {$ENDIF}
  6413. WSASendTo := Stub_WSASendTo;
  6414. {$IFNDEF WINCE}
  6415. WSASetBlockingHook := Stub_WSASetBlockingHook;
  6416. {$ENDIF}
  6417. WSASetEvent := Stub_WSASetEvent;
  6418. WSASetLastError := Stub_WSASetLastError;
  6419. WSASetServiceA := Stub_WSASetServiceA;
  6420. WSASetServiceW := Stub_WSASetServiceW;
  6421. WSASetService := Stub_WSASetService;
  6422. WSASocketA := Stub_WSASocketA;
  6423. WSASocketW := Stub_WSASocketW;
  6424. WSASocket := Stub_WSASocket;
  6425. WSAStartup := Stub_WSAStartup;
  6426. WSAStringToAddressA := Stub_WSAStringToAddressA;
  6427. WSAStringToAddressW := Stub_WSAStringToAddressW;
  6428. WSAStringToAddress := Stub_WSAStringToAddress;
  6429. {$IFNDEF WINCE}
  6430. WSAUnhookBlockingHook := Stub_WSAUnhookBlockingHook;
  6431. {$ENDIF}
  6432. WSAWaitForMultipleEvents := Stub_WSAWaitForMultipleEvents;
  6433. end;
  6434. function WSAMakeSyncReply(Buflen, AError: Word): Longint;
  6435. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6436. begin
  6437. Result := MakeLong(Buflen, AError);
  6438. end;
  6439. function WSAMakeSelectReply(Event, AError: Word): Longint;
  6440. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6441. begin
  6442. Result := MakeLong(Event, AError);
  6443. end;
  6444. function WSAGetAsyncBuflen(Param: LPARAM): Word;
  6445. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6446. begin
  6447. Result := LOWORD(Param);
  6448. end;
  6449. function WSAGetAsyncError(Param: LPARAM): Word;
  6450. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6451. begin
  6452. Result := HIWORD(Param);
  6453. end;
  6454. function WSAGetSelectEvent(Param: LPARAM): Word;
  6455. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6456. begin
  6457. Result := LOWORD(Param);
  6458. end;
  6459. function WSAGetSelectError(Param: LPARAM): Word;
  6460. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6461. begin
  6462. WSAGetSelectError := HIWORD(Param);
  6463. end;
  6464. procedure FD_CLR(ASocket: TSocket; var FDSet: TFDSet);
  6465. var
  6466. i: u_int;
  6467. begin
  6468. i := 0;
  6469. while i < FDSet.fd_count do
  6470. begin
  6471. if FDSet.fd_array[i] = ASocket then
  6472. begin
  6473. while i < FDSet.fd_count - 1 do
  6474. begin
  6475. FDSet.fd_array[i] := FDSet.fd_array[i+1];
  6476. Inc(i);
  6477. end;
  6478. Dec(FDSet.fd_count);
  6479. Break;
  6480. end;
  6481. Inc(i);
  6482. end;
  6483. end;
  6484. function FD_ISSET(ASocket: TSocket; var FDSet: TFDSet): Boolean;
  6485. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6486. begin
  6487. Result := __WSAFDIsSet(ASocket, FDSet);
  6488. end;
  6489. procedure FD_SET(ASocket: TSocket; var FDSet: TFDSet);
  6490. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6491. begin
  6492. if FDSet.fd_count < fd_setsize then
  6493. begin
  6494. FDSet.fd_array[FDSet.fd_count] := ASocket;
  6495. Inc(FDSet.fd_count);
  6496. end;
  6497. end;
  6498. procedure FD_ZERO(var FDSet: TFDSet);
  6499. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6500. begin
  6501. FDSet.fd_count := 0;
  6502. end;
  6503. {$IFNDEF WINCE}
  6504. //Posix aliases
  6505. // #define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
  6506. function CMSGHDR_ALIGN(const Alength: SIZE_T): SIZE_T;
  6507. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6508. begin
  6509. Result := WSA_CMSGHDR_ALIGN(Alength);
  6510. end;
  6511. // #define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
  6512. function CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
  6513. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6514. begin
  6515. Result := WSA_CMSGDATA_ALIGN(Alength);
  6516. end;
  6517. //#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
  6518. function CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
  6519. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6520. begin
  6521. Result := WSA_CMSG_FIRSTHDR(msg);
  6522. end;
  6523. // #define CMSG_NXTHDR WSA_CMSG_NXTHDR
  6524. function CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
  6525. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6526. begin
  6527. Result := WSA_CMSG_NXTHDR(msg, cmsg);
  6528. end;
  6529. // #define CMSG_SPACE WSA_CMSG_SPACE
  6530. function CMSG_SPACE(const Alength: PtrUInt): PtrUInt;
  6531. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6532. begin
  6533. Result := WSA_CMSG_SPACE(ALength);
  6534. end;
  6535. // #define CMSG_LEN WSA_CMSG_LEN
  6536. function CMSG_LEN(const Alength: SIZE_T): SIZE_T;
  6537. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6538. begin
  6539. Result := WSA_CMSG_LEN(ALength);
  6540. end;
  6541. //
  6542. function WSA_CMSGHDR_ALIGN(const Alength: SIZE_T): SIZE_T;
  6543. type
  6544. {$IFDEF WIN32}
  6545. {$ALIGN ON}
  6546. TempRec = record
  6547. x: TIdAnsiChar;
  6548. test: WSACMSGHDR;
  6549. end;
  6550. {$ALIGN OFF}
  6551. {$ELSE}
  6552. //Win64 and WinCE seem to require alignment for API records
  6553. TempRec = record
  6554. x: TIdAnsiChar;
  6555. test: WSACMSGHDR;
  6556. end;
  6557. {$ENDIF}
  6558. var
  6559. Alignment: SIZE_T;
  6560. Tmp: ^TempRec;
  6561. begin
  6562. Tmp := nil;
  6563. Alignment := PtrUInt(@(Tmp^.test));
  6564. Result := (Alength + (Alignment-1)) and not (Alignment-1);
  6565. end;
  6566. function WSA_CMSGDATA_ALIGN(const Alength: PtrUInt): PtrUInt;
  6567. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6568. begin
  6569. Result := (Alength + MAX_NATURAL_ALIGNMENT_SUB_1) and not (MAX_NATURAL_ALIGNMENT_SUB_1);
  6570. end;
  6571. function WSA_CMSG_FIRSTHDR(const msg: LPWSAMSG): LPWSACMSGHDR;
  6572. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6573. begin
  6574. if (msg <> nil) and (msg^.Control.len >= SIZE_WSACMSGHDR) then begin
  6575. Result := LPWSACMSGHDR(msg^.Control.buf);
  6576. end else begin
  6577. Result := nil;
  6578. end;
  6579. end;
  6580. function WSA_CMSG_NXTHDR(const msg: LPWSAMSG; const cmsg: LPWSACMSGHDR): LPWSACMSGHDR;
  6581. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6582. begin
  6583. if cmsg = nil then begin
  6584. Result := WSA_CMSG_FIRSTHDR(msg);
  6585. end else begin
  6586. if (PtrUInt(cmsg) + WSA_CMSGHDR_ALIGN(cmsg^.cmsg_len) + SIZE_WSACMSGHDR) > (PtrUInt(msg^.Control.buf) + msg^.Control.len) then begin
  6587. Result := nil;
  6588. end else begin
  6589. Result := LPWSACMSGHDR(PtrUInt(cmsg) + WSA_CMSGHDR_ALIGN(cmsg^.cmsg_len));
  6590. end;
  6591. end;
  6592. end;
  6593. function WSA_CMSG_DATA(const cmsg: LPWSACMSGHDR): PByte;
  6594. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6595. begin
  6596. Result := PByte(PtrUInt(cmsg) + WSA_CMSGDATA_ALIGN(SIZE_WSACMSGHDR));
  6597. end;
  6598. function WSA_CMSG_SPACE(const Alength: PtrUInt): PtrUInt;
  6599. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6600. begin
  6601. Result := WSA_CMSGDATA_ALIGN(PtrUInt(SIZE_WSACMSGHDR + WSA_CMSGHDR_ALIGN(Alength)));
  6602. end;
  6603. function WSA_CMSG_LEN(const Alength: SIZE_T): SIZE_T;
  6604. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6605. begin
  6606. Result := (WSA_CMSGDATA_ALIGN(SizeOf(WSACMSGHDR)) + Alength);
  6607. end;
  6608. function RIO_CMSG_BASE_SIZE : SIZE_T;
  6609. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6610. begin
  6611. Result := WSA_CMSGHDR_ALIGN(sizeof(RIO_CMSG_BUFFER));
  6612. end;
  6613. function RIO_CMSG_FIRSTHDR(buffer : PRIO_CMSG_BUFFER) : PWSACMSGHDR;
  6614. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6615. begin
  6616. if ((buffer)^.TotalLength >= RIO_CMSG_BASE_SIZE) then
  6617. begin
  6618. if (((buffer)^.TotalLength - RIO_CMSG_BASE_SIZE) >= sizeof(WSACMSGHDR)) then begin
  6619. Result := PWSACMSGHDR((PIdAnsiChar(buffer)) + RIO_CMSG_BASE_SIZE);
  6620. end else begin
  6621. Result := PWSACMSGHDR(nil);
  6622. end;
  6623. end else begin
  6624. Result := PWSACMSGHDR(nil);
  6625. end;
  6626. end;
  6627. function RIO_CMSG_NEXTHDR(buffer : PRIO_CMSG_BUFFER; cmsg : PWSACMSGHDR) : PWSACMSGHDR;
  6628. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6629. begin
  6630. if ((cmsg) = nil) then begin
  6631. Result := RIO_CMSG_FIRSTHDR(buffer);
  6632. end else begin
  6633. if (PIdAnsiChar(cmsg) + WSA_CMSGHDR_ALIGN((cmsg^.cmsg_len) + sizeof(WSACMSGHDR)) > (PIdAnsiChar(buffer) + (buffer)^.TotalLength)) then begin
  6634. Result := (PWSACMSGHDR(nil));
  6635. end else begin
  6636. Result :=(PWSACMSGHDR(PIdAnsiChar(cmsg) + WSA_CMSGHDR_ALIGN(cmsg^.cmsg_len)));
  6637. end;
  6638. end;
  6639. end;
  6640. {$ENDIF} // {$IFNDEF WINCE}
  6641. function IP_MSFILTER_SIZE(const numsrc: DWORD): PtrUInt;
  6642. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6643. begin
  6644. Result := SIZE_IP_MSFILTER - SIZE_TINADDR + (numsrc*SIZE_TINADDR);
  6645. end;
  6646. function SS_PORT(ssp: PSockAddrIn): u_short;
  6647. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6648. begin
  6649. if ssp <> nil then begin
  6650. Result := ssp^.sin_port;
  6651. end else begin
  6652. Result := 0;
  6653. end;
  6654. end;
  6655. //
  6656. // Microsoft-specific IPv4 definitions.
  6657. //
  6658. function IN4_CLASSA(const i : UInt32) : Boolean;
  6659. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6660. begin
  6661. Result := ((i and $00000080) = 0);
  6662. end;
  6663. function IN4_CLASSB(const i : UInt32) : Boolean;
  6664. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6665. begin
  6666. Result := ((i and $000000c0) = $00000080);
  6667. end;
  6668. function IN4_CLASSC(const i : UInt32) : Boolean;
  6669. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6670. begin
  6671. Result := ((i and $000000e0) = $000000c0);
  6672. end;
  6673. function IN4_CLASSD(const i : UInt32) : Boolean;
  6674. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6675. begin
  6676. Result := ((i and $000000f0) = $000000e0);
  6677. end;
  6678. function IN4_MULTICAST(const i : UInt32) : Boolean;
  6679. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6680. begin
  6681. Result := IN4_CLASSD(i);
  6682. end;
  6683. function IN4_ADDR_EQUAL(const a, b : PInAddr ) : Boolean;
  6684. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6685. begin
  6686. Result := a^.S_addr = b^.S_addr;
  6687. end;
  6688. function IN4_UNALIGNED_ADDR_EQUAL(const a, b : PInAddr ) : Boolean;
  6689. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6690. begin
  6691. Result := a^.S_addr = b^.S_addr
  6692. end;
  6693. function IN4_IS_ADDR_UNSPECIFIED(const a : PInAddr) : Boolean;
  6694. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6695. begin
  6696. Result := a^.S_addr = IN4ADDR_ANY;
  6697. end;
  6698. function IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(const a : PInAddr) : Boolean;
  6699. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6700. begin
  6701. Result := a^.S_addr = IN4ADDR_ANY;
  6702. end;
  6703. function IN4_IS_ADDR_LOOPBACK(const a : PInAddr) : Boolean;
  6704. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6705. begin
  6706. Result := PByte(a)^ = $7f; // 127/8
  6707. end;
  6708. function IN4_IS_UNALIGNED_ADDR_LOOPBACK(const a : PInAddr) : Boolean;
  6709. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6710. begin
  6711. Result := PByte(a)^ = $7f; // 127/8
  6712. end;
  6713. function IN4_IS_ADDR_BROADCAST(const a : PInAddr) : Boolean;
  6714. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6715. begin
  6716. Result := a^.S_addr = IN4ADDR_BROADCAST;
  6717. end;
  6718. function IN4_IS_UNALIGNED_ADDR_BROADCAST(const a : PInAddr) : Boolean;
  6719. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6720. begin
  6721. Result := a^.S_addr = IN4ADDR_BROADCAST;
  6722. end;
  6723. function IN4_IS_ADDR_MULTICAST(const a : PInAddr) : Boolean;
  6724. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6725. begin
  6726. Result := IN4_MULTICAST(a^.S_addr);
  6727. end;
  6728. function IN4_IS_UNALIGNED_ADDR_MULTICAST(const a : PInAddr) : Boolean;
  6729. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6730. begin
  6731. Result := IN4_MULTICAST(a^.S_addr);
  6732. end;
  6733. function IN4_IS_ADDR_LINKLOCAL(const a : PInAddr) : Boolean;
  6734. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6735. begin
  6736. Result := ((a^.s_addr and $ffff) = $fea9); // 169.254/16
  6737. end;
  6738. function IN4_IS_UNALIGNED_ADDR_LINKLOCAL(const a : PInAddr) : Boolean;
  6739. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6740. begin
  6741. Result := ((a^.s_addr and $ffff) = $fea9); // 169.254/16
  6742. end;
  6743. function IN4_IS_ADDR_SITELOCAL(const a :PInAddr) : Boolean;
  6744. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6745. begin
  6746. //UNREFERENCED_PARAMETER(a);
  6747. //
  6748. // For existing scenarios (e.g. ICS) to work as expected, RFC-1918 prefixes
  6749. // are deemed to be global scoped. When appropriate, site border routers
  6750. // must explicitly filter packets with these addresses.
  6751. //
  6752. Result := False;
  6753. end;
  6754. function IN4_IS_UNALIGNED_ADDR_SITELOCAL(const a : PInAddr) : Boolean;
  6755. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6756. begin
  6757. Result := IN4_IS_ADDR_SITELOCAL(a);
  6758. end;
  6759. function IN4_IS_ADDR_RFC1918(const a : PInAddr) : Boolean;
  6760. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6761. begin
  6762. Result := (((a^.s_addr and $00ff) = $0a) or // 10/8
  6763. ((a^.s_addr and $f0ff) = $10ac) or // 172.16/12
  6764. ((a^.s_addr and $ffff) = $a8c0)); // 192.168/16
  6765. end;
  6766. function IN4_IS_UNALIGNED_ADDR_RFC1918(const a : PInAddr) : Boolean;
  6767. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6768. var
  6769. Ipv4Address : IN_ADDR;
  6770. begin
  6771. //JPM Notes: Done this way because pointers may not be aligned at all.
  6772. Ipv4Address := a^;
  6773. Result := IN4_IS_ADDR_RFC1918( @Ipv4Address );
  6774. end;
  6775. function IN4_IS_ADDR_MC_LINKLOCAL(const a : PInAddr) : Boolean;
  6776. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6777. begin
  6778. Result := ((a^.s_addr and $ffffff) = $e0); // 224.0.0/24
  6779. end;
  6780. function IN4_IS_ADDR_MC_ADMINLOCAL(const a : PInAddr) : Boolean;
  6781. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6782. begin
  6783. Result := ((a^.s_addr and $ffff) = $ffef); // 239.255/16
  6784. end;
  6785. function IN4_IS_ADDR_MC_SITELOCAL(const a : PInAddr) : Boolean;
  6786. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6787. begin
  6788. Result := ((a^.s_addr and $ff) = $ef) and
  6789. (not IN4_IS_ADDR_MC_ADMINLOCAL(a));
  6790. end;
  6791. function SCOPEID_UNSPECIFIED_INIT: {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  6792. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6793. begin
  6794. Result{$IFNDEF WINCE}.Value{$ENDIF} := 0;
  6795. end;
  6796. function IN4ADDR_ANY_INIT: TInAddr;
  6797. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6798. begin
  6799. Result.S_addr := 0;
  6800. end;
  6801. function IN4ADDR_LOOPBACK_INIT: TInAddr;
  6802. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6803. begin
  6804. Result.S_un_b.s_b1 := $7f;
  6805. Result.S_un_b.s_b2 := $00;
  6806. Result.S_un_b.s_b3 := $00;
  6807. Result.S_un_b.s_b4 := $01;
  6808. end;
  6809. function IN4ADDR_BROADCAST_INIT: TInAddr;
  6810. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6811. begin
  6812. Result.S_un_b.s_b1 := $ff;
  6813. Result.S_un_b.s_b2 := $ff;
  6814. Result.S_un_b.s_b3 := $ff;
  6815. Result.S_un_b.s_b4 := $ff;
  6816. end;
  6817. function IN4ADDR_ALLNODESONLINK_INIT: TInAddr;
  6818. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6819. begin
  6820. Result.S_un_b.s_b1 := $e0;
  6821. Result.S_un_b.s_b2 := $00;
  6822. Result.S_un_b.s_b3 := $00;
  6823. Result.S_un_b.s_b4 := $01;
  6824. end;
  6825. function IN4ADDR_ALLROUTERSONLINK_INIT: TInAddr;
  6826. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6827. begin
  6828. Result.S_un_b.s_b1 := $e0;
  6829. Result.S_un_b.s_b2 := $00;
  6830. Result.S_un_b.s_b3 := $00;
  6831. Result.S_un_b.s_b4 := $02;
  6832. end;
  6833. function IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT: TInAddr;
  6834. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6835. begin
  6836. Result.S_un_b.s_b1 := $e0;
  6837. Result.S_un_b.s_b2 := $00;
  6838. Result.S_un_b.s_b3 := $00;
  6839. Result.S_un_b.s_b4 := $16;
  6840. end;
  6841. function IN4ADDR_ALLTEREDONODESONLINK_INIT: TInAddr;
  6842. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6843. begin
  6844. Result.S_un_b.s_b1 := $e0;
  6845. Result.S_un_b.s_b2 := $00;
  6846. Result.S_un_b.s_b3 := $00;
  6847. Result.S_un_b.s_b4 := $fd;
  6848. end;
  6849. function IN4ADDR_LINKLOCALPREFIX_INIT: TInAddr;
  6850. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6851. begin
  6852. Result.S_un_b.s_b1 := $a9;
  6853. Result.S_un_b.s_b2 := $fe;
  6854. Result.S_un_b.s_b3 := $00;
  6855. Result.S_un_b.s_b4 := $00;
  6856. end;
  6857. function IN4ADDR_MULTICASTPREFIX_INIT: TInAddr;
  6858. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6859. begin
  6860. Result.S_un_b.s_b1 := $e0;
  6861. Result.S_un_b.s_b2 := $00;
  6862. Result.S_un_b.s_b3 := $00;
  6863. Result.S_un_b.s_b4 := $00;
  6864. end;
  6865. procedure IN4ADDR_SETSOCKADDR(a : PSockAddrIn; const addr : PInAddr; const port : USHORT);
  6866. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6867. begin
  6868. a^.sin_family := AF_INET;
  6869. a^.sin_port := port;
  6870. a^.sin_addr.S_addr := addr^.S_addr;
  6871. FillChar(a^.sin_zero,SizeOf(a^.sin_zero),0);
  6872. end;
  6873. procedure IN4ADDR_SETANY(a : PSockAddrIn);
  6874. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6875. begin
  6876. a^.sin_family := AF_INET;
  6877. a^.sin_port := 0;
  6878. a^.sin_addr.S_addr := IN4ADDR_ANY;
  6879. FillChar(a^.sin_zero,SizeOf(a^.sin_zero),0);
  6880. end;
  6881. procedure IN4ADDR_SETLOOPBACK(a : PSockAddrIn);
  6882. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6883. begin
  6884. a^.sin_family := AF_INET;
  6885. a^.sin_port := 0;
  6886. a^.sin_addr.S_addr := IN4ADDR_LOOPBACK;
  6887. FillChar(a^.sin_zero,SizeOf(a^.sin_zero),0);
  6888. end;
  6889. function IN4ADDR_ISANY(const a : PSockAddrIn) : Boolean;
  6890. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6891. begin
  6892. ASSERT(a^.sin_family = AF_INET);
  6893. Result := IN4_IS_ADDR_UNSPECIFIED(@a^.sin_addr );
  6894. end;
  6895. function IN4ADDR_ISLOOPBACK(const a : PSockAddrIn) : Boolean;
  6896. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6897. begin
  6898. ASSERT(a^.sin_family = AF_INET);
  6899. Result := IN4_IS_ADDR_LOOPBACK(@a^.sin_addr);
  6900. end;
  6901. function IN4ADDR_SCOPE_ID(const a : PSockAddrIn) : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  6902. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6903. begin
  6904. //SCOPE_ID UnspecifiedScopeId = {0};
  6905. //UNREFERENCED_PARAMETER(a);
  6906. //return UnspecifiedScopeId;
  6907. Result{$IFNDEF WINCE}.Value{$ENDIF} := 0;
  6908. end;
  6909. function IN4ADDR_ISEQUAL(a, b : PSockAddrIn) : Boolean;
  6910. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6911. begin
  6912. ASSERT(a^.sin_family = AF_INET);
  6913. Result := (IN4ADDR_SCOPE_ID(a){$IFNDEF WINCE}.Value{$ENDIF} = IN4ADDR_SCOPE_ID(b){$IFNDEF WINCE}.Value{$ENDIF}) and
  6914. IN4_ADDR_EQUAL(@a^.sin_addr , @b^.sin_addr);
  6915. end;
  6916. function IN4ADDR_ISUNSPECIFIED(a : PSockAddrIn) : Boolean;
  6917. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6918. begin
  6919. ASSERT(a^.sin_family = AF_INET);
  6920. Result := (IN4ADDR_SCOPE_ID(a){$IFNDEF WINCE}.Value{$ENDIF} = 0) and
  6921. IN4_IS_ADDR_UNSPECIFIED(@a^.sin_addr);
  6922. end;
  6923. {Important!!! INET_IS_ALIGNED doesn't seem to translate well to
  6924. Delphi. The best I could think of is to make a function
  6925. for testing with specific types. I wish Pascal had an AlignOf function}
  6926. //#define INET_IS_ALIGNED(Pointer, Type) \
  6927. // (((ULONG_PTR)Pointer & (__builtin_alignof(Type)-1)) == 0)
  6928. function INET_IS_ALIGNED_IN_ADDR(Ptr : Pointer) : Boolean;
  6929. type
  6930. {$IFDEF WIN32}
  6931. {$ALIGN ON}
  6932. TempRec = record
  6933. test: IN_ADDR;
  6934. end;
  6935. {$ALIGN OFF}
  6936. {$ELSE}
  6937. //Win64 and WinCE seem to require alignment for API records
  6938. TempRec = record
  6939. test: IN_ADDR;
  6940. end;
  6941. {$ENDIF}
  6942. var
  6943. Alignment : SIZE_T;
  6944. begin
  6945. Alignment := SizeOf(TempRec);
  6946. Result := ((ULONG_PTR(Ptr) and (Alignment - 1)) = 0);
  6947. end;
  6948. function INET_IS_ALIGNED_IN6_ADDR(Ptr : Pointer) : Boolean;
  6949. type
  6950. {$IFDEF WIN32}
  6951. {$ALIGN ON}
  6952. TempRec = record
  6953. test: IN6_ADDR;
  6954. end;
  6955. {$ALIGN OFF}
  6956. {$ELSE}
  6957. //Win64 and WinCE seem to require alignment for API records
  6958. TempRec = record
  6959. test: IN6_ADDR;
  6960. end;
  6961. {$ENDIF}
  6962. var
  6963. Alignment : SIZE_T;
  6964. begin
  6965. Alignment := SizeOf(TempRec);
  6966. Result := ((ULONG_PTR(Ptr) and (Alignment - 1)) = 0);
  6967. end;
  6968. {
  6969. Routine Description:
  6970. Determines the scope of an IPv4 unicast address.
  6971. For existing scenarios (e.g. ICS) to work as expected, RFC-1918 prefixes
  6972. are deemed to be global scoped. When appropriate, site border routers
  6973. must explicitly filter packets with these addresses.
  6974. Arguments:
  6975. Address - Supplies the IPv4 unicast address.
  6976. Return Value:
  6977. Returns the scope level of the address.
  6978. Caller IRQL:
  6979. May be called at PASSIVE through DISPATCH level.
  6980. --*/
  6981. }
  6982. function Ipv4UnicastAddressScope(const Address : PUChar) : SCOPE_LEVEL;
  6983. {$IFDEF USE_INLINE}inline;{$ENDIF}
  6984. var
  6985. Ipv4Address : IN_ADDR;
  6986. AddrPtr: PInAddr;
  6987. begin
  6988. if not INET_IS_ALIGNED_IN_ADDR(Address) then begin
  6989. Ipv4Address := PInAddr(Address)^;
  6990. AddrPtr := @Ipv4Address;
  6991. end else begin
  6992. AddrPtr := PInAddr(Address);
  6993. end;
  6994. if IN4_IS_ADDR_LINKLOCAL(AddrPtr) or
  6995. IN4_IS_ADDR_LOOPBACK(AddrPtr) then
  6996. begin
  6997. Result := ScopeLevelLink;
  6998. end else begin
  6999. Result := ScopeLevelGlobal;
  7000. end;
  7001. end;
  7002. {
  7003. /*++
  7004. Routine Description:
  7005. Determines the scope of an IPv4 multicast address.
  7006. See RFC 2365.
  7007. Arguments:
  7008. Address - Supplies the IPv4 multicast address.
  7009. Return Value:
  7010. Returns the scope level of the multicast address.
  7011. Caller IRQL:
  7012. May be called at PASSIVE through DISPATCH level.
  7013. --*/
  7014. }
  7015. function Ipv4MulticastAddressScope(const Address : PUCHAR) : SCOPE_LEVEL;
  7016. var
  7017. Ipv4Address : IN_ADDR;
  7018. AddrPtr : PInAddr;
  7019. begin
  7020. if not INET_IS_ALIGNED_IN_ADDR(Address) then begin
  7021. Ipv4Address := PInAddr(Address)^;
  7022. AddrPtr := @Ipv4Address;
  7023. end else begin
  7024. AddrPtr := PInAddr(Address);
  7025. end;
  7026. if IN4_IS_ADDR_MC_LINKLOCAL(AddrPtr) then begin
  7027. Result := ScopeLevelLink;
  7028. end
  7029. else if IN4_IS_ADDR_MC_ADMINLOCAL(AddrPtr) then begin
  7030. Result := ScopeLevelAdmin;
  7031. end
  7032. else if IN4_IS_ADDR_MC_SITELOCAL(AddrPtr) then begin
  7033. Result := ScopeLevelSite;
  7034. end else begin
  7035. Result := ScopeLevelGlobal;
  7036. end;
  7037. end;
  7038. {
  7039. /*++
  7040. Routine Description:
  7041. Examines an IPv4 address and determines its scope.
  7042. Arguments:
  7043. Address - Supplies the address to test.
  7044. Return Value:
  7045. Returns the scope level of the address.
  7046. Caller IRQL:
  7047. May be called at PASSIVE through DISPATCH level.
  7048. --*/
  7049. }
  7050. function Ipv4AddressScope(Address : PUChar) : SCOPE_LEVEL;
  7051. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7052. var
  7053. Ipv4Address : IN_ADDR;
  7054. begin
  7055. Ipv4Address := PInAddr(Address)^;
  7056. if IN4_IS_ADDR_BROADCAST(@Ipv4Address) then begin
  7057. Result := ScopeLevelLink;
  7058. end
  7059. else if IN4_IS_ADDR_MULTICAST(@Ipv4Address) then begin
  7060. Result := Ipv4MulticastAddressScope(PUCHAR(@Ipv4Address));
  7061. end else begin
  7062. Result := Ipv4UnicastAddressScope(PUCHAR(@Ipv4Address));
  7063. end;
  7064. end;
  7065. function Ipv4AddressType(Address : PUChar) : NL_ADDRESS_TYPE;
  7066. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7067. var
  7068. Ipv4Address : TInAddr;
  7069. begin
  7070. Ipv4Address := PInAddr(Address)^;
  7071. if IN4_IS_ADDR_MULTICAST(@Ipv4Address) then begin
  7072. Result := NlatMulticast;
  7073. Exit;
  7074. end;
  7075. if IN4_IS_ADDR_BROADCAST(@Ipv4Address) then begin
  7076. Result := NlatBroadcast;
  7077. Exit;
  7078. end;
  7079. if IN4_IS_ADDR_UNSPECIFIED(@Ipv4Address) then begin
  7080. Result := NlatUnspecified;
  7081. Exit;
  7082. end;
  7083. //
  7084. // Following prefixes are invalid:
  7085. // 1. 0.0.0.0/8 (except 0.0.0.0/32).
  7086. // 2. 240.0.0.0/4 (except 255.255.255.255/32).
  7087. //
  7088. if ((Ipv4Address.s_addr and $000000ff) = 0) or
  7089. ((Ipv4Address.s_addr and $000000f0) = 240) then
  7090. begin
  7091. Result := NlatInvalid;
  7092. Exit;
  7093. end;
  7094. //
  7095. // Loopback and anycast addresses are treated as unicast.
  7096. //
  7097. Result := NlatUnicast;
  7098. end;
  7099. {$IFNDEF WINCE}
  7100. // SCOPE_ID = record
  7101. // union {
  7102. // struct {
  7103. // ULONG Zone : 28;
  7104. // ULONG Level : 4;
  7105. // };
  7106. // ULONG Value;
  7107. // };
  7108. // Value : ULONG;
  7109. // end;
  7110. function SCOPE_ID_GetZone(const ScopeId : SCOPE_ID) : ULONG;
  7111. begin
  7112. Result := (ScopeId.Value and $FFFFFFF0) shr 4;
  7113. end;
  7114. procedure SCOPE_ID_SetZone(var ScopeId : SCOPE_ID; Value: ULONG);
  7115. begin
  7116. ScopeId.Value := ((Value and $0FFFFFFF) shl 4) or (ScopeId.Value and $F);
  7117. end;
  7118. function SCOPE_ID_GetLevel(const ScopeId : SCOPE_ID) : SCOPE_LEVEL;
  7119. begin
  7120. Result := SCOPE_LEVEL(ScopeId.Value and $F);
  7121. end;
  7122. procedure SCOPE_ID_SetLevel(var ScopeId : SCOPE_ID; Value: ULONG);
  7123. begin
  7124. ScopeId.Value := (ScopeId.Value and $FFFFFFF0) or (Value and $F);
  7125. end;
  7126. procedure IN4_UNCANONICALIZE_SCOPE_ID(Address : PInAddr; ScopeId : PSCOPE_ID);
  7127. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7128. var
  7129. ScopeLevel : SCOPE_LEVEL;
  7130. begin
  7131. ScopeLevel := Ipv4AddressScope(PUCHAR(Address));
  7132. if IN4_IS_ADDR_LOOPBACK(Address) or (ScopeLevel = ScopeLevelGlobal) then begin
  7133. ScopeId^.Value := 0;
  7134. end;
  7135. if SCOPE_ID_GetLevel(ScopeId^) = ScopeLevel then begin
  7136. SCOPE_ID_SetLevel(ScopeId^, 0);
  7137. end;
  7138. end;
  7139. {$ENDIF}
  7140. function IN4_IS_ADDR_6TO4ELIGIBLE(a : PInAddr) : Boolean;
  7141. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7142. begin
  7143. Result := (Ipv4AddressType(PUChar(a)) = NlatUnicast) and
  7144. (not (IN4_IS_ADDR_LOOPBACK(a) or
  7145. IN4_IS_ADDR_LINKLOCAL(a) or
  7146. IN4_IS_ADDR_SITELOCAL(a) or
  7147. IN4_IS_ADDR_RFC1918(a)));
  7148. end;
  7149. function IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(a : PInAddr) : Boolean;
  7150. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7151. var
  7152. Ipv4Address : TInAddr;
  7153. begin
  7154. Ipv4Address := a^;
  7155. Result := IN4_IS_ADDR_6TO4ELIGIBLE(@Ipv4Address);
  7156. end;
  7157. //
  7158. // Microsoft-specific IPv6 definitions.
  7159. //
  7160. function IN6_PREFIX_EQUAL(const a, b : PIN6_ADDR; const len : UINT8) : Boolean;
  7161. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7162. var
  7163. Bytes : UINT8;
  7164. Bits : UINT8;
  7165. Mask : UINT8;
  7166. begin
  7167. Bytes := len div 8;
  7168. Bits := len mod 8;
  7169. Mask := $ff shl (8 - Bits);
  7170. ASSERT(len <= (SizeOf(IN6_ADDR) * 8));
  7171. Result := CompareMem(a,b,len) and ((Bits = 0) or ((a^.s6_bytes[Bytes] or Mask) = (b^.s6_bytes[Bytes] or Mask)));
  7172. end;
  7173. function IN6_IS_ADDR_ALLNODESONNODE(a : PIN6_ADDR) : Boolean;
  7174. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7175. begin
  7176. Result := IN6_ADDR_EQUAL(a, @in6addr_allnodesonnode);
  7177. end;
  7178. function IN6_IS_ADDR_ALLNODESONLINK(a : PIN6_ADDR) : Boolean;
  7179. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7180. begin
  7181. Result := IN6_ADDR_EQUAL(a, @in6addr_allnodesonlink);
  7182. end;
  7183. function IN6_IS_ADDR_ALLROUTERSONLINK(a : PIN6_ADDR) : Boolean;
  7184. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7185. begin
  7186. Result := IN6_ADDR_EQUAL(a, @in6addr_allroutersonlink);
  7187. end;
  7188. function IN6_IS_ADDR_SOLICITEDNODE(a : PIN6_ADDR) : Boolean;
  7189. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7190. begin
  7191. Result := IN6_PREFIX_EQUAL(
  7192. a,
  7193. @in6addr_solicitednodemulticastprefix,
  7194. IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH);
  7195. end;
  7196. function IN6_IS_ADDR_ISATAP(a : PIN6_ADDR) : Boolean;
  7197. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7198. begin
  7199. //
  7200. // Disregard the u/g bit and compare the first byte of the interface id.
  7201. //
  7202. Result := ((a^.s6_words[4] and $fffd) = $0000) and (a^.s6_words[5] = $fe5e);
  7203. end;
  7204. function IN6_IS_ADDR_6TO4(a : PIN6_ADDR) : Boolean;
  7205. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7206. begin
  7207. //C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH = RTL_BITS_OF(USHORT));
  7208. Result := (a^.s6_words[0] = in6addr_6to4prefix.s6_words[0]);
  7209. end;
  7210. function IN6_IS_ADDR_TEREDO(a : PIN6_ADDR) : Boolean;
  7211. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7212. begin
  7213. //C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH == 2 * RTL_BITS_OF(USHORT));
  7214. Result := (a^.s6_words[0] = in6addr_teredoprefix.s6_words[0]) and
  7215. (a^.s6_words[1] = in6addr_teredoprefix.s6_words[1]);
  7216. end;
  7217. function IN6ADDR_ISV4MAPPED(a : PSOCKADDR_IN6) : Boolean;
  7218. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7219. begin
  7220. ASSERT(a^.sin6_family = AF_INET6);
  7221. Result := IN6_IS_ADDR_V4MAPPED(@a^.sin6_addr);
  7222. end;
  7223. function IN6ADDR_ISISATAP(a : PSOCKADDR_IN6) : Boolean;
  7224. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7225. begin
  7226. ASSERT(a^.sin6_family = AF_INET6);
  7227. Result := IN6_IS_ADDR_ISATAP(@a^.sin6_addr);;
  7228. end;
  7229. function IN6ADDR_IS6TO4(a : PSOCKADDR_IN6) : Boolean;
  7230. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7231. begin
  7232. ASSERT(a^.sin6_family = AF_INET6);
  7233. Result := IN6_IS_ADDR_6TO4(@a^.sin6_addr);
  7234. end;
  7235. function IN6ADDR_ISTEREDO(a : PSOCKADDR_IN6) : Boolean;
  7236. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7237. begin
  7238. ASSERT(a^.sin6_family = AF_INET6);
  7239. Result := IN6_IS_ADDR_TEREDO(@a^.sin6_addr);
  7240. end;
  7241. function IN6_GET_ADDR_V4MAPPED(Ipv6Address : PIN6_ADDR) : PUCHAR;
  7242. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7243. begin
  7244. Result := PUChar(@Ipv6Address^.s6_words[6]);
  7245. end;
  7246. function IN6_GET_ADDR_V4COMPAT(Ipv6Address : PIN6_ADDR) : PUCHAR;
  7247. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7248. begin
  7249. Result := PUChar(@Ipv6Address^.s6_words[6]);
  7250. end;
  7251. function IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address : PIN6_ADDR) : PUCHAR;
  7252. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7253. begin
  7254. Result := PUChar(@Ipv6Address^.s6_words[6]);
  7255. end;
  7256. function IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address : PIN6_ADDR) : PUCHAR;
  7257. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7258. begin
  7259. Result := PUChar(@Ipv6Address^.s6_words[1]);
  7260. end;
  7261. procedure IN6_SET_ADDR_V4MAPPED(out a6 : IN6_ADDR; a4 : PInAddr );
  7262. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7263. begin
  7264. a6 := in6addr_v4mappedprefix;
  7265. a6.s6_bytes[12] := a4^.S_un_b.s_b1;
  7266. a6.s6_bytes[13] := a4^.S_un_b.s_b2;
  7267. a6.s6_bytes[14] := a4^.S_un_b.s_b3;
  7268. a6.s6_bytes[15] := a4^.S_un_b.s_b4;
  7269. end;
  7270. procedure IN6_SET_ADDR_V4COMPAT(out a6 : IN6_ADDR; a4 : PInAddr );
  7271. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7272. begin
  7273. a6 := in6addr_any;
  7274. a6.s6_bytes[12] := a4^.S_un_b.s_b1;
  7275. a6.s6_bytes[13] := a4^.S_un_b.s_b2;
  7276. a6.s6_bytes[14] := a4^.S_un_b.s_b3;
  7277. a6.s6_bytes[15] := a4^.S_un_b.s_b4;
  7278. end;
  7279. procedure IN6_SET_ADDR_SOLICITEDNODE(out Multicast : IN6_ADDR; Unicast : PIN6_ADDR);
  7280. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7281. begin
  7282. Multicast := in6addr_solicitednodemulticastprefix;
  7283. Multicast.s6_bytes[13] := Unicast^.s6_bytes[13];
  7284. Multicast.s6_bytes[14] := Unicast^.s6_bytes[14];
  7285. Multicast.s6_bytes[15] := Unicast^.s6_bytes[15];
  7286. end;
  7287. procedure IN6_SET_ISATAP_IDENTIFIER(Ipv6Address : PIN6_ADDR; Ipv4Address : PInAddr);
  7288. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7289. begin
  7290. if IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address) then begin
  7291. Ipv6Address^.s6_words[4] := $0002;
  7292. end else begin
  7293. Ipv6Address^.s6_words[4] := $0000;
  7294. end;
  7295. //
  7296. // 24-bit IANA OUI 00-00-5E and the 8-bit hex value 0xFE.
  7297. // See section 6.1 of RFC 4214.
  7298. //
  7299. Ipv6Address^.s6_words[5] := $FE5E;
  7300. PInAddr(@Ipv6Address^.s6_words[6])^ := Ipv4Address^;
  7301. end;
  7302. procedure IN6_SET_6TO4_PREFIX(Ipv6Address : PIN6_ADDR; Ipv4Address : PInAddr);
  7303. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7304. begin
  7305. Ipv6Address^.s6_words[0] := $0220;
  7306. PInAddr(@Ipv6Address^.s6_words[1])^ := Ipv4Address^;
  7307. Ipv6Address^.s6_words[3] := $0000;
  7308. end;
  7309. function Ipv6UnicastAddressScope(const Address : PUChar) : SCOPE_LEVEL;
  7310. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7311. {*++
  7312. Routine Description:
  7313. Examines a unicast address and determines its scope.
  7314. Note that v4-compatible and 6to4 addresses are deemed to have global scope;
  7315. it is not legal to derive them from non IN4_IS_ADDR_6TO4ELIGIBLE addresses
  7316. (IPv4 loopback, link-local, site-local, and RFC-1918 addresses).
  7317. Arguments:
  7318. Address - Supplies an IPv6 unicast address.
  7319. Return Value:
  7320. Returns the scope level of the address.
  7321. Caller IRQL:
  7322. May be called at PASSIVE through DISPATCH level.
  7323. --*}
  7324. var
  7325. Ipv6Address : TIn6Addr;
  7326. AddrPtr : PIn6Addr;
  7327. begin
  7328. if not INET_IS_ALIGNED_IN6_ADDR(Address) then begin
  7329. Ipv6Address := PIn6Addr(Address)^;
  7330. AddrPtr := @Ipv6Address;
  7331. end else begin
  7332. AddrPtr := PIn6Addr(Address);
  7333. end;
  7334. if IN6_IS_ADDR_LINKLOCAL(AddrPtr) or
  7335. IN6_IS_ADDR_LOOPBACK(AddrPtr) then
  7336. begin
  7337. Result := ScopeLevelLink;
  7338. end
  7339. else if IN6_IS_ADDR_SITELOCAL(AddrPtr) then begin
  7340. Result := ScopeLevelSite;
  7341. end else begin
  7342. Result := ScopeLevelGlobal;
  7343. end;
  7344. end;
  7345. function IN6_MULTICAST_SCOPE(Address : PUCHAR ) : SCOPE_LEVEL;
  7346. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7347. var
  7348. Ipv6Address : PIN6_ADDR;
  7349. begin
  7350. Ipv6Address := PIN6_ADDR(Address);
  7351. Result := SCOPE_LEVEL(Ipv6Address^.s6_bytes[1] and $f);
  7352. end;
  7353. function Ipv6AddressScope(Address : PUCHAR ) : SCOPE_LEVEL;
  7354. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7355. {*++
  7356. Routine Description:
  7357. Examines an IPv6 address and determines its scope.
  7358. Arguments:
  7359. Address - Supplies an IPv6 address.
  7360. Return Value:
  7361. Returns the scope level of the address.
  7362. Caller IRQL:
  7363. May be called at PASSIVE through DISPATCH level.
  7364. --*}
  7365. begin
  7366. if IN6_IS_ADDR_MULTICAST(PIn6Addr(Address)) then begin
  7367. Result := IN6_MULTICAST_SCOPE(Address);
  7368. end else begin
  7369. Result := Ipv6UnicastAddressScope(Address);
  7370. end;
  7371. end;
  7372. function Ipv6AddressType( Address : PUCHAR) : NL_ADDRESS_TYPE;
  7373. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7374. var
  7375. Ipv6Address : PIN6_ADDR;
  7376. Ipv4Address : PUCHAR;
  7377. begin
  7378. Ipv6Address := PIN6_ADDR(Address);
  7379. if IN6_IS_ADDR_MULTICAST(Ipv6Address) then begin
  7380. Result := NlatMulticast;
  7381. Exit;
  7382. end;
  7383. if IN6_IS_ADDR_UNSPECIFIED(Ipv6Address) then begin
  7384. Result := NlatUnspecified;
  7385. Exit;
  7386. end;
  7387. //
  7388. // Extract embedded IPv4 address, if any.
  7389. //
  7390. if IN6_IS_ADDR_ISATAP(Ipv6Address) or
  7391. IN6_IS_ADDR_V4COMPAT(Ipv6Address) or
  7392. IN6_IS_ADDR_V4MAPPED(Ipv6Address) or
  7393. IN6_IS_ADDR_V4TRANSLATED(Ipv6Address) then
  7394. begin
  7395. Ipv4Address := IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address);
  7396. end
  7397. else if IN6_IS_ADDR_6TO4(Ipv6Address) then begin
  7398. Ipv4Address := IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address);
  7399. end else begin
  7400. //
  7401. // Anycast and loopback addresses are treated unicast address.
  7402. //
  7403. Result := NlatUnicast;
  7404. Exit;
  7405. end;
  7406. //
  7407. // Ensure that the embedded IPv4 address is unicast.
  7408. //
  7409. if Ipv4AddressType(Ipv4Address) <> NlatUnicast then begin
  7410. Result := NlatInvalid;
  7411. Exit;
  7412. end;
  7413. Result := NlatUnicast;
  7414. end;
  7415. {$IFNDEF WINCE}
  7416. procedure IN6_UNCANONICALIZE_SCOPE_ID(Address : PIN6_ADDR; ScopeId : PSCOPE_ID);
  7417. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7418. var
  7419. ScopeLevel : SCOPE_LEVEL;
  7420. begin
  7421. ScopeLevel := Ipv6AddressScope(PUCHAR(Address));
  7422. if IN6_IS_ADDR_LOOPBACK(Address) or (ScopeLevel = ScopeLevelGlobal) then begin
  7423. ScopeId^.Value := 0;
  7424. end;
  7425. if (SCOPE_LEVEL(ScopeId^.Value shr 28) = ScopeLevel) then begin
  7426. SCOPE_ID_SetLevel(ScopeId^, 0);
  7427. end;
  7428. end;
  7429. {$ENDIF}
  7430. procedure IN6ADDR_SETSOCKADDR(a : PSOCKADDR_IN6; addr : PIN6_ADDR;
  7431. const scope : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF}; const port : USHORT );
  7432. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7433. begin
  7434. a^.sin6_family := AF_INET6;
  7435. a^.sin6_port := port;
  7436. a^.sin6_flowinfo := 0;
  7437. a^.sin6_addr := addr^;
  7438. {$IFDEF WINCE}
  7439. a^.sin6_scope_id := scope;
  7440. {$ELSE}
  7441. a^.a.sin6_scope_struct := scope;
  7442. IN6_UNCANONICALIZE_SCOPE_ID(@a^.sin6_addr, @a^.a.sin6_scope_struct);
  7443. {$ENDIF}
  7444. end;
  7445. procedure IN6ADDR_SETV4MAPPED(a6 : PSOCKADDR_IN6; a4 : PInAddr;
  7446. const scope : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF}; const port : USHORT );
  7447. begin
  7448. a6^.sin6_family := AF_INET6;
  7449. a6^.sin6_port := port;
  7450. a6^.sin6_flowinfo := 0;
  7451. IN6_SET_ADDR_V4MAPPED(a6^.sin6_addr, a4);
  7452. {$IFDEF WINCE}
  7453. a6^.sin6_scope_id := scope;
  7454. {$ELSE}
  7455. a6^.a.sin6_scope_struct := scope;
  7456. IN4_UNCANONICALIZE_SCOPE_ID(a4, @a6^.a.sin6_scope_struct);
  7457. {$ENDIF}
  7458. end;
  7459. //
  7460. // Define address-family-independent routines.
  7461. //
  7462. function INET_ADDR_EQUAL(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7463. const a, b : Pointer) : Boolean;
  7464. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7465. begin
  7466. if (af = AF_INET6) then begin
  7467. Result := IN6_ADDR_EQUAL(PIN6_ADDR(a), PIN6_ADDR(b));
  7468. end else begin
  7469. ASSERT(af = AF_INET);
  7470. Result := IN4_ADDR_EQUAL(PInAddr(a), PInAddr(b));
  7471. end;
  7472. end;
  7473. function INET_UNALIGNED_ADDR_EQUAL(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7474. const a, b : Pointer ) : Boolean;
  7475. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7476. begin
  7477. if (af = AF_INET6) then begin
  7478. Result := IN6_ADDR_EQUAL(PIN6_ADDR(a), PIN6_ADDR(b));
  7479. end else begin
  7480. ASSERT(af = AF_INET);
  7481. Result := IN4_UNALIGNED_ADDR_EQUAL(PInAddr(a), PInAddr(b));
  7482. end;
  7483. end;
  7484. function INET_IS_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7485. const a : Pointer) : Boolean;
  7486. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7487. begin
  7488. if (af = AF_INET6) then begin
  7489. Result := IN6_IS_ADDR_UNSPECIFIED(PIN6_ADDR(a));
  7490. end else begin
  7491. ASSERT(af = AF_INET);
  7492. Result := IN4_IS_ADDR_UNSPECIFIED(PInAddr(a));
  7493. end;
  7494. end;
  7495. function INET_IS_UNALIGNED_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7496. const a : Pointer) : Boolean;
  7497. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7498. begin
  7499. if (af = AF_INET6) then begin
  7500. Result := IN6_IS_ADDR_LOOPBACK(PIN6_ADDR(a));
  7501. end else begin
  7502. ASSERT(af = AF_INET);
  7503. Result := IN4_IS_ADDR_LOOPBACK(PInAddr(a));
  7504. end;
  7505. end;
  7506. function INET_IS_ADDR_LOOPBACK(const af: {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7507. const a: Pointer): Boolean;
  7508. begin
  7509. if (af = AF_INET6) then begin
  7510. Result := IN6_IS_ADDR_LOOPBACK(PIn6Addr(a));
  7511. end else begin
  7512. ASSERT(af = AF_INET);
  7513. Result := IN4_IS_ADDR_LOOPBACK(PInAddr(a));
  7514. end;
  7515. end;
  7516. function INET_IS_ADDR_BROADCAST(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7517. const a : Pointer) : Boolean;
  7518. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7519. begin
  7520. if (af = AF_INET6) then begin
  7521. Result := False;
  7522. end else begin
  7523. ASSERT(af = AF_INET);
  7524. Result := IN4_IS_ADDR_BROADCAST(PInAddr(a));
  7525. end;
  7526. end;
  7527. function INET_IS_ADDR_MULTICAST(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7528. const a : Pointer) : Boolean;
  7529. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7530. begin
  7531. if (af = AF_INET6) then begin
  7532. Result := IN6_IS_ADDR_MULTICAST(PIN6_ADDR(a));
  7533. end else begin
  7534. ASSERT(af = AF_INET);
  7535. Result := IN4_IS_ADDR_MULTICAST(PInAddr(a));
  7536. end;
  7537. end;
  7538. function INET_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF}) : PUCHAR;
  7539. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7540. begin
  7541. if (af = AF_INET6) then begin
  7542. Result := PUCHAR(@in6addr_any);
  7543. end else begin
  7544. ASSERT(af = AF_INET);
  7545. Result := PUCHAR(@_in4addr_any);
  7546. end;
  7547. end;
  7548. procedure INET_SET_ADDRESS( Family : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7549. Address : PUCHAR; Value : PUCHAR);
  7550. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7551. begin
  7552. if (Family = AF_INET6) then begin
  7553. PIn6Addr(Address)^ := PIn6Addr(Value)^;
  7554. end else begin
  7555. ASSERT(Family = AF_INET);
  7556. PInAddr(Address)^ := PInAddr(Value)^;
  7557. end;
  7558. end;
  7559. function INET_ADDR_LENGTH(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF} ) : Size_t;
  7560. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7561. begin
  7562. if (af = AF_INET6) then begin
  7563. Result := SizeOf(IN6_ADDR);
  7564. end else begin
  7565. ASSERT(af = AF_INET);
  7566. Result := SizeOf(IN_ADDR);
  7567. end;
  7568. end;
  7569. function INET_SOCKADDR_LENGTH(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF}) : Size_t;
  7570. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7571. begin
  7572. if (af = AF_INET6) then begin
  7573. Result := SizeOf(SOCKADDR_IN6);
  7574. end else begin
  7575. ASSERT(af = AF_INET);
  7576. Result := SizeOf(SOCKADDR_IN);
  7577. end;
  7578. end;
  7579. //
  7580. function IN6ADDR_ANY_INIT: TIn6Addr;
  7581. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7582. begin
  7583. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7584. end;
  7585. function IN6ADDR_LOOPBACK_INIT: TIn6Addr;
  7586. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7587. begin
  7588. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7589. Result.s6_bytes[15] := 1;
  7590. end;
  7591. function IN6ADDR_ALLNODESONNODE_INIT : TIn6Addr;
  7592. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7593. begin
  7594. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7595. Result.s6_bytes[0] := $ff;
  7596. Result.s6_bytes[1] := $01;
  7597. Result.s6_bytes[15] := $01;
  7598. end;
  7599. function IN6ADDR_ALLNODESONLINK_INIT : TIn6Addr;
  7600. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7601. begin
  7602. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7603. Result.s6_bytes[0] := $ff;
  7604. Result.s6_bytes[1] := $02;
  7605. Result.s6_bytes[15] := $01;
  7606. end;
  7607. function IN6ADDR_ALLROUTERSONLINK_INIT : TIn6Addr;
  7608. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7609. begin
  7610. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7611. Result.s6_bytes[0] := $ff;
  7612. Result.s6_bytes[1] := $02;
  7613. Result.s6_bytes[15] := $02;
  7614. end;
  7615. function IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT : TIn6Addr;
  7616. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7617. begin
  7618. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7619. Result.s6_bytes[0] := $ff;
  7620. Result.s6_bytes[1] := $02;
  7621. Result.s6_bytes[15] := $16;
  7622. end;
  7623. function IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT : TIn6Addr;
  7624. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7625. begin
  7626. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7627. Result.s6_bytes[0] := $fe;
  7628. Result.s6_bytes[1] := $80;
  7629. Result.s6_bytes[10] := $ff;
  7630. Result.s6_bytes[11] := $ff;
  7631. Result.s6_bytes[12] := $ff;
  7632. Result.s6_bytes[13] := $ff;
  7633. Result.s6_bytes[14] := $ff;
  7634. Result.s6_bytes[15] := $fe;
  7635. end;
  7636. //
  7637. // The old link local address for XP-SP2/Win2K3 machines.
  7638. //
  7639. function IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT : TIn6Addr;
  7640. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7641. begin
  7642. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7643. Result.s6_bytes[0] := $fe;
  7644. Result.s6_bytes[1] := $80;
  7645. Result.s6_bytes[10] := Ord('T');
  7646. Result.s6_bytes[11] := Ord('E');
  7647. Result.s6_bytes[12] := Ord('R');
  7648. Result.s6_bytes[13] := Ord('E');
  7649. Result.s6_bytes[14] := Ord('D');
  7650. Result.s6_bytes[15] := Ord('O');
  7651. end;
  7652. //
  7653. // The old link local address for Vista Beta-2 and earlier machines.
  7654. //
  7655. function IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT : TIn6Addr;
  7656. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7657. begin
  7658. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7659. Result.s6_bytes[0] := $fe;
  7660. Result.s6_bytes[1] := $80;
  7661. Result.s6_bytes[10] := $ff;
  7662. Result.s6_bytes[11] := $ff;
  7663. Result.s6_bytes[12] := $ff;
  7664. Result.s6_bytes[13] := $ff;
  7665. Result.s6_bytes[14] := $ff;
  7666. Result.s6_bytes[15] := $ff;
  7667. end;
  7668. function IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_INIT : IN6_ADDR;
  7669. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7670. begin
  7671. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7672. Result.s6_bytes[0] := $FF;
  7673. Result.s6_bytes[1] := $02;
  7674. Result.s6_bytes[11] := $01;
  7675. Result.s6_bytes[12] := $ff;
  7676. end;
  7677. function IN6ADDR_V4MAPPEDPREFIX_INIT : TIn6Addr;
  7678. begin
  7679. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7680. Result.s6_bytes[10] := $ff;
  7681. Result.s6_bytes[11] := $ff;
  7682. end;
  7683. function IN6ADDR_6TO4PREFIX_INIT : TIn6Addr;
  7684. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7685. begin
  7686. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7687. Result.s6_bytes[0] := $20;
  7688. Result.s6_bytes[1] := $02;
  7689. end;
  7690. function IN6ADDR_TEREDOPREFIX_INIT : TIn6Addr;
  7691. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7692. begin
  7693. System.FillChar(Result.s6_bytes, SIZE_TIN6ADDR, 0); {Do not Localize}
  7694. Result.s6_bytes[0] := $20;
  7695. Result.s6_bytes[1] := $01;
  7696. end;
  7697. procedure IN6ADDR_SETANY(sa: PSockAddrIn6);
  7698. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7699. begin
  7700. if sa <> nil then begin
  7701. sa^.sin6_family := AF_INET6;
  7702. sa^.sin6_port := 0;
  7703. sa^.sin6_flowinfo := 0;
  7704. PULONG(@sa^.sin6_addr.s6_bytes[0])^ := 0;
  7705. PULONG(@sa^.sin6_addr.s6_bytes[4])^ := 0;
  7706. PULONG(@sa^.sin6_addr.s6_bytes[8])^ := 0;
  7707. PULONG(@sa^.sin6_addr.s6_bytes[12])^ := 0;
  7708. end;
  7709. end;
  7710. procedure IN6ADDR_SETLOOPBACK(sa: PSockAddrIn6);
  7711. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7712. begin
  7713. if sa <> nil then begin
  7714. sa^.sin6_family := AF_INET6;
  7715. sa^.sin6_port := 0;
  7716. sa^.sin6_flowinfo := 0;
  7717. PULONG(@sa^.sin6_addr.s6_bytes[0])^ := 0;
  7718. PULONG(@sa^.sin6_addr.s6_bytes[4])^ := 0;
  7719. PULONG(@sa^.sin6_addr.s6_bytes[8])^ := 0;
  7720. PULONG(@sa^.sin6_addr.s6_bytes[12])^ := 1;
  7721. end;
  7722. end;
  7723. function IN6ADDR_ISANY(sa: PSockAddrIn6): Boolean;
  7724. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7725. begin
  7726. if sa <> nil then begin
  7727. Result := (sa^.sin6_family = AF_INET6) and
  7728. (PULONG(@sa^.sin6_addr.s6_bytes[0])^ = 0) and
  7729. (PULONG(@sa^.sin6_addr.s6_bytes[4])^ = 0) and
  7730. (PULONG(@sa^.sin6_addr.s6_bytes[8])^ = 0) and
  7731. (PULONG(@sa^.sin6_addr.s6_bytes[12])^ = 0);
  7732. end else begin
  7733. Result := False;
  7734. end;
  7735. end;
  7736. function IN6ADDR_ISLOOPBACK(sa: PSockAddrIn6): Boolean;
  7737. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7738. begin
  7739. if sa <> nil then begin
  7740. Result := (sa^.sin6_family = AF_INET6) and
  7741. (PULONG(@sa^.sin6_addr.s6_bytes[0])^ = 0) and
  7742. (PULONG(@sa^.sin6_addr.s6_bytes[4])^ = 0) and
  7743. (PULONG(@sa^.sin6_addr.s6_bytes[8])^ = 0) and
  7744. (PULONG(@sa^.sin6_addr.s6_bytes[12])^ = 1);
  7745. end else begin
  7746. Result := False;
  7747. end;
  7748. end;
  7749. function IN6_ADDR_EQUAL(const a: PIn6Addr; const b: PIn6Addr): Boolean;
  7750. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7751. begin
  7752. Result := SysUtils.CompareMem(a, b, SIZE_TIN6ADDR);
  7753. end;
  7754. function IN6_IS_ADDR_UNSPECIFIED(const a: PIn6Addr): Boolean;
  7755. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7756. begin
  7757. Result := IN6_ADDR_EQUAL(a, @in6addr_any);
  7758. end;
  7759. function IN6_IS_ADDR_LOOPBACK(const a: PIn6Addr): Boolean;
  7760. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7761. begin
  7762. Result := IN6_ADDR_EQUAL(a, @in6addr_loopback);
  7763. end;
  7764. function IN6_IS_ADDR_MULTICAST(const a: PIn6Addr): Boolean;
  7765. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7766. begin
  7767. if a <> nil then begin
  7768. Result := (a^.s6_bytes[0] = $FF);
  7769. end else begin
  7770. Result := False;
  7771. end;
  7772. end;
  7773. function IN6_IS_ADDR_EUI64(const a : PIn6Addr) : Boolean;
  7774. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7775. //
  7776. // Format prefixes 001 through 111, except for multicast.
  7777. //
  7778. begin
  7779. if a <> nil then begin
  7780. Result := ((a^.s6_bytes[0] and $e0) <> 0 ) and (not IN6_IS_ADDR_MULTICAST(a));
  7781. end else begin
  7782. Result := False;
  7783. end;
  7784. end;
  7785. function IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(const a : PIn6Addr) : Boolean;
  7786. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7787. //
  7788. // Is this the subnet router anycast address?
  7789. // See RFC 2373.
  7790. //
  7791. begin
  7792. if a <> nil then begin
  7793. Result := IN6_IS_ADDR_EUI64(a) and (a^.s6_words[4] = 0) and
  7794. (a^.s6_words[5] = 0) and (a^.s6_words[6]=0) and (a^.s6_words[7]=0);
  7795. end else begin
  7796. Result := False;
  7797. end;
  7798. end;
  7799. function IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(const a: PIn6Addr) : Boolean;
  7800. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7801. begin
  7802. if a <> nil then begin
  7803. Result := IN6_IS_ADDR_EUI64(a) and (a^.s6_words[4] = $fffd) and
  7804. (a^.s6_words[5] = $ffff) and (a^.s6_words[6] = $ffff) and
  7805. ((a^.s6_words[7] and $80ff) = $80ff);
  7806. end else begin
  7807. Result := False;
  7808. end;
  7809. end;
  7810. function IN6_IS_ADDR_ANYCAST(const a: PIn6Addr) : Boolean;
  7811. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7812. begin
  7813. if a <> nil then begin
  7814. Result := IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(a) or IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(a);
  7815. end else begin
  7816. Result := False;
  7817. end;
  7818. end;
  7819. function IN6_IS_ADDR_LINKLOCAL(const a: PIn6Addr): Boolean;
  7820. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7821. begin
  7822. if a <> nil then begin
  7823. Result := (a^.s6_bytes[0] = $FE) and ((a^.s6_bytes[1] and $C0) = $80);
  7824. end else begin
  7825. Result := False;
  7826. end;
  7827. end;
  7828. function IN6_IS_ADDR_SITELOCAL(const a: PIn6Addr): Boolean;
  7829. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7830. begin
  7831. if a <> nil then begin
  7832. Result := (a^.s6_bytes[0] = $FE) and ((a^.s6_bytes[1] and $C0) = $C0);
  7833. end else begin
  7834. Result := False;
  7835. end;
  7836. end;
  7837. function IN6_IS_ADDR_V4MAPPED(const a: PIn6Addr): Boolean;
  7838. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7839. begin
  7840. if a <> nil then begin
  7841. Result := (a^.s6_words[0] = 0) and
  7842. (a^.s6_words[1] = 0) and
  7843. (a^.s6_words[2] = 0) and
  7844. (a^.s6_words[3] = 0) and
  7845. (a^.s6_words[4] = 0) and
  7846. (a^.s6_words[5] = $FFFF);
  7847. end else begin
  7848. Result := False;
  7849. end;
  7850. end;
  7851. function IN6_IS_ADDR_V4COMPAT(const a: PIn6Addr): Boolean;
  7852. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7853. begin
  7854. if a <> nil then begin
  7855. Result := (a^.s6_words[0] = 0) and
  7856. (a^.s6_words[1] = 0) and
  7857. (a^.s6_words[2] = 0) and
  7858. (a^.s6_words[3] = 0) and
  7859. (a^.s6_words[4] = 0) and
  7860. (a^.s6_words[5] = 0) and
  7861. not ((a^.s6_words[6] = 0) and (a^.s6_bytes[14] = 0) and
  7862. ((a^.s6_bytes[15] = 0) or (a^.s6_bytes[15] = 1)));
  7863. end else begin
  7864. Result := False;
  7865. end;
  7866. end;
  7867. function IN6_IS_ADDR_V4TRANSLATED(const a: PIn6Addr): Boolean;
  7868. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7869. begin
  7870. Result := ((a^.s6_words[0] = 0) and
  7871. (a^.s6_words[1] = 0) and
  7872. (a^.s6_words[2] = 0) and
  7873. (a^.s6_words[3] = 0) and
  7874. (a^.s6_words[4] = $ffff) and
  7875. (a^.s6_words[5] = 0));
  7876. end;
  7877. procedure INETADDR_SETSOCKADDR(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7878. a : PSOCKADDR; addr : Pointer; const scope : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF}; const port : USHORT);
  7879. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7880. var
  7881. addr4 : IN_ADDR;
  7882. begin
  7883. if (af = AF_INET6) then begin
  7884. IN6ADDR_SETSOCKADDR(PSOCKADDR_IN6( a), PIN6_ADDR( addr ), scope, port);
  7885. end else begin
  7886. addr4 := PInAddr(addr)^;
  7887. ASSERT(af = AF_INET);
  7888. IN4ADDR_SETSOCKADDR(PSockAddrIn(a),PInAddr( @addr4), port);
  7889. end;
  7890. end;
  7891. procedure INETADDR_SETANY(a : PSOCKADDR);
  7892. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7893. begin
  7894. if (a^.sa_family = AF_INET6) then begin
  7895. IN6ADDR_SETANY(PSOCKADDR_IN6(a));
  7896. end else begin
  7897. ASSERT(a^.sa_family = AF_INET);
  7898. IN4ADDR_SETANY(PSockAddrIn(a));
  7899. end;
  7900. end;
  7901. procedure INETADDR_SETLOOPBACK(a : PSOCKADDR);
  7902. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7903. begin
  7904. if (a^.sa_family = AF_INET6) then begin
  7905. IN6ADDR_SETLOOPBACK(PSOCKADDR_IN6(a));
  7906. end else begin
  7907. ASSERT(a^.sa_family = AF_INET);
  7908. IN4ADDR_SETLOOPBACK(PSockAddrIn(a));
  7909. end;
  7910. end;
  7911. function INETADDR_ISANY(const a : PSOCKADDR) : Boolean;
  7912. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7913. begin
  7914. if (a^.sa_family = AF_INET6) then begin
  7915. Result := IN6ADDR_ISANY(PSOCKADDR_IN6(a));
  7916. end else begin
  7917. ASSERT(a^.sa_family = AF_INET);
  7918. Result := IN4ADDR_ISANY(PSockAddrIn(a));
  7919. end;
  7920. end;
  7921. function INETADDR_ISLOOPBACK(const a : PSockAddr) : Boolean;
  7922. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7923. begin
  7924. if (a^.sa_family = AF_INET6) then begin
  7925. Result := IN6ADDR_ISLOOPBACK(PSOCKADDR_IN6(a));
  7926. end else begin
  7927. ASSERT(a^.sa_family = AF_INET);
  7928. Result := IN4ADDR_ISLOOPBACK(PSockAddrIn(a));
  7929. end;
  7930. end;
  7931. function INETADDR_ISV4MAPPED(const a : PSockAddr) : Boolean;
  7932. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7933. begin
  7934. if (a^.sa_family = AF_INET6) then begin
  7935. Result := IN6ADDR_ISV4MAPPED(PSOCKADDR_IN6(a));
  7936. end else begin
  7937. Result := False;
  7938. end;
  7939. end;
  7940. function NL_ADDR_EQUAL(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7941. const sa : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  7942. const aa : PUCHAR;
  7943. const sb : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  7944. const ab : PUCHAR) : Boolean;
  7945. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7946. begin
  7947. Result := ((sa{$IFNDEF WINCE}.Value{$ENDIF} = sb{$IFNDEF WINCE}.Value{$ENDIF}) and
  7948. INET_ADDR_EQUAL(af, aa, ab));
  7949. end;
  7950. function NL_IS_ADDR_UNSPECIFIED(const af : {$IFDEF WINCE}Int16{$ELSE}ADDRESS_FAMILY{$ENDIF};
  7951. const s : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  7952. const a : PUCHAR) : Boolean;
  7953. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7954. begin
  7955. Result := ((s{$IFNDEF WINCE}.Value{$ENDIF} = 0) and INET_IS_ADDR_UNSPECIFIED(af, a));
  7956. end;
  7957. function IN6ADDR_ISEQUAL(const a,b : PSOCKADDR_IN6 ) : Boolean;
  7958. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7959. begin
  7960. ASSERT(a^.sin6_family = AF_INET6);
  7961. Result := (a^.{$IFNDEF WINCE}a.{$ENDIF}sin6_scope_id = b^.{$IFNDEF WINCE}a.{$ENDIF}sin6_scope_id) and
  7962. IN6_ADDR_EQUAL(@a^.sin6_addr, @b^.sin6_addr);
  7963. end;
  7964. function INETADDR_ISEQUAL(const a,b : PSOCKADDR) : Boolean;
  7965. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7966. begin
  7967. if (a^.sa_family = AF_INET6) then begin
  7968. Result := (b^.sa_family = AF_INET6) and
  7969. IN6ADDR_ISEQUAL(PSOCKADDR_IN6(a), PSOCKADDR_IN6(b));
  7970. end else begin
  7971. ASSERT(a^.sa_family = AF_INET);
  7972. Result := (b^.sa_family = AF_INET) and
  7973. IN4ADDR_ISEQUAL(PSOCKADDR_IN(a), PSOCKADDR_IN(b));
  7974. end;
  7975. end;
  7976. function IN6ADDR_ISUNSPECIFIED(a : PSOCKADDR_IN6) : Boolean;
  7977. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7978. begin
  7979. ASSERT(a^.sin6_family = AF_INET6);
  7980. Result := (a^.{$IFNDEF WINCE}a.{$ENDIF}sin6_scope_id = 0) and
  7981. IN6_IS_ADDR_UNSPECIFIED(@a^.sin6_addr);
  7982. end;
  7983. function INETADDR_ISUNSPECIFIED(const a : PSOCKADDR) : Boolean;
  7984. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7985. begin
  7986. if (a^.sa_family = AF_INET6) then begin
  7987. Result := IN6ADDR_ISUNSPECIFIED( PSOCKADDR_IN6(a));
  7988. end else begin
  7989. ASSERT(a^.sa_family = AF_INET);
  7990. Result := IN4ADDR_ISUNSPECIFIED(PSOCKADDR_IN(a));
  7991. end;
  7992. end;
  7993. function INETADDR_SCOPE_ID(const a : PSOCKADDR) : {$IFDEF WINCE}u_long{$ELSE}SCOPE_ID{$ENDIF};
  7994. {$IFDEF USE_INLINE}inline;{$ENDIF}
  7995. begin
  7996. if (a^.sa_family = AF_INET6) then begin
  7997. Result := PSOCKADDR_IN6(a)^.{$IFDEF WINCE}sin6_scope_id{$ELSE}a.sin6_scope_struct{$ENDIF};
  7998. end else begin
  7999. ASSERT(a^.sa_family = AF_INET);
  8000. Result := IN4ADDR_SCOPE_ID(PSOCKADDR_IN(a));
  8001. end;
  8002. end;
  8003. function INETADDR_PORT(const a : PSOCKADDR) : USHORT;
  8004. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8005. begin
  8006. if (a^.sa_family = AF_INET6) then begin
  8007. Result := PSOCKADDR_IN6(a)^.sin6_port;
  8008. end else begin
  8009. ASSERT(a^.sa_family = AF_INET);
  8010. Result := PSOCKADDR_IN(a)^.sin_port;
  8011. end;
  8012. end;
  8013. function INETADDR_ADDRESS(const a : PSOCKADDR) : PUCHAR;
  8014. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8015. begin
  8016. if (a^.sa_family = AF_INET6) then begin
  8017. Result := PUCHAR(@(PSOCKADDR_IN6(a))^.sin6_addr);
  8018. end else begin
  8019. ASSERT(a^.sa_family = AF_INET);
  8020. Result := PUCHAR(@(PSOCKADDR_IN(a))^.sin_addr);
  8021. end;
  8022. end;
  8023. procedure INETADDR_SET_PORT(const a : PSOCKADDR; Port : USHORT);
  8024. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8025. begin
  8026. a^.sin_port := Port;
  8027. end;
  8028. procedure INETADDR_SET_ADDRESS(const a : PSOCKADDR; Address : PUCHAR);
  8029. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8030. begin
  8031. if (a^.sa_family = AF_INET6) then begin
  8032. PSOCKADDR_IN6(a)^.sin6_addr := PIN6_ADDR(Address)^;
  8033. end else begin
  8034. ASSERT(PSOCKADDR_IN(a)^.sa_family = AF_INET);
  8035. PSOCKADDR_IN(a)^.sin_addr := PInAddr(Address)^;
  8036. end;
  8037. end;
  8038. {$IFNDEF WINCE}
  8039. procedure INET_UNCANONICALIZE_SCOPE_ID( AddressFamily : ADDRESS_FAMILY;
  8040. Address : PUCHAR; ScopeId : PSCOPE_ID);
  8041. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8042. begin
  8043. if (AddressFamily = AF_INET6) then begin
  8044. IN6_UNCANONICALIZE_SCOPE_ID(PIn6Addr( Address), ScopeId);
  8045. end else begin
  8046. IN4_UNCANONICALIZE_SCOPE_ID(PInAddr( Address), ScopeId);
  8047. end;
  8048. end;
  8049. {$ENDIF}
  8050. function IN6_IS_ADDR_MC_NODELOCAL(const a: PIn6Addr): Boolean;
  8051. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8052. begin
  8053. if a <> nil then begin
  8054. Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 1);
  8055. end else begin
  8056. Result := False;
  8057. end;
  8058. end;
  8059. function IN6_IS_ADDR_MC_LINKLOCAL(const a: PIn6Addr): Boolean;
  8060. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8061. begin
  8062. if a <> nil then begin
  8063. Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 2);
  8064. end else begin
  8065. Result := False;
  8066. end;
  8067. end;
  8068. function IN6_IS_ADDR_MC_SITELOCAL(const a: PIn6Addr): Boolean;
  8069. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8070. begin
  8071. if a <> nil then begin
  8072. Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 5);
  8073. end else begin
  8074. Result := False;
  8075. end;
  8076. end;
  8077. function IN6_IS_ADDR_MC_ORGLOCAL(const a: PIn6Addr): Boolean;
  8078. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8079. begin
  8080. if a <> nil then begin
  8081. Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = 8);
  8082. end else begin
  8083. Result := False;
  8084. end;
  8085. end;
  8086. function IN6_IS_ADDR_MC_GLOBAL(const a: PIn6Addr): Boolean;
  8087. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8088. begin
  8089. if a <> nil then begin
  8090. Result := IN6_IS_ADDR_MULTICAST(a) and ((a^.s6_bytes[1] and $F) = $E);
  8091. end else begin
  8092. Result := False;
  8093. end;
  8094. end;
  8095. procedure IN6_SET_ADDR_UNSPECIFIED(a : PIN6_ADDR);
  8096. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8097. begin
  8098. System.FillChar(a^.s6_bytes, SizeOf(IN6_ADDR), 0 );
  8099. end;
  8100. procedure IN6_SET_ADDR_LOOPBACK(a : PIN6_ADDR);
  8101. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8102. begin
  8103. System.FillChar(a^.s6_bytes, SizeOf(IN6_ADDR), 0 );
  8104. a^.s6_bytes[15] := 1;
  8105. end;
  8106. // A macro convenient for setting up NETBIOS SOCKADDRs.
  8107. procedure SET_NETBIOS_SOCKADDR(snb : PSockAddrNB; const SnbType : Word; const Name : PIdAnsiChar; const Port : TIdAnsiChar);
  8108. var
  8109. len : {$IFDEF FPC}sizeint{$ELSE}DWord{$ENDIF};
  8110. begin
  8111. if snb <> nil then begin
  8112. snb^.snb_family := AF_NETBIOS;
  8113. snb^.snb_type := SnbType;
  8114. {$IFDEF NEXTGEN}
  8115. len := Length(Name);
  8116. {$ELSE}
  8117. len := {$IFDEF HAS_AnsiStrings_StrLen}AnsiStrings.{$ENDIF}StrLen(Name);
  8118. {$ENDIF}
  8119. if len >= NETBIOS_NAME_LENGTH-1 then begin
  8120. System.Move(Name^, snb^.snb_name, NETBIOS_NAME_LENGTH-1);
  8121. end else begin
  8122. if len > 0 then begin
  8123. System.Move(Name^, snb^.snb_name, LongInt(len));
  8124. end;
  8125. System.FillChar((PIdAnsiChar(@snb^.snb_name)+len)^, NETBIOS_NAME_LENGTH-1-len, ' '); {Do not Localize}
  8126. end;
  8127. snb^.snb_name[NETBIOS_NAME_LENGTH-1] := Port;
  8128. end;
  8129. end;
  8130. function GROUP_FILTER_SIZE(const numsrc : DWord) : PtrUInt;
  8131. {$IFDEF USE_INLINE}inline;{$ENDIF}
  8132. begin
  8133. Result := (SIZE_GROUP_FILTER - SIZE_SOCKADDR_STORAGE) + (numsrc * SIZE_SOCKADDR_STORAGE);
  8134. end;
  8135. initialization
  8136. scopeid_unspecified := SCOPEID_UNSPECIFIED_INIT;
  8137. _in4addr_any := IN4ADDR_ANY_INIT;
  8138. _in4addr_loopback := IN4ADDR_LOOPBACK_INIT;
  8139. _in4addr_broadcast := IN4ADDR_BROADCAST_INIT;
  8140. in4addr_allnodesonlink := IN4ADDR_ALLNODESONLINK_INIT;
  8141. in4addr_allroutersonlink := IN4ADDR_ALLROUTERSONLINK_INIT;
  8142. in4addr_alligmpv3routersonlink := IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT;
  8143. in4addr_allteredohostsonlink := IN4ADDR_ALLTEREDONODESONLINK_INIT;
  8144. in4addr_linklocalprefix := IN4ADDR_LINKLOCALPREFIX_INIT;
  8145. in4addr_multicastprefix := IN4ADDR_MULTICASTPREFIX_INIT;
  8146. in6addr_any := IN6ADDR_ANY_INIT;
  8147. in6addr_loopback := IN6ADDR_LOOPBACK_INIT;
  8148. in6addr_allnodesonnode := IN6ADDR_ALLNODESONNODE_INIT;
  8149. in6addr_allnodesonlink := IN6ADDR_ALLNODESONLINK_INIT;
  8150. in6addr_allroutersonlink := IN6ADDR_ALLROUTERSONLINK_INIT;
  8151. in6addr_solicitednodemulticastprefix := IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_INIT;
  8152. in6addr_v4mappedprefix := IN6ADDR_V4MAPPEDPREFIX_INIT;
  8153. in6addr_6to4prefix := IN6ADDR_6TO4PREFIX_INIT;
  8154. in6addr_teredoprefix := IN6ADDR_TEREDOPREFIX_INIT;
  8155. InitializeStubs;
  8156. end.