Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

Search Results for "l" in [All]

winscard

.

‚ÐL××àN’ä¿{<5,¾pëdfÚ¯p;ãå/À¦ÊËP/¤ [ãÉ]ù%ªaùQ¼%߃«Ç׸§?B&L¹ÌõØbÇp±N\~h©ý YvJ4•e…!w°Î×W÷I:X…Uôß^>@LøÀÍõ5 „3J–ÿ}Ýi¼tYøôEwwUææD@

.

1ÑyzB<@þyø_¯3“Þrˆñ^·äV‚±wÅs°ÅáP;Fñ–ì(¦ET¨$PŸ¾[ê«Z$´’ï}ÅXàÏÝN«A‡ýÒZ'ñHU7 Ú³\Ó0_ϕJÛû7•0'uG=h¦»ÁìTècèJƾ!`šÉ³uZ)Òxy h$΍ÎÔ×f?ҟÍâ½z=jaTª”? àSjf«Ï5„²YJ J4 ‡ PˆÐèàt‘wn—fù£ðyõžŠ 禼ïô9HØØžÍö`glºÚr*0–¦µî«ßàÙ×F4užkLúð>Ìå~ƨÍgíëKG­™ÐPö@(¶MÐ:n Tva’yB_Oüõ¼)ÏÔv¡ÂDeÿµÓ¹˜!¾Ø»‡ÚûÈj•©%ÝglS1è¹ÛcáúHvä„ÄŸ¯bJž[›]„ nɄ9ÔÂx"»¯>É=‡­Û¡}ŠnÔ nSŠ”IX)JëJƒB·÷3¤ù-xaÇ0¸‰ËÎhÛÏÉh…KóÉG 6qóÒÐY~dÕfŸ£M!Y!€HìàO·5Ö°œ,Ψç¬.[Ïþ

.

–!ìZè%ؔÞ¸rE£0NßñÝp‰—ÿü¡á`Ò|ø<ì>­Ï­5ÓjÁ°3ã‡c$wÓß%ç9’è÷ º„Š„Q#£¢|#²³’Ø3Ráh&¿G`ՁuÚr=ñ©ž£\æ!rm—%ÃBž;4‡Jë]sÔŘ-9qkíIi%¬ò¡ê²i£E´‚{eg;e‹A06Ö]Ý×½c;og•û9E›pf Lígá1èț1×è ‘¿•MÈÆÄÕ_ðX9÷#§ñ›ÈÌÈP®%•£¤<æ½Ï!ÌëžV7“U „ªÉ5ñRüêLæ)BK¡ü֞mó&“h\Ç—i¤°¡¢&åˆî¶¬?V2ù䛿èux0Êu7Òö„»|™uh(7žPýn~K³Fb¦BLSn$-,õñJ$eôD–“^]4’Н³Êú—\Ó}~’äNF&%8#ëFz9\„

.

Еgw/ÅÄᬔ‡keÚܧ¿|<L1è%©[£Ñ7

.

";Áþ(—Çn>³¦pPÅ¡˜æàѕ÷¸區ð®‹ld\Î!UŘ³bô¬ .¿þ¬q-*¡­Š¯ì¢ZynM—>ò6„Ëì?p³ÍøxÊìw]–ËQ€:33€C q_Á•_ÂÞÎ’òٽ嚲Ár{–Í>V¶×øÚƒØ«[­uüSœ"ïhÁLhuîW‰·TËç¥î¬i,‰ ¥¶d"¹Ñ£ó³m«8›$™8oÚ/c·Á 2q²ìbµaMlnŠ

.

ÏÍåú±E9™‡ZQÝ^¹“cAjøO:e˜ùuTq^Hù.¥™’증óŸ$˜Nñ^Z+Òދ"5‰sLûß6Õ®g¸Ë´%œ>±0‰ÎH÷Ôó!9_×;îÈŒ=‘Wbþpí:—9Aë€[Ä'JÖ p™à‘¥ ÿ¡‡:jW²DbâÑv¡øRCÊn°f0€°Zå×Ý—Æ^15½ ‚;/ðì¿?•sÞ3þ¡Hø²þi±z­ÜŸ}ԗK”å‚I@šéŽèv7Ô¹X&ç´Ý— ?)^‡}ü0ƒ}nɓK'Ð Z<+¥W½ë-Z«°í<‚)l‘VÁH[gþ"äe

.

üo£²9%¢ ä:ªEmóTwB~ƒ3w[¥NUF-Yzü2¥èeZo‡óâÑPébÄÝí«ë@ÜG°CÀO{<X`yÓ¶QLÖÑý—~Ça›ÛÒþ»I—}['rm’qÁB,L•ã¸d˜Ú#—Ëc&¶¹ëg£}nƱ

.

˜"A¾H/Þ?{c×;ïÇ¢gÙw«8P¸‹0êF;3w(…SË*¦i‰rÑʰl–<

.

wz–Þiƒ YB¿_~ïҔµjéP“ˆ&©[Ç«ÐÏC(Uv'ûÞóŽ“^‚"üJžX€”.Œüvp’­ƒ˜û+"LÁÖ׌I,ç²H‹o

.

s;wµ5”(ڛаFû$>“{bs X?û@‹Iðc_ØpÖ(|6dɁár–T gâù"µEÖ¬¯á¡e°¶×9Ë?\hÇæ¾8+[Ù]”ÿÈ­>8›%a“œø#¦œ¤ŠS–œRþÁ«6ŒãÄ D±jðµÔ·:e´â›Ax¼õöe;x}ÍH‰==\E©ÔƒØBòbIˆdO‘݇?QÊ-—Ò+¸lÉnՎ5Œ7ÍæõúÁÛ§fpL•7”b‹m{ú

.

WÓ$L›)C~͚ðù‡¸—b Ž—¦ÑÇØ±)胊‰.»îU.Ÿœ_ Î‚ç<|à™ Ô^»’ôó”ÎÙþgTgVMÕ8Žy0%yB‡¹ƒÍuÝbzZ2m† #5@yL†r¤Uh\\×bCË<ýƒIm½ÝÙ"

.

l'’’ä

.

BŽÄ»£¦x‰Ö,D, ý֑\ lj„3¢°é>#SGhJò¥d?7#DÊ_€·YÌ D¸F"þð˜*„£Mt`RkpØ»ö£ø&Z÷¤Ýh$õ©îŠq²9?Öޖ™o=ò҉.'óY)  0T”^ ðߨ¶È¸¤-uMë_±T’ý±|¿ðNÖa¹ámƒ(é0y7¢xè0HÛ> XŽTÌ’°5ÑãŽÒJØÆvè}ÃlRM/½Ÿ!£é2íR %)º¢¥?Ä}º¨ä ž–¶ÒIö{½üLÕÂFøy¿±Êƒ×è IÜÁ9ú¡›ˆH8“OøƒŽ‘0‚ÃÿjzH:M­‘®W¨‰‚ÏÐ`hŸîÖõ·þ˜Õ+"âs÷!™Êà–¬’&1éJ÷–Ó

.

ÌN#<i„“·ƒ¯8Füœf7ÄÁUÃ1QkÝvM:³LéÛ$ʝužÐÀ7ûHRdrW&ä°ïT¹–Ea—P»$x }¤Ì£k¨–˜UÍÑÍàSúÚrz;óÉþÌ/pQÒ½Y’ù

.

cs)Ѩ´Þ2:¤éÛ>¾´Ê´uT°ø†]Ñ/ÿú ͼ¿¦:wÒØñ0u6€/Õ£M®X‰@œôI3ç¥ wê(ÅLmEÀ±ïñ°9º•‚à¼ãrâ#¢Ë˜“‘@ÎÞ?µzͼÛü黜}ÐàLê`ž1ÄLdÏ@Ì Ó¿mIxÄlÊÿ*û¹‚]qåóHò;5‚ëÚá|$#®`®ä«ãà¸úî jî•4Mè»9Œíu‡¶ Z¤õ<ª]âyƒNí8È$?ÙE&ºIˆù§ÿ2dÔüèÛö®¼xgBËá›ö°©É††J°»ü½¿ÑÆý–UU”>‹TàCÑ'=Ò=>éÇ>S¸PrÄ”tUA·IÓGÙ(Udwe\üP´þÜdwÈî~]Š›åÓ?×$qj#¡4tÝ¥]K{ÉæÂœ¬Cðÿæƒ×·jkö»EqG’õ-Ü¥ÖûtÁóp#Nzâçw+:æãwQ×"‘˜˜¦½ ÂC᪝óŸ òÓà÷»pÒ4[ÙDÇ´l‹´ºBƒë“

.

+8í»9Âó:«LŒ´ãÝd®@ù½ g#ÍËzž à{ÏÚÇYh8PL´\ð¬DMŠD=1ÞNp*2ª–d¢ObãÁ±s/zRDŽ˺‡9u<WÇkF¸BŒ=²­È>C$ A=xƵ†ö”=fôs䦞õŽ‚‚:°¥áŽÔP¹q´Ï‚V v•jµÈ1۟2Å%—¦Ð9Ì*ª Åo-»ÑiùéP ™Wwç@%’KŸ tøØkdaÝGš.”ðÎž¡ùG‰?ü<ÿ}3ô³® Ø^úTwÚìî`=h`Cen;´Pzû ¾ñtž°Ž‘³-±‰£%

.

¡5>í¹=Ü˗ø&4ÂA–D;õ;M$QÜç6§î¹ñâ¬?¼ƒ„þ®Üql ö>5=¬ršÿ—…K^‹ìõŽUÔ»p2õë£å(„…ʾºg'hžÍKþv[6ù¥î&]|çoªp±OQÓDÙRÝ⻄»î­€:ÕmʓH-€çü‘üj51šÕ—>«õSãBäö±¿KK¡øÆôšË<ŠEµ1Þí±A×|#[tI‡~'rh¤zJêmÆc‘Äy¾ÓÚyIˆ+Åð©Ùo7ö!ŠòžšvÁìC­ë†ìØÕtÙs÷ñ/øõv* ̞™d³A"±QܛùábF¼"ðÜx‡÷´zã±Váº]5IÞCЈ-ú…9œ’è{ë½,™Tøj¹–þÇjY»÷C5’ K—ÿ,ŒÚt´Þ{¥á"Úl¤q^ ™…²çxõÊhé;; g8jÝ]95>c:ÍÑTDgfzâ

.

ȱê5lLEØÜE@²9|ë`è3ÒÁߝT?ñ»Ý

.

4/ÜSLù"9jfIü•¥6zKúÖ‹È>˜ŽAЍÜ]K=÷DGþÌ3PºÎz"w"f¤°“¤‰‰DÁ¢g÷MèÑiþî»"é"ö¡ˆ=[µ9$¼LÐ=Ig~Û« wå¯Ä2F’·$Ëð’ç³çò„ö‘\ê`®Ù¤×ωr

.

µª»/¥ÚqRo𑝳œ©«ÑLrQVi$RSvc±'ý­—¥Þ³Ï£M9Gë9ê\8âޑŽÐKZ5‘”_<v‘úÁ+ýiçýÿÝ4[=☶öliBêZâ}d–°õª—9|6„^…Û<”ÕäòÈ»UpqMB‰n)Y5?&’íwÛÅÄpWe×ajÑ%»3•Ր )õTî÷遅dvP »½”Îڝ;zj™SH‡ƒ¸»Q%wðÆ ¹Apa¸î´²ïZƒ{ž¼{Q³Šª ŠÓ¶`·à¥~Ó´»!'‡ú&°

.

5mÈÇPXn/8…Ê Y‚ÐýÒpLÒ{v»S!ÙPCÀû\øYlJ‰b‰xañ‹é²ô~Ÿ'˜äx#;Ïü8%ØËT”sžZ¢öÓ!Únªõ8è|¸‰r¶Áeî&ê¹Z<+U«ÊØLG€czŒBCp#Ä.œn;½ÜO¨àbÒØ$]nùlæä/®ð;•i4¸ÕSnދCŒqðQÛÁ3)‚¤C*•ÖÁÑX–ŠÜ$X,61« ¢ÕßíÒÝrDM=­)ce}Øü$L©ýàøï!2Úb{M¥­pnü?Þގ

.

.k,×E·â†µ ´èuY!»S­Ni߀˜ƒzB¼<­5zu)÷¯‹Rÿ.‚@çœ/Ÿ¸qªb°`x¯až"föÔxO@×±îѸI¡ü? F©æË¼ôU©“Iuj¸*–T{ “üq!άdÌßl¾òãO‹# Æg1dÚ÷Ò²ÒˆíN®ÏÁ•Üvss…rPOãdLûºk%Šð•­bFaÀ1·X„Ø|þþS‘êÊÔxü) ™¿×Ý»•Ë/Z¬ìì™l3Ÿà•ÿ]ÑÕ, á|c½…"8p(’êàÓÿ%ÿ'`nZmƒo)¢V'u¥²¶žeÏé'év’ÔINgb’Ɔƒw[’6ÅǍP§&KŒÖ"aÁ³€UÞèˆÏûéçª;%=-B÷ôŠÄ/—Ö¥õR&ÚqõԊ´a‡ˆ-í¦ ÂVeÉ8Î 6DԐ`±ÈþóYÆE#ö¨ÔB§ÈßO(n 5R@±¡E¸àbñ"‚ ¯y¤~b¦OG¯V¤óõ¼poZTS¥ïW§O©¶w»Å˜øH…ç

.

Í¢o“¢f˜ é¿Q1Ù+ƒ§ÙèŒÅ+VNþXR‡öÏÑÏ®97’_ò·RàÚØ®:wÛYˏì.uÙÂo®`´C,…çòS>íêZNm•¼€FûxQG.CÍ}É4ÊDW±‡wûDªß-ÏÊåýŽ’iZ¾Ú‹5´¤àµ¬kغÄ[[—k“JìFS$ÚR¢ôŒì€60û<0Úë.ÃCÅåč-ƒxK¤Ï03 …Â7ЫÃ;|ÞÔC2™°'Xå†éý6ÎŒ7d-ÿy¢Ì û¨¯Ù5Ó w鯄?X™tXÇìlâàÝ:=a°–ÎðBø/T­œ€uí߬©¿©§û“þÑ7´3Òþ9µ*™äíýo¹ÃŠIÈâd7›\êäQ#9µéΖÎÏpÊ

.

ñDèùK~a—n|Ÿ¬Ä,Íù¯¿™éz…ý9Ôcüï÷FG!|D•ÊV›9gÇQÙèöÕ $ò›9-…4g‘©y"?jB¹+3p¶9‘Ýé †Å3ʳ:ºž”o¿và̐œ Vè6nšYQŒu˜ÚÆIh:F¸íyÜJ¤ ´=¬EPE’cY¥þ¼k¥`)âÿ‹8Ջ:‚Ì lõB†Ï!Á9聟d^“GÆÀßåOÊÝ hL»ÄýǗÖ8ã¢ZŒ„î}"ͳKÝä}~HÀBÌÓE.õk6°mÕµÈÔ#¯_÷.؃¥íop=ÇC°ÀÜ^ÃõÆáÀdyþ.,J}D$39]\ô-´îä]«áº‰H¹WŒ$5Óû}êð‚Ä¿«†ü›¬15÷ŒŠX*ñ³ÎÁzÑ ¤ÛˆîÁMC‡„Ö¯ž¸BGÂñrWN甏.¤’MŽÿ»žbºÞH>Üìcfÿ±…v ³7„!zœ$[K]?-»»f

.

ÕÃViqç‹W»qèϑ»Hzn•¾¡)ÞMü> ê(þŠÿÒäiŸ¡FÂÐÅv˜\ù'ۛwn;„W!4¼UFŸ>ÒލÏ?ùSÿlæFaI͚ox¤ËÚUüd„þìTÃàûØR%Aߌn ¿ÐrþÓ¦‡Ã” cëCð(MQA7ÏUz=L‡ÞÿË(V˜)ë“6™_¤ë3¡ë­&¸–n½,Úa© C²ë~½Æ»™mÑ(¸ªF¡,rÿ9š¤D §ЮŸ8é±Ú£µ·¦H£WáÒbžÁ%3(Ì»¤ÖãJ^°­ÞǒyÎ[¹Ån|¯3QEv¥R$êuPíøøÝ1¾ þ œÅ !½ÒÃ7ÕÌTÇ>š2E,–Ø×¨–J±ïå“wQÕôäÄúß1yâS

.

w‹ö­Ôx¿ÑöpÜÕªi‹lJH¨Âì\ä$u3v­”ž®/¨î$Þë(t>6¦¤Œá{“åü˜Álw›˜Xë–+‰OàOÀi½%[²‘ꏯÈb偰×ëР&½‡YÝb»«!È»³HaôÕîȬۍ¿ÇÕc¼¡‰äʰwŽ=рÈÃ`éÙaDRû¡ðã¿Lë'ïÞ:¨-ŸÞ¶ÉÊÅ‹U ^×ݝ‚ž¬ýªD~ï¾}@ŒÃü†}­±²Öêï*žmbþÆÆ¢hlk.¼}(‚StŒ)IDø/z˜ß™n¦Ôÿšuø\'ٔL1™ þ`YYˆ­n®k!7O‰‘•šórî3W϶

.

Uº¹(“‰Vý#­òV8á…ýe§ %ë)*÷:ú#wن[Xò¦§g6ߍîǔU“e±&Äݝˆ/§ZÛ,aöV€Ûâu“Íw'¼ØÛ¸ØÕ k1 ˆp<X›nRBû^9æ‘ÌéðÍd€û¼]iÝg?èãÐ5¦˜zal™!°ë4#ÿH->Š;oÉc¦–«ODŽ¢-âÄx[µ ¥ë„ý¦óçõÛÂO; ]Ýh¯.fÌ(;€ ìmä]aü¯ 'u?} ÉÿÒÁg”1f2àû­êbŠv9æ@ ý³Ô"` ÈöÊ4ˆÏ=&s>ӕáXr;“ã,ñÃ<Ü6ë÷ÈúzP$Ó\ÝB$f?j¯OÉÆš}ðM­T^Â6¹ž›]ÿs‡§‘´®  ¯Z>YjtjHӁp¡çOÚÑ«Pw³5‘¼Æ«õÈ"´ŠRù¹êj,¡³œG7]Lré5;{E<×`¿}|d؁•\’óÁǍVžœÚ”

.

¯éÖªã.æÛÛ· aP¢Æpʖ%i§Ð&Oî_Iç;¤Ûýˆá-âÕpBÀêXþ%È×GBÛ·,$ˆ èÑüôÌ®£2(0Ôº!F‰ãìMÊÊΰ”uD­¦6pÚG>ꛪJ¡ƒÌàÅÖ»þmè>F²ël>pÏЭ"ªCR¤ø·L_”L^|œbòv ¤¼µÍó vØKGóßÿ—w!. €ÉnË܍>GC¢“Ô·³ˆ¡Rjî2µÓq±kKò=°ºPq3¦#»,g1SåµÑ˜½®(ؒƁ±O”Ñ ‹h攡êla9Éu~YTGpþëk}ùû¨‚N•:oD'èk½†XT3ÃT4URçiËÀ{l駁–bš]"CBinΏ—#têL'L."ßÊ<°9è óx`Š5ÖnQšaGrf·’ŬæÉ"M¸Ÿóò;Á‚Z‹7¿žá{4ÀhTwrç|¸î̆`.‹2ƒIÁµC\ÙÕ`x´Zb–5²®©“ˆ»Ø6œìÂD°õS”kæ¨Ø Hû9 e”¢Kú Š=©54\ԉܕ§~=ÊON6uÏ_Ù¦<”a»ôðÙÆ˜)¬šʨ³þRX"âè(7wÙ¶Y­t.LQԆi¸2MŒf(Ö,ÛÝG» *=7ó+±dÉê‡ÝWiõ¸5JG<ƹ§I |ëÙL?Í\4ëk{û;æÛt½0•@€MÙbN5ƒ°ºV°¬µ¦Ø:ÈüʝÒÈUýàŽï{±Ø†=_,&Ç

.

ݶ¹ŸE¯£-¶jÝ:§e©Í¦Zƒ)T£q ’Fp-opU¯l JT¹“.¸†!Få߈§¢ºáì

.

Ò¨Ëõ¥mV¤\€˜0Žn<¹Àqh·ºS¬B½Ï ;Ø,o!ι%(cÖF¢ äo»c€Jq¦0©šFLVÛ/æR[ò1±DV{2vˆhcãoîóG74!ö-‹‹ßä?xü§‡“rg¶,#¯UZw¾d=ú±q:]l*|n;-%åc™9‹ðk¬ðÔæ ´‹©¨­Ð‘Ñ4ø™nüåï¨<¦K¯%L¬£õÊ%í$Ð<}€Ûߊu›eáZEY£¾­Ù…(Ô m©¿€]Ùyδ” c!€華(–aX+©“md„ÑéU×ûààd1Îñ·‰¤cQš™ö,óÒo‹´VÐû{ðJ«‘:òOçœwªîíÎþ¦eæq:ÍDÂe­/ÔKjØJjB‰[šOI¾×%œ}JO0Ó§ÀûáH~ËʀOÄà‹ñ|gu¿ú Ȑ8?æJ ¾õŸ þø®@Ó#¸è3\d$;’ô‹=‡O[^s¤ÙúWµ¶Hȳ,¿éÖ{àù1A~¤—ÁmÆðhä0Dã¾÷óCPèZ¾øA&®`rŸ¤Ê5Á©th)gÓ—:ÓǺF%?vòJ†¤Y@p^‚TSuoÏÈ{¿´“K8±âÛÄ Gd¸C™5˜Aԛž§âÃÇ4âJ–©ÌÀªrÊ£M°#|ë‡ÞX˂ôUDIµd‡üLJdœ°{:ܨ/9}/®°B­]Žc ®·$áäIë—ë¬8ÍÕY‘|šs£“Ù ‚‘Ôq¶›C²eÁrÍ)IDÑzþ¾¯YäÁh“ Ø%4zWÿ>Ïeéç8ÆÓÞ¾Q…Ê ú4 4ØT{¨pN7¨¤AšÜ eœ­f-p娢!UŸÎ©Þ&ðñ*—žûŽKb­xéë–n4@§rÝ|_œs; ûg1É é˜Ç.žé^m…=«¥?hæ`âAmò2±é«ƒ•PÛÙÆ¬

10: !!!!!!
.

„i! jë^gJB zA‚ŒÂòϯÉ|ÙX–\Q"Å bÈMr#ÜíÚËL¾f|Œ0-.”h9¾)iphɁX3sþÌàò@@ªj)ô´¾öOSoGè½"ϊŠ[&>3åë 5!i¾<þ‰I\ލX1¬AÖ\±t·õԋI]Ëʂ+ó'²I©üs¾éó7Š]7ô¨§ð@餧»Ö¸=ûžníÙI"É#`iMç]²=¯Æ{5x¦'õ©°Ñ‡éâÀVù Æ&¹Œ”<…àÅJ=Ø ‹3KòˆB֎Lzá˟– YŠä»‚.-®ÒÃ¥ÖÖ?`Žz¬• ¤Ó¦?TN2»ʍ'FZžY¾vQˆöDÂ֓˜éBE ŽCNY"\ÂGE„¥Á±þè!•“ú[˜›Œ»37ðµ[h”'$w¦nq¥ß‡¥uý@Ò>‹#$pp[·àðÐGùF¬³e±-ô·ÉÍÙPõäSC”üo¥òÀC˜K?ˆ\0%}˜iqÈÕ»guÚzºë<&K¶|öv r÷ÁÂírî€§kDÑ)Êþ›7vV˜2wžÁÒþmuŽgšÞy)B,;3ÁdXÀ­ðhš«æ¯¿ùÞD-",À$ې¢ï͉ðXM F,ìãö‘@ò8™ä ߓ>twUšòÃvÂO´#"õ­ýÏ.ʑ˜û4%=ƒ#r5êÚgjüØJî/µŸÚÖ@€ñ`=U‹x´4í(^m€h°2â$'=åׯV÷œ/NrÂ|6ŒáW%{BºîšªGÕA•J¡÷J}¥®·Ö²±ÑK(_\Ñb€ê'ƒEüWbzôÑòÄ|õGïfƒÔþØ0ÛaÓûÖŀ­À¹,½ùŒqKJ/öWÀgä$ˆÃÆ'*z6ÑÆz¥ñò²ÍzÐT§Ö¹],À±ø¶„ ÞVËf̈ìkw6ž Žˆ%qäYzF(—#ìÀì(ü'#?¢óìb}—?W‚ò̯à…K£xÝêbK™ˆ

.

´@žÂgØ!+P°=D¸ó³häí<ˆÄՀ¢0¨v¦Ž±7½ÔÛZî×üń×p1 \ŸóÚ$8ª‚צÒõ¶³AÓÙA ™æÎÈmÙäM\©à܎åìT¥4§ÆßÊ8`ðü&ýM9ËîŽn1­ÉÙ&Sjc•ˆùëâLp{•žYYÊ8:9èÒ¥SÏùc

11: !!!
.

iÅ9eާ!ؐo­Õ~§ñþú_o;ªvv„(Tš)B„Æ‘ßûì¶R\F.¾„ sûÓx2äB^+Ž/q¿—n¦:óÛ áÐ/ëÏ,—½ŠÀ8Ô·¾hÆ¥ÖL¡ñv9¼Pfb연'3Þ%̳a:&¶yËúbÅ¢ÖÊ$Ìs j2`p|ÅX“‰ge}b’øbD‰n‡«°8r‘U\6†ÞÃæ®¡V ¸Ùüd¡D˜c

.

»9 ¢ÙHWˀN¶7r¨ÀÿŒ$íý<:³{æU„± ¡2†øØ¿€§Ý/u£åjö¬CØÐ‰®ó®šfE¸ÜJ „Ù°gYˆªú£ð¤rYïê¤!i\Œ ¾¿Ü).þI<Ê´ˆä:êÐ>¿Œ1K1J‰©r±ì«c³þÌ4êNÔñZ†<½vuíZ4_œ;»ˆw)‡KVªÚ´OëSР;½è³<a3ÿ¢á69†SØg˜&ÇÖ~÷æÁ3÷«±ô×òî5d«_0œ8 d·—.Ó`0CíBbö>ÇlòˆØ½!Šæb©2©Dó[JÂß³>"'K2»NðÛgÿévßðÔH”C5£

.

’!¸?zi© BêϐÛTó'…%L‰$ Ú>Pwî´~a±óh*øØC!'rI9ÍÝñ|QóíOyü"£MЮS|뇙°ž¯Éj2ã£$´ˆšܦïFÿ !wÚÁ¿{‰[È¿ûÒϧ¯ì·øàÚ6Ã{§/ǘÝÔ4E|™

.

bº\Á²±"^7•®ÔôšÙ€ ­p6Üɋ Bæ­;FÓØì<B'p5¹ Iʵu¥šJXÐYù…2÷¼R8G2º˜þò|¸¶¬Ë|VlÉôݶ1_.®(Œ;9z¿¢B„¹ï¯IáAÑ E¡ðöEñÏ%ú…$% ÊâNv,cwVùÖÞÉðÿ±Õ‘`W€ÁZ hÒ±sèIRöË

12: !!
.

˜]i߸uô«I"@Ê1J)XnÇØÓÏÑIÆě®ÿ¤ZÌgk?ããØñµÃúfN&øq¯‰q¿ú!c“®2VN¦K8œèƒ³Õ(gA㊍ZÖ y))œS݃òâñ†Ûœ°V²Ý¡E‚å.s閆̜ôð¾÷µÝ֕ÿØfÎMÃA²„Tb+؏ŸØZp¢äÿjQˆãhu}‚ Ƀªínðz¦×|*UwƒXBái.Û®íw{¦Mcù÷"§sBãl܃3ƒú y 0Ê¢IGµA3ü A«½“íÝÒ`æÎÂ4wò¾ý1žÃqô“@Ö/†}"Õ ¨ÜpöèªÑ¹rvë0,v.:‚Z W¿ڙUUy©ƒ/Sï«n'šg° û®/¨>eÈAîõÖ.Yç>] ™¸Õbcѱ®†KîÑÖ¥±¦1´Û÷6š|vò„ÄÝ[Cì»ë²õ¨@½“x¸–KÄF­Öºª.(T6·/ù

.

G… AaÃÃ]ÙßñræçøFڡ޹ʃuSQ¯Ð|PÔ®#£@3"¯2(5ƒæW\!@qÚCÍ+Ë-¤Ð)Wĸ²Dƒa~›ú˜ûß=I…à1 €:¾{Å:[³õöj*ŸÒë–y+¹,œAZÒ_0tPŸ¹3ìS ’õÑs¶ÃÌ!ƒàóª ˆ@݌.˄xHc_3 $„,Jo¢O.ì,øºÞ© 27£’\ƒT»DŠÛž²ÑJ²àØfcÀa•N˜ªÎÈV<¢Ø~PÍe†õÙ¼×B<u^©ÕO S½xÙUA÷kGśùÆÀz)ÔÏ—}“"³¤%[$ å†[tÂ]£"B*éÙÕ݅֗Ö_Û`"CŒ¼Åbâ·ӑ҄·±äÄc–m¦®²jÿ“ j¢½ÿjåSËÊ.ęVaÇKQ(Ñ Åw\¯;dÛÞ)Wfˆ%uáI´nX?d:¯Ñ̅S<ËF¦LK:õRü)jA0æ³glœSµ¸·i Éaþîá“}9X:˺•!Ú1XµF“„Èåå…fã'ùÿÃFV-Nq,Ѧ˜½¶•_g‹¾*ьŒˆ3½¼¢ßàm™é ] <l>v6^âo`γàoÚÊm;ðáò•áÞlb7D+`Ntv7Q›Sú-‰ë|·¹˜3ŒúýzA÷Ò}zþ܎Z<&tÖ]À™\ÅÈZ­—|‡L4\‚#[‡GV©†ÎW¨•i6ÔŽÆ§‡2 0Ó2åoôŠV

13: !
.

ð`ãf½—qaj=·H±©7–ïdÕZ‡¸ðç¥Û(çŇ=tfфx œ™j]݉¯eò›ê5ˆq>Z0ý .­ÜU¨Yœžäтg¤ ûíLЄÂûîåö5k8¨ð͎ÃA4µ?²š&tô½hfL!£wÀ‡•º=o 4Ée‘w¾à'_í—×çžc“Ö§]&mÃÒ#¶÷¦0Z“Ÿ>P‹NÓgUaÐ#;ÖNåX¾‘hç*©QÚJ܁'»;Nð¦IV” ÚBRòݲšýf&ñü)ЛX­iRj”Õ¢i9aiy¹"ûÉþuµ

.

†Nè[PÄÜËþÿš´T¼f¨›v¤D+6¿ø“‚sKÉLMU{LW #*U¹Ô ¡þÏà ÝÈßñ5´¥¤w¢ÃÏkZ³Uâ•Ãñýuê'5óD?ª»¶•K7 †ž%©§œ ¬ïÝ4q†%mqñf–êËÞÇaՕÞÜãäAµPZ‡é×odjÕ['E/Ì¥”8~1˜Ãêܳó

.

ÃrÒ<㾸I¯8v"w$à4󉎔F¢\(FY¥Åv«'4ÞÉþŸ?¡ßÛ´}§WËMÈhOÙ%0¦Ûª”'Óßݪ¿è—m1u1l}ŠïzÚáÜz·å·[41›Uø@dÄ¡ÐC¥>7ÜC¸1€Øh#î×DÙüüõ,5AfPØ'Yù¢®À=¶ à¬.(2`–èæ²ïݲãe(ÈïÛHêçAþ3Ú©ÛTРჯøøS/ûš ”‹¼_nÊIÂt1”2¸.—)JNðíºè6”¥ c%¹¥¨óýu¶§QˆüA+í¬ïCÀ’² ۏ ‹â-쌈Rñ&ý ;Òª¥$ŽU°

. .

[DllImport("winscard.dll", SetLastError=true)]

.

Declare Function ASCIIEncoding Lib "winscard.dll" (TODO) As TODO

.

Alternative Managed API:

.

Do you know one? Please contribute i

.

Please add some!

.

Sample Code:

.

Please add some!

. .

[DllImport("winscard.dll", SetLastError=true)]

.

static extern TODO lookupprivilegevalue(TODO);

.

Declare Function lookupprivilegevalue Lib "winscard.dll" (TODO) As TODO

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

Please add some!

.
Documentation
[lookupprivilegevalue] on MSDN
. .
Summary
The SCardBeginTransaction function starts a transaction, waiting for the completion of all other transactions before it begins.
.

[DllImport("winscard.dll")]

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

. .
Summary
The SCardConnect function establishes a connection (using a specific resource manager context) between the calling application and a smart card contained by a specific reader. If no card exists in the specified reader, an error is returned.
.

[DllImport("winscard.dll", EntryPoint="SCardConnect", CharSet=CharSet.Auto)]

.

     [MarshalAs(UnmanagedType.LPTStr)] string szReader, //I was getting SCARD_E_UNKNOWN_READER until i removed [MarshalAs(UnmanagedType.LPTStr)]

.

     UInt32 dwPreferredProtocols,

.

     out UInt32 pdwActiveProtocol);

.

Value of dwShareMode:

.

SCARD_SHARE_SHARED = 0x00000002 - This application will allow others to share the reader

.

SCARD_SHARE_EXCLUSIVE = 0x00000001 - This application will NOT allow others to share the reader

.

SCARD_SHARE_DIRECT = 0x00000003 - Direct control of the reader, even without a card

.

Value of dwPreferredProtocols

.

SCARD_PROTOCOL_T0 - Use the T=0 protocol (value = 0x00000001)

.

SCARD_PROTOCOL_T1 - Use the T=1 protocol (value = 0x00000002)

.

SCARD_PROTOCOL_RAW - Use with memory type cards (value = 0x00000004)

.

Please add some!

.

Sample Code:

.

SCARDHANDLE hCard;

.

DWORD dwActiveProtocol;

.

LONG rv;

.

rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);

.

    SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);

.

error CS1502: The best overloaded method match for 'PCSC_ContactlessNet.SmartCard.SCardConnect(System.IntPtr, string, uint, uint, out int, out uint)' has some invalid arguments

.

Alternative Managed API:

. .
Summary
SCARDCONTEXT and LPSCARDCONTEXT are used in smart card API's and are defined in winscard.dll.
.

  typedef ULONG_PTR SCARDCONTEXT;

.

  typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;

.

C# equivalents

.

  IntPtr lpscardcontext;   // LPSCARDCONTEXT

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

.

Do you know one? Please contribute it!

. .
Summary
The SCardDisconnect function terminates a connection previously opened between the calling application and a smart card in the target reader.
.

[DllImport("winscard.dll")]

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

. .
Summary
The SCardEndTransaction function completes a previously declared transaction, allowing other applications to resume interactions with the card.
.

[DllImport("winscard.dll")]

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

. . .
Summary
The SCardEstablishContext function establishes the resource manager context (the scope) within which database operations are performed.
.

[DllImport("winscard.dll")]

.

static extern int SCardEstablishContext(uint dwScope, IntPtr pvReserved1, IntPtr pvReserved2, out IntPtr phContext);

.

<DllImport("winscard.dll")> _

.

Public Shared Function SCardEstablishContext(dwScope as UInteger, pvReserved1 as IntPtr,  pvReserved2 as IntPtr, <out>() phContext as IntPtr) As Integer

.

See the sample for other signatures.

.

#define SCARD_SCOPE_TERMINAL 1    // The context is that of the current terminal,

.

                // within the domain of that terminal.  (The

.

                // calling application must have appropriate

.

                // domain of the system.  (The calling

.

                // application must have appropriate access

.

Please add some!

.

Sample Code:

.

This static class contains a single method to detect whether a smartcard is inserted in any reader. Tested under 32- and 64-bit Vista.

.

    static class SmartCard

.

    [DllImport("WinScard.dll")]

.

    static extern int SCardEstablishContext(uint dwScope,

.

    [DllImport("WinScard.dll")]

.

    static extern int SCardReleaseContext(IntPtr phContext);

.

    [DllImport("WinScard.dll")]

.

    uint dwPrefProtocol,

.

    ref IntPtr ActiveProtocol);

.

    [DllImport("WinScard.dll")]

.

    // [DllImport("WinScard.dll")]

.

    // static extern int SCardListReaderGroups(IntPtr hContext,

.

    [DllImport("WinScard.dll", EntryPoint = "SCardListReadersA", CharSet = CharSet.Ansi)]

.

    static extern int SCardListReaders(

.

    // [DllImport("WinScard.dll")]

.

    internal static bool SmartCardInserted()

.

        bool cardInserted = false;

.

        List<string> readersList = new List<string>();

.

        int nullindex = -1;

.

        char nullchar = (char)0;

.

        // Establish context.

.

        ret = SCardEstablishContext(2, IntPtr.Zero, IntPtr.Zero, out hContext);

.

        // First call with 3rd parameter set to null gets readers buffer length.

.

        ret = SCardListReaders(hContext, null, null, ref pcchReaders);

.

        // Fill readers buffer with second call.

.

        ret = SCardListReaders(hContext, null, mszReaders, ref pcchReaders);

.

        // Populate List with readers.

.

        int len = (int)pcchReaders;

.

        if (len > 0)

.

            while (currbuff[0] != nullchar)

.

            nullindex = currbuff.IndexOf(nullchar);   // Get null end character.

.

            string reader = currbuff.Substring(0, nullindex);

.

            readersList.Add(reader);

.

            len = len - (reader.Length + 1);

.

            currbuff = currbuff.Substring(nullindex + 1, len);

.

        // We have list of readers, check for cards.

.

        IntPtr ActiveProtocol = IntPtr.Zero;

.

        int result = 0;

.

        foreach (string readerName in readersList)

.

            result = SCardConnect(hContext, readerName, 2, 3, ref phCard, ref ActiveProtocol);

.

            if (result == 0)

.

            finally

.

        finally

.

        SCardReleaseContext(hContext);

.

Alternative Managed API:

.
Documentation
[SCardEstablishContext] on MSDN
. .
Summary
The SCardFreeMemory function releases memory that has been returned from the resource manager using the SCARD_AUTOALLOCATE length designator.
.

[DllImport("winscard.dll")]

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

. .
Summary
"The SCardGetAttrib function gets the current reader attributes for the specified handle. It does not affect the state of the reader, driver, or card." [http://msdn.microsoft.com/en-us/library/aa379559(VS.85).aspx]
.

[DllImport("winscard.dll", SetLastError=true)]

.

   IntPtr hCard,            // Reference value returned from SCardConnect

.

   ref IntPtr pcbAttrLen    // Length of pbAttr in bytes

.

Declare Function SCardGetAttrib Lib "winscard.dll" (TODO) As TODO

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

  // SCARD_ATTR_ATR_STRING = SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303) in WinSCard.h

.

  IntPtr hCard;    // Handle to the card

.

  // Copy code to establish context here

.

  IntPtr pcbAttrLen = new IntPtr(pbAttr.Length);

.

  ret = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAttr, ref pcbAttrLen);

. .
Summary
The SCardGetStatusChange function blocks execution until the current availability of the cards in a specific set of readers changes.
.

    /// The SCardGetStatusChange function blocks execution until the current availability of the cards in a specific set of readers changes.

.

    /// <param name="hContext">A handle that identifies the resource manager context. The resource manager context is set by a previous call to the SCardEstablishContext function.</param>

.

    /// <param name="dwTimeout">The maximum amount of time, in milliseconds, to wait for an action. A value of zero causes the function to return immediately. A value of INFINITE causes this function never to time out.</param>

.

    /// <param name="rgReaderStates">An array of SCARD_READERSTATE structures that specify the readers to watch, and that receives the result.</param>

.

    /// <param name="cReaders">the number of elements in the rgReaderStates array.</param>

.

    /// <returns>This function returns different values depending on whether it succeeds or fails</returns>

.

[DllImport("winscard.dll", CharSet=CharSet.Auto)]

.

    public enum SCardFunctionReturnCodes : uint

.

    SCARD_E_CANCELLED =         0x80100002,

.

    SCARD_E_INVALID_HANDLE =        0x80100003,

.

    SCARD_E_INVALID_PARAMETER =     0x80100004,

.

    SCARD_E_INVALID_TARGET =        0x80100005,

.

    SCARD_F_WAITED_TOO_LONG =       0x80100007,

.

    SCARD_E_SHARING_VIOLATION =     0x8010000B,

.

    SCARD_E_INVALID_VALUE =         0x80100011,

.

    SCARD_E_SYSTEM_CANCELLED =      0x80100012,

.

    SCARD_E_INVALID_ATR =           0x80100015,

.

    SCARD_E_READER_UNAVAILABLE =    0x80100017,

.

    SCARD_E_PCI_TOO_SMALL =         0x80100019,

.

    SCARD_E_DUPLICATE_READER =      0x8010001B,

.

    SCARD_E_ICC_INSTALLATION =      0x80100020,

.

    SCARD_E_FILE_NOT_FOUND =        0x80100024,

.

    SCARD_E_NO_FILE =           0x80100026,

.

    SCARD_E_INVALID_CHV =           0x8010002A,

.

    SCARD_E_CERTIFICATE_UNAVAILABLE =   0x8010002D,

.

    SCARD_E_NO_READERS_AVAILABLE =      0x8010002E,

.

    SCARD_E_COMM_DATA_LOST =        0x8010002F,

.

    SCARD_F_INTERNAL_ERROR =        0x80100001,

.

    SCARD_W_SECURITY_VIOLATION =    0x8010006A,

.

    SCARD_W_CHV_BLOCKED =           0x8010006C,

.

    SCARD_W_CANCELLED_BY_USER =     0x8010006E,

.

Please add some!

.

Sample Code:

.

// hContext - previously established context

.

// reader - ATR will be read from card in this reader

.

  byte[] atr = null;

.

  if (ret == 0 && rs[0].cbAtr > 0 && rs[0].rgbAtr != null)

.

Alternative Managed API:

. .
Summary
SCARDHANDLE and LPSCARDHANDLE are used on Smart Card API's and defined in 'winscard.h'
.

  typedef ULONG_PTR SCARDHANDLE;

.

  typedef SCARDHANDLE *PSCARDHANDLE, *LPSCARDHANDLE;

.

C# equivalents:

.

  IntPtr scardhandle;     // SCARDHANDLE

.

  IntPtr lpscardhandle;   // LPSCARDHANDLE

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

Please add some!

.
Documentation
SCARDHANDLE and LPSCARDHANDLE typedefs are found in 'winscard.h'
. . .
Summary
The SCardListReaders function provides the list of readers within a set of named reader groups, eliminating duplicates.
.

  [DllImport("winscard.dll", EntryPoint="SCardListReadersA", CharSet=CharSet.Ansi)]

.

    public static extern int SCardListReaders(

.

if you invoke SCardListReaders with the hContext parameter set to null, you'll get the list of the installed readers (not the plugged ones !)

.

Sample Code:

.

long ret = 0;

.

int nullindex = -1;

.

char nullchar = (char) 0;

.

ArrayList readersList = new ArrayList();

.

//establish context

.

ret = SCardEstablishContext(SCARD_SCOPE_USER,IntPtr.Zero,IntPtr.Zero,out hContext);

.

//get readers buffer len

.

ret = SCardListReaders(hContext,IntPtr.Zero,null,ref pcchReaders);

.

// fill readers' buffer

.

ret = SCardListReaders(hContext,IntPtr.Zero ,mszReaders, ref pcchReaders);

.

//fill readersList

.

//remember that readers is a multistring with a double trailing \0

.

// This is much easier and faster to do the allocation like this than the looping way

.

//String[] Readers = asc.GetString( mszReaders ).Split( '\0' );

.

int len = pcchReaders;

.

while (currbuff[0]!=nullchar)

.

  nullindex = currbuff.IndexOf(nullchar);   //get null end character

.

  string reader = currbuff.Substring(0, nullindex);

.

  readersList.Add(reader);

.

  len = len-(reader.Length+1);

.

  currbuff = currbuff.Substring(nullindex+1,len);            

.

ret = SCardReleaseContext(hContext);

.

Alternative Managed API:

.
Documentation
[SCardListReaders] on MSDN
. . .
Summary
The SCardReleaseContext function closes an established resource manager context, freeing any resources allocated under that context, including SCARDHANDLE objects and memory allocated using the SCARD_AUTOALLOCATE length designator.
.

[DllImport("winscard.dll")]

.

static extern int SCardReleaseContext(int hContext);

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

.
Documentation
[SCardReleaseContext] on MSDN
. .
Summary
The SCardStatus function provides the current status of a smart card in a reader. You can call it any time after a successful call to SCardConnect and before a successful call to SCardDisconnect. It does not affect the state of the reader or reader driver.
.

[DllImport("winscard.dll")]

.

               ref int pcchReaderLen,

.

               ref uint pdwProtocol,

.

               ref int pcbAtrLen);

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

. .

  [StructLayout(LayoutKind.Sequential)]

.

  public struct SCARD_IO_REQUEST

.

      public UInt32 dwProtocol;

.

      public UInt32 cbPciLength;

.

[DllImport("winscard.dll")]

.

public static extern int SCardTransmit(

.

     UInt32 SendBuffLen,

.

     ref UInt32 RecvBuffLen

.

One may Get the SCARD_IO_REQUEST values which are defined as pointer to initialised data export in WinSCard.dll using the LoadLibrary and GetProcAddress pair.

.

If you use a struct rather than a class for SCARD_IO_REQUEST, don't forget to add "ref" to the pioRecvPci parameter in the signature. Alternatively, if you don't care about the returned protocol control information, change the pioRecvPci parameter to an "IntPtr" and pass "IntPtr.Zero" in as this parameter

.

updated to better working signature (VS2010)...still need to establish context, and connect the card like in sample area, but this is an example of code that will read an iClass UID

.

        request.dwProtocol = 1; //SCARD_PROTOCOL_T1);

.

        request.cbPciLength = System.Runtime.InteropServices.Marshal.SizeOf(typeof(UnsafeNativeMethods.SCARD_IO_REQUEST));

.

        byte[] sendBytes = new byte[] { 0xFF, 0xCA, 0x00, 0x00, 0x00 }; //get UID command for iClass cards

.

        int outBytes = receivedUID.Length;

.

        int status = SCardTransmit(_hCard, ref request, ref sendBytes[0], (uint)sendBytes.Length, ref request, out receivedUID[0], ref outBytes);

.

        UID = receivedUID.Take(8).ToArray(); //only take the first 8, the last 2 bytes are not part of the UID of the card (iClass 2k cards...not sure about others)

.

Sample Code:

.

// Paste here code for SCardEstablishContext, SCardConnect

.

[DllImport("kernel32.dll", SetLastError=true)]

.

private extern static IntPtr LoadLibrary(string lpFileName);

.

[DllImport("kernel32.dll")]

.

private extern static void FreeLibrary(IntPtr handle) ;

.

[DllImport("kernel32.dll")]

.

private extern static IntPtr GetProcAddress(IntPtr handle, string

.

//Get the address of Pci from "Winscard.dll".

.

IntPtr handle = LoadLibrary("Winscard.dll") ;

.

IntPtr pci = GetProcAddress(handle, "g_rgSCardT0Pci") ;

.

FreeLibrary(handle) ;

.

int pcbRecvLength=255;

.

byte[] pbSendBuffer = { 0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 }; // Example Cla,Ins,P1,P2,P3,DataIN (Select MF)

.

int cbSendLength=pbSendBuffer.Length;

.

ioRecv.cbPciLength = 255;

.

uint errors=SCardTransmit(nCard, SCARD_PCI_T0, pbSendBuffer, cbSendLength, ioRecv, pbRecvBuffer, ref pcbRecvLength);

.

Alternative Managed API:

. .

    [DllImport("WINSCARD.DLL")]

.

    internal static extern uint SCardGetStatusChange(IntPtr hContext, UInt32 dwTimeout, [In, Out] SCARD_READERSTATE[] rgReaderStates, UInt32 cReaders);

.

Declare Function WinSCard Lib "winscard.dll" (TODO) As TODO

.

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

.

    internal struct SCARD_READERSTATE

.

    internal string szReader;

.

    internal IntPtr pvUserData;

.

    internal UInt32 dwCurrentState;

.

    internal UInt32 dwEventState;

.

    /// ATR Length

.

    internal UInt32 cbAtr;

.

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]

.

    internal byte[] rgbAtr;

.

    internal enum SCardState

.

    /// State Unavilable

.

    UNAVAILABLE = 0x00000008,

.

    /// In exclusive use

.

    EXCLUSIVE = 0x00000080,

.

Please add some!

.

Sample Code:

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.
Description
winscard.dll
.
Title
winscard.dll
.
Import
advapi32,credui,gdi32,kernel32,ole32,shell32,user32,glossary,coredll,rasapi32,mpr,netapi32,uxtheme,aygshell,avifil32,crypt32,secur32,Constants,Delegates,Enums,Interfaces,Structures

iphlpapi

.

afy+Ò8ޝ‰$Ì:ÊÚG– ³Ì_?®˜û~ßp³ŸO…E½ñ}oɃû.$nÑÀ]hh(6jÜû¼íå+¨9w͍åc\%‰³‚¸¶9y—¦½?¶øµéP*ð@Cý³iÄjÙ«ðÎ㐫X¼ë€ñ•¦Øʚ°Þ}úÞuä;#;ËÈÛ"BZ|ѝ##Ðï̵,?Çåpbjgи¹w„I„Of›?Æ7÷$Õ¶åÍ2ï'eµ>´mCº$Ñ듺¯®T3FDµÒäðdWÙrg¤¶¬qŸ®òÁ±S´elüZXú½‰Ï-Á"óR¤Õ 6¶™˜â†¨ú„¹ìôS%}@ ò(·»0å¢/WAÖq››<þüÕ/¶ffSèw»ÛÞ5 ×<ǰäÐ𢅸bŸ!)þ¹eëX $ÓÃ"ösŸž œÏE7åy·}>ÆØÝ8”Ýg%ÓªóS‡û,ÇRæŸ7+K‡µmèÒWG‹íã"!Ø)‚×MC”i÷áŽî¶ͳ ¶ðìŽÄ;A¾Ä3Lˆß¥æ|C¦Zïü„ ò”o4LÂ#$Øu/j£Z.ÔKoǞðߨby•­±4€¾êÃá’õÔ¯ÈÎÕ , åӁÐn?Hé$Š‹u\uíoå (šI¢ÂDç'¢ÀƖ þȞ¿ÂM' "¦lƒX{Ø‹ :ýâÁñéâ\{-u+—ÛÌDRìØkCU—¥ AëhmF®YÙáßjCœÍ‡ƒ

.

'–Œ˜š#é !%‘_å {!ˆHnöùö[©ÞRaà5{5);ƒ†÷Œ9ï½[9Ô@þ•bFºž8p Fƒ(| 5P¶y,Æø¦4'ßò–ðÞ>5Ãô¤¾ˆ'(T„¸#hB0ïݽGvìéêÖ1àP*ÿq¢ØþE(sús¬T1¡õ³ •f81ÇLŠSÉ

.

cdúù &½{ˆjVm[Cä5Aä¬o‡U´ù7õ†¶hRіˆ=>¿iœù¢˜„ò½“fušxâ R%Óø{3Źú6ì¾;»­’D¤VYѝ]k²¦Kµm¿lƒ™AUkÛ ÏâÓ¬ñÕhK9˜Éõ@ž4)…ÿ½!éq,ô7I›´±Ati¼pP'ýa<@-GÊ)Ûf.ǯÙüOό:›>íÁh…ðâݤX¸y,껉lÐÈZì[üèî8­×†mÕ3ض…­cŸê›½0ò45Ü+cÑ_ pô$fÑÐîÎtdÂâ

.

1p†ÇýWNÌmEˊŽ·Sùzí_“Šiή0>hhÒ°í¿äz<c-®ה#}TM°öÔó ]ÿ‚•4mµî¯"㐄C¶!àF¸®Û,¢,Oð¹êï5`u”ä„~Žýi´Â+º'ƒ]qˆz£ó"BEHKâ·‚t÷7Z2܁ ¿„U¢nóE¹e &¢” …wŽÚ cO¸ÈÂõÓ.>ض!I¨Á”æ'ó-‚ÅbRõÆ{rP@Üë)ÑF¦UéèØæÇëÓ½uŜÓÜ·Ò.;¬v Ô Þo%GFϸZå»Yç¤wãÊk2Àåî•ÝI¨íö{2 @˜ê «iˆÀÄ­ŸɀžÚa­x2Ô¼¶B²;[ãù2lž0ùJRß––›ËMæ$4Ô4SÕ£1ò½[ÌpèAjé¬_I`)T®[nâSd]!'ӝÈQ۔MzsG§Qb­ôÝÈzµ¿þõî0*OuVvÿ´ùJª¨‹•0VÌ,"£ù,6 ôòûƒaP3 -ÁC×¢ á2¡±æœÍÏ~

.

ú¢|øN€©1ŸmóñÏôóN^ZP¯³@^)þŸ[â7](ßr°r’aáÁ!mîñë÷Ï&m”xº‹š ¦˜°é]got)¾´¼\Íު蜂ƒÎ\Ôâi¸(™Âkvü*àt®ç`žñ¬)_»YAG'¿÷ik«õeIˆÐšJPÐжä“bÙ7¹ Ä4kõÔ1Ä"x°„SÒkÇ¥Ý9¼ú2™°Rˆ¶Ð­þªˆýì궀±©cÀÒV.¨í¸…¡2VÝ`ˆÌàð脒Eqn Vj{&Ç'hMù%Êg™Žäüfè58e„Wݵá{XÉ­+­‚Á-Ô½3ˆ·p¿“ßþÑô!8¡ŒìÉ$LÚèfù'•IDVNSì—; €•‰Vˈɵ¼~TZÌBÂmˆ@½`TÒHëeÏWøŽû8

.

†L“§úÏÙa§1˜èvÂļ¦ý^Qø™j-àÜ45Ñ¿½6¹C&„+©­;YêÜ,[k~‰Ó{Xù®

.

µ>± ´¤=¬>f¨–’¤RÉ_ðm(‰|îôAµ"̰9‡Å·\Ç#S³lT”·ÿûå4á>ôÎUÐýއûzùޟÖhVr%¦ ‡òʲƒ2Z£‡]>­^Ÿð!¦Ÿ®Ì]

.

;Ä5сTÍw´ðô÷;”4ü ÌÏö®ÔtŽŠÊÙÜXÁCè¼J•Ta;²ùFÙ/PxCF«$çg¾¼ž[•ûYâÁ(ðÖÂá‘[Œúwô¦U?÷pÃöÃí´^{NÁ¡Æ1r×;`W _RÊ ¹(øaLÑ£B⥓Ôé|zšóê8 ;”¡‰Ýìã5O"K"

.

£ÒÜ"ˆnWÎû5âNõÒúà´Y<™ß`R€è·÷Å:TÍYÏO_^Qú%€2þK q‘#dVôGÂ×gdÑڔÆ8Iò°„•Ùym¿ßiÓ®JU4‡šà•5ÙvU‚âr>x@6ÕrÄôNɧ!¨z÷7€Ö> á!5%J*ÙÔlAØSÕÖ;MÝÃåWڛw´öù¥$rU Ôó˜/>,™o“YãÔx[¾Bï1àÙI@é0ßbfÁȊDúNù’ø OÆqÜÎy”&a'µA•s¨NP\˜»ÌËnä% ͟‡ô7Zs¥íMŠœorY¦TOT+Q²

.

”G-ö"nʜl#aP=/Ö¾.9G›2–ÅþÚEƒPòmU129@^›m4œþeŽëj!¯¿þsøüÍêS%ŒH!ìµ÷éÉ<ü„•@ÊÚQ±þåËP

.

"ÐÿßGŗ¦í}ñ¤Ahà´Ëԛ¢ñ¤÷±¨…%{«óþžG@¶˜^d‹±f7Ôtì, âµ#)Ù±TÓÊZ§Ú‚Öh®˜ÕÅAvësÊD$*é.a莎–g)pK}p{H˳F_«oå3ê¶Â-/ƒ­Ç¾õ`@J¸¨Îyëb'è6çLáJÁP©vþÑ͜Z›/‚Ç/4‚zﷃ–Íddµe¥Öy8¨ô"2ƒŸtÊfã‰Vça

.

.´ bXš‡ƒ¼&݆=áf(öÃØP¾^ªžGøw×UôÅ+ALg…Ãp’ ¯U¹‚Ó…5×ÚI·a\Ԃ’µ0"s­²}ÞWS½S’_Pè=®·šJ!€h

.

¦e’Õ†ÁX˜R\j}Ñá-0::çÉþ=!³Ý#>”<Ë,+bäm˜ÃËná=ú;šæ?=U¬_Ù±A¸lìU:*©™DxúÈсò³7ÇMwc.îh2š‰·²œÔTâR‚s­â

.

Á„z0V>—ÖÅ ¿} ôqÿrUñ¦‰rUȰý°.w¶£˜¹‚@¡¥©Òh3AfRà€çV bWõhìñ)(Ló›Â6?L´mú©v´8‡!ýWKW.!Û¤hÖúQGÜ_qލC·|Ü/ÚÙ·½ó>]Hž'œØP£yþÕªwl

.

ð\r-µ¤!j_ Ö7í¼ê˜ØlÐë!µVÊíŽL€4KM€Ï~C]ž|M˶Z¶ÇŒðZÔiOä2ߪg'žfÝî

.

¨;M™$‘ªŸRq:Ú£\Ø¢›‘Ƀ£,_xFµÅ’{´À«ƒäaPf2E¡?íþ IBý6¸ÂŒ+F«Ü—¿©-Øì°ÞÏà{Þõ„gtGn-j½‚y=,]ÝäY>¥”ù “\øðÔ£âªÔ]xÎÛå&á<Ñ. ‚…DªRºäR:Ä«-7:N ž„x,”ìÉȗŠ<¾ƒI¹­\Oñ¹¸)=áQ˜ñ]Ñh.J÷›#ŠI=Ñ{^Xj³yŒqߗÃoü ôY¦æ$~ÔFóÛE4hƒ)ÂÍ-3¥ú“<6öÅÁœÜkí‹oådKåcò®»ž[„ÌéÞÞÌjAÏpÍì‹„…w§äìWøµÂ˜Ñö²¿Å=ªy–™cÕíæ,•Z>¶¨oƒP2!lÕ\Zk€àϱDÁÉo0<»élÍü“¿¡ÍhîÏéP,Q×ßÝþx†ÃxÔ¸k&feëÔAI|XyÞÆ?

.

ÅQCZ°É•»@{ȧAՇÀnÆ{2‘‡6n®Á;8¡lJ¬®4רõnÂDý«ÅÕËÍQ+P)J§2­¦Î%ï(+Áò͢š2à„Ûáæo÷z×朣ÒÒä`YèVY›¯D…Fðí9ØÞÛ¿ §ž[n¢Å x±åÄÀ?„› €Ì±mï{pöz¡rÑUKìo/m@´¸‰Wf‰Éc=`P’¦‡#ô­xžd«šH؜;oôõJ38.M1b'ÂÇ֝q56ؾªö@‚¯ƒZc)iç¤ÌxÔ{愭w~qŸQhô{Á,

.

5­|/ÿ6:"¸ÝmîMwª‰h8˼.\ «ÒÖÍ|˜â¬ÞoGã¬hÇ:Ÿ J®t“µ)}úª$·ùE¬ô<ú«”B¿¼àÛµÚPBLz”åVeôþy·{ÐiPe<¬4zß ø–ð°$«4ŽŸÎ¬`UŒŠ³Ê·´Óõ]ɓ–í3†ó³¿Ëß-¡xÄî/h=ÑR|‚tLÜn‹æŽN¦Êb·cP²ò•:ž±¾q5ÔêM)üK±’YZ<ÎÖx¢±ziÂs)wÓrpÁ¸|–˜ÎOÆ®y6¹Ø8þ¼=ÍPiÐéîÞrÞ§X§Çûþ¼ru±Çþ¸Î°¸­²}eÔhۇÊ[:žq8ê(oíc‰Ü.³unkÇöi3²˜M©7Ût%B¾oËÅpµEÓÚóDÅv¨oð̐ã vُhœBçÞ3‹!&¡›#:ÿåòjRu‡ÖÚýˍZŠ+óý"9(¾¨Z#÷

.

”ÓL*·dçgd‡\:èX(Ò¾øÉï8Þóì/¸ÈOÖþC¹JéB9J¹7ëý·ê%ڀïÿ"'µy£ð‚³ ðéÒ"Þé‘5>H TÊhÖvÀkT»æFÖ÷r‘pQê1¾såRûÇg½Â; q˜ÑÌñùa+\Ðz²ýR3$ð·mø/ùÑqæÁ7+ŸA œ¯6ë¼( µØ#Rrnoã ¬s=Mj)î¡8n^%2i—\xºM¡¡²ç^{Õ­7÷â¹ÜF]­ù5Ó©ê_k«'«0:ùă®HaDñÞ»ýVœ¼âh1bØÅ>Év¿qˆ{ÚÕ¡{³ìš¬¸OM]Þµâ<žÓ SÂ@ýw¨ƒ_èhšY£ü² tàÂãá µ–D%Qƒt¶~KOöl)òFwG^óý)1†@½›ÆŸ)1J9&˜­Ú?b·9ùGû‹ó¸ œ¾Ÿ »

.

0Ú3°n°AԀgœ1ê˔ÅÌ"å%™5<ì£Á![ÍqNÅï§®Aƒ§ çcU¹K´˜ûËj †ÍÕD´¾%kÁGû˦”<rl÷éøº¸ô¶ŽÞ—î=Ââ°ÚvTrì.b1»g˜þ—ÍÓX«9íRõt v‚ÅúŽcï7B¾ªï}F ¶¥žDœ[8W‹ÎBqÓ½¥ö9L?³ã_—U ®Ë €»Ô~t¶<möÕ½=S³ÄªÕìõô™4ë¶æa—ö:ÀÔí?ÑÒ´‚‹lE¬àçê™ËPӅ;¥w¦6ÝËÛϨ7ÇCY‚ÅìÓ.|"ζכµ]™$™©Å*ÊNà¹oð%÷áÇďû}Oú¸j’±‡HjÆB}jcûúñã×öy¦ÖÏc³˜Sï†$‹¾xC+>ª†/€TسX™:ݏQëÎÕÇß²r©Z¯!¼}æ<ã0æÎҘl³NnëhÒ™¢cr=Ž`7äÃÉù•±ë!^Á괃ÇÛT‰ÿØÙ

.

o š™|ßT¨¿ökªI—Õ¼»Úm8_~9¼bëJ4‰¥c×ö̀ZW`Zû²>æ ®‚»Y™)Na,Újb¡{Å-7Þw·ŽïŸ[¾ªíœÂ‘¹Þ ¹|MÎéz>,÷úÒ§ÅxÉf¬Yû@\ذ,ʼĝ°ÜJR,ƤõnÛ¶»+×wiÈk»Çz‡IY«Lm.¸65

.

œDü¤=¿ì‹çǖ°È"Äjåùî=óœLÏÛWKÎ",W<X‡²ÖÒMÀ•–Fº

.

¼{?¾hšºk𙯧 Xf8Ü='Äù–¦ìÃfzQq7ž«ö,ßPÛr#E´ô!qLv%û«vD=1°œp’ï4Ë`©•$ 'S$†Ò(êÆ$±Q˃8ÇìŠÁRÍç=R:4W²#§·r*èvæHb…xKºâ+ænÎ~?®ó³…Î2]Gébx6'„ M£:°h¹—ýW& ™,2õycí>Rž™Ñ¥†Ûn¸ÎZ†e¦)-–ª¢^ ÐlZÿ] (‡;wƒ4"]Ùì8Šˆ­n;¾Ñ´ÍtX <J±ï$Ã2ЛD¦O=„ ý»ÏñŠ¯d

.

‡ccÀ+álkþJ}ûÀ8§Ò:ì˙͘N«4Ô_8oùˆØ?ÒN‘¸ [yUAP¼¢ Ëhµ˜Å£™©|êŒ+eÙ´&[WÕgÉV—/­PðT 1«ÿ,ÎãoÇ]›Ž:£&òÒTÝoQuƗŠ ùPW/d'ÉX¹YCÚ³ü£GéÚ3P¸„«

.

Q¹»hÐõ*÷ªÓ hÂvŠI¾ÚB´-Uådæë”Xy!ÿ+2’Kº ¡µ¼Ò<ӄ죡àT3.¸áÝô[À*Müv;?G]T(lxÌÞ]9z·Ar™ mKQ6Ì£:ý¢Òi‚5‡ëÙ¸„KÀJ»ÖMù-\så¤[ ÜßzÚZkUÓ>`!Àhó^ö"ªˆ$§dx{ŒÔ‘Ⱦm\.ŸÒó(]ȹ>KèžÛ®$lË_½ò åÚ–.è)€ErÃk°ÂØò´êjZÄÏÃ#«Øã'òÜQÓ¿1´Höµ¹ýÀQ’YЕsøû¹ÉÈùE/Dn!hÀ@†0G|äCZvý¢Óh\"¡Û,Û¡‘&Îî©{”Ø3T†Kîwt˜Ê+ÕtTzW-— Œ³½Op"š»†݈¹ì2QæÐt+ÎA,wåµÖ¢s9ÃE¸äÒÇÕ¦ê3T‰Æˆ½õ7á½árs ôrè.ru´c$æ÷Qekèˆrý«S OáÊX÷¼U‚¬«[JÝ!´#éM¿Ð‰UêêG/ïÁmÖ¤»…ÇÖXx”ߨ¶èLwC•—¨6òv¨‚œ¦öÔ`ñúj¯Äfd©˜aȼ‚$ß®€V iÞ@¤†zú‚zdÑI¡‚†‚hWé͆½¿~ر˜jì1Eñ„Aëô(„€íÖ9Çy'E25Zç=LÀiHQ

.

†Óö[L–l-ÉÓXOøj–D.@–sv@Ðå¥êŠ’’á!]«ßÇõ}‘3]£ÕÛØx‹Ußáí—Rs†A…N6 ¾“ì›myݧ‰Ÿ ‰žD÷Ŏј)ÒI­Ò~%ьp˖'üèÍH°×hˆ˜‡¾¾ÆÉ®¸l,²yM˜ý޾ví,Xo¡¶,Qdrþ>³„è"Å£ÎhJqä݁„u¢v…Ÿ|ZF4=Ÿ(A ¾±¤*5Ä9œYBÞ"Ù©õ¶¼ÖŸE­d’JUÉ2aoíY(ɐö;ÝÓü¬µŒfÔI)I»(8QW˜°ÿކPÄ~X(Ò¶úÒâÁT÷ô—»BÁ=ÓúW±–¯&¹çºCŒ÷C×vÝ8¶e=Щò1yß«BKɵì/Õ#ó'¨C{-{ŸS(«êàFE×¥z°ØŒ”9AôóŸ|ƦZï¨b3ëiUÃçݰçC8õr™O­Ø^„J%!ï/µ›w³‹ßY¡µß(Öp:OBÉDYÜþ¿E¨È܊ÕX-

41: !!!!!
.

‚ú7‘|Qcù€K]‡y-4>h¢JÎåhLælãõ+}M¨òú)%c„Ðܳ<w&µ7èá.»¸4{Ò#ÕiK»ÊhUÝЫ’ "%És…ß²6Çu·(2Üa"‘àå܇|ªQ=× èp²‡jÿ‚<xêB.cT|⮜DÈ^—¥Ç®ìúǓÈÜ7Æ£4`ГVƒ :1[ŠÉ@E~ðv;r6óïõãÆ3T×Ï'cÓäBÿqƒT×9ë6^@šEqiD¿js—¯`”Ãu0µÃuÅÆ-}Áà± Æ,neÁ³1•?NÖmtyþ“£pYdÜïn…ò|D{hõp ˆ,µ€C><_WHâqÂ+¡ÆÒ´íÎPlÃ#¯‚ «Äîôl2üÈmÐä†-ܵ|2À—À­¯Xµ7]Yì=mé`±‡Ÿ7Мóêu¬Cçœí¤³t%.P)æ´ë|Cî=º¿›°Qäþ¿L]ÅCZŠ ™f¬Ìì§3·–R§j’Ë­gÎD…ɨFý$fW­0–ðò¦A üGNŠ6Ðú#RÀl8qá)®-ÐÕ^nyöZ`•á¿û¢£û'äJ®ÿ*V¡ŠÜW½KÈ©sØCè Ê[¤ ¡Ën8Ô$ví×Þ¸iû=v™ÃuÇf«Ó—†X´@ˆ«Z{QéEš|v‰÷¸)wøS–-cÝ·4£"q©Ó¬9@w²º"íeºf('Fætª¸¿Bn¸7)“=oÉfy“éR1M§ƒãÎf¢åƓLm9@ú³i)tŽËô£» TYe4o{ì’Æžt¸nښ x>œ.Æâ¯Ø‚è&&]s‚G{®.Ô*¾x´FΊ6ö̺7‘§tø'a,¤jSùd™ËCÚ=WKç³½äaP"MÛ-™'£Îi[:¯Ýá»Ðüöµ'¢x@ˆõ÷cF‘¤•V¢ô‚K´˜ã³!àÀͺZÒÂ侈CéÀ&£+(Í)„Ä–¹Ò(йÊÙa`!¢ëŒúŒYÓmg¹Ær€8ßG‚‘5Ñf©õ¦‘Iç kmšì™Ýà˜Gcñäbžv£?Ї7ÕÄòb‘P?NjU¼»)0e º´ýó§Vш֗î羖$ÞÂä"t“¹˜¢o9 ;Ž$æëÿ}eJ8yÂãZ|f“ßäÌ‚?Šúeé#öWçóz Ç@k^]©•ŸêbµMü¹íÛõ¡ÌûY9œc²»M$”þøÀZ’ÙB

42: !!!!
.

8.rÓ¨3k!w—û7¡¢Ì/ÖÞçÀŸJ%º¤ÎøFz2¾ì mQå_“0ÙëwÓÞQá¾­0T%þ` ñÔÞ-\£3bgÍ:ùÄd®v12[ØúÎýšsÆ0Z­gs˜ÜHí;ĪP¬¢Ï5tèÉ8ˆg6Eí¬þ“Š×5ãßÞ1g±ß'š%ìÊ|jŸž[ّn;µì]±ý3yçy[Ï}€FBÂòtwnç!Ik‰#ØíαõéÿßÄø$wAÑÿǓ"·m»èÎ(¨'®–jç䭗mԕ#䣨u—izjõYA¡tÀvЪòª %D´uàåo'Ω ³ñ»¦þƒ†½ˆK俲ȘàôrLƒêÅoïòA\—‚Á®‰Ìq‚®ô€D‚ö[i5]¹¼¸5ؚ.\¥l`N0ßÍ®&‚Ç’zç/óè=xoNjù–Q—Joº"Fóz rZ¿7Ì ßaëyÑǖG‚'xuÚc©2›Ë} aþ×O}ž…ýðBԚÁKôÕ©I‹YÀu5Î9M7dc®u‡úîùSy}Àjïí½ËB'7­eVÆL¡øÕ:zÁ®¯þÜÇUÀžÉ—ŸËeÃ,%ß&0ÓU^4(iÈ~u>mùAâm':±Ø•ŠÝ­‚ÝÕ]6 $¾|ŒÝ!†:ËI›tWjuEÝF›Æý&qõÙkJ¨‚ÀlµÈëÿ¹z—ép§ô­ÖÓB{¾ÞSû™VxД„ŸXo÷ØWNƒ0¦•£Í¼[rS]¬ïÓ ¦½ê>/õÕ5˜ttÔµ«f,°,Ÿ:Å͘W`ØV ®}I¬[´E·ð‚¨‚[ï¤N¾®Ü0éþbÉވù¹;j2G,VÔÃÃԇ5à žæ¤ŸY›s;¿Œ/\ì\@©ØQáDÄR:˙°–Ù5‰.´n·ÏÛoìý”–g¿ŽÛÌí« #]™ü…Øju”}óˆúµ(þÇÚ."§°ÿKÅ©c³Ê_OÊøÑr;ƒ?KQYŒT¾ƒ®˜aÝbGæàTh¸»¾˜qþtF{ô¿Wìì

43: !!!
.

[Ípd8]?ª¬ª’ë#bÉÿ¹aéEß#eÖoȾå2Œ¹ûÂ/fÌIó¼rEé(ƒßڂÛÜ#ìfϜÑsÃm2R½|Ì£…žtÿª´ßó§>H[úÚâžÞh󝚈ËE´BÎzZŒµf“ó.d(érrÝ}êûÔÇ۔µÆƒÊ6‡6¡s¤l,¡TeÐêµåP•‘‰.¿S'µ­j¸à¬òͲÿíéá›{âÒԟ7hž£VLÍ$=¬´&À¡-âíù¯–•øágEõ)°.-.ìÌN %f( Fí¬7áàò)JÆJ˜Õ<YtƒgK0qöüú‡K6H ¡gp¨XÉÛ|µÙp ŸäÕ9>¤¤Ä.#m–ì"¡ô]ÜNýg‘lLpØHˆ33“ ƒü4¿@ Ã>9Í­UÈ^;¦~‡è:×óGÚPŽ)ðaÑÕGcR×¾Æq [˜('YÎt·'2úU#0Vs:ÉÛøá֝º ÃJ7„à*…—ë>%ú&ª@RÂð3kc½/!5QTÛôK˜cÏà§âA3Ü»l†b kŠxË

.

‚.I~LRñªxE Ÿ»¡XEŸñÍi Í{DşÇl²åˆÔœÄ7CDFW–Wæ¿oÌ•ã‰æjÄšQ.UΤ¶ÝÄäY¦%_¶?Ð@½’xgr

44: !
.

Id¸É]éñe‡Â„v™¡÷*}è_– ¢~&ctøÅV8Z Å=7Rµ!SV6R^—|ϊÇ4y@Ÿax‡áR›Ä°ÁctÇEôà“8ø]1:ì…k^Ã0ãµ%n°›%ËO|öùØÛ¿L‘ý¢4΅õŸ€¿!µCæçûì™:‰[è³/ýihæ@éPg

.

µi~}¥ëJd6ÉóM©<®tŒ"JJȎ“»à’ÃçP˜§±Ìü ֦ݙBýÏÍçÕ¿N]Ö©J`Çèс4bº )Ñì0ú‰HBí/æuYù䤏±¹,Q“å‰c{¼ª·q) Ñuq왶aN½tKÁž)5Ü#—êMøüpèožöhìanÿ|ë+–¿¥gðE9k=ãîƖ¤¼0_cþoG½ŠT$<NùíU4³W 击p_zÚÊ.Ÿ8’Ìiþ»-9<Y¼® hPž#ö°ÐbÓÕ1"¥a42ÀkX^×MÂâµR²’—;ON’a©l~ñõ*:êæƒl&ÑBEÑPËne՘›²¨!Bw=}lÉ{~ø<ôXBº7Y¼Í…¼(MŸË@ð:"xGs…¶†4Ò÷ÍŠ´eïèU&šß{áŠ0Ù6ß­N¢wN&Ì4îJ0jìŒxCËc)í£Y4èI×G=°–óììïSR<=qsõÛØ©ÿDi‰>¼ M•c¶÷Ä'l† +…U0=€iN´¹è*t’ßF8ìÅü"¦Hrâu·Gõ)—iZÍe¢ÕG"nk²gW[ÕQ¬A4Gpwå[†VRmQ}ÓàÚ2¬{]DOf4ùøÌFOæB@ÁŒ&êΠį

.

¿ÁÈÊrs)É}0/䱟WϨ €«ÀJÝõ/Ûë1¢ÆÎ²è¢œìµZxê҂†zQì¹¢m‚Ò½C"}iŠ`ë:w3žÿ=BS:žñËGŸÆîBK›8e‰ ¿æ¾ê‚뾚½¥.Ûl‘—Å—¥ •ôjG».îŸR"ãsë0æ8Ö½£Þ¼Q$ÐÏ.Þy>«êf Ãl/LÒµˆXÇf „.éə$Öm9þô_ÂnZµÅ˜=î~!ÜD ‚•´JÃöǐŒU/ûªsÃ?ã%Á0Æú¿K½m „&j‹f ™|%\‘Œ‹0>ªsx‡,% ³ApIXÊvF ÉÐ4¸|bñO먚õÖÁ^Wy©¼,è]‹,ì®7‰˜ÃióEBš.~¶ ÎAš«Ï

. .

[DllImport("iphlpapi.dll", SetLastError=true)]

.

Declare Function AddIPAddress Lib "iphlpapi.dll" (TODO) As TODO

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

Please add some!

.

  public class MyClass

.

      [DllImport("iphlpapi.dll", EntryPoint = "AddIPAddress", SetLastError = true)]

.

    public MyClass()

.

      public void AddIPAddress(String IPAddress, String SubnetMask, int ifIndex)

.

        UInt32 Result =  MyAddIPAddress((uint)IPAdd.Address,

. .
Summary
The EnableRouter function turns on IPv4 forwarding on the local computer. EnableRouter also increments a reference count that tracks the number of requests to enable IPv4 forwarding.
.

[DllImport("iphlpapi.dll", SetLastError=true)]

.

static extern int EnableRouter(IntPtr pHandle, ref System.Threading.NativeOverlapped pOverlapped);

.

    <DllImport("iphlpapi.dll", CharSet:=CharSet.Ansi)>

.

    Public Shared Function EnableRouter(pHandle As IntPtr, ByRef pOverlapped As OVERLAPPED) As Integer

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

VB.NET Example

.

    <StructLayout(LayoutKind.Explicit, Size:=20)>

.

    Public Structure OVERLAPPED

.

    <FieldOffset(0)>

.

    Public Internal As UInt32

.

    <FieldOffset(4)>

.

    Public InternalHigh As UInt32

.

    <FieldOffset(8)>

.

    Public Offset As UInt32

.

    <FieldOffset(12)>

.

    Public OffsetHigh As UInt32

.

    <FieldOffset(8)>

.

    Public Pointer As IntPtr

.

    <FieldOffset(16)>

.

    Public hEvent As IntPtr

.

    <DllImport("iphlpapi.dll", CharSet:=CharSet.Ansi)>

.

    Public Shared Function EnableRouter(pHandle As IntPtr, ByRef pOverlapped As OVERLAPPED) As Integer

.

    <DllImport("kernel32.dll", EntryPoint:="CreateEventA", CharSet:=CharSet.Unicode)>

.

    Public Shared Function CreateEvent(lpEventAttributes As IntPtr, ByVal bManualReset As Boolean, ByVal bInitialState As Boolean, ByVal lpName As String) As IntPtr

.

    Private pOverlapped As OVERLAPPED ' <- Important! This should also be used when calling UnenableRouter() API Function.

.

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

.

    ' OVERLAPPED strucutre fields can be NULLED except hEvent field.

.

    pOverlapped.hEvent = CreateEvent(IntPtr.Zero, False, False, "enablerouter")

.

    Dim RetVal As Integer = EnableRouter(IntPtr.Zero, pOverlapped)

.

    If RetVal = ERROR_IO_PENDING Then

.

        Console.WriteLine("Success!")

.

    Else

.

        Dim errorMessage As String = New Win32Exception(RetVal).Message

.

        Console.WriteLine("Error {0}", errorMessage)

.
Documentation
[EnableRouter] on MSDN
. .

    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]

.

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_HOSTNAME_LEN + 4)]

.

        public string HostName;

.

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_HOSTNAME_LEN + 4)]

.

        public string DomainName;

.

        public IntPtr CurrentDnsServer;

.

        public IP_ADDR_STRING DnsServerList;

.

        public uint NodeType;

.

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_SCOPE_ID_LEN + 4)]

.

        public string ScopeId;

.

        public uint EnableRouting;

.

        public uint EnableProxy;

.

        public uint EnableDns;

.

Declare Function FIXED_INFO Lib "iphlpapi.dll" (TODO) As TODO

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

Please add some!

. .
Summary
Provides "adapter index" to be used with other IP Helper API functions based on the adapter name string in the form of "\\DEVICE\\TCPIP_" + deviceGuid.
.

[DllImport("iphlpapi.dll", SetLastError=true)]

.

Declare Function GetAdapterIndex Lib "iphlpapi.dll" (TODO) As TODO

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

Please add some!

. .

[DllImport("iphlpapi.dll")]

.

private static extern ERROR GetAdaptersAddresses(uint Family, uint Flags, IntPtr Reserved, IntPtr pAdapterAddresses, ref uint pOutBufLen);

.

Alternative Managed API:

.

Some, but not, all the information provided by the P/Invoke are available from the managed System.Net.NetworkInformation.NetworkInterface (http://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkinterface.aspx) class.

.

Sample Code:

.

    public class IPIntertop

.

    public enum FAMILY : uint

.

        /// Unpecified. Includes both IPv4 and IPv4

.

    public enum FLAGS : uint

.

        GAA_FLAG_SKIP_UNICAST = 0x0001,

.

        GAA_FLAG_SKIP_ANYCAST = 0x0002,

.

        GAA_FLAG_SKIP_MULTICAST = 0x0004,

.

        GAA_FLAG_SKIP_DNS_SERVER = 0x0008,

.

        GAA_FLAG_INCLUDE_PREFIX = 0x0010,

.

        GAA_FLAG_SKIP_FRIENDLY_NAME = 0x0020

.

    public enum ERROR : uint

.

        ERROR_BUFFER_OVERFLOW = 111,

.

        ERROR_INVALID_PARAMETER = 87

.

    public enum IF_OPER_STATUS : uint

.

        IfOperStatusLowerLayerDown,

.

    public enum IF_TYPE : uint

.

        IF_TYPE_OTHER = 1,   // None of the below

.

        IF_TYPE_REGULAR_1822 = 2,

.

        IF_TYPE_STARLAN = 11,

.

        IF_TYPE_HYPERCHANNEL = 14,

.

        IF_TYPE_LAP_B = 16,

.

        IF_TYPE_SDLC = 17,

.

        IF_TYPE_E1 = 19,  // Obsolete; see DS1-MIB

.

        IF_TYPE_PROP_POINT2POINT_SERIAL = 22,  // proprietary serial

.

        IF_TYPE_SOFTWARE_LOOPBACK = 24,

.

        IF_TYPE_EON = 25,  // CLNP over IP

.

        IF_TYPE_SLIP = 28,  // Generic Slip

.

        IF_TYPE_ULTRA = 29,  // ULTRA Technologies

.

        IF_TYPE_FRAMERELAY = 32,  // DTE only

.

        IF_TYPE_PARA = 34,  // Parallel port

.

        IF_TYPE_ARCNET_PLUS = 36,

.

        IF_TYPE_ATM = 37,  // ATM cells

.

        IF_TYPE_X25_PLE = 40,

.

        IF_TYPE_ISO88022_LLC = 41,

.

        IF_TYPE_LOCALTALK = 42,

.

        IF_TYPE_FRAMERELAY_SERVICE = 44,  // FRNETSERV-MIB

.

        IF_TYPE_AAL5 = 49,  // AAL5 over ATM

.

        IF_TYPE_PROP_VIRTUAL = 53,  // Proprietary virtual/internal

.

        IF_TYPE_PROP_MULTIPLEXOR = 54,  // Proprietary multiplexing

.

        IF_TYPE_FIBRECHANNEL = 56,

.

        IF_TYPE_FRAMERELAY_INTERCONNECT = 58,  // Obsolete, use 32 or 44

.

        IF_TYPE_AFLANE_8023 = 59,  // ATM Emulated LAN for 802.3

.

        IF_TYPE_AFLANE_8025 = 60,  // ATM Emulated LAN for 802.5

.

        IF_TYPE_CCTEMUL = 61,  // ATM Emulated circuit

.

        IF_TYPE_G703_2MB = 67,  // Obsolete; see DS1-MIB

.

        IF_TYPE_QLLC = 68,  // SNA QLLC

.

        IF_TYPE_CHANNEL = 70,

.

        IF_TYPE_IBM370PARCHAN = 72,  // IBM System 360/370 OEMI Channel

.

        IF_TYPE_DLSW = 74,  // Data Link Switching

.

        IF_TYPE_LAP_D = 77,  // Link Access Protocol D

.

        IF_TYPE_ATM_LOGICAL = 80,  // ATM Logical Port

.

        IF_TYPE_DS0 = 81,  // Digital Signal Level 0

.

        IF_TYPE_DS0_BUNDLE = 82,  // Group of ds0s on the same ds1

.

        IF_TYPE_BSC = 83,  // Bisynchronous Protocol

.

        IF_TYPE_ASYNC = 84,  // Asynchronous Protocol

.

        IF_TYPE_EPLRS = 87,  // Ext Pos Loc Report Sys

.

        IF_TYPE_ARAP = 88,  // Appletalk Remote Access Protocol

.

        IF_TYPE_PROP_CNLS = 89,  // Proprietary Connectionless Proto

.

        IF_TYPE_HOSTPAD = 90,  // CCITT-ITU X.29 PAD Protocol

.

        IF_TYPE_TERMPAD = 91,  // CCITT-ITU X.3 PAD Facility

.

        IF_TYPE_FRAMERELAY_MPI = 92,  // Multiproto Interconnect over FR

.

        IF_TYPE_ADSL = 94,  // Asymmetric Digital Subscrbr Loop

.

        IF_TYPE_RADSL = 95,  // Rate-Adapt Digital Subscrbr Loop

.

        IF_TYPE_SDSL = 96,  // Symmetric Digital Subscriber Loop

.

        IF_TYPE_VDSL = 97,  // Very H-Speed Digital Subscrb Loop

.

        IF_TYPE_VOICE_ENCAP = 103,  // Voice encapsulation

.

        IF_TYPE_VOICE_OVERIP = 104,  // Voice over IP encapsulation

.

        IF_TYPE_PPPMULTILINKBUNDLE = 108,  // PPP Multilink Bundle

.

        IF_TYPE_IPOVER_CDLC = 109,  // IBM ipOverCdlc

.

        IF_TYPE_IPOVER_CLAW = 110,  // IBM Common Link Access to Workstn

.

        IF_TYPE_VIRTUALIPADDRESS = 112,  // IBM VIPA

.

        IF_TYPE_MPC = 113,  // IBM multi-proto channel support

.

        IF_TYPE_TDLC = 116,  // IBM twinaxial data link control

.

        IF_TYPE_HDLC = 118,

.

        IF_TYPE_LAP_F = 119,

.

        IF_TYPE_X25_MLP = 121,  // Multi-Link Protocol

.

        IF_TYPE_TRANSPHDLC = 123,

.

        IF_TYPE_INTERLEAVE = 124,  // Interleave channel

.

        IF_TYPE_FAST = 125,  // Fast channel

.

        IF_TYPE_DOCSCABLE_MACLAYER = 127,  // CATV Mac Layer

.

        IF_TYPE_DOCSCABLE_DOWNSTREAM = 128,  // CATV Downstream interface

.

        IF_TYPE_DOCSCABLE_UPSTREAM = 129,  // CATV Upstream interface

.

        IF_TYPE_A12MPPSWITCH = 130,  // Avalon Parallel Processor

.

        IF_TYPE_TUNNEL = 131,  // Encapsulation interface

.

        IF_TYPE_CES = 133,  // Circuit Emulation Service

.

        IF_TYPE_L2_VLAN = 135,  // Layer 2 Virtual LAN using 802.1Q

.

        IF_TYPE_L3_IPVLAN = 136,  // Layer 3 Virtual LAN using IP

.

        IF_TYPE_L3_IPXVLAN = 137,  // Layer 3 Virtual LAN using IPX

.

        IF_TYPE_DIGITALPOWERLINE = 138,  // IP over Power Lines

.

        IF_TYPE_MEDIAMAILOVERIP = 139,  // Multimedia Mail over IP

.

        IF_TYPE_MSDSL = 143,  // Multi-rate Symmetric DSL

.

        IF_TYPE_IEEE1394 = 144,  // IEEE1394 High Perf Serial Bus

.

        IF_TYPE_RECEIVE_ONLY = 145 // TV adapter type

.

    public enum IP_SUFFIX_ORIGIN : uint

.

        IpSuffixOriginManual,

.

        IpSuffixOriginWellKnown,

.

        IpSuffixOriginLinkLayerAddress,

.

    public enum IP_PREFIX_ORIGIN : uint

.

        IpPrefixOriginManual,

.

        IpPrefixOriginWellKnown,

.

    public enum IP_DAD_STATE : uint

.

        /// IpDadStateInvalid -> 0

.

        IpDadStateInvalid = 0,

.

        IpDadStateDuplicate,

.

    public enum NET_IF_CONNECTION_TYPE : uint

.

    public enum TUNNEL_TYPE : uint {

.

        TUNNEL_TYPE_NONE = 0,

.

        TUNNEL_TYPE_OTHER = 1,

.

        TUNNEL_TYPE_DIRECT = 2,

.

        TUNNEL_TYPE_6TO4 = 11,

.

        TUNNEL_TYPE_ISATAP = 13,

.

        TUNNEL_TYPE_TEREDO = 14,

.

        TUNNEL_TYPE_IPHTTPS = 15

.

    [StructLayout(LayoutKind.Sequential)]

.

    public struct GUID {

.

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]

.

    private const int MAX_ADAPTER_ADDRESS_LENGTH = 8;

.

    private const int MAX_ADAPTER_NAME_LENGTH = 256;

.

    private const int MAX_DHCPV6_DUID_LENGTH = 130;

.

    [StructLayout(LayoutKind.Sequential)]

.

    public struct SOCKADDR

.

        public ushort sa_family;

.

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)]

.

        public byte[] sa_data;

.

    [StructLayout(LayoutKind.Sequential)]

.

    public struct SOCKET_ADDRESS

.

        public IntPtr lpSockAddr;

.

        public int iSockaddrLength;

.

    [StructLayout(LayoutKind.Sequential)]

.

    public struct IP_ADAPTER_UNICAST_ADDRESS

.

        public UInt64 Alignment;

.

        public IntPtr Next;

.

        public SOCKET_ADDRESS Address;

.

        public IP_PREFIX_ORIGIN PrefixOrigin;

.

        public IP_SUFFIX_ORIGIN SuffixOrigin;

.

        public IP_DAD_STATE DadState;

.

        public uint ValidLifetime;

.

        public uint PreferredLifetime;

.

        public uint LeaseLifetime;

.

    [StructLayout(LayoutKind.Sequential)]

.

    public struct IP_ADAPTER_ADDRESSES

.

        public UInt64 Alignment;

.

        public IntPtr Next;

.

        public IntPtr AdapterName;

.

        public IntPtr FirstUnicastAddress;

.

        public IntPtr FirstAnycastAddress;

.

        public IntPtr FirstMulticastAddress;

.

        public IntPtr FirstDnsServerAddress;

.

        [MarshalAs(UnmanagedType.LPWStr)]

.

        public string DnsSuffix;

.

        [System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPWStr)]

.

        public string Description;

.

        [System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPWStr)]

.

        public string FriendlyName;

.

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]

.

        public byte[] PhysicalAddress;

.

        public uint PhysicalAddressLength;

.

        public uint Flags;

.

        public uint Mtu;

.

        public IF_TYPE IfType;

.

        public IF_OPER_STATUS OperStatus;

.

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]

.

        public uint[] ZoneIndices;

.

        public IntPtr FirstPrefix;

.

        // May need to be removed on Windows versions below Vista to work properly (?)

.

        public UInt64 TrasmitLinkSpeed;

.

        public UInt64 ReceiveLinkSpeed;

.

        public IntPtr FirstWinsServerAddress;

.

        public IntPtr FirstGatewayAddress;

.

        public uint Ipv4Metric;

.

        public uint Ipv6Metric;

.

        public UInt64 Luid;

.

        public SOCKET_ADDRESS Dhcpv4Server;

.

        public uint CompartmentId;

.

        public GUID NetworkGuid;

.

        public NET_IF_CONNECTION_TYPE ConnectionType;

.

        public TUNNEL_TYPE TunnelType;

.

        public SOCKET_ADDRESS Dhcpv6Server;

.

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_DHCPV6_DUID_LENGTH)]

.

        public byte[] Dhcpv6ClientDuid;

.

        public uint Dhcpv6ClientDuidLength;

.

        public uint Dhcpv6Iaid;

.

        public uint FirstDnsSuffix;

.

    [DllImport("iphlpapi.dll")]

.

    private static extern ERROR GetAdaptersAddresses(uint Family, uint Flags, IntPtr Reserved, IntPtr pAdapterAddresses, ref uint pOutBufLen);

.

    public static string MarshalString(IntPtr text)

.

        // !!!: This should only be used with IP_ADAPTER_ADDRESSES.AdapterName since it can't be marshalled automatically

.

        byte[] cName = new byte[MAX_ADAPTER_NAME_LENGTH];

.

        Marshal.Copy(text, cName, 0, MAX_ADAPTER_NAME_LENGTH);

.

        string name = Encoding.ASCII.GetString(cName, 0, MAX_ADAPTER_NAME_LENGTH);

.

    public static IList<IP_ADAPTER_ADDRESSES> GetIPAdapters(FAMILY family)

.

        List<IP_ADAPTER_ADDRESSES> adapters = new List<IP_ADAPTER_ADDRESSES>();

.

        uint outBufLen = 0;

.

        ERROR err = GetAdaptersAddresses((uint)family, (uint)0, IntPtr.Zero, IntPtr.Zero, ref outBufLen);

.

        if (ERROR.ERROR_BUFFER_OVERFLOW == err)

.

        IntPtr pAdapterAddresses = Marshal.AllocHGlobal((int)outBufLen);

.

            err = GetAdaptersAddresses((uint)FAMILY.AF_INET, (uint)0, IntPtr.Zero, pAdapterAddresses, ref outBufLen);

.

            while (IntPtr.Zero != currPtr)

.

                IP_ADAPTER_ADDRESSES addr = (IP_ADAPTER_ADDRESSES)Marshal.PtrToStructure(currPtr, typeof(IP_ADAPTER_ADDRESSES));

.

        finally

.

            Marshal.FreeHGlobal(pAdapterAddresses);

.

    public static IList<IPAddress> GetIPAddresses(FAMILY family)

.

        List<IPAddress> addresses = new List<IPAddress>();

.

        foreach (IP_ADAPTER_ADDRESSES addr in GetIPAdapters(family)) {

.

            IP_ADAPTER_UNICAST_ADDRESS unicastAddr = (IP_ADAPTER_UNICAST_ADDRESS)Marshal.PtrToStructure(addr.FirstUnicastAddress, typeof(IP_ADAPTER_UNICAST_ADDRESS));

.

            if (IntPtr.Zero != unicastAddr.Address.lpSockAddr)

.

            SOCKADDR socketAddr = (SOCKADDR)Marshal.PtrToStructure(unicastAddr.Address.lpSockAddr, typeof(SOCKADDR));

.

AdapterName is an ASCII string, I was unable to Marshal automatically, you can use this code to get it:

.

byte[] cName = new byte[MAX_ADAPTER_NAME_LENGTH];

.

Marshal.Copy(addr.AdapterName, cName, 0, MAX_ADAPTER_NAME_LENGTH);

.

string name = Encoding.ASCII.GetString(cName, 0, MAX_ADAPTER_NAME_LENGTH);

.

Please add some!

. .

[DllImport("iphlpapi.dll", CharSet=CharSet.Ansi)]

.

public static extern int GetAdaptersInfo(IntPtr pAdapterInfo, ref Int64 pBufOutLen);

.

<DllImport("iphlpapi.dll", EntryPoint:="GetAdaptersInfo", CharSet:=CharSet.Ansi)> _

.

     ByVal pAdapterInfo As IntPtr, _

.

     ByRef pBufOutLen As UInt64) As Int32

.

Sample Code:

.

Public Sub GetAdapters()

.

     Dim structSize As Int32 = Marshal.SizeOf(GetType(IP_ADAPTER_INFO))

.

     Dim pArray As IntPtr = Marshal.AllocHGlobal(structSize)

.

     Dim len As UInt64 = Convert.ToUInt64(structSize)

.

     Dim ret As Int32 = GetAdaptersInfo(pArray, len)

.

     ' Buffer was too small, reallocate the correct size for the buffer.

.

     pArray = Marshal.ReAllocHGlobal(pArray, New IntPtr(Convert.ToInt64(len)))

.

     ret = GetAdaptersInfo(pArray, len)

.

     ' Call succeeded

.

         Dim Entry As IP_ADAPTER_INFO = CType(Marshal.PtrToStructure(pEntry, GetType(IP_ADAPTER_INFO)), IP_ADAPTER_INFO)

.

     Loop Until IntPtr.op_Equality(pEntry, IntPtr.Zero)

.

     Marshal.FreeHGlobal(pArray)

.

C# Sample Code:

.

        const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;

.

        const int ERROR_BUFFER_OVERFLOW = 111;

.

        const int MAX_ADAPTER_NAME_LENGTH = 256;

.

        const int MAX_ADAPTER_ADDRESS_LENGTH = 8;

.

        const int MIB_IF_TYPE_LOOPBACK = 24;

.

        const int MIB_IF_TYPE_SLIP = 28;

.

public static void GetAdapters()

.

   long structSize = Marshal.SizeOf( typeof( IP_ADAPTER_INFO ) );

.

   IntPtr pArray = Marshal.AllocHGlobal( new IntPtr(structSize) );

.

   if (ret == ERROR_BUFFER_OVERFLOW ) // ERROR_BUFFER_OVERFLOW == 111

.

     // Buffer was too small, reallocate the correct size for the buffer.

.

     pArray = Marshal.ReAllocHGlobal( pArray, new IntPtr (structSize) );

.

     // Call Succeeded

.

       IP_ADAPTER_INFO entry = (IP_ADAPTER_INFO)Marshal.PtrToStructure( pEntry, typeof( IP_ADAPTER_INFO ));

.

       Console.WriteLine("\n");

.

       Console.WriteLine( "Index: {0}", entry.Index.ToString() );

.

         case MIB_IF_TYPE_LOOPBACK  : tmpString = "Loopback"; break;

.

         case MIB_IF_TYPE_SLIP      : tmpString = "Slip"; break;

.

         default                    : tmpString = "Other/Unknown"; break;

.

       Console.WriteLine( "Adapter Type: {0}", tmpString );

.

       Console.WriteLine( "Name: {0}", entry.AdapterName );

.

       Console.WriteLine( "Desc: {0}\n", entry.AdapterDescription );

.

       Console.WriteLine( "DHCP Enabled: {0}", ( entry.DhcpEnabled == 1 ) ? "Yes" : "No" );

.

       if (entry.DhcpEnabled == 1)

.

         Console.WriteLine( "DHCP Server : {0}", entry.DhcpServer.IpAddress.Address );

.

         // Lease Obtained (convert from "time_t" to C# DateTime)

.

         DateTime pdatDate = new DateTime(1970, 1, 1).AddSeconds( entry.LeaseObtained ).ToLocalTime();

.

         Console.WriteLine( "Lease Obtained: {0}", pdatDate.ToString() );

.

         // Lease Expires (convert from "time_t" to C# DateTime)

.

         pdatDate = new DateTime(1970, 1, 1).AddSeconds( entry.LeaseExpires ).ToLocalTime();

.

         Console.WriteLine( "Lease Expires : {0}\n", pdatDate.ToString() );

.

       } // if DhcpEnabled

.

       Console.WriteLine( "IP Address     : {0}", entry.IpAddressList.IpAddress.Address );

.

       Console.WriteLine( "Subnet Mask    : {0}", entry.IpAddressList.IpMask.Address );

.

       Console.WriteLine( "Default Gateway: {0}", entry.GatewayList.IpAddress.Address );

.

       for (int i = 0; i < entry.AddressLength - 1; i++)

.

       Console.WriteLine( "MAC Address    : {0}{1:X2}\n", tmpString, entry.Address[entry.AddressLength - 1] );

.

       Console.WriteLine( "Has WINS: {0}", entry.HaveWins ? "Yes" : "No" );

.

         Console.WriteLine( "Primary WINS Server  : {0}", entry.PrimaryWinsServer.IpAddress.Address );

.

         Console.WriteLine( "Secondary WINS Server: {0}", entry.SecondaryWinsServer.IpAddress.Address );

.

     while( pEntry != IntPtr.Zero );

.

     Marshal.FreeHGlobal(pArray);

.

   else

.

     Marshal.FreeHGlobal(pArray);

.

     throw new InvalidOperationException( "GetAdaptersInfo failed: " + ret );

.

GetAdaptersInfo returns a pointer to an IP_ADAPTER_INFO linked list.

.

In .NET 2.0, this library (The IP Helper API) is encapsulated in the NetworkInformation namespace.

.

Does this requiere a new dll?

. .

[DllImport("iphlpapi.dll", SetLastError=true)]

.

Declare Function GetBestInterface Lib "iphlpapi.dll" (TODO) As TODO

.

DestAddr is a 32 bit representation of the four IP bytes. For .NET 1.0, you can get this from IPAddress.Address. In .NET 1.1, this is obsolete. You can use BitConverter.ToUInt32(IPAddress.GetAddressBytes()) instead.

.

Sample Code:

.

    public static class Win32ApiCalls

.

    [DllImport("iphlpapi.dll", CharSet = CharSet.Auto)]

.

    public static extern int GetBestInterface(UInt32 destAddr, out UInt32 bestIfIndex);

.

    class Program

.

        Console.WriteLine("Host name : " + hostInfo.HostName);

.

        Console.WriteLine("\r\nAliases : ");

.

        foreach (var thisAlias in hostInfo.Aliases)

.

            Console.WriteLine(thisAlias);

.

        Console.WriteLine("\r\nIP Address list :");

.

        foreach (var thisAddress in hostInfo.AddressList)

.

            Console.WriteLine(thisAddress);

.

        IPAddress ipv4Address = (from thisAddress in hostInfo.AddressList

.

                     where thisAddress.AddressFamily == AddressFamily.InterNetwork

.

                     select thisAddress).FirstOrDefault();

.

        if (ipv4Address == null)

.

            Console.WriteLine("No Ipv4 address found for www.yahoo.com.");

.

        Console.WriteLine("\r\nGetting best interface to reach {0}...", ipv4Address);

.

        int result = Win32ApiCalls.GetBestInterface(ipv4AddressAsUInt32, out interfaceindex);

.

        if (result != 0)

.

            throw new Win32Exception(result);

.

        Console.WriteLine("Best interface:\r\n" +

.

        Console.WriteLine("SocketException caught!!!");

.

        Console.WriteLine("Source : " + e.Source);

.

        Console.WriteLine("Message : " + e.Message);

.

        catch (ArgumentNullException e)

.

        Console.WriteLine("ArgumentNullException caught!!!");

.

        Console.WriteLine("Source : " + e.Source);

.

        Console.WriteLine("Message : " + e.Message);

.

        catch (NullReferenceException e)

.

        Console.WriteLine("NullReferenceException caught!!!");

.

        Console.WriteLine("Source : " + e.Source);

.

        Console.WriteLine("Message : " + e.Message);

.

        Console.WriteLine("Win32Exception caught!!!");

.

        Console.WriteLine("Source : " + e.Source);

.

        Console.WriteLine("Message : " + e.Message);

.

        Console.WriteLine("Exception caught!!!");

.

        Console.WriteLine("Source : " + e.Source);

.

        Console.WriteLine("Message : " + e.Message);

.

        // Search in all network interfaces that support IPv4.

.

        NetworkInterface ipv4Interface = (from thisInterface in NetworkInterface.GetAllNetworkInterfaces()

.

                          let ipv4Properties = thisInterface.GetIPProperties().GetIPv4Properties()

.

                          where ipv4Properties != null && ipv4Properties.Index == index

.

                          select thisInterface).SingleOrDefault();

.

        if (ipv4Interface != null)

.

        // Search in all network interfaces that support IPv6.

.

        NetworkInterface ipv6Interface = (from thisInterface in NetworkInterface.GetAllNetworkInterfaces()

.

                          let ipv6Properties = thisInterface.GetIPProperties().GetIPv6Properties()

.

                          where ipv6Properties != null && ipv6Properties.Index == index

.

                          select thisInterface).SingleOrDefault();

.

Alternative Managed API:

.

Do you know one? Please contribute it!

. .
Summary
The GetExtendedTcpTable function retrieves a table that contains a list of TCP endpoints available to the application.
.

[DllImport("iphlpapi.dll", SetLastError=true)]

.

static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass,uint reserved = 0);

.

<DllImport("iphlpapi.dll", SetLastError:=True)> _

.

Public Shared Function GetExtendedTcpTable(ByVal pTcpTable As IntPtr, ByRef dwOutBufLen As Integer, ByVal sort As Boolean, ByVal ipVersion As  Integer, ByVal tblClass As TCP_TABLE_CLASS, ByVal reserved As Integer) As UInteger

.

TCP_TABLE_CLASS

.

When you do not need the PID information look at: IPGlobalProperties.GetActiveTcpListeners Method from the System.Net.NetworkInformation namespace

.

(Msdn: http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getactivetcplisteners.aspx)

.

Sample Code:

.

Generic methods for IPv4 and IPv6. Using MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID, MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID and TCP_TABLE_CLASS

.

public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork

.

public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

.

public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections()

.

    return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);

.

public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections()

.

    return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);

.

private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type

.

    IPR[] tableRows;

.

    var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

.

    uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);

.

    IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

.

        ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);

.

            return new List<IPR>();

.

        // get the number of entries in the table

.

        IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));

.

        int rowStructSize = Marshal.SizeOf(typeof(IPR));

.

        uint numEntries = (uint)dwNumEntriesField.GetValue(table);

.

        // buffer we will be returning

.

        tableRows = new IPR[numEntries];

.

        IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);

.

            IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));

.

            tableRows[i] = tcpRow;

.

            rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry

.

    finally

.

        Marshal.FreeHGlobal(tcpTablePtr);

.

    return tableRows != null ? tableRows.ToList() : new List<IPR>();

.

Sample Code:

.

Previous sample

.

public MIB_TCPROW_OWNER_PID[] GetAllTcpConnections()

.

    MIB_TCPROW_OWNER_PID[] tTable;

.

    uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);        

.

    IntPtr buffTable = Marshal.AllocHGlobal(buffSize);

.

        ret = GetExtendedTcpTable(buffTable, ref buffSize, true, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);

.

            return null;

.

        // get the number of entries in the table

.

        MIB_TCPTABLE_OWNER_PID tab = (MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(buffTable, typeof(MIB_TCPTABLE_OWNER_PID));

.

        IntPtr rowPtr = (IntPtr)((long)buffTable + Marshal.SizeOf(tab.dwNumEntries));

.

        tTable = new MIB_TCPROW_OWNER_PID[tab.dwNumEntries];

.

            MIB_TCPROW_OWNER_PID tcpRow = (MIB_TCPROW_OWNER_PID)Marshal.PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID));

.

            tTable[i] = tcpRow;

.

            rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow));   // next entry

.

    finally

.

        Marshal.FreeHGlobal(buffTable);

.

    return tTable;

.

PowerShell

.

  using System.Collections;

.

  using System.Collections.Generic;

.

  using System.Linq;

.

  // https://msdn2.microsoft.com/en-us/library/aa366073.aspx

.

  namespace IPHelper {

.

      // https://msdn2.microsoft.com/en-us/library/aa366913.aspx

.

      [StructLayout(LayoutKind.Sequential)]

.

      public struct MIB_TCPROW_OWNER_PID {

.

      public uint state;

.

      public uint localAddr;

.

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]

.

      public byte[] localPort;

.

      public uint remoteAddr;

.

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]

.

      public byte[] remotePort;

.

      public uint owningPid;

.

      // https://msdn2.microsoft.com/en-us/library/aa366921.aspx

.

      [StructLayout(LayoutKind.Sequential)]

.

      public struct MIB_TCPTABLE_OWNER_PID {

.

      public uint dwNumEntries;

.

      [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]

.

      public MIB_TCPROW_OWNER_PID[] table;

.

      // https://msdn.microsoft.com/en-us/library/aa366896

.

      [StructLayout(LayoutKind.Sequential)]

.

      public struct MIB_TCP6ROW_OWNER_PID {

.

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]

.

      public byte[] localAddr;

.

      public uint localScopeId;

.

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]

.

      public byte[] localPort;

.

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]

.

      public byte[] remoteAddr;

.

      public uint remoteScopeId;

.

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]

.

      public byte[] remotePort;

.

      public uint state;

.

      public uint owningPid;

.

      // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366905

.

      [StructLayout(LayoutKind.Sequential)]

.

      public struct MIB_TCP6TABLE_OWNER_PID {

.

     public uint dwNumEntries;

.

     [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]

.

     public MIB_TCP6ROW_OWNER_PID[] table;

.

      // https://msdn2.microsoft.com/en-us/library/aa366386.aspx

.

      public enum TCP_TABLE_CLASS {

.

      TCP_TABLE_BASIC_LISTENER,

.

      TCP_TABLE_BASIC_CONNECTIONS,

.

      TCP_TABLE_BASIC_ALL,

.

      TCP_TABLE_OWNER_PID_LISTENER,

.

      TCP_TABLE_OWNER_PID_CONNECTIONS,

.

      TCP_TABLE_OWNER_PID_ALL,

.

      TCP_TABLE_OWNER_MODULE_LISTENER,

.

      TCP_TABLE_OWNER_MODULE_CONNECTIONS,

.

      TCP_TABLE_OWNER_MODULE_ALL

.

      // https://msdn.microsoft.com/en-us/library/aa366896.aspx

.

      public enum MIB_TCP_STATE {

.

      MIB_TCP_STATE_CLOSED,

.

      MIB_TCP_STATE_LISTEN,

.

      MIB_TCP_STATE_CLOSE_WAIT,

.

      MIB_TCP_STATE_CLOSING,

.

      MIB_TCP_STATE_LAST_ACK,

.

      MIB_TCP_STATE_DELETE_TCB

.

      public static class IPHelperAPI {

.

      [DllImport("iphlpapi.dll", SetLastError = true)]

.

      internal static extern uint GetExtendedTcpTable(

.

          IntPtr tcpTable,

.

          ref int tcpTableLength,

.

          bool sort,

.

          TCP_TABLE_CLASS tcpTableType,

.

      public class IPHelperWrapper : IDisposable {

.

      public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork

.

      public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

.

      // Creates a new wrapper for the local machine

.

      public IPHelperWrapper() { }

.

      public void Dispose() { GC.SuppressFinalize(this); }

.

      public List<MIB_TCPROW_OWNER_PID> GetAllTCPv4Connections() {

.

          return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);

.

      public List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections() {

.

          return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);

.

      public List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion) { //IPR = Row Type, IPT = Table Type

.

          IPR[] tableRows;

.

          var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

.

          uint ret = IPHelperAPI.GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);

.

          IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

.

          ret = IPHelperAPI.GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);

.

          if (ret != 0) return new List<IPR>();

.

          // get the number of entries in the table

.

          IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));

.

          int rowStructSize = Marshal.SizeOf(typeof(IPR));

.

          uint numEntries = (uint)dwNumEntriesField.GetValue(table);

.

          // buffer we will be returning

.

          tableRows = new IPR[numEntries];

.

          IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);

.

              IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));

.

              tableRows[i] = tcpRow;

.

              rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry

.

          finally {

.

          Marshal.FreeHGlobal(tcpTablePtr);

.

          return tableRows != null ? tableRows.ToList() : new List<IPR>();

.

      ~IPHelperWrapper() { Dispose(); }

.

      } // wrapper class

.

  Add-Type -TypeDefinition $TypeDefinition -PassThru | Out-Null

.

    $x=New-Object IPHelper.IPHelperWrapper

.

    $y=$x.GetAllTCPv4Connections()

.

    $services=Get-WmiObject -Namespace "root\cimv2" -Class "Win32_Service"

.

    $StateList=@("UNKNOWN","CLOSED","LISTEN","SYN-SENT","SYN-RECEIVED","ESTABLISHED","FIN-WAIT-1","FIN-WAIT-2","CLOSE-WAIT","CLOSING","LAST-ACK","TIME-WAIT","DELETE-TCB")

.

    for ($i=0; $i -lt $y.Count; $i++) {

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "LocalAddress" -Value ([System.Net.IPAddress]::new($y[$i].localAddr).IPAddressToString)

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "RemoteAddress" -Value ([System.Net.IPAddress]::new($y[$i].remoteAddr).IPAddressToString)

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "LocalPort" -Value ($y[$i].localPort[1]+($y[$i].localPort[0]*0x100)+($y[$i].localPort[3]*0x1000)+($y[$i].localPort[2]*0x10000))

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "RemotePort" -Value ($y[$i].remotePort[1]+($y[$i].remotePort[0]*0x100)+($y[$i].remotePort[3]*0x1000)+($y[$i].remotePort[2]*0x10000))

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "PID" -Value $y[$i].owningPid

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "ProcessName" -Value ((Get-Process -Id $y[$i].owningPid).ProcessName)

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "StateValue" -Value $y[$i].state

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "State" -Value $StateList[$y[$i].state]

.

      $boolNoService=$true

.

      for ($j=0; $j -lt $services.Count; $j++) {

.

      Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "ServiceName" -Value $services[$j].Caption

.

      $boolNoService=$false

.

      if ($boolNoService) { Add-Member -InputObject $objOutput -MemberType NoteProperty -Name "ServiceName" -Value $null }

.
Documentation
[GetExtendedTcpTable] on MSDN
. .
Summary
P/ invoque for GetIfTable iphlpapi function. Only C# example. You need also a MIB_IFROW structure
.

    /// <param name="pIfTable">A pointer to a buffer that receives the interface table as a MIB_IFTABLE structure</param>

.

    /// On input, specifies the size in bytes of the buffer pointed to by the pIfTable parameter.

.

    /// On output, if the buffer is not large enough to hold the returned interface table,

.

    ///  the function sets this parameter equal to the required buffer size in bytes

.

    /// sort the table by index

.

    /// A Boolean value that specifies whether the returned interface table should be sorted

.

    /// in ascending order by interface index. If this parameter is TRUE, the table is sorted.

.

    /// If the function succeeds, the return value is

.

    [DllImport("Iphlpapi.dll", SetLastError=true)]

.

    public static extern uint GetIfTable(IntPtr pIfTable, ref uint pdwSize, bool bOrder);

.

Declare Function GetIfTable Lib "iphlpapi.dll" (TODO) As TODO

.

Alternative Managed API:

.

System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

.

Get if Table Wrapper Class

.

    /// Wrapper to unmanaged code. to use all in C# declarations

.

    public class IPHelperWrapper

.

    #region  fields

.

    /// MIB_IFROW Declaration

.

    protected static IPHelperTraslation.MIB_IFROW netWorkInfoBlock;

.

    public static IPHelperTraslation.MIB_IFROW[] mRows;

.

    /// each network comes in a row. See MIB_IFROW in IPHelper Traslation for more

.

    public static IPHelperTraslation.MIB_IFROW[] GetNetworkInterfaceBlock()

.

        IPHelperTraslation.GetIfTable(IntPtr.Zero, ref size, false);

.

        IntPtr buf = Marshal.AllocHGlobal((int)size);

.

        IPHelperTraslation.GetIfTable(buf, ref size, false);

.

        int numEntries = Marshal.ReadInt32(buf);

.

        mRows = new IPHelperTraslation.MIB_IFROW[numEntries];

.

        mRows[i] = (IPHelperTraslation.MIB_IFROW)Marshal.PtrToStructure((IntPtr)pRows, typeof(IPHelperTraslation.MIB_IFROW));

.

        pRows += Marshal.SizeOf(typeof(IPHelperTraslation.MIB_IFROW));

.

        Marshal.FreeHGlobal(buf);

.
Documentation
[GetIfTable] on MSDN
. .

[DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]

.

public static extern int GetInterfaceInfo(Byte[] PIfTableBuffer, ref int size);

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

The following C# sourcecode implements classes and structures with the purpose of making the use of GetInterfaceInfo and IpReleaseAddress easier. Thanks to Lieutenant (http://www.red-gate.com/MessageBoard/viewtopic.php?t=5754) for submitting this code.

.

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

.

    public struct IP_ADAPTER_INDEX_MAP

.

        public int Index;

.

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = PInvokes.MAX_ADAPTER_NAME)]

.

        public String Name;

.

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

.

    public struct IP_INTERFACE_INFO

.

        public int NumAdapters;

.

        public IP_ADAPTER_INDEX_MAP[] Adapter;

.

        public static IP_INTERFACE_INFO FromByteArray(Byte[] buffer)

.

            Marshal.Copy(buffer, 0, new IntPtr(&iNumAdapters), 4);

.

            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(map));

.

            Marshal.StructureToPtr(map, ptr, false);

.

            Marshal.Copy(buffer, offset, ptr, Marshal.SizeOf(map));

.

            map = (IP_ADAPTER_INDEX_MAP)Marshal.PtrToStructure(ptr, typeof(IP_ADAPTER_INDEX_MAP));

.

            Marshal.FreeHGlobal(ptr);

.

            offset += Marshal.SizeOf(map);

.

    internal class PInvokes

.

        public const int MAX_ADAPTER_NAME = 128;

.

        public const int ERROR_INSUFFICIENT_BUFFER = 122;

.

        public const int ERROR_SUCCESS = 0;

.

        [DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]

.

        public static extern int GetInterfaceInfo(Byte[] PIfTableBuffer, ref int size);

.

        [DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]

.

        public static extern int IpReleaseAddress(ref IP_ADAPTER_INDEX_MAP AdapterInfo);

.

    public class Iphlpapi

.

        public static IP_INTERFACE_INFO GetInterfaceInfo()

.

        int r = PInvokes.GetInterfaceInfo(null, ref size);

.

        public static bool IpReleaseAddress(IP_ADAPTER_INDEX_MAP adapter)

.

        if (PInvokes.IpReleaseAddress(ref adapter) == PInvokes.ERROR_SUCCESS)

.

        else

.

            return false;

.

        public static void IpReleaseAllAddresses()

.

            IpReleaseAddress(info.Adapter[i]);

. .

[DllImport("iphlpapi.dll", SetLastError=true)]

.

public static extern int GetIpAddrTable(IntPtr pIpAddrTable, ref int pdwSize, bool bOrder);

.

Declare Ansi Function

.

GetIpAddrTable Lib "iphlpapi.dll" (ByRef ipTable As IntPtr, ByRef tableSize As IntPtr, ByVal ordered As Boolean) As UInt32

.

[DllImport(S"IPHLPAPI.DLL", EntryPoint=S"GetIpAddrTable", SetLastError=true, CharSet=CharSet::Unicode, ExactSpelling=true)]

.

static UInt32 GetIpAddressTable( [Out] IntPtr ipTable, [In,Out] IntPtr tableSize, bool sort);

.

Alternative Managed API:

.

Example:

.

    Console.WriteLine(strIP.ToString());

.

Please add some!

.

Sample Code:

.

GetIpAddrTable( IntPtr.Zero, ref nBufSize, false );

.

// allocate the buffer

.

pBuf = Marshal.AllocHGlobal( nBufSize );

.

int r = GetIpAddrTable( pBuf, ref nBufSize, false );

.

    throw new System.ComponentModel.Win32Exception( r );

.

int entrySize = Marshal.SizeOf(typeof(MIB_IPADDRROW));

.

int nEntries = Marshal.ReadInt32(pBuf);

.

int tableStartAddr = (int)pBuf + sizeof(int);

.

    IntPtr pEntry = (IntPtr)(tableStartAddr + i * entrySize);

.

    MIB_IPADDRROW addrStruct = (MIB_IPADDRROW)Marshal.PtrToStructure(pEntry, typeof(MIB_IPADDRROW));

.

    Marshal.FreeHGlobal( pBuf );

.

// helper function IPToString

.
Documentation
[GetIpAddrTable] on MSDN
. .
Summary
The GetIpNetTable function retrieves the IP-to-physical address mapping table.
.

[DllImport("iphlpapi.dll", EntryPoint="GetIpNetTable")]

.

static extern int GetIpNetTable(IntPtr pIpNetTable, ref int pdwSize, bool bOrder);

.

    <DllImport("IpHlpApi.dll")>

.

    Private Shared Function GetIpNetTable(pIpNetTable As IntPtr, <MarshalAs(UnmanagedType.U4)> ByRef pdwSize As Integer, bOrder As Boolean) As <MarshalAs(UnmanagedType.U4)> Integer

.

    [StructLayout(LayoutKind.Sequential)]    

.

        [MarshalAs(UnmanagedType.U4)]    

.

        public uint dwIndex;    

.

        [MarshalAs(UnmanagedType.U4)]    

.

        public uint dwPhysAddrLen;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac0;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac1;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac2;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac3;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac4;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac5;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac6;    

.

        [MarshalAs(UnmanagedType.U1)]    

.

        public byte mac7;    

.

        [MarshalAs(UnmanagedType.U4)]    

.

        public uint dwAddr;    

.

        [MarshalAs(UnmanagedType.U4)]    

.

        public uint dwType;      

.

    Public Const ERROR_SUCCESS As Integer = 0

.

    Public Const ERROR_INSUFFICIENT_BUFFER As Integer = 122

.

<StructLayout(LayoutKind.Sequential)>

.

Public Structure MIB_IPNETROW

.

    <MarshalAs(UnmanagedType.U4)>

.

    Public dwIndex As UInteger

.

    <MarshalAs(UnmanagedType.U4)>

.

    Public dwPhysAddrLen As UInteger

.

    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)>

.

    Public bPhysAddr() As Byte

.

    <MarshalAs(UnmanagedType.U4)>

.

    Public dwAddr As UInteger

.

    <MarshalAs(UnmanagedType.U4)>

.

    Public dwType As DWTYPES

.

Public Enum DWTYPES As UInteger

.

    <MarshalAs(UnmanagedType.U4)>

.

    <MarshalAs(UnmanagedType.U4)>

.

    Invalid = 2

.

    <MarshalAs(UnmanagedType.U4)>

.

    <MarshalAs(UnmanagedType.U4)>

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

If you are only interesting in getting the mac Address and you are deploying to Windows 2008 or later, you might want to use ResolveIpNetEntry2 (http://msdn.microsoft.com/en-us/library/aa814455(VS.85).aspx) instead.

.

Please add some!

.

C# Sample Code:

.

    //http://stackoverflow.com/questions/1148778/how-do-i-access-arp-protocol-information-through-c-net

.

    using System.ComponentModel;

.

    namespace GetIpNetTable

.

    class Program   {      

.

        // The max number of physical addresses.      

.

        const int MAXLEN_PHYSADDR = 8;      

.

          // Declare the GetIpNetTable function.

.

          [DllImport("IpHlpApi.dll")]

.

          [return: MarshalAs(UnmanagedType.U4)]

.

          static extern int GetIpNetTable(

.

         IntPtr pIpNetTable,

.

         [MarshalAs(UnmanagedType.U4)]

.

         bool bOrder);

.

         // The result from the API call.

.

         int result = GetIpNetTable(IntPtr.Zero, ref bytesNeeded, false);

.

         // Call the function, expecting an insufficient buffer.

.

         if (result != ERROR_INSUFFICIENT_BUFFER)

.

            throw new Win32Exception(result);

.

         // Allocate the memory, do it in a try/finally block, to ensure

.

         // that it is released.

.

         // Try/finally.

.

            // Allocate the memory.

.

            buffer = Marshal.AllocCoTaskMem(bytesNeeded);

.

            // Make the call again. If it did not succeed, then

.

            result = GetIpNetTable(buffer, ref bytesNeeded, false);

.

            // If the result is not 0 (no error), then throw an exception.

.

            if (result != 0)

.

               throw new Win32Exception(result);

.

            // Now we have the buffer, we have to marshal it. We can read

.

            // the first 4 bytes to get the length of the buffer.

.

            int entries = Marshal.ReadInt32(buffer);

.

               Marshal.SizeOf(typeof(int)));    

.

            // Allocate an array of entries.

.

            MIB_IPNETROW[] table = new MIB_IPNETROW[entries];

.

            // Cycle through the entries.

.

               // Call PtrToStructure, getting the structure information.

.

               table[index] = (MIB_IPNETROW) Marshal.PtrToStructure(new

.

              Marshal.SizeOf(typeof(MIB_IPNETROW)))), typeof(MIB_IPNETROW));

.

               IPAddress ip=new IPAddress(table[index].dwAddr);

.

               Console.Write("IP:"+ip.ToString()+"\t\tMAC:");

.

               b=table[index].mac0;

.

              Console.Write("0");

.

               else

.

              Console.Write("");

.

               Console.Write(b.ToString("X"));

.

               b=table[index].mac1;

.

              Console.Write("-0");

.

               else

.

              Console.Write("-");

.

               Console.Write(b.ToString("X"));

.

               b=table[index].mac2;

.

              Console.Write("-0");

.

               else

.

              Console.Write("-");

.

               Console.Write(b.ToString("X"));

.

               b=table[index].mac3;

.

              Console.Write("-0");

.

               else

.

              Console.Write("-");

.

               Console.Write(b.ToString("X"));

.

               b=table[index].mac4;

.

              Console.Write("-0");

.

               else

.

              Console.Write("-");

.

               Console.Write(b.ToString("X"));

.

               b=table[index].mac5;

.

              Console.Write("-0");

.

               else

.

              Console.Write("-");

.

               Console.Write(b.ToString("X"));

.

               Console.WriteLine();

.

         finally

.

            // Release the memory.

.

            Marshal.FreeCoTaskMem(buffer);

.

VB.NET Sample Code:

.

    Public Shared Sub GetARPTablr()

.

    ' The result from the API call.

.

    Dim result As Integer = GetIpNetTable(IntPtr.Zero, bytesNeeded, False)

.

    ' Call the function, expecting an insufficient buffer.

.

    If result <> ERROR_INSUFFICIENT_BUFFER Then

.

        Throw New Win32Exception(result)

.

    ' Allocate the memory, do it in a try/finally block, to ensure

.

    ' that it is released.

.

    ' Try/finally.

.

        ' Allocate the memory.

.

        buffer = Marshal.AllocCoTaskMem(bytesNeeded)

.

        ' Make the call again. If it did not succeed, then

.

        result = GetIpNetTable(buffer, bytesNeeded, False)

.

        ' If the result is not 0 (no error), then throw an exception.

.

        If result <> ERROR_SUCCESS Then

.

        Throw New Win32Exception(result)

.

        ' Now we have the buffer, we have to marshal it. We can read

.

        ' the first 4 bytes to get the length of the buffer.

.

        Dim entries As Integer = Marshal.ReadInt32(buffer)

.

        Dim currentBuffer As New IntPtr(buffer.ToInt64() + Marshal.SizeOf(GetType(Integer)))

.

        ' Allocate an array of entries.

.

        Dim table As MIB_IPNETROW() = New MIB_IPNETROW(entries - 1) {}

.

        ' Cycle through the entries.

.

        ' Call PtrToStructure, getting the structure information.

.

        table(index) = DirectCast(Marshal.PtrToStructure(New IntPtr(currentBuffer.ToInt64() + (index * Marshal.SizeOf(GetType(MIB_IPNETROW)))), GetType(MIB_IPNETROW)), MIB_IPNETROW)

.

        If table(index).dwType <> DWTYPES.Invalid And table(index).dwType <> DWTYPES.Other Then

.

            Dim ip As New IPAddress(table(index).dwAddr)

.

            Dim mac As New PhysicalAddress(table(index).bPhysAddr)

.

            Console.WriteLine(table(index).dwType.ToString & vbTab & vbTab & "IP:" + ip.ToString() & vbTab & vbTab & "MAC: " & MACtoString(mac))

.

    Finally

.

        ' Release the memory.

.

        Marshal.FreeCoTaskMem(buffer)

.

        '  Marshal.FreeHGlobal(rowptr)

.

    Public Shared Function MACtoString(mac As PhysicalAddress, Optional Capital As Boolean = True) As String

.

    If Capital Then ' In capital Letters

.

        Return String.Join(":", (From z As Byte In mac.GetAddressBytes Select z.ToString("X2")).ToArray())

.

    Else

.

        Return String.Join(":", (From z As Byte In mac.GetAddressBytes Select z.ToString("x2")).ToArray())

.
Documentation
[GetIpNetTable] on MSDN
. .
Summary
Retrieve network parameters for the local computer
.

[DllImport("iphlpapi.dll", CharSet=CharSet.Ansi)]

.

public static extern int GetNetworkParams(IntPtr pFixedInfo, ref UInt32 pBufOutLen);

.

    <DllImport("iphlpapi.dll", CharSet:=CharSet.Ansi)>

.

    Public Shared Function GetNetworkParams(pFixedInfo As IntPtr, ByRef pBufOutLen As Integer) As Integer

.

Alternative Managed API:

.

Use [System.Net.NetworkInformation.IPGlobalProperties].GetIPGlobalProperties().

.

Note that ScopeId is renamed to DhcpScopeName and EnableProxy is renamed to IsWinsProxy.

.

Please add some!

.

Sample Code:

.

int infoLen = Marshal.SizeOf(typeof(FIXED_INFO));

.

while (true)

.

    infoPtr = Marshal.AllocHGlobal(Convert.ToInt32(infoLen));

.

    ret = GetNetworkParams(infoPtr, ref infoLen);

.

    if (ret == ERROR_BUFFER_OVERFLOW)

.

        Marshal.FreeHGlobal(infoPtr);

.

    throw new ApplicationException("An error occurred while fetching adapter information.", new Win32Exception(Convert.ToInt32(ret)));

.

FIXED_INFO info = (FIXED_INFO)Marshal.PtrToStructure(infoPtr, typeof(FIXED_INFO));

.

VB.NET Example

.

    Private Const ERROR_SUCCESS As Long = 0

.

    Private Const ERROR_BUFFER_OVERFLOW As Integer = 111

.

    Private Const MAX_HOSTNAME_LEN As Integer = 128

.

    Private Const MAX_SCOPE_ID_LEN As Integer = 256

.

    Private Const MAX_DOMAIN_NAME_LEN As Integer = 128

.

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>

.

    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_HOSTNAME_LEN + 4)>

.

    Public HostName As String

.

    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_DOMAIN_NAME_LEN + 4)>

.

    Public DomainName As String

.

    Public CurrentDnsServer As IntPtr

.

    Public DnsServerList As IP_ADDR_STRING

.

    Public NodeType As UInteger

.

    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_SCOPE_ID_LEN + 4)>

.

    Public ScopeId As String

.

    Public EnableRouting As Boolean

.

    Public EnableProxy As Boolean

.

    Public EnableDns As Boolean

.

    <DllImport("iphlpapi.dll", CharSet:=CharSet.Ansi)>

.

    Private Shared Function GetNetworkParams(pFixedInfo As IntPtr, ByRef pBufOutLen As Integer) As Integer

.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

.

    Dim infoLen As Integer

.

    '      Dim bufOF As Boolean = True

.

        '       Do While bufOF

.

        ret = GetNetworkParams(infoPtr, infoLen)

.

        If ret = ERROR_BUFFER_OVERFLOW Then

.

        infoPtr = Marshal.AllocHGlobal(infoLen)

.

        ret = GetNetworkParams(infoPtr, infoLen)

.

        If ret = ERROR_BUFFER_OVERFLOW Then

.

        ElseIf ret = ERROR_SUCCESS Then

.

        Dim info As FIXED_INFO = Marshal.PtrToStructure(infoPtr, GetType(FIXED_INFO))

.

        ' We can now access the FIXED_INFO fields here.

.

        Console.WriteLine("Enable Routing: {0}", info.EnableRouting) ' CBool(info.EnableRouting))

.

        Else

.

            Console.WriteLine("Error {0}", errorMessage)

.

        '   Loop

.

        Console.WriteLine(ex.ToString)

.

    Finally

.

        Marshal.FreeHGlobal(infoPtr)

. .

[DllImport("iphlpapi.dll", SetLastError=true)]

.

Declare Function IPAddress Lib "iphlpapi.dll" (TODO) As TODO

.

Please add some!

.

Sample Code:

.

Please add some!

.

Alternative Managed API:

.

Do you know one? Please contribute it!

. .

    [DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]

.

    public static extern int IpReleaseAddress(ref IP_ADAPTER_INDEX_MAP AdapterInfo);

.

Alternative Managed API:

.

Do you know one? Please contribute it!

.

Please add some!

.

Sample Code:

.

The following C# sourcecode implements classes and structures with the purpose of making the use of GetInterfaceInfo and IpReleaseAddress easier. Thanks to Lieutenant (http://www.red-gate.com/MessageBoard/viewtopic.php?t=5754) for submitting this code.

.

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

.

    public struct IP_ADAPTER_INDEX_MAP

.

    public int Index;

.

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = PInvokes.MAX_ADAPTER_NAME)]

.

    public String Name;

.

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

.

    public struct IP_INTERFACE_INFO

.

    public int NumAdapters;

.

    public IP_ADAPTER_INDEX_MAP[] Adapter;

.

    public static IP_INTERFACE_INFO FromByteArray(Byte[] buffer)

.

        Marshal.Copy(buffer, 0, new IntPtr(&iNumAdapters), 4);

.

        IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(map));

.

        Marshal.StructureToPtr(map, ptr, false);

.

        Marshal.Copy(buffer, offset, ptr, Marshal.SizeOf(map));

.

        map = (IP_ADAPTER_INDEX_MAP)Marshal.PtrToStructure(ptr, typeof(IP_ADAPTER_INDEX_MAP));

.

        Marshal.FreeHGlobal(ptr);

.

        offset += Marshal.SizeOf(map);

.

    internal class PInvokes

.

    public const int MAX_ADAPTER_NAME = 128;

.

    public const int ERROR_INSUFFICIENT_BUFFER = 122;

.

    public const int ERROR_SUCCESS = 0;

.

    [DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]

.

    public static extern int GetInterfaceInfo(Byte[] PIfTableBuffer, ref int size);

.

    [DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]

.

    public static extern int IpReleaseAddress(ref IP_ADAPTER_INDEX_MAP AdapterInfo);

.

    public class Iphlpapi

.

    public static IP_INTERFACE_INFO GetInterfaceInfo()

.

    int r = PInvokes.GetInterfaceInfo(null, ref size);

.

    public static bool IpReleaseAddress(IP_ADAPTER_INDEX_MAP adapter)

.

    if (PInvokes.IpReleaseAddress(ref adapter) == PInvokes.ERROR_SUCCESS)

.

    else

.

        return false;

.

    public static void IpReleaseAllAddresses()

.

        IpReleaseAddress(info.Adapter[i]);

.
Documentation
[IpReleaseAddress] on MSDN

Cut off search results after 60. Please refine your search.


 
Access PInvoke.net directly from VS: