From: Subject: Inside Windows: An In-Depth Look into the Win32 Portable Executable File Format -- MSDN Magazine, February 2002 Date: Mon, 7 Mar 2005 12:18:38 +0100 MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0000_01C5230F.CAC46F80"; type="multipart/alternative" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1409 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/library/toolbar/3.0/images/banners/msdn_masthead_ltr.gif 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 ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif R0lGODlhBAAHAPcAAP8zAP///////+7u7tfX18zMzMHBwaqqqpmZmQAAAAAAAAAAAAAAAAAAAAAA AAAAAG91dC1iYXNpYy5naWYAAAAAAAAAAAAAAAAAAAAAAAAAAAAXABRH6HfQmxcA0JsXACIC+38H AAAA7PQSADVa6HcgPRMAJvkXADT5FwB+8xcAnvMXACCwFwCk9hIAAAAAAAAAXy2oAF8t4PQSADz2 EgDM9RIAAAAAACD1EgB+L/h3AABfLQEAAAACAAAArPUSAKgAXy0AEF8t2CNfLQEAAAC8aPh3CQQA AAAQXy0AAAAAbPUSACQAAABxI/h3SA0TAAAAEwAkAAAAAAAAAET1EgAAAgAA/PYSAEWQ+3ewI/h3 /////wz3EgDgo/x396P8dwAAAAAAAAAAKPoSAAIAAADU9RIApPYSACx5AAAAAAAACQQAABgVXy0J BAAAeAETACCwFwCgmQEA2CNfLQAAAAABAAAAzPUSAAAAAAA49RIAPPYSAAAAAABFkPt3oJkBAP// //8AEF8tjPUSALD/EgAgsBcAeAETACCwFwB4ARMAGLAXAHlr+HcAAF8tsDBfLTj2EgAAAAAAt1Do dwAAXy2wMF8tOPYSAAAAAACk9hIALHkAAAAAAACwMF8tEAAAAAkAAACo9hIA/gAAAGz2EgCIZeF3 aFtIAP4AAACE9hIA7m5gLRIAAAAAAAAA/gAAAAAAAACY9hIADmnhdwAAAADubmAtCQAAAKj2EgAJ AAAAAAAAAHZbSADK0EcAzvQXAGD0FwCrqUIAAABfLe5uYC1oW0gA/wAAAAAAEwDnBQAAaPYXAGD2 FwBoARMAAPcSACQAAAAseQAAAPQXAAAAAACA9xcAuCYYAHgBEwBg9hcAaPYXACABAAABAAAABgJk AwYCZANI9xIARZD7d3Af+Hf/////WPcSAMwy6HcAABMACAAUABgBAABg9BcAAAAAAAAAAAAAAAAA AAAAAMTARADD9hcARMkVAMf2FwCH+hIA/////2j2FwAuwUQAw/YXACH5BAEAAAIALAAAAAAEAAcA QAgSABMIGJigoICCAgUSVIgQ4cCAADs= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/promo/ad1.gif R0lGODlhfQB9APcAAP///wBuucbY8AB6xABWjXB7iEqYytna2nzDZhKMvYqWprXj+Mfq+nvDZaen p67cp3zEZej158rnwwGFyGbD6gOp5Ym10Rp4qaXd90uOuSd5qBsbG8jIyJfY9Ta26hZ6vnbG6Fm8 5QBptjQ0NHvEZpeXl0a46QUFBae1yIbJd1fB7ABIepmnuFio0zyHtGi94nuGlHar1gE9Y6u6zmpq agBsuSin2AFgkjao2QBmq3h4eIeIiLm5ubrL4QWk28HT6lpaWigoKEep2Weq1LjgsAZ3qO3t7UdH R3rFdOHh4fPz84rU9CeGw9vv1ofJ6Pr6+ieFtmfI8Ca57D2UyRW265fSkw10uhqn23uazG3AZ3XM 8aXW7vX69AJEbbjY6gaTxgex6mWx2V1iZsja8yiSyJnG4lefyQGS04rNhY+ozoGh1nm02LPF3QGb 26fO5ZWnxJ7Tj3zDZTOMxufo6AFQfQBjtFa13r/M1QA1XM3d8pjT7hmTwztESQRzu0/A7Eq038Dj ugBgoIGMmmdxfAOc1HPCbRmt5DZwmGeozVRdZTFWcjew4uL0/WuPtIaRoH3Q8lvE76PXnTWBrv// ++Pz4Mnc9EejzrLC1y2f0ims4ABqt8ra9dLrzo6aqjO97sfZ8Y3P7Jeu0krD74XQ8DOf0j+Qvfz8 /Im93QGMzqO74Xmnxvr9+oGWu/3+/QGCvZXPha/D5K7e893w21BWWpex1Dykzl5rd8PY7tPg9fz+ +wBysQuc0RltohSf1QGW18fa8vf697fH3Tyx3AZvukxOTwmW04SvzcbY8bjJ3/7//iOgzzw9PgBs ugyi2c3f9KCuwMXZ8QJ8s8vd8QGg3wNsuB2AvyErMBdHacfZ8sbZ8MjX7c/c8n+e0b7P5gFyvgJu uQFuux5+sCyNvQBut8fY8MrZ7tDQ0ZOgsH294KCgoBF5sKK00P///vDs6K6/07OztK2tre737BAR EQ5OecHBwsDO1ubn50G+7QFvuQBxuQNutgFuucja8W/L8X7L7Du97iH5BAAAAAAALAAAAAB9AH0A AAj/AAMIHEiwoMGDCBMqXMiwocOHBmtAnEixosWLGDNq3Mixo8ePID/WGEmypMmTKFOqXMmypcuX Fq3InEmzps2bOHPq3Mmzp88+miRCvEO0qNGjSJMqXcq0qdOnUO+osiLU4ZyrWLNq3cq1q9evYMOK HZskyYw+VRk+eWKqVdtWa+PKXdt2rt27ePPq3cu3r1wlc5IYEPEQAIBWSgAoUdLKsOPHhp9Anky5 suXLmDNrhgysnTHCIwOIIIwQQLJ3yxwtg2GOg70DHA7MoackdolZ6RJv3s27t2/H7IBZEFHjAxNN QxB9Kw1gkDxr1pYlKkDMmhgxiY6IGTRrGZ8CSpL9/x5PvrzhScNFmDFjoAy6KaQLsnsyi499PsR2 JNoxK5EY+9glkggP7Jhn4IGaoScCM9W44YUVQwx2EACmJDHHa0aYc4A9wLhmjjm1XWiheAiWaKJj CgZQQzXViFDNMMxMCFkyrSRjI4mm4XjijiamCI4IdYiWEI9EFolZiiIwMcQHVuDDnJFQRqlgkmW4 IccQcmgiY5RcEjkle2Yw0YIZCxrU5Zk7KsjMB1We4sYHaQ3E2xM7mMNOKyWYg6ASYgRxRBAcmOgA PQAYcQQNjfGWoiYftLAkNftsmVkrRsgDj2HyOHAgOwfIw4MS8pRQYisj6ABAh3r2liIzQI42pGEO EP9TwgjE6GkPDSMcYc4cxJywAQ3L+CoGADwsMwIPih16bDqzEDMCPHc6MMIIhBpmTxA7OOBpogCY c8QOxr5zqrIOKKFDrge0gqexPNBwgjxHALDDDgAkgesySXTrbDqt2CPGCEAklqIVH0T64pM6nCBG OiMsY0+76RCzjBLa0mBOOvLQcAA9QeigwwYHGHHCCA4Y4a7HGyRhzgY67BCoYzuM/M4T7xgBADsc nLDMO2LIYw4wJwSRThLwAOHAERPvsEEJO/DAwQazfHrELMB4l84OZY1Ag9L0AHEE0wKnZ0YLow0B 35YfG8EOPSfA88QBPOjgcxKZHiZPOgAAa4QRS8//cUIJjf3bzhPyvJPzDkqYYlgr6WxwxAaubZBq zu8Eh60SfzemxAE8y5PEBjvcqXjH7ChxqANBmDPJWo0nYSiwIySh25RTrFFHHadIaKZhOgRxWKfv 0LPBMstATvelpmRKnzwbNL+DPZbeLMYyNoeK5wYjmKP50uz0LsYR9hyWs57slFqppoxjP4LnJyDr WMeIHbpDEDYflnDzv3JwhDw72KzgN9Q4RRnKcIphICxlAHCA5LTWCnicwBx0c4ApnnACvAEhdkng gBJEdikATE9toXrC3oJAjMRUCnBP6BW9DJOzS3UqN3crVMfk5TnQISYxHXuC6WiAOg6wwwh0ktwc /1wzBwCU4G8ASJGKmCAHZsRJTrw7ATF6RwMAACEINAjCCTRIvBIoIQgjKMHTgKADMeytbUmcxQjU VkFzLONcOpDME2jAMhocoWH0aEzOtNYwI2AOb0q44sdOAAyl0WAW8GjFn3RQNWIYqlRAMMIBGrYD INgLCP9CloIkook6uOqAJQAC4gAwhzKmQwf2wBkQSgAMeohhB5PoGhDSAQxzpQsA6WAlAHSwKxqI UjKR4Y8YeGAvCQIgZ75E5al4aZgD+LIEOlBcOoAAhEA5E1G5BIA9dDALHSTmAGKYxQ6A4QBqvgw9 w6iGFeTATjn0IVK7a0XvDsMtdtjzMXe6mT33ef9PdV3mnvhkxyT2+Rh6yOMAAYWMurgFHH9CBqAC HWhlJmGMaiCCTQMsQzWeGADHyA1Nm+HBFgsE0vMMhxmsGk184pnBkmbGCLRxqUlJIxSOCkSmOPXN JocBFE304Z2SAkAE0ICEoiIhBVUABBcgIwE0oKEJOeWSgqxghjV84AO5WykUHSOLLHj1q15FggRw hAavVgFKq+DCUmWKnjpM4RbOcIMbTmEFeBaEqV5FwwMeQNSwcsIxDygqIIqUjCZEIgVEwOmUqiEH EVCDOE86DBG8SgQbAYATSPBqJFZBIkrEA0qZRYIsdISmRZFGS09KBheq4NW/OgYQXk0BJZIRDwn/ SMC1hlkFJSQACNs2gRKrcEwyIsAJ21LiMfHgRG8lMNomwDYLSCACID5bUgXtwwpMkAgTrBDZeBQC urN1DCW8WogmJOO5aHBMBCKR2a8ioQrUzQURyhpWCQS3CfQ1KxfaC1ZZuPRLLbhdhLR6U67mlbqm iUdYZdGKSHh1sACQBX2RSt8qAAMAuXBwFqoQWOhGgAspyCt7I7He9iL1AWsFKe0KOIxTnG13pnlu JBTnmCbkNQIAKGshOKFa1mbhAfHgwgO8+gDxyJgLwNCwLDiRVyRHIB5p1bEEkEzaLi0qBnJdgwG3 1IohZyGxjmnFZDe8iniEdqmc+G4VuGAjH491/xU6hjIgQhsPWXy3ECQWbmiPq9jhCEQEVyXwVoEh ZRztl7KtSHMW0EAjLwPCRlz4rmwL214kFOLOf+3yd7NQCCIojhLfRQNDq+vnAHRyNDZ1jHezIFvH JDm2sx1zJHrc2hg3ORmY5TQS0BCJ6T5mvZvmsQQ0G9UUUYMJBkg2d7fE5EXLIh7E9XEWHg0AHw92 tZTlAiXaO2sANCGzaABGK9IaAXIjmQsa5rGXI8EFBJNaBJqQQxm8cAovVAO1dzXMmAuRghTwtxBF Vi19j5uMMW/Y0g82TDzoy+sqIBUYEihEFSJRBUlHIBka3jWY/yu29XyAPYJ2jLTBilROJKrZWf9I VDx8DPDQ8tgwEgarWAFgcE6jwbWcCDGnX85x4lTDDPJ2w3FklAwJEOHoR+8tg0k0XEAQQQKJUi1v mxABSacYALU9OnODGwGjH50TKU6GLL5+dRX7GaWaYMJGU6sjy07G7QBI640wTmSGwr0yd48qikrN SU2AI7K/4QQaANEETmQcx+a500Id+hi3VGbUj28MMCmjoHgbwJOCLvB4xKzrSpt3RzyQTVn8aI5P KSEJB5DdHIzwjiTYw3UiCkzISI96eFzICIHx40zT7gX2GGDZMP5NLjhR8bwS4eI8ckA6ll+Cdyi/ BPAoAQ8cUIJ0vGMO8OBBCZT/DnhQ3wHwyOX/h8zxjurDAx47cH79FESND6zhFOg4BZyCap4bEQn1 +Hf9AfafetTzIB2ShH+pZw+t93qotzf8p3+yoT0zpSKedDuppnfjcU8ARSGMQRm6oU+WARd7Rxoq lXkdJYEiSHl+pgkGAH9ZAngjSBl7UxkblIGLsxiT9xhzoENzcGGWUXlyYCVTIHT4RhAriBng1xr0 8CEccITv8H8ZdIQHAAzv8BqwsTn0QA9JUAJz8A7dBxscAEGQMSXJVgeBYAZTUAdPFISXAQ/2oHz/ xwP0oH0ckA4OQH3e9zNFeDHlEn3pEH1G8IbeJ33wgFCPUXnV4AUxEAPQEANLEidm+Hj2AESm/wAM a6EudAFEa4F71iKDFPIEgZEYcgQMirMWJDVTxTEEpFiK8zcQEIAAcdAAJIAADQABsEgCDfCKEBAH rQgBsogAteiKr6iKDRAHtiiLqZiKv8iLrgiLupiKCIAArUgCEDCLupiMzPiMy4iMw+iMxwiL1piN JCCLcaCNzNgAzKiKxoiLy9iN1ciK18iL2qiO4aiLsxiP4iiO1diKy/iNtiiO5hiNcTCOxiiOt2iO w6iMx8iK5BiM39iNsAiNuoiOs/iMuDiPskiP52iM3UiLvIiOwkiRuNiNq6iMq/iQ+UgC31iPtFiL JNmK8biRKjmNtviMrHiR+piNEqmMJImRvv/YjsVYkf0IkPRokK44jqwIjcgYk6+Ij8s4j67YjMk4 j0C5jEFZj+T4ikCZivZ4kbUIjTL5kFD5jAE5jK64irm4lABJkl4Zj2GpjAAJkVlZjQuplkEZkhMp kVTpjNBIlU+JkggAABIAi03QBO0Ikh/Jl85olwzJiynwV1zgjLtIi3Y5kUnpk7D4jbT4i7mojLgI kUlpl9PYjBPZkUv5llbpmfbYj5MJB2AHAFzQBK+Qinz5in8JkT65kq85kbZpkBDACZNwdKZJjVDZ iwUZjUkpAY6xmnBQjcQpXhKQAsRIAsnpGH05lJ9JlWT5lgmpj8gYB4DADlknAfHwAM5ImDL/SYwi KYzsIAFmmZlB6ZXswAm7qJAumZTkSJLkmIwSwA5axwXsEAnieJ9JB1X7iY3+iXTHyYwpmZnAiZbN OJna2IpEgJ/E+JGtyJdFiY7UWJZ7KQENqZDAGZ4aaqDd6IwfKZGMKYv2iADECYxxkALxQAmpSJxm 2QApEAGT8ArLmKLfiJmr2JPeiIzCeZjR6Iwp0J5cSZEZ6oowCowpMF3c+QC2yJeqGAntCZ8QEAmP IQG/+ACUgGQ5l5LnSQRcwAnwOJwAAJFx8FesmKTJOKScIIvE6ZZYKZ9H6ZW36Isq2aAN8ACTAAe2 2JD6GAevCQHE+YssygWA8ACAAAir+Jpw/9Ce1piKKfAA7NAED/AKcXCfnPAARBAPwMCce9luTneN L1qm2tgE8YCkAHCROWqqbgoAU4mdS9mj7miOD7mQ2CioZSqPd5mhuIij2wkHv7iPfPkKq5kCxliN cXCerfgK7AAItQgBbMqKSZQCCNmRuLqMS4qfqPqKudgAg4qi+Il0xoqV5KmR3EqQbgmQ93miQWmX r+mt7ECS8dAEORqZ3qZtKRCs5UgCFEoC22ms5tgEwNCP3pajV9mqV/qQg0qNssgJ7DCLxMlPBYqO UBmVt3iRqviWsxgHifUKeKmeDQCll5qrgdqUIXszkRCS7tiLr4mirhqTzpmqEFCbDbmU4P96dA/A nCH5ptIIAZRACboIo4bplvUqmrJ5sNmIAK8AAIq6mdlYm29KAqvJij0Ji5dFCcBgqTUrnxTaAP9a r6YqrX1ZlBsLr8+KrsQJliQABzTXijAqjW6plzX7kLfIkPvoik2wn7FYi/k6sxrqra46sjYamQhw nizaqcc4tOeZio0KCL2YAu8KpVZZkYBbjel4reNIrPFgrJVrj5iZjpwZq1H5kLPImbLFDpTgdN75 ALXIl6t4n5AKDMBwqLYljq6bArLrqQv5iv2KAA6bqZu6uWJbjLGojmrakLBInP+Jdcz5jGn7m1dZ uvRojfBZsQvpkohFCfZUW8wZslgKuMP/mJj6SQnA6r26CAfAsLn72q+/SATaywXL2Y9HGovn2KoD GY+4ak+rSQS/CbiVqZIU+5sV2ZHimKN4iawf66MG+ZFeCZa764+8iJG9CJPnWLqqWpg2S6t3ao9H iZZuOabRaK12e7ZNGZhA6ZA+WrE2i5NDWb8mWrVW6Y5bG5T6SJUDeY8tDI7xKJbIiLEDHKTm2JIB 2ZWT6bkqya3wOL0nWroNSp/ceqf0+JH9K5SWe65a2Yt3aaK7O73+eKfyi5l1yZPXy5Wea7nwGLox Obp4yZlYDJbC2ZNkHJMROY/AiLG9yZX0O47YaJtJ2ZtaXJhfzJihaZWZ2a0EecLS+8GZ/2mrPXqM nQmTRNmnNKyZagmZtPqTQ5nHZxyQfVqWw8jAPoqNaKmgj2mi8GiVPGygvWiXkykDePDKsBzLsjzL riwDtnzLuJzLurzLuvzK1zAIwOwf2IEfAtIfApII9SEGthAgxWwLwPzM0BzN0jwIivDKrhzLtrwC dHADgZAD14wHtgzOtyzOudwFttwF6JzO6twFK7DO7vzO74wH16ADBVDP9mwL9pzP9ezM+tzP/vzP 9pwIuHwN1zAPMoDOK0AABJADOdDOBy0DBp3OBz0P6TwP7TwPFr0CGU0H80AHHO3RIB3SIj3SI70C K4AHiiAIMLDSLN3SLg0DKv3SMj3TMv8tCIfQznSQzxtNAN0sAnRg0kAd1EHt0QlNBwp91ARwA0q9 1Ezd1E7N1EmN1EZNB12gCJ2gAArgCI6gAFfdCV591Y7g1QogCGG91YLQ1WKt1V/91Vwt1lj91p0w CCZ9CDdt0h591D1NAEaN1EgdCDzN04EQ2IFwAzlA2EWQA7pQBIqt2NHQ2I7t2EUQDYs92UVwAZWt 2JZdBARwCM/Q2QXQCYIw1mftCCwAA4NwDgrAAgUQ1oOw0qR91qgtCAUQ2ljtCIJA1ljd2brd2Y2g 0LzACofAC7zg1zzN0DmgCYLN08MdCHWw3LxQBzmgDxeA2OqgDo2dAI3tCgngCl+QAHv/kADevQfi /d3dDd7ebd7obd7aHQ45cAiX4A6XAAPnINv2PAjPAAP1DAOX4AjnUACt7d8zgN9cvdX17d8FgN+C 4A4KvuCX0AiBzQvGoAoSPtzQzdBBkQPMDYa3A92epAn4MA59oAt9EA0D4AquMAETgAqo8AVf0At7 oAzKgAkyPuMwLuM4gAmkcOMw7uK7sAvFwOJA7gq6IAnd0AM9MAMogAyXsOQs4AjBsOQK3g1scAko MAPugALv/d7I0A0zsOTn0Akz8AwK3uWXYOQ9gAxG3g2I4EkYztAVztDwVgPjUANsrlLUoA/44A3e MAB8fuIojgpncAa+sAu9YAOGjgOL/7AIwrDowvAHjm4Hju7oiW4DmXAFPtAMPrALhFAMhBDoZ/AF uuAC5fADAkDWVI4C7oDkVe4OPxAMKIACwdAJl/AMLMAC58ACbDADMzAGChDmtO4Il5DrWP4DxF7s 5RADdaAPyq4J8KYJcy7n4xDtohEUzAAO4KDne17iA/Dnge4LbdAMV0DpiW4Cf2ACJqACIUAB6q7u kKACfmACHhDvmWAIFeAD9j4NbUAIvuALgT4B+uAC20AOleAIM6DSnSDfXz7b7tDfMC0IlwDmZ33g td4NBw/WZA0DTS4I3TAGAtDx5LANMTAaU2AGmJcQ1M4MeZ7tfP7ngO7t4C7u5h4CMv8fAmEQBqAw CjfvD+uO7uYe71Iw7/XuA9OA722w76gQ6ttwDJ/QAz+A5mZe5Gje9MgQDMjABtpg5K0eDMHQA91A 7JdQ5FqPDGJv5LfQ8WYP8vDGBF6wBqR4igXhd8yA7Xy+8imOCvu+C+E+7jKP7i1gABmQAZagB1ug B2Hge0PwAv0QBe4O71JgCPReAfU+9G3QBmfQBwDf8WPwCZUwBpzf+Zv/CWNQCZtfCdnA+b8g+pv/ C6C/+aHP+p1v9mcf8owyBIiYiAdR7XJP9yke6ITQC1eQCYsQ8ypAAS2QAS4gCRogB0sQC7HQAX8g CZLgAi6QAYgAAqOg+PDuAY0PBpD/XwFDPw2+YPlJLwCi7/GwLwChz/Gwr/nYcP7nPwbk4P7nj/Yq 0ipBghBxr+dzj+K7DxC+ml2xsciEiRAhKIwyI0mDhgu1/G15YadWKSgPJUlykWFNh1H9KPj550EK FSqGwICp4MNVqW0CPs2YUWnMrTE5x1QK5o6NM5s2f7jrVsnozqM2uwmoJMDpU6jbYogIEIBqAE01 qm7dCs7bALADJoxFdabNwEwGEUIC0QGRBl7iFOp5oSyBqz3hwj3kyxGRHgxLlvRTcc/TSZYV2rzc Rq4SDAXPzp1j8YwFi3OdHMFAMfkcGxYz3GGO3KmT5U6UO7EINgZq1KkBhsVww2TK/wetXKt6+wqW bFlCAxcJO6jQX4ctBsLVGhULlLIv0b/sgnLB+nUNfjHEAhnFjyeUK1sOgOn4HLJOClhEfvbM0QzT ChydUxAMBQrSCjLrl596fQ/XXnNKKhFEMCCMIeRowYCrdOtNLLJ8CS4ttVQAYZQttohFj1EWcEKc cC5IQLov9riguusuyC6DIRboYLDvTBJvGsacGuMYAX7J8ZZPPhnjB5tk+sW1HwVwrMdffvlEgDF8 vOWSJQUccCoRplhjiClOmUKEfXRjxjcIz5CwFwoPUqEfDDWMZYEthgjROjKa2YUQQpQRx4Y3L9hr RVA6eCQKFf45jArxanwKR6dwPP8mm2wSRdSpHh99KptjPsExQCkFIPAbTYbwwosYqNFtKzDL8mWX K9LKxAMT2NJCj1hiZWALF4q4LhxlfGjGhwnz0ksvDcKRxAw3MPAHkkBNQqyCCWByqhIedcppyDF+ sekTbHJiMqejpNWxEh9zivI1AqsSwQorRGBm1ADw8a2sYnohKJNVW40ChBc6KCOWU8yoRRk7yAgx nF582EXXOaupRi8ownHBL3RO0QNQP+4xoSQqKqgRG9G66aaHHpBBxrIffgimhx8+7uYTyn5A5hKP Q+4Bv2du6QaZbn4Y96lya/DZZ3arCjPeK64wZFUPFLq3lDAsaeGFBMSZuBllyJj/wgYbir4Ck17E qYYMcUixpBZLMjDD7DJGKeyee0qSwpBmt1nSkW7OcaQARxQQRBAYBFEABhiemUG+SwRhYTO+FZAP hk5gKOAcvAWpSUACRWDCgDrqMEAOTUZlhiyiBzraAz9UoECLhsQpJZwQLLHEBEIIEmb2TITBQZha MCGDjFpasAQHG8Iw42wXPoLk4n8ElQKMuJl0ZwYUoIfenfsuEfwZmO/7YYYfBEdB8EvceYb6+8af oQcdyY2hjim8kKaMMrxgovNRJ0Al3l19GF0FFUK4NwO4hOMPIEDEAkIwr9kJ4w8KTIgQyICJP0Rw dsNrQQvMtgUtUCAKUegHsjyA/4pS5OFZSDFKCUuYh2sZ5RPgMqEJSQgUcEmJQFYwwxCYwATcdEk3 +JgA/qahK0MsQgXIOtMLHMKLFjAAHepARAtqp8A/2MEOCUnIC0gBxT+EIAwZKEUpKmgAJyxBBRzs RxSOB8KYZEqNa2SjDKcCDmZoQgSaoB+7zlCMNhDih0crXelOZwa4XOARjFiDrcIBwSlS8QUheMEi hfACCrwAX2boYikkAQU7tGAUG3zEI7TQDxN8wVltJGUpKRcbfAzDZ8PoQ9CK4QtY7rFV/IPE6QDI i3CggwFmUEc4xGGJKkaSAhQAQTHD0AIQOOEFC5rCFCyZEQ1AAR1l1MIjyhjKUf+aUpuknKEBhvCB D6xhS3Y8g1l+6IEoUIB/YwSBCwLJCzuUQh1ToEAWG1nMZDrBCaBABzr0gI4W1IIUzRRHw/bUgg32 o5NaUEECQiipbUb0lOy7hTPK4IYy4IZdZTnDHlWQQSL2w4iBvFUthPCHF/ijmKBgqR7U9M8wCMF1 Uyhow6yjAQNEQRSQUKgWIDEFM+AiD0MlalGNyg+JsrFyTJADVUSQm/qJ6YeZiMImVeAHSDxiCA/h xa3CQYYwuHQL/gCFS9e0gAXEwglhOKYQSLE7gw4sA/0QhRYraAkXuCAUe+VrX/2aCm1II6lq7FlW gMYuZpjKBxUwgRZC4gesLgH/kBfoqnXCoY4XcIEBDGDpFtDKgLRmqJ8viOlbyQCFauhJTzldhAGc dkx1SGIG66BtbW1rWxZw4wdIHewpqaKJPoDzA63cqDkNYYIodHKIkGAISfWkDkv4YwGadekCQOsF NsGKnxVx61sVppfVvsAMFFDoIyCxh1LgYhMtZK9RsvEGWuQBor0lUA0+ED83eKEaddxKYs1SAUN4 IqvVrGVzIaIiX2KAEYwABiMyFKstbHZDGFBmGOwgBBzoLgELY5gl2LoEDIxCCyEQZRrbWAk2pAEb vT2lJurQghp+oAWcs6MvFgsGKfyjH2WMghaWgIiH5TUDGUDHgo3MCLRuAQOb/2UABigcSTv8AQdv ZcKvoCAOIbQgDBjoQAf6cY8SP4UfvJUSitMADRarb45ywNIpyrAlHXYFFdNow0qo4AkzDrGqMRhy R7ioB0YwYMGCBi2sNpvWBeCLuxkmw4ahAAUX1OIFFlgDKJyAjoqIwwAxOQY2cibCMqcYzWnmWWzA YYVhwFhU7PJFG6ZRATBQQRSlW64WwuCQh4RjCp9lMmgXsJ2zphUEFLiwEDChOyaIQ9MGMAMiGmG2 ZpuBDEVwgdzIsQ41qAEWedjZs0RN6lJfpQYiyBw42AWOVlcA1jn2BGT5pwV05LUUQzCDHXjta7S6 qAOIXgAFGshoq5Uir40ww/8aEDGER/iDrlSI249YgYVsb1tAZh41uHtmhSnI4RtQ1Y0vXr1uKXjg H6KYdT/8kQFLgJguGMh3WmPVAS53IFYsB0Gxj51xjphBFf0EAVs3KQrwvITbnwhFI7gRcW5DheLg ntJTP+CGU7jZChyvCjOmcfVYp0QKnmCb6VBniUeU1R9OZvl2nDyYLpMdAyAQAoZxMAVJZCDqmA5D StkKKFEsD41G0sYbjI70Rnn7zEzXFJWanbk1MIhdV59GrGO9dUHdY4MvKAUkxN4WtS/hEbEIjNo9 hAMcCEEOciggA+hSd38soYKQgAR4NDbKX/Td6EeXuOArTmoCaYIJawCnlj7/MAzdgKMNbVA3S3DM bgFz0ADCsAMFnPC0JYzCyf140SNg7uRYLeAFojfDKdDK5WGDwJot+INOpfC2LxgAF5UohzTyUI5Q sCLb2s5Do5bO9MpVwwtuyO9F96sbOoM14wMDros8hQKBKYCCENCDJeiAC3GyLlOnEGiOs5qVNNiX NemyF/mkaqogUaACgsCEasiAVChBE0yFNMg22ssDchiDb8O/2KgKcACHGsAHfNiHOAsAq3s141s3 rvOEkeuH6BOCKXgBPQAMtesAfxumCnQDWvAC0OKOmNM8T+oHIRAG8PgCVEAFTdCA+fvCL6Q9H3lB i4vBoNEN4oM1AcQxQakY/1E4E8F4gVqwvus7q1EIAemyLgZwAwv4PgjsMsGoQkioBRxYni9whQnI AQ3AAkZsRCw4uvnDgjRgCjLEPTM8Qxl0tZUYQFmDhHtwN54SjGHzh2E6QJbzLCbbAgtYE7LTwC6z Jp0SBawhlC+IhmgIhENgBV3cxYeLxDfQmfsrwwbBxKpwtTXcxE4UhU+EhKoSjCUAAdAThpOSrkOb lVX8tZhzRVgkOU9QBmUgFHXbhWhwAW3ImZz5AVjwxR9wjWC0xGHEROErPkJBxhxjRmTpMWdcAkaS JFK8kCVIKwtAQlcUjFEYDDMShX+QgmYghMQwhGZ4CVzABWeIyB5IQTXghiNQKAdn8JE8CIY0+IVN yANpGckx2ASTPEmUTMlNwIVLxMSAAAA7 ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/promo/ad2.gif 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 h0CnExcIADs= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/magsub.gif R0lGODlhowEuAPcAAFR/1DNmzFN+1FWA1VF91DRnzFV/1FB801J91Dxtzk150jVnzDVozf///1F8 005600l30kh20UFwz0970zZozTdpzUV00UJx0Ep30jlqzUFx0EZ00URz0Et40jprzj1uzzhqzU16 00x50kd10Ttszkl20TlrzkVz0EBwz0Ny0D5uzz9vzz1tzlaA1c3Z8pqz5pmz5vP2/FqD1l2F1meN 2WiN2c/b86e96VyF1s7a8+ft+fT3/HGV3Jy15miO2ubt+ViC1aS76Nrj9tTf9ICg31mD1tDc87PG 7EFxz6C46HSX3eju+X2e31yF12aM2W2S2pq05luE1tPe9PX3/LTH7J6252uQ2nqb3qG46FmC1cPS 8Nvk9qO66HCU21eB1XOW3NHd9Obs+U5702mP2pu05urv+vT2/MDQ79/n9+nv+mWM2Z2150160sHR 8LbI7XSX3GqP2o6q43mb3d7m983a86K56E560m+T28XU8EJxz2yR2qi+6aa86cnW8bXH7FqE1kNx 0GCI13aY3aC458LR8FR+1HKV3IWk4HeZ3W6S27bJ7dLd9MTT8Kq/6lyE1oKh4FF907fJ7cXU8bDE 62SL2NDb82KJ2IGg316H15Kt5FuF1o2q4mOK2LnK7b3O756357rL7nia3URy0Iel4ZSv5IOi4Imm 4ZOu5MDQ8I2p4lJ908jW8XGV2+nu+ai+6pew5avA6nKV293l9o6q4l2F15225o+r42GI12mO2qm/ 6rXI7cjV8Xyd3oGh4N3l98fV8WKK2HaZ3VSA1Z+353iZ3ViC1tHc832d3oWj4Jaw5YSj4K7C62uP 2rHF69zk9m2R2mKI13WX3bzN7rLG7Iuo4oal4ZCs5L3N752253WY3cnX8mWL2Imm4rLF7GGI2Iak 4V+H12CI2LTG7GSL2YKi4Nzl9pSv5WeM2dnj9pGs5JCr47zM7ujt+V2G1qu/6r7O73GU27LF6+nu +oim4ViB1W6S2n+g38bU8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAACjAS4A QAj/AAMIHEiwoMGCBRIqXMhw4YKHECMuYECxYkUKGDNW2MgRhEePGUJmMEHSg0kPJFKSSMCyZUsW H2J+UKFixQoUOCVI0MBTw4WfQFNwGMrhxAkLSDco3TBiRISnEUpAmEoVQ4erHUQo2MpVQYgHYB9M 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 ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/ts.gif R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/dingbats/indent.gif R0lGODlhCgAEAID/ANPQ0AAAACH5BAEAAAAALAAAAAAKAAQAQAIGhI+py50FADsA ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/caps/a.gif R0lGODlhLAA/APcAAKG541SBwNBEWZaw3qS65CVqsMnl+M3Y9Yun2Dx1uBNkrJSv3XeZ0N3o/QRh qXyo1RlmrmKLxuTx/8bU8l6Jxkp8vcjV8k5+v2qQyrXI68KauO72/4yo2o16qLzN75iy33ia0KnA 5rTG6tTh+Lo1Ucl7lQBeqNnk+1GAwN3s/SFpr0J4uuLu/q3A6Pj+/7rM7gBcptY1SC5ttDFwtIal 1lqSyP///2ySzApiqnOVzpJJcPb9/0R5u9rq/Iuo2F2HxB1oripss4Si1maNyFaEwcPR8aa85Q1j q9Lo+n6f1HWXz4Cg1GiOyZGs3HaYz9ZOYUB3urLE6m+Tzai95dbp+zRwtc7c9r3O8MHQ8TlytnCU zaRZfkZ5u7LH6pKt3Eh6vGSMx/z//8TT8VuGw/L5//H4/8ZOZ+rz/+jx/2yazmZro6/C6Z204Tp1 uFF/wLppiL3O76iNtGWVyihrstDd9+ny/y1tszpzt5u032uRyzZztoZpl//5//D3/8/n+dksPL/O 8K/E6cpddtYoOtwhMABbpf/X3Pibonqb0Z+24rjJ7IWk1oCf1FiFwp614X2e04Oh1au/598wPnyd 0Ymm2I6r2+peaqm955qz37DD6f/IzTVytn6e04em132d0y9vtONATcvX88zX9fP7/zVxte5teMDP 78DP8K3B6JOu3XKVzedPW5Cr2/+5v1B/v3CTzZu04XGUzfF9hlqFw7rK7KS64zdytfWMlPypsP/n 6sbU8f/2+LnK7vX7/2OLx7nK7DdzuDRxtp+24YOi1uz1/8PU8bi936J8pKbE5dVxhvvn8P/x9sPT 8X2RxtdabXFRg7/U8O/4/+e9zqhEZqZPctMnObtGYrXT7rlceouDs0Zvr2aYzKunzqKt1rikxkqO xM6pw8qzzsa72HOXz7pQbc7i946s29OUq8xqgw9jq/zc5NR+k8iMp7rK7k+Qxs4vRMY1TVGKw748 V9SJn3VzqIqbzLyEop9tlY1WgGZhl/fl7//i59M/U2l5sN+6ynKbzyH5BAAAAAAALAAAAAAsAD8A AAj/AAsJHDgQhgkTDnAogABBRYEgn6rYSgCFx5cKrlAQGUMhwhAMN2IpAeGJkZAyBAkeRHhkIRAV cyCSykLR4oWMGyn4+hhyZEkhNMikFLjSQUsIL2N+mlnzy80AOXfmuaHKCQhOSxZR4iA0ZdF0LmHa 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 SIGCe8BgKjgYCUjwgwEmTGEK2yAgADs= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/issues/02/02/PE/pefig01.gif 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 qU6VqlWNahAAADs= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/library/toolbar/3.0/text.aspx?t=TQ%3d%3d&f=FFFFFF&b=669AFF&font=Microsoft+Logo+95%2c+13pt&w=105&h=29&a=0&l=0&v=0&c=eAdQAhJgwJihw2DKZGDGx4FnKIM%3d /9j/4AAQSkZJRgABAQEAGAAYAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAdAGkDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD90/8A gmF8N9P8bfHbXtd1zS7LVdF8E+BtRujb6jZw39m+ta7fWWkadHNb3Mcls2dOfXbiNpFdkltUMcZb MsX6eeKf2bfCHi/9rDwT8Q73w34ctPh78O/hfp9zHYwaXplto3iHxz4k8UeI9P8ADsM9rDBHaagl jbebqRfEjLfx+HonWSG6Cn8uP2Nf2l/hh+zp8K/jc+rXWsL8UvGUDxeEbax0ea6s2fQvDupf8Iyb vVFZYrKOfxDrd2txnzGhht1uGjb92rfUNj/wUI+EhP7OXhy+1HxP/wAIx4I0O11T4pXh0G4kuNT8 VeH/AASui+GdHtbZJt+oWEPim7m8UXV5+5RL/QNDkjMitcRD+9vFjh/xXznxL4qzvhrKs+hlccir 8J5diKGGxbVXLVw5VzDOMTgIw5ac8RjcVVxmTZXVi71MfjKbhUhOjp/OPBmZ8G4HhTJ8vzbGZc8Z LMaec4qlUq0E4Yp5pTw+BpYmUryVKhRp0MdjINWhhqElKMlKz+rPin8Olv8Ax94w8QeBYvBHhS3+ EnwoWa5tj8KPD3jH+39W8VXereINS0eCyuLvS4LTUbbTvBPhOSCVYbu5lTXo4ovJRnW4/OyH9gf4 daJq3hfwf8c/2ibDwT8aviTp2p+JNM8KaVoEeoaNpUdvDfX982ra5cXlrp0iA2d9FFPcXXh6yv7+ zvdN0SfVXgWeT13xX/wUK+FOn+Evibq3gltd1X4geLPi14b8XafpWpaNNp2mXHhnwrq3gXR4dOu9 SImWCLV/BXgl2ntjE5gvNbuwwkl84S8X8Xvjj+wH8W/FFz8bfHlj8UPHviu58F6f4ftvhJIuseG9 Osr+xknntrqXXdGutKWCSMyNa3D23ibUtPEV1PfJo97eMqQeVwRlnjBwvQp4KeXcaZJlWKw6y9Yz h3hTJ824klmuV5Tl9XCUa8s7owpRyLE5/nOb42tjszxdGhioYKtgsPmOXUZSlLs4gxfA+b1JYiOK yHMMXRq/WXQzPOcdgcqjgsXjMRCvUpxy+pKbzGll2AwVCGHwlCpUoyxEMRVwuKmlFcv4N/4JrWWq eDNc8WeNPjfoXhS00vxvqPh6y1i202y1XwvrOg2GuWmi22t2Wqy67p+b3W7h7qz0vSgHdtU+yWJn lnlaIXNS/wCCf/wZ8DeLfCfw4+J37QWo6T8Q/iXq+o2/gHw9oXhM6in9mG+ls9Ck1y7Z3iiur5li hmmlOk2E2p/bNN0ya8isZdRfivi1+1p8Nv8AhTX7Nfw8+EOm3tsnw08Y6B8RPF/hmWLVrHRrfWNC lbW4vDen6tqdxfanq2jHXda1tIry+lurto7Cw1C8Nxe7JB734t/ak/Yt8WfFDw5+03qurfFi4+JH hjwWuhaJ8OrbRLeGDT9SRdZNrf8A2+aBtJ/tCxfXL4Q3CeIZrGKf7NqcVm91b+W32WKzHx8jJY3H Y7jRZdmtbjCGX4DIuEshWaYHFZXNYPhOhmMZ4DMXlmBzrEJ5jjsZiZ18NTwcI0cPjIwqyrVPCo4X w3a+r4fD5E8Vg4ZFLE4jMc6zH6piKOLj7fOqmFccThVi8RgKVsLh6FKNOtLESdSrQcoKnHyjwb/w TbuIpvi7f/Ebxjr95pHwr8Snw/baJ8LPDKeI/GXjGI+H/DviyC+03Trm6kSxubvQvE+ktBowg1S8 F5JeRvIIrOCTUeU/4YN0Px18WPDvgX4MfFSfW9Fn0S6174hz+LvC1/onif4U2kD6QtnaeINGmFgd Q1nxAdVePQ9KRdLnkn0vVvtbW9jYTagPVPA37Tn7Oeq2d541PxR+Ov7Pfxe1zX7PUvG19Y6r4n+K OleKrXTo57CytZLTXT4k0LUoItGTTLWG81TQdOv9JlsksdOgfRlkgufY2/4KW/BO9+MmtW9x4f8A ENp8M9b8FWfhW48fR6TGPEjanY6lrF1BcPpkM76lF4Whtdc1AWoj8/V4tQlNz/Y6JNII+bF8R/SI oY7NauCwPEuZYrC5NiKbw9ThzL8syvB47D4HLcHia+Hw08Bj8FxC6mNqZhm2RvJOI6uKxVWjGhj8 FDAKOBq7UMr8MamHwUMRicqwlGrjqUlVjmmJxeLr4eriMTiKVOrVjiMNXyxQoRw2CzH6/lcKNGE5 VMNXeIviIfMJ/Yh+B3jDwf4y8afCb9oi+13RPhRr4tPilqmseCtQ/s/TvDelhLzxZr3h46bCbnW2 0fQodT1jTYdNg1O11/7D9jtr6AXFveS/oXafs8/s/wDh3wz8Ef2dBe6El14niTxZqkF18Nnn8T/F /TfBkumeKdbfWvEQtvtPgu1ur/7EbqHVNRS7m0lj4SsPMhjmhX4OX9oz9mD4LfC4/Aj4HXfjTxV4 e+Jfiyyf4vfELxTpTW15beCdSu9O07xVY2Gmiz0e41S8n8KW93o9rp0Wn2VhFDd3t2bu6v7t0r1F /wBvT4IXf7XEHxV1FvFc/wAPdJ+Cs/gHw5eQ6KWubDxNqPieHxBq+p3WjyzR3apeWMC6MlzbSzBR DBvtGjmlurTxOKsr8ZuJLuFTxExeS5Q+KM94bePyrKMtzzE4nLsqy/B8P1cwwuFyegqWMr59i8zx eBwWJpUsypZZhnVwdLDYz6pj6ffk+L4Eyu3NDhijj8csny/NVh8ZjcVl9GlicZia+ZQw1atjqnNR p5dRwlHEV6U54WeLquFedWg6+Hl8Lftk+G/gj4d+NnjbT/hDrVsNM02Oz0668L6P4c1LStG8MeLd Fv5/DXiPw1b3mpMX1Q2y6Mdeu9ZtTJpt3f6y1pp80sdvKsHyDXoPxX1Dwvq/xK8b6t4L1HXdX8Ma r4j1PU9K1XxNFbQa7qMd/cNd3F7qMFnDb28M1zeTXEqRxwRFIWjWRBIHrz6v7F4Py/EZXwvkOBxW OzTMa+HyjLqdXE50oLM5Thg6EJRxihQw8vbwcWqvt4SxLqc7xFWrW55v8NzvE08Xm+Y4ijh8Hhad XG4mUKOA5vqii69Rp0OapVXs5Jpw9nJUuW3soQhaKKKKK+kPLCiiigAooooAKKKKACiiigAooooA KKKKACiiigD/2Q== ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: base64 Content-Location: http://c.microsoft.com/trans_pixel.asp?source=msdn&TYPE=PV&p=msdnmag_issues_02_02_PE&URI=%2fmsdnmag%2fissues%2f02%2f02%2fPE%2fdefault.aspx&GUID=1F4FC18C-F71E-47FB-8FC9-612F8EE59C61&r=http%3a%2f%2fwww.data-recovery-resource.com%2fdata-executable-format.html R0lGODlhAQABAIAAAP8zzAAAACH5BAEAAAAALAAAAAABAAEAQAIChFEAOwA= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdnmag/images/dingbats/rtg_btn_print.gif R0lGODlhLwASAPcRAPC6Fo2mjf/pi/Hx8fvWaPXOUP/xpvbHOP7mcddQN+OAcP//1u65GAMDUzAx Mv///wAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABEALAAAAAAvABIA AAjNAB8IHEiwoMGDCBMW/Mew4b8GCiNKNPhv4QOIEzMqrBig44OKFzWKpLiw4ciTAjl6HIgRJciJ Lwu2pGhyZEwHKjt6bOAA4cuYMAc6WACUJYGeJFMqZfgxZU2HPRtInUpVKgOkBH86HQhSa9MHPQ2I FUAWAQECBQocuEqTqVKub7+CDGuArACzaNWuxQrXYl+vcx/UJXs27wEFCdj6zcr4q1yBDgAwkAyg suXLfOP2fev147/IDEKLHj0ZQGaUBx2oXs269WnUsGPLnp0wIAA7 ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/msdnmag/issues/02/02/PE/ Inside Windows: An In-Depth Look into the Win32 Portable = Executable File Format -- MSDN Magazine, February 2002 =20 =0A= =0A= =0A=
<= table cellpadding=3D"0" cellspacing=3D"0" width=3D"100%" = border=3D"0">
Microsoft.com Home|Site = Map
3D"MSDN"
=09
Search for


Advanced = Search
3D"Microsoft
3D"ASP.NET
3D"MSDN 
MSDN = Home=C2=A0>=C2=A0MSDN Magazine=C2=A0>=C2=A0February = 2002
=20
Inside Windows

An In-Depth Look into the Win32 Portable Executable File = Format

Matt Pietrek
3D""
This article assumes you're familiar with = C++ and Win32
Level of Difficulty     1   2   3 
Download the code for this article: PE.exe (98KB)
SUMMARY A good understanding of the Portable = Executable (PE) file format leads to a good understanding of the = operating system. If you know what's in your DLLs and EXEs, you'll be a = more knowledgeable programmer. This article, the first of a two-part = series, looks at the changes to the PE format that have occurred over = the last few years, along with an overview of the format itself.
3D""After this update, the author discusses how the PE = format fits into applications written for .NET, PE file sections, RVAs, = the DataDirectory, and the importing of functions. An appendix includes = lists of the relevant image header structures and their = descriptions.

3D"A" long time ago, in a galaxy far = away, I wrote one of my first articles for Microsoft Systems = Journal (now MSDN® Magazine). The article, = "Peering Inside the PE: A Tour of the Win32 Portable Executable = File Format," turned out to be more popular than I had expected. To = this day, I still hear from people (even within Microsoft) who use that = article, which is still available from the MSDN Library. Unfortunately, = the problem with articles is that they're static. The world of = Win32® has changed quite a bit in the intervening years, and the = article is severely dated. I'll remedy that situation in a two-part = article starting this month.
3D""You might be wondering why you should care about = the executable file format. The answer is the same now as it was then: = an operating system's executable format and data structures reveal quite = a bit about the underlying operating system. By understanding what's in = your EXEs and DLLs, you'll find that you've become a better programmer = all around.
3D""Sure, you could learn a lot of what I'll tell you = by reading the Microsoft specification. However, like most specs, it = sacrifices readability for completeness. My focus in this article will = be to explain the most relevant parts of the story, while filling in the = hows and whys that don't fit neatly into a formal specification. In = addition, I have some goodies in this article that don't seem to appear = in any official Microsoft documentation.

Bridging the Gap
3D""Let me give you just a few examples of what has = changed since I wrote the article in 1994. Since 16-bit Windows® is = history, there's no need to compare and contrast the format to the Win16 = New Executable format. Another welcome departure from the scene is = Win32s®. This was the abomination that ran Win32 binaries very = shakily atop Windows 3.1.
3D""Back then, Windows 95 (codenamed = "Chicago" at the time) wasn't even released. Windows NT® = was still at version 3.5, and the linker gurus at Microsoft hadn't yet = started getting aggressive with their optimizations. However, there were = MIPS and DEC Alpha implementations of Windows NT that added to the = story.
3D""And what about all the new things that have come = along since that article? 64-bit Windows introduces its own variation of = the Portable Executable (PE) format. Windows CE adds all sorts of new = processor types. Optimizations such as delay loading of DLLs, section = merging, and binding were still over the horizon. There are many new = things to shoehorn into the story.
3D""And let's not forget about Microsoft® .NET. = Where does it fit in? To the operating system, .NET executables are just = plain old Win32 executable files. However, the .NET runtime recognizes = data within these executable files as the metadata and intermediate = language that are so central to .NET. In this article, I'll knock on the = door of the .NET metadata format, but save a thorough survey of its full = splendor for a subsequent article.
3D""And if all these additions and subtractions to the = world of Win32 weren't enough justification to remake the article with = modern day special effects, there are also errors in the original piece = that make me cringe. For example, my description of Thread Local Storage = (TLS) support was way out in left field. Likewise, my description of the = date/time stamp DWORD used throughout the file format is accurate only = if you live in the Pacific time zone!
3D""In addition, many things that were true then are = incorrect now. I had stated that the .rdata section wasn't really used = for anything important. Today, it certainly is. I also said that the = .idata section is a read/write section, which has been found to be most = untrue by people trying to do API interception today.
3D""Along with a complete update of the PE format = story in this article, I've also overhauled the PEDUMP program, which = displays the contents of PE files. PEDUMP can be compiled and run on = both the x86 and IA-64 platforms, and can dump both 32 and 64-bit PE = files. Most importantly, full source code for PEDUMP is available for = download fropm the link at the top of this article, so you have a = working example of the concepts and data structures described here.

Overview of the PE File Format
3D""Microsoft introduced the PE File format, more = commonly known as the PE format, as part of the original Win32 = specifications. However, PE files are derived from the earlier Common = Object File Format (COFF) found on VAX/VMS. This makes sense since much = of the original Windows NT team came from Digital Equipment Corporation. = It was natural for these developers to use existing code to quickly = bootstrap the new Windows NT platform.
3D""The term "Portable Executable" was = chosen because the intent was to have a common file format for all = flavors of Windows, on all supported CPUs. To a large extent, this goal = has been achieved with the same format used on Windows NT and = descendants, Windows 95 and descendants, and Windows CE.
3D""OBJ files emitted by Microsoft compilers use the = COFF format. You can get an idea of how old the COFF format is by = looking at some of its fields, which use octal encoding! COFF OBJ files = have many data structures and enumerations in common with PE files, and = I'll mention some of them as I go along.
3D""The addition of 64-bit Windows required just a few = modifications to the PE format. This new format is called PE32+. No new = fields were added, and only one field in the PE format was deleted. The = remaining changes are simply the widening of certain fields from 32 bits = to 64 bits. In most of these cases, you can write code that simply works = with both 32 and 64-bit PE files. The Windows header files have the = magic pixie dust to make the differences invisible to most C++-based = code.
3D""The distinction between EXE and DLL files is = entirely one of semantics. They both use the exact same PE format. The = only difference is a single bit that indicates if the file should be = treated as an EXE or as a DLL. Even the DLL file extension is = artificial. You can have DLLs with entirely different = extensions—for instance .OCX controls and Control Panel applets = (.CPL files) are DLLs.
3D""A very handy aspect of PE files is that the data = structures on disk are the same data structures used in memory. Loading = an executable into memory (for example, by calling LoadLibrary) is = primarily a matter of mapping certain ranges of a PE file into the = address space. Thus, a data structure like the IMAGE_NT_HEADERS (which = I'll examine later) is identical on disk and in memory. The key point is = that if you know how to find something in a PE file, you can almost = certainly find the same information when the file is loaded in = memory.
3D""It's important to note that PE files are not just = mapped into memory as a single memory-mapped file. Instead, the Windows = loader looks at the PE file and decides what portions of the file to map = in. This mapping is consistent in that higher offsets in the file = correspond to higher memory addresses when mapped into memory. The = offset of an item in the disk file may differ from its offset once = loaded into memory. However, all the information is present to allow you = to make the translation from disk offset to memory offset (see Figure 1).

3D"Figure
Figure 1 = Offsets

3D""When PE files are loaded into memory via the = Windows loader, the in-memory version is known as a module. The starting = address where the file mapping begins is called an HMODULE. This is a = point worth remembering: given an HMODULE, you know what data structure = to expect at that address, and you can use that knowledge to find all = the other data structures in memory. This powerful capability can be = exploited for other purposes such as API interception. (To be completely = accurate, an HMODULE isn't the same as the load address under Windows = CE, but that's a story for yet another day.)
3D""A module in memory represents all the code, data, = and resources from an executable file that is needed by a process. Other = parts of a PE file may be read, but not mapped in (for instance, = relocations). Some parts may not be mapped in at all, for example, when = debug information is placed at the end of the file. A field in the PE = header tells the system how much memory needs to be set aside for = mapping the executable into memory. Data that won't be mapped in is = placed at the end of the file, past any parts that will be mapped = in.
3D""The central location where the PE format (as well = as COFF files) is described is WINNT.H. Within this header file, you'll = find nearly every structure definition, enumeration, and #define needed = to work with PE files or the equivalent structures in memory. Sure, = there is documentation elsewhere. MSDN has the "Microsoft Portable = Executable and Common Object File Format Specification," for = instance (see the October 2001 MSDN CD under Specifications). But = WINNT.H is the final word on what PE files look like.
3D""There are many tools for examining PE files. Among = them are Dumpbin from Visual Studio, and Depends from the Platform SDK. = I particularly like Depends because it has a very succinct way of = examining a file's imports and exports. A great free PE viewer is = PEBrowse Professional, from Smidgeonsoft (http://www.smidgeonsoft.com). = The PEDUMP program included with this article is also very = comprehensive, and does almost everything Dumpbin does.
3D""From an API standpoint, the primary mechanism = provided by Microsoft for reading and modifying PE files is = IMAGEHLP.DLL.
3D""Before I start looking at the specifics of PE = files, it's worthwhile to first review a few basic concepts that thread = their way through the entire subject of PE files. In the following = sections, I will discuss PE file sections, relative virtual addresses = (RVAs), the data directory, and how functions are imported.

PE File Sections
3D""A PE file section represents code or data of some = sort. While code is just code, there are multiple types of data. Besides = read/write program data (such as global variables), other types of data = in sections include API import and export tables, resources, and = relocations. Each section has its own set of in-memory attributes, = including whether the section contains code, whether it's read-only or = read/write, and whether the data in the section is shared between all = processes using the executable.
3D""Generally speaking, all the code or data in a = section is logically related in some way. At a minimum, there are = usually at least two sections in a PE file: one for code, the other for = data. Commonly, there's at least one other type of data section in a PE = file. I'll look at the various kinds of sections in Part 2 of this = article next month.
3D""Each section has a distinct name. This name is = intended to convey the purpose of the section. For example, a section = called .rdata indicates a read-only data section. Section names are used = solely for the benefit of humans, and are insignificant to the operating = system. A section named FOOBAR is just as valid as a section called = .text. Microsoft typically prefixes their section names with a period, = but it's not a requirement. For years, the Borland linker used section = names like CODE and DATA.
3D""While compilers have a standard set of sections = that they generate, there's nothing magical about them. You can create = and name your own sections, and the linker happily includes them in the = executable. In Visual C++, you can tell the compiler to insert code or = data into a section that you name with #pragma statements. For instance, = the statement
#pragma data_seg( "MY_DATA" )
causes all data emitted by Visual C++ to go into a section called = MY_DATA, rather than the default .data section. Most programs are fine = using the default sections emitted by the compiler, but occasionally you = may have funky requirements which necessitate putting code or data into = a separate section.
3D""Sections don't spring fully formed from the = linker; rather, they start out in OBJ files, usually placed there by the = compiler. The linker's job is to combine all the required sections from = OBJ files and libraries into the appropriate final section in the PE = file. For example, each OBJ file in your project probably has at least a = .text section, which contains code. The linker takes all the sections = named .text from the various OBJ files and combines them into a single = .text section in the PE file. Likewise, all the sections named .data = from the various OBJs are combined into a single .data section in the PE = file. Code and data from .LIB files are also typically included in an = executable, but that subject is outside the scope of this article.
3D""There is a rather complete set of rules that = linkers follow to decide which sections to combine and how. I gave an = introduction to the linker algorithms in the July 1997 Under The = Hood column in MSJ. A section in an OBJ file may be intended = for the linker's use, and not make it into the final executable. A = section like this would be intended for the compiler to pass information = to the linker.
3D""Sections have two alignment values, one within the = disk file and the other in memory. The PE file header specifies both of = these values, which can differ. Each section starts at an offset that's = some multiple of the alignment value. For instance, in the PE file, a = typical alignment would be 0x200. Thus, every section begins at a file = offset that's a multiple of 0x200.
3D""Once mapped into memory, sections always start on = at least a page boundary. That is, when a PE section is mapped into = memory, the first byte of each section corresponds to a memory page. On = x86 CPUs, pages are 4KB aligned, while on the IA-64, they're 8KB = aligned. The following code shows a snippet of PEDUMP output for the = .text and .data section of the Windows XP KERNEL32.DLL.
Section Table
  01 .text     VirtSize: 00074658  VirtAddr:  00001000
    raw data offs:   00000400  raw data size: 00074800
•••
  02 .data     VirtSize: 000028CA  VirtAddr:  00076000
    raw data offs:   00074C00  raw data size: 00002400
The .text section is at offset 0x400 in the PE file and will be 0x1000 = bytes above the load address of KERNEL32 in memory. Likewise, the .data = section is at file offset 0x74C00 and will be 0x76000 bytes above = KERNEL32's load address in memory.
3D""It's possible to create PE files in which the = sections start at the same offset in the file as they start from the = load address in memory. This makes for larger executables, but can speed = loading under Windows 9x or Windows Me. The default /OPT:WIN98 = linker option (introduced in Visual Studio 6.0) causes PE files to be = created this way. In Visual Studio® .NET, the linker may or may not = use /OPT:NOWIN98, depending on whether the file is small enough.
3D""An interesting linker feature is the ability to = merge sections. If two sections have similar, compatible attributes, = they can usually be combined into a single section at link time. This is = done via the linker /merge switch. For instance, the following linker = option combines the .rdata and .text sections into a single section = called .text:
/MERGE:.rdata=3D.text
3D""The advantage to merging sections is that it saves = space, both on disk and in memory. At a minimum, each section occupies = one page in memory. If you can reduce the number of sections in an = executable from four to three, there's a decent chance you'll use one = less page of memory. Of course, this depends on whether the unused space = at the end of the two merged sections adds up to a page.
3D""Things can get interesting when you're merging = sections, as there are no hard and fast rules as to what's allowed. For = example, it's OK to merge .rdata into .text, but you shouldn't merge = .rsrc, .reloc, or .pdata into other sections. Prior to Visual Studio = .NET, you could merge .idata into other sections. In Visual Studio .NET, = this is not allowed, but the linker often merges parts of the .idata = into other sections, such as .rdata, when doing a release build.
3D""Since portions of the imports data are written to = by the Windows loader when they are loaded into memory, you might wonder = how they can be put in a read-only section. This situation works because = at load time the system can temporarily set the attributes of the pages = containing the imports data to read/write. Once the imports table is = initialized, the pages are then set back to their original protection = attributes.

Relative Virtual Addresses
3D""In an executable file, there are many places where = an in-memory address needs to be specified. For instance, the address of = a global variable is needed when referencing it. PE files can load just = about anywhere in the process address space. While they do have a = preferred load address, you can't rely on the executable file actually = loading there. For this reason, it's important to have some way of = specifying addresses that are independent of where the executable file = loads.
3D""To avoid having hardcoded memory addresses in PE = files, RVAs are used. An RVA is simply an offset in memory, relative to = where the PE file was loaded. For instance, consider an EXE file loaded = at address 0x400000, with its code section at address 0x401000. The RVA = of the code section would be:
(target address) 0x401000 - (load address)0x400000  =3D (RVA)0x1000.
3D""To convert an RVA to an actual address, simply = reverse the process: add the RVA to the actual load address to find the = actual memory address. Incidentally, the actual memory address is called = a Virtual Address (VA) in PE parlance. Another way to think of a VA is = that it's an RVA with the preferred load address added in. Don't forget = the earlier point I made that a load address is the same as the = HMODULE.
3D""Want to go spelunking through some arbitrary DLL's = data structures in memory? Here's how. Call GetModuleHandle with the = name of the DLL. The HMODULE that's returned is just a load address; you = can apply your knowledge of the PE file structures to find anything you = want within the module.

The Data Directory
3D""There are many data structures within executable = files that need to be quickly located. Some obvious examples are the = imports, exports, resources, and base relocations. All of these = well-known data structures are found in a consistent manner, and the = location is known as the DataDirectory.
3D""The DataDirectory is an array of 16 structures. = Each array entry has a predefined meaning for what it refers to. The = IMAGE_DIRECTORY_ENTRY_ xxx #defines are array indexes into the = DataDirectory (from 0 to 15). Figure 2 describes what each of the = IMAGE_DATA_DIRECTORY_xxx values refers to. A more detailed = description of many of the pointed-to data structures will be included = in Part 2 of this article.

Importing Functions
3D""When you use code or data from another DLL, you're = importing it. When any PE file loads, one of the jobs of the Windows = loader is to locate all the imported functions and data and make those = addresses available to the file being loaded. I'll save the detailed = discussion of data structures used to accomplish this for Part 2 of this = article, but it's worth going over the concepts here at a high = level.
3D""When you link directly against the code and data = of another DLL, you're implicitly linking against the DLL. You don't = have to do anything to make the addresses of the imported APIs available = to your code. The loader takes care of it all. The alternative is = explicit linking. This means explicitly making sure that the target DLL = is loaded and then looking up the address of the APIs. This is almost = always done via the LoadLibrary and GetProcAddress APIs.
3D""When you implicitly link against an API, = LoadLibrary and GetProcAddress-like code still executes, but the loader = does it for you automatically. The loader also ensures that any = additional DLLs needed by the PE file being loaded are also loaded. For = instance, every normal program created with Visual C++® links = against KERNEL32.DLL. KERNEL32.DLL in turn imports functions from = NTDLL.DLL. Likewise, if you import from GDI32.DLL, it will have = dependencies on the USER32, ADVAPI32, NTDLL, and KERNEL32 DLLs, which = the loader makes sure are loaded and all imports resolved. (Visual Basic = 6.0 and the Microsoft .NET executables directly link against a different = DLL than KERNEL32, but the same principles apply.)
3D""When implicitly linking, the resolution process = for the main EXE file and all its dependent DLLs occurs when the program = first starts. If there are any problems (for example, a referenced DLL = that can't be found), the process is aborted.
3D""Visual C++ 6.0 added the delayload feature, which = is a hybrid between implicit linking and explicit linking. When you = delayload against a DLL, the linker emits something that looks very = similar to the data for a regular imported DLL. However, the operating = system ignores this data. Instead, the first time a call to one of the = delayloaded APIs occurs, special stubs added by the linker cause the DLL = to be loaded (if it's not already in memory), followed by a call to = GetProcAddress to locate the called API. Additional magic makes it so = that subsequent calls to the API are just as efficient as if the API had = been imported normally.
3D""Within a PE file, there's an array of data = structures, one per imported DLL. Each of these structures gives the = name of the imported DLL and points to an array of function pointers. = The array of function pointers is known as the import address table = (IAT). Each imported API has its own reserved spot in the IAT where the = address of the imported function is written by the Windows loader. This = last point is particularly important: once a module is loaded, the IAT = contains the address that is invoked when calling imported APIs.
3D""The beauty of the IAT is that there's just one = place in a PE file where an imported API's address is stored. No matter = how many source files you scatter calls to a given API through, all the = calls go through the same function pointer in the IAT.
3D""Let's examine what the call to an imported API = looks like. There are two cases to consider: the efficient way and = inefficient way. In the best case, a call to an imported API looks like = this:
CALL DWORD PTR [0x00405030]
If you're not familiar with x86 assembly language, this is a call = through a function pointer. Whatever DWORD-sized value is at 0x405030 is = where the CALL instruction will send control. In the previous example, = address 0x405030 lies within the IAT.
3D""The less efficient call to an imported API looks = like this:
CALL 0x0040100C
•••
0x0040100C:
JMP       DWORD PTR [0x00405030]
In this situation, the CALL transfers control to a small stub. The stub = is a JMP to the address whose value is at 0x405030. Again, remember that = 0x405030 is an entry within the IAT. In a nutshell, the less efficient = imported API call uses five bytes of additional code, and takes longer = to execute because of the extra JMP.
3D""You're probably wondering why the less efficient = method would ever be used. There's a good explanation. Left to its own = devices, the compiler can't distinguish between imported API calls and = ordinary functions within the same module. As such, the compiler emits a = CALL instruction of the form
CALL XXXXXXXX
where XXXXXXXX is an actual code address that will be filled in = by the linker later. Note that this last CALL instruction isn't through = a function pointer. Rather, it's an actual code address. To keep the = cosmic karma in balance, the linker needs to have a chunk of code to = substitute for XXXXXXXX. The simplest way to do this is to make = the call point to a JMP stub, like you just saw.
3D""Where does the JMP stub come from? Surprisingly, = it comes from the import library for the imported function. If you were = to examine an import library, and examine the code associated with the = imported API name, you'd see that it's a JMP stub like the one just = shown. What this means is that by default, in the absence of any = intervention, imported API calls will use the less efficient form.
3D""Logically, the next question to ask is how to get = the optimized form. The answer comes in the form of a hint you give to = the compiler. The __declspec(dllimport) function modifier tells the = compiler that the function resides in another DLL and that the compiler = should generate this instruction
CALL DWORD PTR [XXXXXXXX]
rather than this one:
CALL XXXXXXXX
3D""In addition, the compiler emits information = telling the linker to resolve the function pointer portion of the = instruction to a symbol named __imp_functionname. For instance, if you = were calling MyFunction, the symbol name would be __imp_MyFunction. = Looking in an import library, you'll see that in addition to the regular = symbol name, there's also a symbol with the __imp__ prefix on it. This = __imp__ symbol resolves directly to the IAT entry, rather than to the = JMP stub.
3D""So what does this mean in your everyday life? If = you're writing exported functions and providing a .H file for them, = remember to use the __declspec(dllimport) modifier with the = function:
__declspec(dllimport) void Foo(void);
If you look at the Windows system header files, you'll find that they = use __declspec(dllimport) for the Windows APIs. It's not easy to see = this, but if you search for the DECLSPEC_IMPORT macro defined in = WINNT.H, and which is used in files such as WinBase.H, you'll see how = __declspec(dllimport) is prepended to the system API declarations.

PE File Structure
3D""Now let's dig into the actual format of PE files. = I'll start from the beginning of the file, and describe the data = structures that are present in every PE file. Afterwards, I'll describe = the more specialized data structures (such as imports or resources) that = reside within a PE's sections. All of the data structures that I'll = discuss below are defined in WINNT.H, unless otherwise noted.
3D""In many cases, there are matching 32 and 64-bit = data structures—for example, IMAGE_NT_HEADERS32 and = IMAGE_NT_HEADERS64. These structures are almost always identical, except = for some widened fields in the 64-bit versions. If you're trying to = write portable code, there are #defines in WINNT.H which select the = appropriate 32 or 64-bit structures and alias them to a size-agnostic = name (in the previous example, it would be IMAGE_NT_HEADERS). The = structure selected depends on which mode you're compiling for = (specifically, whether _WIN64 is defined or not). You should only need = to use the 32 or 64-bit specific versions of the structures if you're = working with a PE file with size characteristics that are different from = those of the platform you're compiling for.

The MS-DOS Header
3D""Every PE file begins with a small MS-DOS® = executable. The need for this stub executable arose in the early days of = Windows, before a significant number of consumers were running it. When = executed on a machine without Windows, the program could at least print = out a message saying that Windows was required to run the = executable.
3D""The first bytes of a PE file begin with the = traditional MS-DOS header, called an IMAGE_DOS_HEADER. The only two = values of any importance are e_magic and e_lfanew. The e_lfanew field = contains the file offset of the PE header. The e_magic field (a WORD) = needs to be set to the value 0x5A4D. There's a #define for this value, = named IMAGE_DOS_SIGNATURE. In ASCII representation, 0x5A4D is MZ, the = initials of Mark Zbikowski, one of the original architects of = MS-DOS.

The IMAGE_NT_HEADERS Header
3D""The IMAGE_NT_HEADERS structure is the primary = location where specifics of the PE file are stored. Its offset is given = by the e_lfanew field in the IMAGE_DOS_HEADER at the beginning of the = file. There are actually two versions of the IMAGE_NT_HEADER structure, = one for 32-bit executables and the other for 64-bit versions. The = differences are so minor that I'll consider them to be the same for the = purposes of this discussion. The only correct, Microsoft-approved way of = differentiating between the two formats is via the value of the Magic = field in the IMAGE_OPTIONAL_HEADER (described shortly).
3D""An IMAGE_NT_HEADER is comprised of three = fields:
typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
In a valid PE file, the Signature field is set to the value 0x00004550, = which in ASCII is "PE00". A #define, IMAGE_NT_SIGNATURE, is = defined for this value. The second field, a struct of type = IMAGE_FILE_HEADER, predates PE files. It contains some basic information = about the file; most importantly, a field describing the size of the = optional data that follows it. In PE files, this optional data is very = much required, but is still called the IMAGE_OPTIONAL_HEADER.
3D""Figure 3 shows the fields of the = IMAGE_FILE_HEADER structure, with additional notes for the fields. This = structure can also be found at the very beginning of COFF OBJ files. Figure 4 lists the common values of = IMAGE_FILE_xxx. Figure 5 shows the members of the = IMAGE_OPTIONAL_HEADER structure.
3D""The DataDirectory array at the end of the = IMAGE_OPTIONAL_HEADERs is the address book for important locations = within the executable. Each DataDirectory entry looks like this:
typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;     // RVA of the data
    DWORD   Size;               // Size of the data
};
The Section Table
3D""Immediately following the IMAGE_NT_HEADERS is the = section table. The section table is an array of IMAGE_SECTION_HEADERs = structures. An IMAGE_SECTION_HEADER provides information about its = associated section, including location, length, and characteristics. Figure 6 contains a description of the = IMAGE_SECTION_HEADER fields. The number of IMAGE_SECTION_HEADER = structures is given by the IMAGE_NT_HEADERS.FileHeader.NumberOfSections = field.
3D""The file alignment of sections in the executable = file can have a significant impact on the resulting file size. In Visual = Studio 6.0, the linker defaulted to a section alignment of 4KB, unless = /OPT:NOWIN98 or the /ALIGN switch was used. The Visual Studio .NET = linker, while still defaulting to /OPT:WIN98, determines if the = executable is below a certain size and if that is the case uses = 0x200-byte alignment.
3D""Another interesting alignment comes from the .NET = file specification. It says that .NET executables should have an = in-memory alignment of 8KB, rather than the expected 4KB for x86 = binaries. This is to ensure that .NET executables built with x86 entry = point code can still run under IA-64. If the in-memory section alignment = were 4KB, the IA-64 loader wouldn't be able to load the file, since = pages are 8KB on 64-bit Windows.

Wrap-up
3D""That's it for the headers of PE files. In Part 2 = of this article I'll continue the tour of portable executable files by = looking at commonly encountered sections. Then I'll describe the major = data structures within those sections, including imports, exports, and = resources. And finally, I'll go over the source for the updated and = vastly improved PEDUMP.

For background information see:
The Common = Object File Format (COFF)


Matt Pietrek is an independent writer, = consultant, and trainer. He was the lead architect for = Compuware/NuMega's Bounds Checker product line for eight years and has = authored three books on Windows system programming. His Web site, at http://www.wheaty.net, has a FAQ page = and information on previous columns and articles.

From the February = 2002 issue of MSDN = Magazine.
Get it at your local newsstand, or better yet, subscribe.
3D""/ 3D""/
=09

© 2005 Microsoft Corporation. All rights = reserved. Terms of Use = |Trademarks = |Privacy = Statement
3D"Microsoft"
------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/msdnmag/css/mag.css BODY { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; COLOR: #000000; PADDING-TOP: 0px; FONT-FAMILY: = verdana,arial,helvetica; BACKGROUND-COLOR: #ffffff } DIV.clsDocBody { PADDING-RIGHT: 0px; PADDING-LEFT: 10px; FONT-SIZE: 68%; PADDING-BOTTOM: = 10px; MARGIN: 0px 10px 0px 0px; PADDING-TOP: 0px } TD.clsDocBody { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: = 10px; FONT-SIZE: 68%; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: = 0px } TD.clsContainer { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: = 10px; FONT-SIZE: 68%; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: = 0px } DIV.clsFigDiv { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 68%; PADDING-BOTTOM: = 0px; MARGIN: 10px; PADDING-TOP: 0px } DIV.clsPrint { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 68%; = PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 10px } P { MARGIN: 0em; TEXT-INDENT: 1em; LINE-HEIGHT: 1.5em } P.clsNoIndent { TEXT-INDENT: 0em } P.clsDropCap { TEXT-INDENT: 0em } P.clsDropCap:first-letter { PADDING-RIGHT: 5px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: = 180%; FLOAT: left; PADDING-BOTTOM: 5px; COLOR: #cc3300; PADDING-TOP: 5px } P.clsQA { TEXT-INDENT: 0em } P.clsQA:first-letter { FONT-WEIGHT: bold; FONT-SIZE: 110%; COLOR: #cc3300 } UL { MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 25px } OL { MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 25px } LI { =09 } TD { FONT-SIZE: 68%; VERTICAL-ALIGN: top } TH { FONT-WEIGHT: bold; FONT-SIZE: 68%; BACKGROUND-COLOR: #99ccff } PRE { PADDING-RIGHT: 5pt; MARGIN-TOP: 1em; PADDING-LEFT: 5pt; FONT-SIZE: 90%; = BACKGROUND: #eeeeee; MARGIN-BOTTOM: 1em; PADDING-BOTTOM: 5pt; = LINE-HEIGHT: 1em; PADDING-TOP: 5pt; FONT-FAMILY: 'courier = new',courier,serif } PRE.clsCode { PADDING-RIGHT: 5pt; MARGIN-TOP: 1em; PADDING-LEFT: 5pt; FONT-SIZE: 90%; = BACKGROUND: #eeeeee; MARGIN-BOTTOM: 1em; PADDING-BOTTOM: 5pt; = LINE-HEIGHT: 1em; PADDING-TOP: 5pt; FONT-FAMILY: 'courier = new',courier,serif } BLOCKQUOTE { MARGIN-TOP: 1em; MARGIN-BOTTOM: 1em; LINE-HEIGHT: 1em } .clsDeck { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; = PADDING-TOP: 2px } SPAN.clsSum { MARGIN-TOP: 2px; FONT-WEIGHT: bold; FLOAT: left; COLOR: #000080 } DIV.clsBeta { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-SIZE: 90%; Z-INDEX: 1; = PADDING-BOTTOM: 5px; MARGIN: 3px 0px 0px; COLOR: #ffffff; PADDING-TOP: = 5px; POSITION: relative; BACKGROUND-COLOR: #3366cc } DIV.clsFamiliar { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; = PADDING-TOP: 3px } DIV.clsDownload { PADDING-RIGHT: 3px; PADDING-LEFT: 0px; PADDING-BOTTOM: 3px; MARGIN: 0px = 0px 3px; PADDING-TOP: 3px } SPAN.clsLevel { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; COLOR: = #999999; PADDING-TOP: 0px } DIV.clsLevel { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; = PADDING-BOTTOM: 3px; COLOR: #ffffff; PADDING-TOP: 3px; BACKGROUND-COLOR: = #3366cc } SPAN.pd { COLOR: #008080 } DIV.pd { FLOAT: left; COLOR: #008080 } DIV.clsInfoBox { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px = 0px 0px; PADDING-TOP: 5px; BACKGROUND-COLOR: #3366cc } LI.clsInfoBox { MARGIN-BOTTOM: 0.2em } DIV.clsDiscuss { MARGIN: 0px 20px 0px 0px } .articletext { VERTICAL-ALIGN: top; LINE-HEIGHT: 1.5em } SPAN.dropcap { FONT-WEIGHT: bold; FONT-SIZE: 250%; COLOR: #cc3300 } DIV.dropcap { FONT-WEIGHT: bold; FONT-SIZE: 250%; FLOAT: left; MARGIN: 0px 2px 2px = 0px; VERTICAL-ALIGN: top; COLOR: #cc3300; LINE-HEIGHT: 1em } SPAN.QAcap { FONT-WEIGHT: bold; FONT-SIZE: 140%; COLOR: #cc3300 } A.clsWhite { COLOR: #ffffff } A.clsWhite:visited { COLOR: #ffffff } A.clsWhite:hover { COLOR: #ffffff } SPAN.clsSmWhite { FONT-SIZE: 80%; COLOR: #ffffff } .clsSubhead { FONT-WEIGHT: bold; FONT-SIZE: 115%; COLOR: #008080 } SPAN.clsSmHead { FONT-WEIGHT: bold; FONT-SIZE: 120%; TEXT-TRANSFORM: uppercase; COLOR: = #cc3300 } DIV.clsBio { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-SIZE: 90%; PADDING-BOTTOM: = 5px; MARGIN: 0px 0px 5px; LINE-HEIGHT: 1.2em; PADDING-TOP: 5px; = BACKGROUND-COLOR: #cccccc } SPAN.clsBio { FONT-SIZE: 90%; LINE-HEIGHT: 1.2em } .clsGloss { FONT-WEIGHT: bold; COLOR: #000080 } .clsRed { COLOR: red } .clsInfo { FONT-SIZE: 90% } .clsSmall { FONT-SIZE: 90% } DIV.clsContents { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: = 10px; PADDING-BOTTOM: 10px; MARGIN: 0px; WIDTH: 550px; PADDING-TOP: 0px } DIV.extras { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; MARGIN: 0px = 10px 0px 20px; PADDING-TOP: 5px; HEIGHT: 45px } DIV.clsInfoBar { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 3px; MARGIN: = 5px 0px 5px 5px; WIDTH: 315px; PADDING-TOP: 3px; HEIGHT: 15px; = BACKGROUND-COLOR: #cc3300 } SPAN.clsSearchBox { FONT-WEIGHT: bold; COLOR: #cc3300 } SPAN.functionbar { FONT-WEIGHT: bold; FONT-SIZE: 110%; FLOAT: left; TEXT-TRANSFORM: = uppercase; COLOR: #ffffff } SPAN.functionbartext { FONT-SIZE: 80%; FLOAT: right; COLOR: #ffffff } TD.clsColumns { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px } TD.clsLND { COLOR: #008080; LINE-HEIGHT: 1em } SPAN.st { FONT-WEIGHT: bold; FONT-SIZE: 110% } DIV.Banner { BORDER-RIGHT: #003399 2px solid; PADDING-RIGHT: 5px; BORDER-TOP: = #003399 2px solid; PADDING-LEFT: 5px; FLOAT: right; PADDING-BOTTOM: 5px; = VERTICAL-ALIGN: top; BORDER-LEFT: #003399 2px solid; WIDTH: 200px; = PADDING-TOP: 5px; BORDER-BOTTOM: #003399 2px solid; TEXT-ALIGN: center } DIV.NextMonth { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; WIDTH: = 100px; PADDING-TOP: 0px; TEXT-ALIGN: center } SPAN.clsNextMonth { FONT-WEIGHT: bold; FONT-SIZE: 160%; COLOR: #cc3300 } HR.clsBlue { COLOR: #3399cc } HR.clsGray { COLOR: #999999 } SPAN.clsOnSale { FONT-WEIGHT: bold; COLOR: #003399 } .clsCap { FONT-WEIGHT: bold; COLOR: #000080 } .clsCaptxt { COLOR: #000080 } .clsFigs { FONT-WEIGHT: bold } .clsField { FONT-WEIGHT: bold } .clsFigure { FONT-WEIGHT: bold } A.small { FONT-SIZE: 95%; TEXT-DECORATION: underline } DIV.eyebrow { MARGIN: 10px } DIV.smalleyebrow { FONT-SIZE: 68%; MARGIN: 10px; LINE-HEIGHT: 1.2em } A { COLOR: #003399 } A:visited { COLOR: #660099 } A:hover { COLOR: #ff3300 } H1 { FONT-SIZE: 165%; MARGIN: 0px } H2 { FONT-SIZE: 125%; MARGIN: 0px } H3 { FONT-SIZE: 115%; MARGIN: 0px } H4 { FONT-SIZE: 100%; MARGIN: 0px } H5 { FONT-SIZE: 100%; MARGIN: 0px } H6 { FONT-SIZE: 100%; MARGIN: 0px } HR { COLOR: #cccccc; HEIGHT: 1px } .unsorted { BORDER-RIGHT: #999999 1px solid; BORDER-TOP: #ffffff 1px solid; = FONT-SIZE: 68%; BORDER-LEFT: #ffffff 1px solid; CURSOR: hand; = BORDER-BOTTOM: #999999 1px solid; FONT-FAMILY: Verdana; = BACKGROUND-COLOR: #cccccc } .unsorted A { FONT-WEIGHT: bold; TEXT-DECORATION: none } .unsorted A:link { COLOR: #000000 } .unsorted A:visited { COLOR: #000000 } .unsorted A:hover { COLOR: #ff3300 } .sorted { BORDER-RIGHT: #cccccc 1px solid; BACKGROUND-POSITION: right center; = BORDER-TOP: #666666 1px solid; FONT-SIZE: 68%; BACKGROUND-IMAGE: = url(/msdnmag/images/dingbats/arrow-up.gif); BORDER-LEFT: #666666 1px = solid; CURSOR: hand; BORDER-BOTTOM: #cccccc 1px solid; = BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Verdana; BACKGROUND-COLOR: = #999999 } .sorted A { FONT-WEIGHT: bold; TEXT-DECORATION: none } .sorted A:link { COLOR: #ffffff } .sorted A:visited { COLOR: #ffffff } .sorted A:hover { COLOR: #ff3300 } .sortedDESC { BORDER-RIGHT: #cccccc 1px solid; BACKGROUND-POSITION: right center; = BORDER-TOP: #666666 1px solid; FONT-SIZE: 68%; BACKGROUND-IMAGE: = url(/msdnmag/images/dingbats/arrow-down.gif); BORDER-LEFT: #666666 1px = solid; CURSOR: hand; BORDER-BOTTOM: #cccccc 1px solid; = BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Verdana; BACKGROUND-COLOR: = #999999 } .sortedDESC A { FONT-WEIGHT: bold; TEXT-DECORATION: none } .sortedDESC A:link { COLOR: #ffffff } .sortedDESC A:visited { COLOR: #ffffff } .sortedDESC A:hover { COLOR: #ff3300 } .filters { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; = PADDING-LEFT: 12px; FONT-SIZE: 75%; VERTICAL-ALIGN: middle; BORDER-LEFT: = #cccccc 1px solid; COLOR: #000000; BORDER-BOTTOM: #cccccc 1px solid; = FONT-FAMILY: Tahoma; HEIGHT: 30px; BACKGROUND-COLOR: #99ccff } .filters A { FONT-SIZE: 100%; COLOR: #ffffff; FONT-FAMILY: Tahoma } .filters A:visited { COLOR: #ffffff } .recenttitle { PADDING-LEFT: 8px; FONT-WEIGHT: bold; FONT-SIZE: 68%; FILTER: = progid:DXImageTransform.Microsoft.Gradient(GradientType=3D1, = StartColorStr=3D'#FF003399', EndColorStr=3D'#FF6699CC'); VERTICAL-ALIGN: = middle; COLOR: #ffffff; FONT-FAMILY: Verdana; HEIGHT: 24px; = BACKGROUND-COLOR: #003399 } .recentcell { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; = FONT-SIZE: 68%; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc = 1px solid; FONT-FAMILY: Verdana } .recentselect { FONT-SIZE: 95% } .recentspecial { BORDER-RIGHT: #cccccc 1px solid } .recentbutton { PADDING-LEFT: 1px; FONT-SIZE: 95%; MARGIN-LEFT: -5px } ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/library/mnp/2/aspx/css.aspx?locale=en-us&name=QuickSearch&name=Menu&static=Page .mnpQuickSearch { PADDING-RIGHT: 10px; PADDING-LEFT: 5px; PADDING-BOTTOM: 7px; = PADDING-TOP: 5px } .mnpQuickSearch A { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0% } .mnpQuickSearch A:visited { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0% } .mnpQuickSearch A:hover { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0% } .mnpSearchBox { MARGIN: 2px 0px 1px } .mnpSearchButton { PADDING-LEFT: 1px; MARGIN-LEFT: 7px } .syncBarNext { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; = BACKGROUND: #cccccc; MARGIN-LEFT: 7px; BORDER-LEFT: #cccccc 1px solid; = WIDTH: 15px; CURSOR: hand; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: = 15px } .syncBarPrevious { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; = BACKGROUND: #cccccc; MARGIN-LEFT: 7px; BORDER-LEFT: #cccccc 1px solid; = WIDTH: 15px; CURSOR: hand; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: = 15px } .mnpQuickSearch { FONT: 7.5pt Verdana } .mnpSearchBox { FONT: 11px Verdana } .mnpSearchScopes { FONT: 11px Tahoma } .mnpSearchButton { FONT: 11px Tahoma } .mnpMenuTop { BORDER-RIGHT: #999999 1px solid; BORDER-TOP: #999999 0px solid; = FONT-SIZE: small; BACKGROUND: #f1f1f1; BORDER-LEFT: #999999 0px solid; = PADDING-TOP: 2px; BORDER-BOTTOM: #999999 0px solid } .mnpMenuSub { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #999999 1px solid; PADDING-LEFT: 0px; BACKGROUND: #f1f1f1; = PADDING-BOTTOM: 2px; BORDER-LEFT: #999999 1px solid; PADDING-TOP: 2px; = BORDER-BOTTOM: #999999 1px solid; POSITION: absolute } .mnpMenuRow { BORDER-RIGHT: 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: 1px solid; = PADDING-LEFT: 6px; PADDING-BOTTOM: 3px; MARGIN: 0px 2px; BORDER-LEFT: = 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 1px; BORDER-BOTTOM: = 1px solid } .mnpMenuRow A { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: black; TEXT-DECORATION: none } .mnpMenuRow A:visited { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: black; TEXT-DECORATION: none } .mnpMenuRow A:hover { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: black; TEXT-DECORATION: none } .mnpMenuLabel { PADDING-RIGHT: 2px; PADDING-LEFT: 4px; BACKGROUND: #f1f1f1; = PADDING-BOTTOM: 4px; COLOR: black; PADDING-TOP: 2px } .mnpMenuBorder { BACKGROUND: #999999; MARGIN: 2px 0px; OVERFLOW: hidden; HEIGHT: 1px } .mnpMenuArrow { MARGIN-TOP: 4px; POSITION: absolute } .mnpMenuScroller { BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; MARGIN: 0px 2px; = OVERFLOW: hidden; BORDER-LEFT: 1px solid; PADDING-TOP: 4px; = BORDER-BOTTOM: 1px solid; HEIGHT: 19px; TEXT-ALIGN: center } .mnpMenuScrollArea { BACKGROUND: none transparent scroll repeat 0% 0%; OVERFLOW: hidden } .mnpAds { BACKGROUND: none transparent scroll repeat 0% 0% } .mnpAds A { BACKGROUND: none transparent scroll repeat 0% 0% } .mnpAds A:link { BACKGROUND: none transparent scroll repeat 0% 0% } .mnpAds A:visited { BACKGROUND: none transparent scroll repeat 0% 0% } .mnpAds A:hover { BACKGROUND: none transparent scroll repeat 0% 0% } .mnpInherit { BACKGROUND: none transparent scroll repeat 0% 0% } .mnpMenuLabel { FONT: bold 70% Verdana } .mnpMenuRow { FONT: 70% Verdana } BODY { MARGIN: 0px } ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/library/toolbar/3.0/css.aspx?c=/msdnmag/issues/02/02/config_issue.xml BODY { MARGIN: 0px } #msviRegionIdGraphic { PADDING-LEFT: 7px } #msviGlobalToolbar { PADDING-LEFT: 1px } #msviGlobalToolbar A { FONT: 65% Verdana; COLOR: #ffffff; TEXT-DECORATION: none } .gt0 { BORDER-RIGHT: #3568cc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: = #3568cc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 100%; PADDING-BOTTOM: = 2px; BORDER-LEFT: #3568cc 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: = #3568cc 1px solid } .gt1 { BORDER-RIGHT: #adc9ff 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: = #adc9ff 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 100%; BACKGROUND: = #5781d5; PADDING-BOTTOM: 2px; BORDER-LEFT: #adc9ff 1px solid; = PADDING-TOP: 0px; BORDER-BOTTOM: #adc9ff 1px solid } .gtsep { PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 2px; FONT: 65% = Verdana; COLOR: #adc9ff; PADDING-TOP: 0px } #msviBanner { TEXT-ALIGN: right } #msviGlobalSearch { PADDING-RIGHT: 15px; PADDING-LEFT: 6px; FONT: 65% Verdana; PADDING-TOP: = 5px; TEXT-ALIGN: left } #msviSearchForm { MARGIN: -1px 0px 0px } #msviSearchBox { FONT: 110% Tahoma; WIDTH: 235px; xheight: 18px } #msviGoButton { PADDING-RIGHT: 0.2em; PADDING-LEFT: 0.2em; PADDING-BOTTOM: 0em; FONT: = 110% Tahoma; MARGIN-LEFT: 6px; PADDING-TOP: 0em; POSITION: relative; = TOP: 1px } #msviNoSearch { WIDTH: 271px } #msviMastheadHR { BACKGROUND: #3366cc; OVERFLOW: hidden; HEIGHT: 1px } #msviLocalToolbar { PADDING-RIGHT: 0px; BORDER-TOP: #999 1px solid; PADDING-LEFT: 0px; = FONT-SIZE: 100%; BACKGROUND: #f1f1f1; PADDING-BOTTOM: 1px; PADDING-TOP: = 2px; BORDER-BOTTOM: #999 1px solid } #msviLocalToolbar TD { FONT-SIZE: 100% } #msviLocalToolbar A { FONT: 70% Verdana; COLOR: black; TEXT-DECORATION: none } .lt0 { BORDER-RIGHT: #f1f1f1 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: = #f1f1f1 1px solid; PADDING-LEFT: 6px; BACKGROUND: #f1f1f1; = PADDING-BOTTOM: 0px; BORDER-LEFT: #f1f1f1 1px solid; PADDING-TOP: 0px; = BORDER-BOTTOM: #f1f1f1 1px solid } .lt1 { BORDER-RIGHT: #999 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #999 1px = solid; PADDING-LEFT: 6px; BACKGROUND: #ccc; PADDING-BOTTOM: 0px; = BORDER-LEFT: #999 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #999 1px = solid } .ltsep { PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 0px; FONT: 70% = Verdana; COLOR: #a9a9a9; PADDING-TOP: 0px } .localToolbar FORM { MARGIN: 0px } .localToolbar INPUT { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; FONT: 70% = Tahoma, Helvetica; MARGIN-RIGHT: 8px; PADDING-TOP: 0px } #msviHomePageLink { PADDING-LEFT: 2px; WIDTH: 177px } #msviHomePageLink TD { FONT-SIZE: 100% } #msviHomePageLink A { BORDER-RIGHT: #f1f1f1 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: = #f1f1f1 1px solid; DISPLAY: block; PADDING-LEFT: 6px; BACKGROUND: = #f1f1f1; PADDING-BOTTOM: 2px; MARGIN: 0px; BORDER-LEFT: #f1f1f1 1px = solid; PADDING-TOP: 2px; BORDER-BOTTOM: #f1f1f1 1px solid; WHITE-SPACE: = nowrap } #msviHomePageLink A:hover { BORDER-RIGHT: #999 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #999 1px = solid; DISPLAY: block; PADDING-LEFT: 6px; BACKGROUND: #ccc; = PADDING-BOTTOM: 2px; MARGIN: 0px; BORDER-LEFT: #999 1px solid; = PADDING-TOP: 2px; BORDER-BOTTOM: #999 1px solid } #msviFooter { BORDER-TOP: #3366cc 1px solid; FONT: 70% Tahoma, Helvetica; POSITION: = absolute } #msviFooter TD { FONT-SIZE: 100% } #msviLocalFooter { PADDING-LEFT: 10px; MARGIN: 0px; PADDING-TOP: 8px } #msviGlobalFooter { PADDING-LEFT: 10px; PADDING-BOTTOM: 13px; MARGIN: 0px; PADDING-TOP: = 10px } #msviFooter A { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: #03c; MARGIN-RIGHT: 2px } #msviFooter A:visited { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: #03c } #msviFooter A:hover { FONT-WEIGHT: normal; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: #f60 } #msviFooter NOBR { COLOR: #a9a9a9; MARGIN-RIGHT: 5px } ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://ads.ddj.com/msdnmag/adindex.gif R0lGODlhgAAQANX/AP///wgICBAQEBgYGCkpKTExMTk5OUpKSlpaWmNjY2tra3Nzc3t7e5SUlJyc nK2trbW1tb29vcbGxs7OztbW1t7e3ufn5+/v7/f39/fn3t7GtbV7Uta1nL2Uc+fWxgAAAMDAwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACAALAAAAACAABAAAAb/QIBw SCwaj8ikcslsOp/QqHRKrVqNHsxTe11yu+ArZ8NhPgwGx6WoMDTWUcbigvl8HvCpofBWOgwJdGFH YxsdGkoIdgcVeRgGHwmNX0x1HxUWBQUPFhiUT3aSgkYYCx8Fk4NFhRuGHkgBdgESnRMICQUfCAsK E6ULFhYMBgcRFxQMDQsJDXYIFAoJDxUNewwVGMLExsjKDZ4AlggPCw0NBQvYEggHCR8EEhIJgOpy F3IOn0+srYYZRc0KDPiggIKFWHZ0QVog4cMACQR0RXTw4EOsAgfswLPTgMEHNLooREQwsWIsUeEW NUP4YQEFlu8eEAigIECACRUGZhwwoZMU/wz8+m14NUTRgYwGJphkEOuAKQMeD3gcEMHUAQd2Bhxo eIdrA3cDEjBw0IxA1Q9Xs7qkY+lAsw/DPq5kEJFA1AgZGVB427KnviZBW3GwMARD04yz3BGQidYk JAaKEn4Q8LYBBK4PuDKAkMvOMsmTK0dolBLtWweKCKR+kJFARslJX1p00HMKUKGGIuAcwjehgmYD GuiMAMkiBFMDHjhI9jZzBTsMJkB3QB0xcuXM7WQmXNqtHQipkf95Z/VBxwcTFDhEO2EUlNutOlyW UFuIIq0HBqaxI8CZBI+nQBCBTgP99h0FFyCkmTsgLUYgQW9BgKAQ4gAIgWJYrfeOAwMEgPpALLT1 Z0oAnFAxhnwCTmBQHgwwE4EEDSDQiwMHQOXWBOkhwIAEFUyAC1QSXIgAjxc8kMCQCSTgAAULaHJA ZhH8uKOQtHBRCgINGIlABA4kwBCNUu0SAWsY0daAAgxEoACW2EyhgQYSvLgiOBRaoGIFFVBAASZ6 4rjnBRbo2cgFed4ZzJ8YECronnziiJMFPRoaaCpCKLqnnpAySoGjOOG56Z+B6onpX0xYOsknibKV Kh2AXuCqJ6mCk6gFr7o6yqqvzkorW62y+ioRq8Yaq6u7+rqrJ7W6F8WsvyZBKqxK0EnKEVYCS+q0 4RShBSXQZhtGt6qEK+64AAQBADs= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0023_01C5230F.CACB9B70" ------=_NextPart_001_0023_01C5230F.CACB9B70 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx =EF=BB=BF Inside Windows: An In-Depth Look into the Win32 = Portable Executable File Format -- MSDN Magazine, February 2002
Microsoft.com = Home | Site=20 Map
3DMSDN=20
| Developer=20 Centers | Library | Downloads | How to Buy | Subscribers | Worldwide
Search for


Advanced=20 Search
3D*=20Febr= uary=20 2002
3D*=20Search
3D*=20Column=20 Archive
Next= =20 Issue
Subscribe
Order Back Issues
Specia= l=20 CD Offer
Media Kit
Corrections
MSJ=20 Archive
MIND=20 Archive
TechNet=20 Magazine
Magazine=20 Newsgroup
3D"Microsoft

3D"MSDN  
Inside Windows=20

An In-Depth Look into the Win32 Portable = Executable File=20 Format

Matt Pietrek
3D""=20
This article assumes you're = familiar=20 with C++ and Win32
Level of Difficulty  =   =20 1   2  
Download the = code for=20 this article: PE.exe=20 (98KB)
SUMMARY A good understanding of the = Portable=20 Executable (PE) file format leads to a good = understanding of=20 the operating system. If you know what's in your DLLs = and=20 EXEs, you'll be a more knowledgeable programmer. This = article,=20 the first of a two-part series, looks at the changes = to the PE=20 format that have occurred over the last few years, = along with=20 an overview of the format itself.
3D""=20After this update, the author discusses how = the PE=20 format fits into applications written for .NET, PE = file=20 sections, RVAs, the DataDirectory, and the importing = of=20 functions. An appendix includes lists of the relevant = image=20 header structures and their descriptions.=20
3DA long time ago, in a galaxy = far away, I=20 wrote one of my first articles for Microsoft = Systems=20 Journal (now MSDN=C2=AE Magazine). = The article,=20 "Peering Inside the PE: A Tour of the Win32 Portable=20 Executable File Format," turned out to be more popular = than I=20 had expected. To this day, I still hear from people = (even=20 within Microsoft) who use that article, which is still = available from the MSDN Library. Unfortunately, the = problem=20 with articles is that they're static. The world of = Win32=C2=AE has=20 changed quite a bit in the intervening years, and the = article=20 is severely dated. I'll remedy that situation in a = two-part=20 article starting this month.
3D""=20You might be wondering why you should care = about the=20 executable file format. The answer is the same now as = it was=20 then: an operating system's executable format and data = structures reveal quite a bit about the underlying = operating=20 system. By understanding what's in your EXEs and DLLs, = you'll=20 find that you've become a better programmer all=20 around.
3D""=20Sure, you could learn a lot of what I'll = tell you by=20 reading the Microsoft specification. However, like = most specs,=20 it sacrifices readability for completeness. My focus = in this=20 article will be to explain the most relevant parts of = the=20 story, while filling in the hows and whys that don't = fit=20 neatly into a formal specification. In addition, I = have some=20 goodies in this article that don't seem to appear in = any=20 official Microsoft documentation.

Bridging the Gap
3D""=20Let me give you just a few examples of what = has=20 changed since I wrote the article in 1994. Since = 16-bit=20 Windows=C2=AE is history, there's no need to compare = and contrast=20 the format to the Win16 New Executable format. Another = welcome=20 departure from the scene is Win32s=C2=AE. This was the = abomination=20 that ran Win32 binaries very shakily atop Windows = 3.1.
Back then, Windows 95 (codenamed "Chicago" = at the=20 time) wasn't even released. Windows NT=C2=AE was still = at version=20 3.5, and the linker gurus at Microsoft hadn't yet = started=20 getting aggressive with their optimizations. However, = there=20 were MIPS and DEC Alpha implementations of Windows NT = that=20 added to the story.
3D""=20And what about all the new things that have = come=20 along since that article? 64-bit Windows introduces = its own=20 variation of the Portable Executable (PE) format. = Windows CE=20 adds all sorts of new processor types. Optimizations = such as=20 delay loading of DLLs, section merging, and binding = were still=20 over the horizon. There are many new things to = shoehorn into=20 the story.
3D""=20And let's not forget about Microsoft=C2=AE = .NET. Where=20 does it fit in? To the operating system, .NET = executables are=20 just plain old Win32 executable files. However, the = .NET=20 runtime recognizes data within these executable files = as the=20 metadata and intermediate language that are so central = to=20 .NET. In this article, I'll knock on the door of the = .NET=20 metadata format, but save a thorough survey of its = full=20 splendor for a subsequent article.
3D""=20And if all these additions and subtractions = to the=20 world of Win32 weren't enough justification to remake = the=20 article with modern day special effects, there are = also errors=20 in the original piece that make me cringe. For = example, my=20 description of Thread Local Storage (TLS) support was = way out=20 in left field. Likewise, my description of the = date/time stamp=20 DWORD used throughout the file format is accurate only = if you=20 live in the Pacific time zone!
3D""=20In addition, many things that were true = then are=20 incorrect now. I had stated that the .rdata section = wasn't=20 really used for anything important. Today, it = certainly is. I=20 also said that the .idata section is a read/write = section,=20 which has been found to be most untrue by people = trying to do=20 API interception today.
3D""=20Along with a complete update of the PE = format story=20 in this article, I've also overhauled the PEDUMP = program,=20 which displays the contents of PE files. PEDUMP can be = compiled and run on both the x86 and IA-64 platforms, = and can=20 dump both 32 and 64-bit PE files. Most importantly, = full=20 source code for PEDUMP is available for download fropm = the=20 link at the top of this article, so you have a working = example=20 of the concepts and data structures described=20 here.

Overview of the = PE File=20 Format
3D""=20Microsoft introduced the PE File format, = more=20 commonly known as the PE format, as part of the = original Win32=20 specifications. However, PE files are derived from the = earlier=20 Common Object File Format (COFF) found on VAX/VMS. = This makes=20 sense since much of the original Windows NT team came = from=20 Digital Equipment Corporation. It was natural for = these=20 developers to use existing code to quickly bootstrap = the new=20 Windows NT platform.
3D""=20The term "Portable Executable" was chosen = because the=20 intent was to have a common file format for all = flavors of=20 Windows, on all supported CPUs. To a large extent, = this goal=20 has been achieved with the same format used on Windows = NT and=20 descendants, Windows 95 and descendants, and Windows=20 CE.
3D""=20OBJ files emitted by Microsoft compilers = use the COFF=20 format. You can get an idea of how old the COFF format = is by=20 looking at some of its fields, which use octal = encoding! COFF=20 OBJ files have many data structures and enumerations = in common=20 with PE files, and I'll mention some of them as I go=20 along.
3D""=20The addition of 64-bit Windows required = just a few=20 modifications to the PE format. This new format is = called=20 PE32+. No new fields were added, and only one field in = the PE=20 format was deleted. The remaining changes are simply = the=20 widening of certain fields from 32 bits to 64 bits. In = most of=20 these cases, you can write code that simply works with = both 32=20 and 64-bit PE files. The Windows header files have the = magic=20 pixie dust to make the differences invisible to most = C++-based=20 code.
3D""=20The distinction between EXE and DLL files = is entirely=20 one of semantics. They both use the exact same PE = format. The=20 only difference is a single bit that indicates if the = file=20 should be treated as an EXE or as a DLL. Even the DLL = file=20 extension is artificial. You can have DLLs with = entirely=20 different extensions=E2=80=94for instance .OCX = controls and Control=20 Panel applets (.CPL files) are DLLs.
3D""=20A very handy aspect of PE files is that the = data=20 structures on disk are the same data structures used = in=20 memory. Loading an executable into memory (for = example, by=20 calling LoadLibrary) is primarily a matter of mapping = certain=20 ranges of a PE file into the address space. Thus, a = data=20 structure like the IMAGE_NT_HEADERS (which I'll = examine later)=20 is identical on disk and in memory. The key point is = that if=20 you know how to find something in a PE file, you can = almost=20 certainly find the same information when the file is = loaded in=20 memory.
3D""=20It's important to note that PE files are = not just=20 mapped into memory as a single memory-mapped file. = Instead,=20 the Windows loader looks at the PE file and decides = what=20 portions of the file to map in. This mapping is = consistent in=20 that higher offsets in the file correspond to higher = memory=20 addresses when mapped into memory. The offset of an = item in=20 the disk file may differ from its offset once loaded = into=20 memory. However, all the information is present to = allow you=20 to make the translation from disk offset to memory = offset (see=20 Figure 1).


Figure 1 = Offsets

3D""=20When PE files are loaded into memory via = the Windows=20 loader, the in-memory version is known as a module. = The=20 starting address where the file mapping begins is = called an=20 HMODULE. This is a point worth remembering: given an = HMODULE,=20 you know what data structure to expect at that = address, and=20 you can use that knowledge to find all the other data=20 structures in memory. This powerful capability can be=20 exploited for other purposes such as API interception. = (To be=20 completely accurate, an HMODULE isn't the same as the = load=20 address under Windows CE, but that's a story for yet = another=20 day.)
3D""=20A module in memory represents all the code, = data, and=20 resources from an executable file that is needed by a = process.=20 Other parts of a PE file may be read, but not mapped = in (for=20 instance, relocations). Some parts may not be mapped = in at=20 all, for example, when debug information is placed at = the end=20 of the file. A field in the PE header tells the system = how=20 much memory needs to be set aside for mapping the = executable=20 into memory. Data that won't be mapped in is placed at = the end=20 of the file, past any parts that will be mapped = in.
The central location where the PE format = (as well as=20 COFF files) is described is WINNT.H. Within this = header file,=20 you'll find nearly every structure definition, = enumeration,=20 and #define needed to work with PE files or the = equivalent=20 structures in memory. Sure, there is documentation = elsewhere.=20 MSDN has the "Microsoft Portable Executable and Common = Object=20 File Format Specification," for instance (see the = October 2001=20 MSDN CD under Specifications). But WINNT.H is the = final word=20 on what PE files look like.
3D""=20There are many tools for examining PE = files. Among=20 them are Dumpbin from Visual Studio, and Depends from = the=20 Platform SDK. I particularly like Depends because it = has a=20 very succinct way of examining a file's imports and = exports. A=20 great free PE viewer is PEBrowse Professional, from=20 Smidgeonsoft (http://www.smidgeonsoft.com/). = The PEDUMP program included with this article is also = very=20 comprehensive, and does almost everything Dumpbin=20 does.
3D""=20From an API standpoint, the primary = mechanism=20 provided by Microsoft for reading and modifying PE = files is=20 IMAGEHLP.DLL.
3D""=20Before I start looking at the specifics of = PE files,=20 it's worthwhile to first review a few basic concepts = that=20 thread their way through the entire subject of PE = files. In=20 the following sections, I will discuss PE file = sections,=20 relative virtual addresses (RVAs), the data directory, = and how=20 functions are imported.

PE File=20 Sections
3D""=20A PE file section represents code or data = of some=20 sort. While code is just code, there are multiple = types of=20 data. Besides read/write program data (such as global=20 variables), other types of data in sections include = API import=20 and export tables, resources, and relocations. Each = section=20 has its own set of in-memory attributes, including = whether the=20 section contains code, whether it's read-only or = read/write,=20 and whether the data in the section is shared between = all=20 processes using the executable.
3D""=20Generally speaking, all the code or data in = a section=20 is logically related in some way. At a minimum, there = are=20 usually at least two sections in a PE file: one for = code, the=20 other for data. Commonly, there's at least one other = type of=20 data section in a PE file. I'll look at the various = kinds of=20 sections in Part 2 of this article next month.
3D""=20Each section has a distinct name. This name = is=20 intended to convey the purpose of the section. For = example, a=20 section called .rdata indicates a read-only data = section.=20 Section names are used solely for the benefit of = humans, and=20 are insignificant to the operating system. A section = named=20 FOOBAR is just as valid as a section called .text. = Microsoft=20 typically prefixes their section names with a period, = but it's=20 not a requirement. For years, the Borland linker used = section=20 names like CODE and DATA.
3D""=20While compilers have a standard set of = sections that=20 they generate, there's nothing magical about them. You = can=20 create and name your own sections, and the linker = happily=20 includes them in the executable. In Visual C++, you = can tell=20 the compiler to insert code or data into a section = that you=20 name with #pragma statements. For instance, the = statement
#pragma data_seg( "MY_DATA" )
causes all data emitted by Visual C++ to go into a=20 section called MY_DATA, rather than the default .data = section.=20 Most programs are fine using the default sections = emitted by=20 the compiler, but occasionally you may have funky = requirements=20 which necessitate putting code or data into a separate = section.
3D""=20Sections don't spring fully formed from the = linker;=20 rather, they start out in OBJ files, usually placed = there by=20 the compiler. The linker's job is to combine all the = required=20 sections from OBJ files and libraries into the = appropriate=20 final section in the PE file. For example, each OBJ = file in=20 your project probably has at least a .text section, = which=20 contains code. The linker takes all the sections named = .text=20 from the various OBJ files and combines them into a = single=20 .text section in the PE file. Likewise, all the = sections named=20 .data from the various OBJs are combined into a single = .data=20 section in the PE file. Code and data from .LIB files = are also=20 typically included in an executable, but that subject = is=20 outside the scope of this article.
3D""=20There is a rather complete set of rules = that linkers=20 follow to decide which sections to combine and how. I = gave an=20 introduction to the linker algorithms in the July 1997 = Under=20 The Hood column in MSJ. A section in an OBJ = file=20 may be intended for the linker's use, and not make it = into the=20 final executable. A section like this would be = intended for=20 the compiler to pass information to the = linker.
Sections have two alignment values, one = within the=20 disk file and the other in memory. The PE file header=20 specifies both of these values, which can differ. Each = section=20 starts at an offset that's some multiple of the = alignment=20 value. For instance, in the PE file, a typical = alignment would=20 be 0x200. Thus, every section begins at a file offset = that's a=20 multiple of 0x200.
3D""=20Once mapped into memory, sections always = start on at=20 least a page boundary. That is, when a PE section is = mapped=20 into memory, the first byte of each section = corresponds to a=20 memory page. On x86 CPUs, pages are 4KB aligned, while = on the=20 IA-64, they're 8KB aligned. The following code shows a = snippet=20 of PEDUMP output for the .text and .data section of = the=20 Windows XP KERNEL32.DLL.
Section Table
  01 .text     VirtSize: 00074658  VirtAddr:  00001000
    raw data offs:   00000400  raw data size: 00074800
=E2=80=A2=E2=80=A2=E2=80=A2
  02 .data     VirtSize: 000028CA  VirtAddr:  00076000
    raw data offs:   00074C00  raw data size: 00002400
The .text section is at offset 0x400 in the PE file and=20 will be 0x1000 bytes above the load address of = KERNEL32 in=20 memory. Likewise, the .data section is at file offset = 0x74C00=20 and will be 0x76000 bytes above KERNEL32's load = address in=20 memory.
3D""=20It's possible to create PE files in which = the=20 sections start at the same offset in the file as they = start=20 from the load address in memory. This makes for larger = executables, but can speed loading under Windows = 9x or=20 Windows Me. The default /OPT:WIN98 linker option = (introduced=20 in Visual Studio 6.0) causes PE files to be created = this way.=20 In Visual Studio=C2=AE .NET, the linker may or may not = use=20 /OPT:NOWIN98, depending on whether the file is small=20 enough.
3D""=20An interesting linker feature is the = ability to merge=20 sections. If two sections have similar, compatible = attributes,=20 they can usually be combined into a single section at = link=20 time. This is done via the linker /merge switch. For = instance,=20 the following linker option combines the .rdata and = .text=20 sections into a single section called .text:
/MERGE:.rdata=3D.text
3D""=20The advantage to merging sections is that = it saves=20 space, both on disk and in memory. At a minimum, each = section=20 occupies one page in memory. If you can reduce the = number of=20 sections in an executable from four to three, there's = a decent=20 chance you'll use one less page of memory. Of course, = this=20 depends on whether the unused space at the end of the = two=20 merged sections adds up to a page.
3D""=20Things can get interesting when you're = merging=20 sections, as there are no hard and fast rules as to = what's=20 allowed. For example, it's OK to merge .rdata into = .text, but=20 you shouldn't merge .rsrc, .reloc, or .pdata into = other=20 sections. Prior to Visual Studio .NET, you could merge = .idata=20 into other sections. In Visual Studio .NET, this is = not=20 allowed, but the linker often merges parts of the = .idata into=20 other sections, such as .rdata, when doing a release=20 build.
3D""=20Since portions of the imports data are = written to by=20 the Windows loader when they are loaded into memory, = you might=20 wonder how they can be put in a read-only section. = This=20 situation works because at load time the system can=20 temporarily set the attributes of the pages containing = the=20 imports data to read/write. Once the imports table is=20 initialized, the pages are then set back to their = original=20 protection attributes.

Relative=20 Virtual Addresses
3D""=20In an executable file, there are many = places where an=20 in-memory address needs to be specified. For instance, = the=20 address of a global variable is needed when = referencing it. PE=20 files can load just about anywhere in the process = address=20 space. While they do have a preferred load address, = you can't=20 rely on the executable file actually loading there. = For this=20 reason, it's important to have some way of specifying=20 addresses that are independent of where the executable = file=20 loads.
3D""=20To avoid having hardcoded memory addresses = in PE=20 files, RVAs are used. An RVA is simply an offset in = memory,=20 relative to where the PE file was loaded. For = instance,=20 consider an EXE file loaded at address 0x400000, with = its code=20 section at address 0x401000. The RVA of the code = section would=20 be:
(target address) 0x401000 =
- (load address)0x400000  =3D (RVA)0x1000.
3D""=20To convert an RVA to an actual address, = simply=20 reverse the process: add the RVA to the actual load = address to=20 find the actual memory address. Incidentally, the = actual=20 memory address is called a Virtual Address (VA) in PE=20 parlance. Another way to think of a VA is that it's an = RVA=20 with the preferred load address added in. Don't forget = the=20 earlier point I made that a load address is the same = as the=20 HMODULE.
3D""=20Want to go spelunking through some = arbitrary DLL's=20 data structures in memory? Here's how. Call = GetModuleHandle=20 with the name of the DLL. The HMODULE that's returned = is just=20 a load address; you can apply your knowledge of the PE = file=20 structures to find anything you want within the=20 module.

The Data=20 Directory
3D""=20There are many data structures within = executable=20 files that need to be quickly located. Some obvious = examples=20 are the imports, exports, resources, and base = relocations. All=20 of these well-known data structures are found in a = consistent=20 manner, and the location is known as the=20 DataDirectory.
3D""=20The DataDirectory is an array of 16 = structures. Each=20 array entry has a predefined meaning for what it = refers to.=20 The IMAGE_DIRECTORY_ENTRY_ xxx #defines are = array=20 indexes into the DataDirectory (from 0 to 15). Figure 2 describes what each = of the=20 IMAGE_DATA_DIRECTORY_xxx values refers to. A = more=20 detailed description of many of the pointed-to data = structures=20 will be included in Part 2 of this = article.

Importing Functions
3D""=20When you use code or data from another DLL, = you're=20 importing it. When any PE file loads, one of the jobs = of the=20 Windows loader is to locate all the imported functions = and=20 data and make those addresses available to the file = being=20 loaded. I'll save the detailed discussion of data = structures=20 used to accomplish this for Part 2 of this article, = but it's=20 worth going over the concepts here at a high = level.
When you link directly against the code and = data of=20 another DLL, you're implicitly linking against the = DLL. You=20 don't have to do anything to make the addresses of the = imported APIs available to your code. The loader takes = care of=20 it all. The alternative is explicit linking. This = means=20 explicitly making sure that the target DLL is loaded = and then=20 looking up the address of the APIs. This is almost = always done=20 via the LoadLibrary and GetProcAddress APIs.
3D""=20When you implicitly link against an API, = LoadLibrary=20 and GetProcAddress-like code still executes, but the = loader=20 does it for you automatically. The loader also ensures = that=20 any additional DLLs needed by the PE file being loaded = are=20 also loaded. For instance, every normal program = created with=20 Visual C++=C2=AE links against KERNEL32.DLL. = KERNEL32.DLL in turn=20 imports functions from NTDLL.DLL. Likewise, if you = import from=20 GDI32.DLL, it will have dependencies on the USER32, = ADVAPI32,=20 NTDLL, and KERNEL32 DLLs, which the loader makes sure = are=20 loaded and all imports resolved. (Visual Basic 6.0 and = the=20 Microsoft .NET executables directly link against a = different=20 DLL than KERNEL32, but the same principles = apply.)
When implicitly linking, the resolution = process for=20 the main EXE file and all its dependent DLLs occurs = when the=20 program first starts. If there are any problems (for = example,=20 a referenced DLL that can't be found), the process is=20 aborted.
3D""=20Visual C++ 6.0 added the delayload feature, = which is=20 a hybrid between implicit linking and explicit = linking. When=20 you delayload against a DLL, the linker emits = something that=20 looks very similar to the data for a regular imported = DLL.=20 However, the operating system ignores this data. = Instead, the=20 first time a call to one of the delayloaded APIs = occurs,=20 special stubs added by the linker cause the DLL to be = loaded=20 (if it's not already in memory), followed by a call to = GetProcAddress to locate the called API. Additional = magic=20 makes it so that subsequent calls to the API are just = as=20 efficient as if the API had been imported = normally.
Within a PE file, there's an array of data=20 structures, one per imported DLL. Each of these = structures=20 gives the name of the imported DLL and points to an = array of=20 function pointers. The array of function pointers is = known as=20 the import address table (IAT). Each imported API has = its own=20 reserved spot in the IAT where the address of the = imported=20 function is written by the Windows loader. This last = point is=20 particularly important: once a module is loaded, the = IAT=20 contains the address that is invoked when calling = imported=20 APIs.
3D""=20The beauty of the IAT is that there's just = one place=20 in a PE file where an imported API's address is = stored. No=20 matter how many source files you scatter calls to a = given API=20 through, all the calls go through the same function = pointer in=20 the IAT.
3D""=20Let's examine what the call to an imported = API looks=20 like. There are two cases to consider: the efficient = way and=20 inefficient way. In the best case, a call to an = imported API=20 looks like this:
CALL DWORD =
PTR [0x00405030]
If you're not familiar with x86 assembly language, this=20 is a call through a function pointer. Whatever = DWORD-sized=20 value is at 0x405030 is where the CALL instruction = will send=20 control. In the previous example, address 0x405030 = lies within=20 the IAT.
3D""=20The less efficient call to an imported API = looks like=20 this:
CALL 0x0040100C
=E2=80=A2=E2=80=A2=E2=80=A2
0x0040100C:
JMP       DWORD PTR [0x00405030]
In this situation, the CALL transfers control to a small=20 stub. The stub is a JMP to the address whose value is = at=20 0x405030. Again, remember that 0x405030 is an entry = within the=20 IAT. In a nutshell, the less efficient imported API = call uses=20 five bytes of additional code, and takes longer to = execute=20 because of the extra JMP.
3D""=20You're probably wondering why the less = efficient=20 method would ever be used. There's a good explanation. = Left to=20 its own devices, the compiler can't distinguish = between=20 imported API calls and ordinary functions within the = same=20 module. As such, the compiler emits a CALL instruction = of the=20 form
CALL XXXXXXXX
where XXXXXXXX is an actual code address that=20 will be filled in by the linker later. Note that this = last=20 CALL instruction isn't through a function pointer. = Rather,=20 it's an actual code address. To keep the cosmic karma = in=20 balance, the linker needs to have a chunk of code to=20 substitute for XXXXXXXX. The simplest way to do = this is=20 to make the call point to a JMP stub, like you just=20 saw.
3D""=20Where does the JMP stub come from? = Surprisingly, it=20 comes from the import library for the imported = function. If=20 you were to examine an import library, and examine the = code=20 associated with the imported API name, you'd see that = it's a=20 JMP stub like the one just shown. What this means is = that by=20 default, in the absence of any intervention, imported = API=20 calls will use the less efficient form.
3D""=20Logically, the next question to ask is how = to get the=20 optimized form. The answer comes in the form of a hint = you=20 give to the compiler. The __declspec(dllimport) = function=20 modifier tells the compiler that the function resides = in=20 another DLL and that the compiler should generate this = instruction
CALL DWORD PTR =
[XXXXXXXX]
rather than this one:
CALL XXXXXXXX
3D""=20In addition, the compiler emits information = telling=20 the linker to resolve the function pointer portion of = the=20 instruction to a symbol named __imp_functionname. For=20 instance, if you were calling MyFunction, the symbol = name=20 would be __imp_MyFunction. Looking in an import = library,=20 you'll see that in addition to the regular symbol = name,=20 there's also a symbol with the __imp__ prefix on it. = This=20 __imp__ symbol resolves directly to the IAT entry, = rather than=20 to the JMP stub.
3D""=20So what does this mean in your everyday = life? If=20 you're writing exported functions and providing a .H = file for=20 them, remember to use the __declspec(dllimport) = modifier with=20 the function:
__declspec(dllimport) void Foo(void);
If you look at the Windows system header files, you'll=20 find that they use __declspec(dllimport) for the = Windows APIs.=20 It's not easy to see this, but if you search for the=20 DECLSPEC_IMPORT macro defined in WINNT.H, and which is = used in=20 files such as WinBase.H, you'll see how = __declspec(dllimport)=20 is prepended to the system API = declarations.

PE File Structure
3D""=20Now let's dig into the actual format of PE = files.=20 I'll start from the beginning of the file, and = describe the=20 data structures that are present in every PE file. = Afterwards,=20 I'll describe the more specialized data structures = (such as=20 imports or resources) that reside within a PE's = sections. All=20 of the data structures that I'll discuss below are = defined in=20 WINNT.H, unless otherwise noted.
3D""=20In many cases, there are matching 32 and = 64-bit data=20 structures=E2=80=94for example, IMAGE_NT_HEADERS32 and = IMAGE_NT_HEADERS64. These structures are almost always = identical, except for some widened fields in the = 64-bit=20 versions. If you're trying to write portable code, = there are=20 #defines in WINNT.H which select the appropriate 32 or = 64-bit=20 structures and alias them to a size-agnostic name (in = the=20 previous example, it would be IMAGE_NT_HEADERS). The = structure=20 selected depends on which mode you're compiling for=20 (specifically, whether _WIN64 is defined or not). You = should=20 only need to use the 32 or 64-bit specific versions of = the=20 structures if you're working with a PE file with size=20 characteristics that are different from those of the = platform=20 you're compiling for.

The MS-DOS=20 Header
3D""=20Every PE file begins with a small = MS-DOS=C2=AE executable.=20 The need for this stub executable arose in the early = days of=20 Windows, before a significant number of consumers were = running=20 it. When executed on a machine without Windows, the = program=20 could at least print out a message saying that Windows = was=20 required to run the executable.
3D""=20The first bytes of a PE file begin with the = traditional MS-DOS header, called an IMAGE_DOS_HEADER. = The=20 only two values of any importance are e_magic and = e_lfanew.=20 The e_lfanew field contains the file offset of the PE = header.=20 The e_magic field (a WORD) needs to be set to the = value=20 0x5A4D. There's a #define for this value, named=20 IMAGE_DOS_SIGNATURE. In ASCII representation, 0x5A4D = is MZ,=20 the initials of Mark Zbikowski, one of the original = architects=20 of MS-DOS.

The = IMAGE_NT_HEADERS=20 Header
3D""=20The IMAGE_NT_HEADERS structure is the = primary=20 location where specifics of the PE file are stored. = Its offset=20 is given by the e_lfanew field in the IMAGE_DOS_HEADER = at the=20 beginning of the file. There are actually two versions = of the=20 IMAGE_NT_HEADER structure, one for 32-bit executables = and the=20 other for 64-bit versions. The differences are so = minor that=20 I'll consider them to be the same for the purposes of = this=20 discussion. The only correct, Microsoft-approved way = of=20 differentiating between the two formats is via the = value of=20 the Magic field in the IMAGE_OPTIONAL_HEADER = (described=20 shortly).
3D""=20An IMAGE_NT_HEADER is comprised of three = fields:
typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
In a valid PE file, the Signature field is set to the=20 value 0x00004550, which in ASCII is "PE00". A #define, = IMAGE_NT_SIGNATURE, is defined for this value. The = second=20 field, a struct of type IMAGE_FILE_HEADER, predates PE = files.=20 It contains some basic information about the file; = most=20 importantly, a field describing the size of the = optional data=20 that follows it. In PE files, this optional data is = very much=20 required, but is still called the=20 IMAGE_OPTIONAL_HEADER.
3D""=20Figure 3 shows the fields of = the=20 IMAGE_FILE_HEADER structure, with additional notes for = the=20 fields. This structure can also be found at the very = beginning=20 of COFF OBJ files. Figure 4 lists the common = values of=20 IMAGE_FILE_xxx. Figure 5 shows the members of = the=20 IMAGE_OPTIONAL_HEADER structure.
3D""=20The DataDirectory array at the end of the=20 IMAGE_OPTIONAL_HEADERs is the address book for = important=20 locations within the executable. Each DataDirectory = entry=20 looks like this:
typedef =
struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;     // RVA of the data
    DWORD   Size;               // Size of the data
};
The Section Table
Immediately following the IMAGE_NT_HEADERS = is the=20 section table. The section table is an array of=20 IMAGE_SECTION_HEADERs structures. An = IMAGE_SECTION_HEADER=20 provides information about its associated section, = including=20 location, length, and characteristics. Figure 6 contains a = description of the=20 IMAGE_SECTION_HEADER fields. The number of=20 IMAGE_SECTION_HEADER structures is given by the=20 IMAGE_NT_HEADERS.FileHeader.NumberOfSections = field.
The file alignment of sections in the = executable file=20 can have a significant impact on the resulting file = size. In=20 Visual Studio 6.0, the linker defaulted to a section = alignment=20 of 4KB, unless /OPT:NOWIN98 or the /ALIGN switch was = used. The=20 Visual Studio .NET linker, while still defaulting to=20 /OPT:WIN98, determines if the executable is below a = certain=20 size and if that is the case uses 0x200-byte=20 alignment.
3D""=20Another interesting alignment comes from = the .NET=20 file specification. It says that .NET executables = should have=20 an in-memory alignment of 8KB, rather than the = expected 4KB=20 for x86 binaries. This is to ensure that .NET = executables=20 built with x86 entry point code can still run under = IA-64. If=20 the in-memory section alignment were 4KB, the IA-64 = loader=20 wouldn't be able to load the file, since pages are 8KB = on=20 64-bit Windows.

Wrap-up
3D""=20That's it for the headers of PE files. In = Part 2 of=20 this article I'll continue the tour of portable = executable=20 files by looking at commonly encountered sections. = Then I'll=20 describe the major data structures within those = sections,=20 including imports, exports, and resources. And = finally, I'll=20 go over the source for the updated and vastly improved = PEDUMP.

For=20 background information see:
The=20 Common Object File Format (COFF) =


Matt Pietrek is an = independent=20 writer, consultant, and trainer. He was the lead = architect for=20 Compuware/NuMega's Bounds Checker product line for = eight years=20 and has authored three books on Windows system = programming.=20 His Web site, at http://www.wheaty.net/, has=20 a FAQ page and information on previous columns and=20 articles.

From the Febr= uary=20 2002 issue of MSDN = Magazine.
Get it at your local newsstand, or better = yet, subscribe.=20
3D""=20 3D""=20
Manage Your = Profile=20 |Legal |Contact us |MSDN = Flash=20 Newsletter
=C2=A9 2005 Microsoft = Corporation. All=20 rights reserved. Terms of = Use=20 |Trademarks=20 |Privacy=20 Statement
3DMicrosoft=20
------=_NextPart_001_0023_01C5230F.CACB9B70 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://ads.ddj.com/msdnmag/ros.htm







------=_NextPart_001_0023_01C5230F.CACB9B70-- ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdn-online/shared/graphics/rtg_Bar.gif R0lGODlhAQABAIAAAJnM/wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_print.gif R0lGODlhEgASAMQQAP/xpvXOUPbHOP7mcf//1uOAcNdQN/vWaP/pi42mjfC6Fu65GAMDUzAxMgAA AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA ABAALAAAAAASABIAAAVtICSOZGk6aOowJuk8MPyyLfQm+PM+9BnLqdotF+uVdj+YcdQY4nKMRqlB QCYZB6mowWN4v2DGQssFmBHoweEQCAjG28c5vW4L3mQ5GrFmuwsGcBANCguFCoiJimSFC46PkIhk DZSVlpc1mZqbIQA7 ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_email.gif R0lGODlhEgASAMQaAKCgof7+/rKytJ2bm3BtaHR0dvHx8c7Ozn+AgpOTlKioqpmZmU5PUMbFyf7+ +oySkmFhYuvs7fb28tri3r7AwLu6vvr6+tTU1f///wAAAP///wAAAAAAAAAAAAAAAAAAACH5BAEA ABoALAAAAAASABIAAAVzoCaOZGmeaJpmbOu+rJYhi2XfuDUUmUxVA4xwOBxUBL0MJYABIIiGQsUQ ACSXGEelcMAIEA1h9crEFCgKiGDwEFqsPiFBgIlUJIZEQghXYggXREMHBE1JEwQVgkQHCxVJDBeS k5SSCgxJMJotKp2en6CfIQA7 ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_save.gif R0lGODlhEgASAMQRAO6wAf7mcf/jSf/dL+KjLdKTAvC6Fu65GPbHOPvWaPXOUP/ZG+yqAPrIAfO4 AP/VDgAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA ABEALAAAAAASABIAAAVsYCSOIkSeaAQ9ZppCSOuSa8POdPAEMg39P8HgMRAAgSWFbcF8LB4NBoHR gzQctof26qCiII7hltHt0QRPKMDrgqCxjQbAPIIEFo4CAGtw0FV4BQQQB3t+XwEAgyY/ZIc0CT8n jXR/JTiYmSkhADs= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/msdn-online/shared/css/ie4.css BODY { FONT: 68% verdana,arial,helvetica; COLOR: #000000 } DIV.clsDocBody { MARGIN-TOP: 10px; MARGIN-LEFT: 10px; MARGIN-RIGHT: 10px } DIV.clsFooter { MARGIN-TOP: 10px; MARGIN-LEFT: 10px; MARGIN-RIGHT: 10px } DIV.clsFPfig { FONT-SIZE: 80% } TD { FONT-SIZE: 68% } TH { FONT-SIZE: 68% } A:link { COLOR: #003399; TEXT-DECORATION: none } A:visited { COLOR: #6699cc; TEXT-DECORATION: none } A:hover { TEXT-DECORATION: underline } DIV.clsDocBody A:link { TEXT-DECORATION: underline } DIV.clsDocBody A:visited { TEXT-DECORATION: underline } DIV.clsDocBody SPAN.clsHighlightItems A:link { TEXT-DECORATION: none } DIV.clsDocBody SPAN.clsHighlightItems A:visited { TEXT-DECORATION: none } DIV.clsNavTbl A:link { TEXT-DECORATION: none } DIV.clsNavTbl A:visited { TEXT-DECORATION: none } H2 A:visited { COLOR: #003399 } H3 A:visited { COLOR: #003399 } A.clsIncCpyRt { FONT-SIZE: 95%; COLOR: #000000; TEXT-DECORATION: underline } A.clsIncCpyRt:hover { COLOR: #003399 } A.clsBackTop { MARGIN-TOP: 10px; FONT-SIZE: 90%; MARGIN-BOTTOM: 0px; PADDING-BOTTOM: = 0px; COLOR: #003399; TEXT-DECORATION: underline } A.clsBackTop:visited { MARGIN-TOP: 10px; FONT-SIZE: 90%; MARGIN-BOTTOM: 0px; PADDING-BOTTOM: = 0px; COLOR: #003399; TEXT-DECORATION: underline } A.clsBackTop:hover { COLOR: blue } P { MARGIN-TOP: 0.5em; MARGIN-BOTTOM: 1em; LINE-HEIGHT: 1.5em } P.clsRef { MARGIN-TOP: 12pt; FONT-WEIGHT: bold; MARGIN-BOTTOM: 0em } PRE { PADDING-RIGHT: 5pt; MARGIN-TOP: 1em; PADDING-LEFT: 5pt; BACKGROUND: = #eeeeee; MARGIN-BOTTOM: 1em; PADDING-BOTTOM: 5pt; MARGIN-LEFT: 0px; = PADDING-TOP: 5pt } SPAN.db PRE { BACKGROUND: #eeeeee; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt } SPAN.ci PRE { BACKGROUND: #eeeeee; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt } SPAN.di PRE { BACKGROUND: #eeeeee; PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt } PRE.clsCode { FONT-SIZE: 110%; FONT-FAMILY: 'courier new',courier,serif } CODE.clsText { FONT-SIZE: 110%; FONT-FAMILY: 'courier new',courier,serif } PRE.clsCCCode { FONT-SIZE: 120%; BACKGROUND: none transparent scroll repeat 0% 0%; = FONT-FAMILY: 'courier new',courier,serif } PRE.clsSyntax { FONT-SIZE: 100%; FONT-FAMILY: verdana,arial,helvetica,sans-serif } H1 { MARGIN: 0px 0px 5px; FONT: 165% verdana,arial,helvetica } H2 { MARGIN-TOP: 1em; MARGIN-BOTTOM: 0.5em; FONT: bold 125% = verdana,arial,helvetica } H2.clsOsigHead { MARGIN-TOP: 1em; FONT-SIZE: 125%; MARGIN-BOTTOM: 0em; COLOR: #3366cc; = FONT-FAMILY: arial, helvetica, sans-serif } H2.clsBlue { COLOR: #336699 } H3 { MARGIN-BOTTOM: 0.5em; FONT: bold 115% verdana,arial,helvetica } H4 { MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica } H5 { MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica } H6 { MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica } TABLE.clsNavTbl { MARGIN-LEFT: 10px } TABLE.clsNavTbl TH { FONT-SIZE: 60%; FONT-FAMILY: verdana,arial,helvetica,sans-serif } TABLE.clsNavTbl TD { FONT-SIZE: 60%; FONT-FAMILY: verdana,arial,helvetica,sans-serif } TABLE.clsNavTbl TH { PADDING-BOTTOM: 0px } TABLE.clsTblHomeLeft A { FONT-SIZE: 90%; COLOR: #003399; FONT-FAMILY: = verdana,arial,helvetica,sans-serif } TABLE.clsTblHomeLeft A:visited { FONT-SIZE: 90%; COLOR: #003399; FONT-FAMILY: = verdana,arial,helvetica,sans-serif } TABLE.clsTblHomeLeft A:hover { FONT-SIZE: 90%; COLOR: #003399; FONT-FAMILY: = verdana,arial,helvetica,sans-serif } TABLE.clsTblHomeLeft A:hover { TEXT-DECORATION: underline } TABLE.clsStd TH { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; = VERTICAL-ALIGN: top; PADDING-TOP: 2px; BACKGROUND-COLOR: #ddd; = TEXT-ALIGN: left } TABLE.clsStd TD { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; = VERTICAL-ALIGN: top; PADDING-TOP: 2px; BACKGROUND-COLOR: #eee } TABLE.clsParamVls { PADDING-RIGHT: 2pt; PADDING-LEFT: 2pt } TABLE.clsParamVls TD { PADDING-RIGHT: 2pt; PADDING-LEFT: 2pt } UL { MARGIN-TOP: 10px; MARGIN-BOTTOM: 10px; MARGIN-LEFT: 17px } UL.clsBltBlu { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/bulletblue.gif) } UL.clsBltRed { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/bulletred.gif) } OL { MARGIN-TOP: 10px; MARGIN-BOTTOM: 10px; MARGIN-LEFT: 25px } UL LI { MARGIN-BOTTOM: 0.5em; LINE-HEIGHT: 120% } UL LI LI { LIST-STYLE-TYPE: disc } OL LI { MARGIN-BOTTOM: 0.7em } INPUT.clsButton { MARGIN-TOP: 10px; FONT-WEIGHT: bold; MARGIN-LEFT: 5px; COLOR: #ffffff; = BACKGROUND-COLOR: #6699cc } TD.clsGrayBar { PADDING-LEFT: 18px; BORDER-BOTTOM: #cccccc 2px inset; BACKGROUND-COLOR: = #cccccc } DIV.clsVoicesBody { MARGIN-LEFT: 10px; MARGIN-RIGHT: 10px } TABLE.clsVoicesHead { MARGIN-TOP: 4px } TD.clsCategory { FONT: bold 65% verdana,arial,helvetica,sans-serif } TD.clsVoiceNav { BACKGROUND-IMAGE: url(/msdn-online/voices/graphics/background.jpg); = PADDING-TOP: 4px } TD.clsVoiceNav DIV { FONT-SIZE: 90%; PADDING-TOP: 4px } TD.clsVoiceNav A:visited { COLOR: #003399 } TD.clsVoiceNav SPAN.clsLeftNavDot { FONT-WEIGHT: normal; FONT-SIZE: 100%; LINE-HEIGHT: 80%; FONT-STYLE: = normal; FONT-VARIANT: normal } TD.clsArchiveTD { PADDING-LEFT: 20px; PADDING-TOP: 20px } TD.clsArchiveTD { FONT: 68% verdana,arial,helvetica,sans-serif } H3.clsVoicesHead { MARGIN-BOTTOM: 1.5em; PADDING-TOP: 6px } TD.clsStoryTD { PADDING-RIGHT: 6px; PADDING-TOP: 4px } TH.clsStoryTD { PADDING-RIGHT: 6px; PADDING-TOP: 4px } DIV.clsByLine { FONT-SIZE: 80%; LINE-HEIGHT: 120%; PADDING-TOP: 2px } SPAN.pubdate { COLOR: #999999 } SPAN.pd { COLOR: #999999 } SPAN.clsPubdate { COLOR: #999999 } TD.clsPubDate { COLOR: #999999 } P.clsPubDate { COLOR: #999999 } TABLE.clsCatItems TD.clsPubDate { PADDING-TOP: 4px } TABLE.clsCatItems A:link { TEXT-DECORATION: none } TABLE.clsCatItems A:visited { TEXT-DECORATION: none } TD.clsPubDate { PADDING-TOP: 10px } TABLE.clsCatItems { MARGIN-TOP: 5px } TABLE.clsCatItems P { MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px } P.clsPostDate { COLOR: #0099ff } DIV.clsPullQuote { PADDING-BOTTOM: 0.5em; FONT: italic 110%/140% = verdana,arial,helvetica,sans-serif; COLOR: #3366ff } DIV.clsPullQuote HR { PADDING-BOTTOM: 0.5em; FONT: italic 110%/140% = verdana,arial,helvetica,sans-serif; COLOR: #3366ff } TD.clsTDBody SPAN.clsHighlightItem { LINE-HEIGHT: 1.5em } IMG.clsLstImg { MARGIN-TOP: -2px } SPAN.clsHighlightItem A { FONT-SIZE: 120% } .clsNewsContent { DISPLAY: none } .clsTab { FONT: bold 65% verdana,arial,helvetica,sans-serif; CURSOR: hand; COLOR: = #ffffff; BACKGROUND-COLOR: #3366cc } .clsTabSelected { FONT: bold 65% verdana,arial,helvetica,sans-serif; CURSOR: hand; COLOR: = #000000; BACKGROUND-COLOR: #99ccff } .clsNewsItemTD { PADDING-TOP: 4px } #idTabs TD.clsTab { BORDER-RIGHT: #6699cc 1px solid; BORDER-TOP: #003366 2px solid; = BORDER-LEFT: #6699cc 1px solid; CURSOR: hand; BORDER-BOTTOM: #99ccff 2px = inset; BACKGROUND-COLOR: #003366 } #idTabs TD.clsTab A { FONT-SIZE: 95%; COLOR: #ffffff; TEXT-DECORATION: none } TD.clsTab A:hover { FONT-SIZE: 95%; COLOR: #ffffff; TEXT-DECORATION: none } TD.clsTab A:active { FONT-SIZE: 95%; COLOR: #ffffff; TEXT-DECORATION: none } #idTabs TD.clsTabSelected { BORDER-RIGHT: #99ccff 2px outset; BORDER-TOP: #99ccff 2px outset; = BORDER-LEFT: #99ccff 2px outset; BACKGROUND-COLOR: #6699cc } #idTabs TR.clsTblHead TD { BORDER-TOP: #cccccc 2px groove; BORDER-BOTTOM: #cccccc 1px outset } #idTabs TD.clsTabSelected A { FONT-WEIGHT: bold; FONT-SIZE: 95%; COLOR: #ccffcc; TEXT-DECORATION: = none } TD.clsTabSelected A:hover { FONT-WEIGHT: bold; FONT-SIZE: 95%; COLOR: #ccffcc; TEXT-DECORATION: = none } TD.clsTabSelected A:active { FONT-WEIGHT: bold; FONT-SIZE: 95%; COLOR: #ccffcc; TEXT-DECORATION: = none } #tabs A.clsTab { FONT-SIZE: 95%; COLOR: #ffffff; TEXT-DECORATION: none } #tabs A.clsTab:hover { COLOR: #ffffff } #tabs A.clsTab:active { COLOR: #ffffff } #tabs A.clsTab:visited { COLOR: #ffffff } #tabs A.clsTabSelected { FONT-WEIGHT: bold; FONT-SIZE: 95%; COLOR: #003399; TEXT-DECORATION: = none } #tabs A.clsTabSelected:active { COLOR: #000000 } #tabs A.clsTabSelected:hover { COLOR: #000000 } #tabs A.clsTabSelected:visited { COLOR: #000000 } TD.clsLToc A { CURSOR: hand; COLOR: #003399; TEXT-DECORATION: none } TD.clsLToc A:hover { CURSOR: hand; COLOR: #003399; TEXT-DECORATION: none } TD.clsLToc A:visited { CURSOR: hand; COLOR: #003399; TEXT-DECORATION: none } TD.clsLToc B { CURSOR: hand; COLOR: #003399; TEXT-DECORATION: none } TD.clsLToc A:hover { TEXT-DECORATION: underline } SPAN.st { FONT-WEIGHT: normal; FONT-SIZE: 100%; LINE-HEIGHT: 120%; FONT-STYLE: = normal; FONT-VARIANT: normal } UL.clsShowHide LI { FONT-WEIGHT: bold; LIST-STYLE-IMAGE: = url(/msdn-online/shared/graphics/plus.gif); CURSOR: hand; PADDING-TOP: = 2px } UL.clsShowHide DIV { FONT-WEIGHT: normal; PADDING-TOP: 4px } UL.clsShowHide A:visited { COLOR: #003399 } DIV.clsHide { DISPLAY: none } UL.clsShowHide LI.clsHide { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/plus.gif) } DIV.clsShow { DISPLAY: block; CURSOR: text } DIV.clsShow P { MARGIN-TOP: 6px; MARGIN-BOTTOM: 4px; LINE-HEIGHT: 120% } UL.clsShowHide LI.clsShow { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/minus.gif) } TD.clsBigNav A:visited { COLOR: #003399 } TD.clsBigNav A:hover { TEXT-DECORATION: underline } TD.clsBigNav { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; FONT-SIZE: 108%; PADDING-BOTTOM: = 0px; CURSOR: hand; PADDING-TOP: 0px } TD.clsBigNavSel { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; FONT-SIZE: 108%; PADDING-BOTTOM: = 0px; CURSOR: auto; PADDING-TOP: 0px } A#idToggleAll { FONT-WEIGHT: bold; COLOR: #003399 } A#idToggleAll IMG { VERTICAL-ALIGN: bottom } #lnkPrevText { FONT-WEIGHT: normal; FONT-SIZE: 7.5pt; COLOR: #003399; FONT-FAMILY: = verdana,arial,helvetica,sans-serif; TEXT-DECORATION: none } #lnkNextText { FONT-WEIGHT: normal; FONT-SIZE: 7.5pt; COLOR: #003399; FONT-FAMILY: = verdana,arial,helvetica,sans-serif; TEXT-DECORATION: none } #lnkUpText { FONT-WEIGHT: normal; FONT-SIZE: 7.5pt; COLOR: #003399; FONT-FAMILY: = verdana,arial,helvetica,sans-serif; TEXT-DECORATION: none } DIV.clsBucketBranch { MARGIN: 10px; FONT-STYLE: italic } DIV.clsBucketBranch A { COLOR: #003399; TEXT-DECORATION: none } DIV.clsBucketBranch A:link { COLOR: #003399; TEXT-DECORATION: none } DIV.clsBucketBranch A:active { COLOR: #003399; TEXT-DECORATION: none } DIV.clsBucketBranch A:visited { COLOR: #003399; TEXT-DECORATION: none } DIV.clsBucketBranch A:hover { COLOR: blue } TD.clsGrayTop { PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 10px; = FONT-WEIGHT: normal; PADDING-BOTTOM: 5px; COLOR: #003399; PADDING-TOP: = 5px; BORDER-BOTTOM: 0px } TD.clsRaised { PADDING-RIGHT: 10px; BORDER-TOP: #99ccff 1px solid; PADDING-LEFT: 10px; = PADDING-BOTTOM: 5px; PADDING-TOP: 5px; BORDER-BOTTOM: #003366 1px solid } TD.clsDarkRaised { PADDING-RIGHT: 10px; BORDER-TOP: #6699cc 1px solid; PADDING-LEFT: 10px; = PADDING-BOTTOM: 5px; PADDING-TOP: 5px; BORDER-BOTTOM: #000000 1px solid } TD.clsSunken { PADDING-RIGHT: 10px; BORDER-TOP: #003366 1px solid; PADDING-LEFT: 10px; = PADDING-BOTTOM: 5px; PADDING-TOP: 5px; BORDER-BOTTOM: #99ccff 1px solid } TD.clsBBarSunken { PADDING-RIGHT: 10px; BORDER-TOP: #003366 1px solid; PADDING-LEFT: 10px; = PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #99ccff 1px solid } TD.clsBBarRaised { PADDING-RIGHT: 10px; BORDER-TOP: #99ccff 1px solid; PADDING-LEFT: 10px; = PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #000033 1px solid } TD.clsLightGreen { FONT-WEIGHT: normal; COLOR: #ccffcc; FONT-STYLE: italic } TD.clsBtnUp { BORDER-RIGHT: #99ccff 2px outset; PADDING-RIGHT: 3px; BORDER-TOP: = #99ccff 2px outset; PADDING-LEFT: 3px; FONT-WEIGHT: bold; = PADDING-BOTTOM: 0px; BORDER-LEFT: #99ccff 2px outset; CURSOR: hand; = COLOR: #ffffff; PADDING-TOP: 0px; BORDER-BOTTOM: #99ccff 2px outset } TD.clsBtnDown { BORDER-RIGHT: #99ccff 2px inset; PADDING-RIGHT: 3px; BORDER-TOP: = #99ccff 2px inset; PADDING-LEFT: 3px; FONT-WEIGHT: bold; PADDING-BOTTOM: = 0px; BORDER-LEFT: #99ccff 2px inset; CURSOR: hand; COLOR: #ffffff; = PADDING-TOP: 0px; BORDER-BOTTOM: #99ccff 2px inset } TD.clsBtnOn { BORDER-RIGHT: #99ccff 2px inset; PADDING-RIGHT: 3px; BORDER-TOP: = #99ccff 2px inset; PADDING-LEFT: 3px; FONT-WEIGHT: bold; PADDING-BOTTOM: = 0px; BORDER-LEFT: #99ccff 2px inset; CURSOR: hand; COLOR: #ffffff; = PADDING-TOP: 0px; BORDER-BOTTOM: #99ccff 2px inset; BACKGROUND-COLOR: = #336699 } TD.clsBtnOff { BORDER-RIGHT: #6699cc 2px solid; PADDING-RIGHT: 3px; BORDER-TOP: = #6699cc 2px solid; PADDING-LEFT: 3px; FONT-WEIGHT: bold; PADDING-BOTTOM: = 0px; BORDER-LEFT: #6699cc 2px solid; COLOR: #ffffff; PADDING-TOP: 0px; = BORDER-BOTTOM: #6699cc 2px solid; tab-index: 0 } TABLE.clsRating TD { BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #666666 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; BORDER-LEFT: = #666666 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #cccccc 1px solid } #pBackTop { DISPLAY: none } TABLE.clsNavLinks A:hover { TEXT-DECORATION: underline } TABLE.clsNavLinks { CLEAR: both } #txtCharCount { BORDER-RIGHT: #cccccc 2px ridge; BORDER-TOP: #cccccc 2px ridge; = FONT-WEIGHT: bold; OVERFLOW: hidden; BORDER-LEFT: #cccccc 2px ridge; = WIDTH: 3.7em; BORDER-BOTTOM: #cccccc 2px ridge; HEIGHT: 1.5em; = BACKGROUND-COLOR: white; TEXT-ALIGN: right } TABLE.clsCmtEntryTbl TD { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 3px; = PADDING-TOP: 3px } SPAN.clsLeftNavDot { FONT-SIZE: 115%; COLOR: red; LINE-HEIGHT: 1 } DIV.clsExpanded { DISPLAY: inline; WIDTH: 100%; COLOR: #003399 } A.clsExpanded { DISPLAY: inline; WIDTH: 100%; COLOR: #003399 } DIV.clsCollapsed { DISPLAY: none } A.clsCollapsed { DISPLAY: none } SPAN.clsPropattr { FONT-WEIGHT: bold } #pStyles { DISPLAY: none; CURSOR: hand; TEXT-DECORATION: underline } #pCode { DISPLAY: none; CURSOR: hand; TEXT-DECORATION: underline } #pSyntax { DISPLAY: none; CURSOR: hand; TEXT-DECORATION: underline } #pEvents { DISPLAY: none; CURSOR: hand; TEXT-DECORATION: underline } #pStyles { DISPLAY: none; CURSOR: hand; TEXT-DECORATION: underline } #idToolbar { FONT-SIZE: 10pt } #idToolbar { BORDER-BOTTOM: #ffffff 1px solid } #idToolbar A:hover { TEXT-DECORATION: none } A.clsDisabled { CURSOR: text; COLOR: #003399; TEXT-DECORATION: none } A.clsEnabled { CURSOR: auto } SPAN.clsAccess { TEXT-DECORATION: underline } TABLE.clsIndex { PADDING-RIGHT: 2pt; MARGIN-TOP: 17pt; PADDING-LEFT: 2pt } TABLE.clsIndex TD { MARGIN: 3pt; BACKGROUND-COLOR: #eeeeee } TR.clsEntry { VERTICAL-ALIGN: top } TABLE.clsIndex TD.clsLetters { BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: center } TD.clsMainHead { MARGIN-TOP: 1.35em; FONT-WEIGHT: bold; FONT-SIZE: 145%; MARGIN-BOTTOM: = 0.5em; VERTICAL-ALIGN: top; BACKGROUND-COLOR: #ffffff } UL.clsIndex { MARGIN-TOP: 0pt; MARGIN-BOTTOM: 5pt; MARGIN-LEFT: 20pt } LI OL { PADDING-BOTTOM: 1.5em } A.clsLeftMenu { FONT-WEIGHT: bold; FONT-SIZE: 8pt; COLOR: #003399; TEXT-DECORATION: = none } A.clsLeftMenu:visited { FONT-WEIGHT: bold; FONT-SIZE: 8pt; COLOR: #003399; TEXT-DECORATION: = none } BUTTON.clsShowme { FONT-WEIGHT: bold; FONT-SIZE: 11px; WIDTH: 68px; COLOR: #ffffff; = FONT-FAMILY: arial; POSITION: relative; TOP: 2px; HEIGHT: 23px; = BACKGROUND-COLOR: #002f90 } BUTTON.clsShowme5 { FONT-WEIGHT: bold; FONT-SIZE: 11px; WIDTH: 68px; COLOR: #ffffff; = FONT-FAMILY: arial; POSITION: relative; TOP: 2px; HEIGHT: 23px; = BACKGROUND-COLOR: #002f90 } DIV.clsBeta { MARGIN-TOP: 0.5em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 0.5em; COLOR: red } DIV.clsHi { PADDING-LEFT: 2em; TEXT-INDENT: -2em } BUTTON.clsShowme { MARGIN-TOP: 0.5em; MARGIN-BOTTOM: 0.5em } BUTTON.clsShowme5 { MARGIN-TOP: 0.5em; MARGIN-BOTTOM: 0.5em } DIV.clsShowme { MARGIN-TOP: 0.5em; MARGIN-BOTTOM: 0.5em } SPAN.clsDefValue { FONT-WEIGHT: bold; FONT-FAMILY: 'courier new' } TD.clsDefValue { FONT-WEIGHT: bold; FONT-FAMILY: 'courier new' } SPAN.clsLiteral { FONT-FAMILY: 'courier new' } TD.clsLiteral { FONT-FAMILY: 'courier new' } SPAN.clsRange { FONT-STYLE: italic } TD.clsRange { FONT-STYLE: italic } SPAN.clsEntryText { FONT-SIZE: 8pt; LINE-HEIGHT: 12pt } SPAN.clsHeading { FONT-WEIGHT: bold; FONT-SIZE: 11pt; COLOR: #00319c } DIV.clsNote { MARGIN-BOTTOM: 4pt; BACKGROUND-COLOR: #eeeeee } SPAN.clsFmtLib { TEXT-TRANSFORM: lowercase } SPAN.clsFmtInc { TEXT-TRANSFORM: lowercase } SPAN.clsFmtIDL { TEXT-TRANSFORM: lowercase } SPAN.clsFmtDLL { TEXT-TRANSFORM: lowercase } #tblSiteMap DIV { LINE-HEIGHT: 120% } #idToc A.clsTocHeading { FONT-WEIGHT: bold; COLOR: #003399; TEXT-DECORATION: none } #idToc A.clsTocHeading:hover { TEXT-DECORATION: underline } #idToc A.clsTocItem { COLOR: #003399; TEXT-DECORATION: none } #idToc A.clsTocItem:hover { TEXT-DECORATION: underline } #idToc A.clsTocItemSelect { FONT-WEIGHT: bold; COLOR: #003399; TEXT-DECORATION: none } #idToc A.clsTocItemSelect:hover { COLOR: #003399 } #idToc UL { MARGIN-TOP: 0px; MARGIN-BOTTOM: 2px; MARGIN-LEFT: 24px } #idToc UL UL LI { MARGIN-TOP: 0.1em; MARGIN-LEFT: -24px } #idToc .noexpand { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/solid.gif) } #idToc .clsNoExpand { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/solid.gif) } #idToc .clsShowHide { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/plus.gif); CURSOR: = hand } #idToc .clsShowHideShowing { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/minus.gif); CURSOR: = hand } #idToc UL.clsItemsShow { LIST-STYLE-IMAGE: url(/msdn-online/shared/graphics/arrowstop.gif) } #idToc UL.clsItemsHide { DISPLAY: none } #idToc .clsStyleCheck { MARGIN-TOP: 5px; MARGIN-LEFT: 15px } #idToc .clsStyleText { MARGIN-TOP: -16px; FONT-SIZE: 10px; MARGIN-LEFT: 34px; CURSOR: default } UL.clsItemsShow { MARGIN-TOP: 5px } UL.clsItemsShow LI { MARGIN-TOP: 5px; MARGIN-LEFT: -17px } A.clsTocHeading { LINE-HEIGHT: 130% } UL.clsItemsShow LI A { COLOR: #003399 } UL.clsItemsShow A:visited { COLOR: #003399 } A.clsTocHeading { COLOR: #003399 } A.clsTocHeading:visited { COLOR: #003399 } UL.clsItemsShow LI A:hover { COLOR: #003399; TEXT-DECORATION: underline } A.clsTocHeading:hover { COLOR: #003399; TEXT-DECORATION: underline } .clsCCActListBG { BACKGROUND: #ffcc66 } .clsCCRatListBG { BACKGROUND: #99ccff } .clsCCRatList { BACKGROUND: none transparent scroll repeat 0% 0% } .clsCCActList { BACKGROUND: none transparent scroll repeat 0% 0% } .clsCCActListText { FONT-SIZE: xx-small; COLOR: #003366; FONT-FAMILY: verdana,arial,sans = serif } .clsCCActListHeader { FONT-SIZE: x-small; COLOR: #003399; FONT-FAMILY: verdana,arial,sans = serif } .clsCCActListHost { FONT-SIZE: x-small; BACKGROUND: none transparent scroll repeat 0% 0%; = COLOR: #003399; FONT-FAMILY: verdana,arial,sans serif } .clsDicta { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; FONT-SIZE: x-small; = PADDING-BOTTOM: 6px; PADDING-TOP: 6px; FONT-FAMILY: verdana,arial } .clsDesc { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; FONT-SIZE: x-small; = PADDING-BOTTOM: 6px; PADDING-TOP: 6px; FONT-FAMILY: verdana,arial } DIV.clsDesc SPAN.clsDesc { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } .clsCop { FONT-SIZE: x-small; COLOR: #6699cc; FONT-FAMILY: verdana,arial } .clsPrecis { BORDER-TOP: buttonhighlight 1px solid; FONT-SIZE: small; COLOR: = menutext; BORDER-BOTTOM: buttonshadow 1px solid; FONT-FAMILY: = verdana,arial; BACKGROUND-COLOR: menu } .clsCCGeneralHead { PADDING-RIGHT: 2pt; BORDER-TOP: #6699cc 1px solid; PADDING-LEFT: 6pt; = FONT-WEIGHT: bold; FONT-SIZE: 12pt; BACKGROUND: #003366; PADDING-BOTTOM: = 2pt; WIDTH: 100%; COLOR: #ffffff; PADDING-TOP: 2pt; FONT-FAMILY: = verdana,arial,sans serif; HEIGHT: 25px } .clsCCGeneralHead2 { PADDING-RIGHT: 2pt; BORDER-TOP: #ffffff 1px solid; PADDING-LEFT: 6pt; = FONT-WEIGHT: bold; FONT-SIZE: 10pt; BACKGROUND: #cccccc; PADDING-BOTTOM: = 2pt; WIDTH: 100%; COLOR: #003366; PADDING-TOP: 2pt; BORDER-BOTTOM: = #999999 1px solid; FONT-FAMILY: verdana,arial,sans serif; HEIGHT: 23px } ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/msdn-online/shared/components/ratings/ratings.aspx?ContentID=25020203&mnp2=1&HideDiscuss=1 =EF=BB=BF Page Stats
= =20
Print E-Mail Add to = Favorites

How would you rate the quality of this=20 content?

=
1 2 3 4 5 6 7 8 9
Poor   Outstanding
Tell us why you rated the content this way.=20 (optional)
Average rating:
8 out of = 9
1 2 3 4 5 6 7 8 9
412 people have rated this=20 = page
------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/library/mnp/2/aspx/js.aspx?&name=Menu var mnpMenuTop =3D null; var mnpMenuKill =3D null; var mnpMenuPopup =3D null; var mnpMenuUrl =3D null; var mnpMenuParent =3D null; var mnpMenuScrollTimer =3D null; var mnpMenuShadows =3D new Array(); var mnpMenuDirSave =3D "LTR"; var mnpMenuCTSave =3D false; var mnpMenuRenderStart =3D null; var mnpMenuShadowsEnabled =3D true; window.attachEvent("onload", mnpMenuInit); function mnpMenuInit() { try { mnpMenuDirSave =3D mnpMenuDir(); mnpMenuCTSave =3D mnpMenuCT(); } catch(e) { return; } mnpMenuTop =3D document.getElementById("mnpMenuTop"); mnpMenuUrl =3D mnpMenuTop.getAttribute("url"); mnpMenuParent =3D mnpMenuTop.getAttribute("parent"); mnpMenuAttach(mnpMenuTop); } function mnpPage(label, url, target, menu, linkID) { this.label =3D label; this.url =3D url; this.target =3D target; this.menu =3D menu; this.linkID =3D linkID; } function mnpLabel(label) { this.label =3D label; } function mnpMenuEnter() { if (mnpMenuKill) { window.clearTimeout(mnpMenuKill); mnpMenuKill =3D null; } } function mnpMenuLeave() { mnpMenuKill =3D window.setTimeout("mnpMenuKiller()", 200); } function mnpMenuKiller() { mnpKillMenu(mnpMenuTop.getAttribute("currentMenu")); mnpMenuTop.removeAttribute("currentMenu"); } function mnpMenuAttach(el) { el.attachEvent("onmouseenter", mnpMenuEnter); el.attachEvent("onmouseleave", mnpMenuLeave); var divs =3D el.getElementsByTagName("DIV"); var t =3D divs.length; for (var i=3D0; i < t; i++) { var div =3D divs.item(i); if (div.className =3D=3D "mnpMenuRow") { div.attachEvent("onmouseenter", mnpMenuMouseover); div.attachEvent("onmouseleave", mnpMenuMouseout); div.attachEvent("onmousedown", mnpMenuMousedown); div.attachEvent("onmouseup", mnpMenuMouseup); div.setAttribute("save-background", div.style.background); div.setAttribute("save-border", div.style.borderColor); var a =3D div.getElementsByTagName("A"); if (a.length > 0) { var a0 =3D a[0]; if (a0.getAttribute("aoff")) a0.outerHTML =3D a0.innerHTML; else { div.setAttribute("status", a0.href); div.attachEvent("onclick", mnpMenuClick); } } if (div.getAttribute("menu")) { var imgs =3D div.getElementsByTagName("IMG"); if (imgs.length > 0) { var img =3D imgs[0]; img.style.visibility =3D "visible"; } else { var x; if (mnpMenuDirSave =3D=3D "LTR") x =3D (div.offsetWidth - 10) + "px"; else if (mnpMenuTop.contains(div)) x =3D "4px"; else x =3D "6px"; var img =3D ""; div.insertAdjacentHTML("afterBegin", img); } } } } } function mnpMenuClick() { var div =3D window.event.srcElement; var a =3D div.getElementsByTagName("A"); if (a.length =3D=3D 0) return; if (window.event.shiftKey) { var target =3D a[0].target; a[0].target =3D "_new"; a[0].click(); a[0].target =3D target; } else a[0].click(); } function mnpKillMenu(id) { if (id =3D=3D null) return; var menu =3D document.getElementById(id); var current =3D menu.getAttribute("currentMenu"); if (current)=20 { mnpKillMenu(current); menu.removeAttribute("currentMenu"); } var temp =3D mnpMenuShadows[id]; if (temp) { var i; var tempLength =3D temp.length; for (i=3D0; i"; html +=3D "
"; html +=3D "
"; var isThisPage =3D false; var mLength =3D menu.items.length; for (var i=3D0; i"; if (url && (url !=3D mnpMenuUrl)) { var targetAttr =3D target =3D=3D "" ? "" : " target=3D'" + target + = "'"; if (mnpMenuCTSave) html +=3D "" + label + ""; else html +=3D "" + label + = ""; } else html +=3D "" + label + ""; html +=3D "
"; } html +=3D "
"; html +=3D "
"; html +=3D ""; document.body.insertAdjacentHTML("afterBegin", html); var div =3D document.getElementById(id); var sa =3D div.childNodes.item(1); var max =3D 0; var saLength =3D sa.childNodes.length; for (var i=3D0; i max) max =3D w; } max +=3D 34; if (max < 100) max =3D 100; else if (max > 410) max =3D 410; div.style.width =3D max + "px"; for (var i=3D0; i bodyHeight) { up.style.display =3D ""; up.childNodes.item(0).src =3D "/library/mnp/2/gif/up_disabled.gif"; down.style.display =3D ""; down.childNodes.item(0).src =3D "/library/mnp/2/gif/down_enabled.gif"; box.style.height =3D (bodyHeight - up.offsetHeight - down.offsetHeight = - 6) + "px"; } var bodyBottom =3D bodyTop + bodyHeight; if (y + div.offsetHeight > bodyBottom) { y -=3D div.offsetHeight - 25; if (y < bodyTop) y =3D bodyTop + (bodyHeight - div.offsetHeight) / 2; } if (mnpMenuDirSave =3D=3D "RTL") x -=3D div.offsetWidth; div.style.left =3D x + "px"; div.style.top =3D y + "px"; div.style.zIndex =3D parent.style.zIndex + 10; if (div.offsetLeft + div.offsetWidth > bodyWidth + bodyLeft) document.body.scrollLeft =3D div.offsetLeft + div.offsetWidth - = bodyWidth; hide_elements("SELECT", div); hide_elements("OBJECT", div); if (mnpMenuShadowsEnabled) { mnpMenuShadows[id] =3D mnpMenuShadow(div, "#666666", 4, = div.offsetWidth, div.offsetHeight); mnpMenuRenderStart =3D mnpMenuTime(); window.setTimeout("mnpMeasureRenderTime()", 1); } } function mnpMeasureRenderTime() { var msec =3D mnpMenuTime() - mnpMenuRenderStart; if (msec > 100) { // client is slow or document is huge, so disable shadows mnpMenuShadowsEnabled =3D false; } } function mnpMenuPt(el) { this.left =3D 0; this.top =3D 0; while (el) { this.left +=3D el.offsetLeft; this.top +=3D el.offsetTop; el =3D el.offsetParent; } } function mnpMenuMouseover() { var div =3D window.event.srcElement; var status =3D div.getAttribute("status"); if (status) window.status =3D status; div.style.background =3D "#CCCCCC"; div.style.borderColor =3D "#999999"; var pt =3D new mnpMenuPt(div); var x; if (mnpMenuDirSave =3D=3D "LTR") x =3D pt.left + div.offsetWidth - 1; else x =3D pt.left + 2; var y =3D pt.top - 3; var menu =3D div.getAttribute("menu"); if (menu) menu =3D "'" + menu + "'"; else menu =3D "null"; if (mnpMenuPopup) window.clearTimeout(mnpMenuPopup); var parent =3D div.parentElement.parentElement; mnpMenuPopup =3D window.setTimeout("mnpMenuOpen(" + menu + ", '" + = parent.id + "', " + x + ", " + y + ")", 200); } function mnpMenuMouseout() { var div =3D window.event.srcElement; window.status =3D ""; var menu =3D div.getAttribute("menu"); if (menu !=3D null && menu =3D=3D = div.parentElement.parentElement.getAttribute("currentMenu")) { div.style.background =3D "#CCCCCC"; div.style.borderColor =3D "#CCCCCC"; } else { div.style.background =3D div.getAttribute("save-background"); div.style.borderColor =3D div.getAttribute("save-border"); } if (mnpMenuPopup) { window.clearTimeout(mnpMenuPopup); mnpMenuPopup =3D null; } } function mnpMenuMousedown() { var div =3D window.event.srcElement; if (div.tagName !=3D "DIV") div =3D div.parentElement; div.style.background =3D "#999999"; } function mnpMenuMouseup() { var div =3D window.event.srcElement; if (div.tagName !=3D "DIV") div =3D div.parentElement; div.style.background =3D div.getAttribute("save-background"); } function mnpMenuTime() { var time =3D new Date(); return time.valueOf(); } function mnpStartScroll(dy) { var src =3D window.event.srcElement; src.style.background =3D "#CCCCCC"; src.style.borderColor =3D "#999999"; var div =3D src.parentElement; div.setAttribute("scrollTime0", mnpMenuTime()); div.setAttribute("scrollTop0", div.childNodes.item(1).scrollTop); mnpMenuScrollTimer =3D window.setInterval("mnpMenuScroll('" + div.id + = "', " + dy + ")", 35); } function mnpStopScroll() { var src =3D window.event.srcElement; src.style.background =3D "#F1F1F1"; src.style.borderColor =3D "#F1F1F1"; if (mnpMenuScrollTimer) window.clearInterval(mnpMenuScrollTimer); mnpMenuScrollTimer =3D null; } function mnpMenuScroll(id, dy) { var div =3D document.getElementById(id); var current =3D div.getAttribute("currentMenu"); if (current) { mnpKillMenu(current); div.removeAttribute("currentMenu"); } var box =3D div.childNodes.item(1); var y =3D div.getAttribute("scrollTop0") + Math.round((mnpMenuTime() - = div.getAttribute("scrollTime0")) * 0.150) * dy box.scrollTop =3D y; if (y !=3D box.scrollTop) { window.clearInterval(mnpMenuScrollTimer); mnpMenuScrollTimer =3D null; if (box.scrollTop =3D=3D 0) div.childNodes.item(0).childNodes.item(0).src =3D = "/library/mnp/2/gif/up_disabled.gif"; else div.childNodes.item(2).childNodes.item(0).src =3D = "/library/mnp/2/gif/down_disabled.gif"; } else if (dy < 0) div.childNodes.item(2).childNodes.item(0).src =3D = "/library/mnp/2/gif/down_enabled.gif"; else div.childNodes.item(0).childNodes.item(0).src =3D = "/library/mnp/2/gif/up_enabled.gif"; } function mnpMenuShadow(el, color, size, width, height) { var temp =3D new Array(); var i; for (i=3Dsize; i>0; i--) { var rect =3D document.createElement('div'); var rs =3D rect.style rs.position =3D 'absolute'; rs.left =3D (el.style.posLeft + i) + 'px'; rs.top =3D (el.style.posTop + i) + 'px'; rs.width =3D width + 'px'; rs.height =3D height + 'px'; rs.zIndex =3D el.style.zIndex - i; rs.backgroundColor =3D color; var opacity =3D 1 - i / (i + 1); rs.filter =3D 'alpha(opacity=3D' + (100 * opacity) + ')'; document.body.appendChild(rect); temp[i] =3D rect; } return temp; } function hide_elements(tagName, menu) { windowed_element_visibility(tagName, -1, menu) } function show_elements(tagName, menu) { windowed_element_visibility(tagName, +1, menu) } function windowed_element_visibility(tagName, change, menu) { var els =3D document.getElementsByTagName(tagName) var i var rect =3D new element_rect(menu) var elsLength =3D els.length; for (i=3D0; i < elsLength; i++) { var el =3D els.item(i) if (elements_overlap(el, rect)) { if (el.visLevel) el.visLevel +=3D change else el.visLevel =3D change if (el.visLevel =3D=3D -1 && change =3D=3D -1) { el.visibilitySave =3D el.style.visibility; el.style.visibility =3D "hidden"; } else if (el.visLevel =3D=3D 0 && change =3D=3D +1) { el.style.visibility =3D el.visibilitySave; } } } } function element_rect(el) { var left =3D 0 var top =3D 0 this.width =3D el.offsetWidth this.height =3D el.offsetHeight while (el) { left +=3D el.offsetLeft top +=3D el.offsetTop el =3D el.offsetParent } this.left =3D left; this.top =3D top; } function elements_overlap(el, rect) { var r =3D new element_rect(el); return ((r.left < rect.left + rect.width) && (r.left + r.width > = rect.left) && (r.top < rect.top + rect.height) && (r.top + r.height > = rect.top)) } ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/mnp_utility.mspx/menujs?mnpshell=%2fmsdnmag%2fissues%2f02%2f02%2fconfig_issue.xml&clicktrax=False function mnpMenuDir() { return "LTR"; } function mnpMenuCT() { =09 return false; } function m0f731677f25f06028c42e4c7c51c96dc()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('Visual C++ .NET: Tips and Tricks to = Bolster Your Managed C++ Code in Visual Studio .NET', = '/msdnmag/issues/02/02/managedc/default.aspx', '', '', = '_S2_Node1_S1_Node1');=0A= this.items[n++] =3D new mnpPage('Visual Studio .NET: Custom Add-Ins = Help You Maximize the Productivity of Visual Studio .NET', = '/msdnmag/issues/02/02/VSIDE/default.aspx', '', '', = '_S2_Node1_S1_Node2');=0A= this.items[n++] =3D new mnpPage('Inside Windows: An In-Depth Look into = the Win32 Portable Executable File Format', = '/msdnmag/issues/02/02/PE/default.aspx', '', '', '_S2_Node1_S1_Node3');=0A= this.items[n++] =3D new mnpPage('ASP.NET: Create Snazzy Web Charts and = Graphics On the Fly with the .NET Framework', = '/msdnmag/issues/02/02/ASPDraw/default.aspx', '', '', = '_S2_Node1_S1_Node4');=0A= this.items[n++] =3D new mnpPage('Still in Love with C++: Modern = Language Features Enhance the Visual C++ .NET Compiler', = '/msdnmag/issues/02/02/ModernC/default.aspx', '', '', = '_S2_Node1_S1_Node5');=0A= this.items[n++] =3D new mnpPage('Talking To... Grady Booch Discusses = .NET and the Art of Software Development', = '/msdnmag/issues/02/02/TalkingTo/default.aspx', '', '', = '_S2_Node1_S1_Node6');=0A= this.items[n++] =3D new mnpPage('Editor\'s Note: Welcome Visual Studio = .NET', '/msdnmag/issues/02/02/ednote/default.aspx', '', '', = '_S2_Node1_S1_Node7');=0A= this.items[n++] =3D new mnpPage('New Stuff: Resources for Your = Developer Toolbox', '/msdnmag/issues/02/02/stuff/default.aspx', '', '', = '_S2_Node1_S1_Node8');=0A= this.items[n++] =3D new mnpPage('Web Q&A: Threading in MSXML, = Sorting XML, Order-by, Changing Mouse Pointer, and More', = '/msdnmag/issues/02/02/web/default.aspx', '', '', '_S2_Node1_S1_Node9');=0A= this.items[n++] =3D new mnpPage('The XML Files: Publishing and = Discovering Web Services with DISCO and UDDI', = '/msdnmag/issues/02/02/xml/default.aspx', '', '', '_S2_Node1_S1_Node10');=0A= this.items[n++] =3D new mnpPage('Data Points: Establishing = Relationships Between Rowsets with ADO.NET', = '/msdnmag/issues/02/02/Data/default.aspx', '', '', = '_S2_Node1_S1_Node11');=0A= this.items[n++] =3D new mnpPage('Cutting Edge: Data Binding Between = Controls in Windows Forms', = '/msdnmag/issues/02/02/cutting/default.aspx', '', '', = '_S2_Node1_S1_Node12');=0A= this.items[n++] =3D new mnpPage('Advanced Basics: COM+ and MTS, DCOM = and MSMQ, Serialization in .NET', = '/msdnmag/issues/02/02/Basics/default.aspx', '', '', = '_S2_Node1_S1_Node13');=0A= this.items[n++] =3D new mnpPage('.NET: Array Types in .NET', = '/msdnmag/issues/02/02/NET/default.aspx', '', '', '_S2_Node1_S1_Node14');=0A= this.items[n++] =3D new mnpPage('House of Web Services: The Continuing = Challenges of XML Web Services', = '/msdnmag/issues/02/02/WebServ/default.aspx', '', '', = '_S2_Node1_S1_Node15');=0A= this.items[n++] =3D new mnpPage('C++ Q&A: Getting a Class Name, = ImgView Revisited, GetModuleFileName, and More', = '/msdnmag/issues/02/02/c/default.aspx', '', '', '_S2_Node1_S1_Node16');=0A= }=0A= =0A= function m66be025db64f7146f504e0fec1b2bae3()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('Article Index', = '/msdnmag/find/default.aspx', '', '', '_S3_Node1_S1_Node1');=0A= this.items[n++] =3D new mnpPage('Technology Index', = '/msdnmag/find/tech.aspx', '', '', '_S3_Node1_S1_Node2');=0A= }=0A= =0A= function m3fd9abd6d4e6b1d47da1677743a69def()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('Source Code—2005', = '/msdnmag/code05.aspx', '', '', '_S3_Node2_S1_Node1');=0A= this.items[n++] =3D new mnpPage('Source Code—2004', = '/msdnmag/code04.aspx', '', '', '_S3_Node2_S1_Node2');=0A= this.items[n++] =3D new mnpPage('Source Code—2003', = '/msdnmag/code03.aspx', '', '', '_S3_Node2_S1_Node3');=0A= this.items[n++] =3D new mnpPage('Source Code—2002', = '/msdnmag/code02.aspx', '', '', '_S3_Node2_S1_Node4');=0A= this.items[n++] =3D new mnpPage('Source Code—2001', = '/msdnmag/code01.aspx', '', '', '_S3_Node2_S1_Node5');=0A= this.items[n++] =3D new mnpPage('Source Code—2000', = '/msdnmag/code00.aspx', '', '', '_S3_Node2_S1_Node6');=0A= this.items[n++] =3D new mnpPage('Code Updates', '/msdnmag/codeup.aspx', = '', '', '_S3_Node2_S1_Node7');=0A= this.items[n++] =3D new mnpPage('Utilities', '/msdnmag/utility.aspx', = '', '', '_S3_Node2_S1_Node8');=0A= }=0A= =0A= function m0e5c80cdf8bdd73274e5171bd96f4ed9()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('Back Issues—2005', = '/msdnmag/backissues05.aspx', '', 'm8339c35b91e84e0aa6ba5fd1009ba90a', = '_S3_Node3_S1_Node1');=0A= this.items[n++] =3D new mnpPage('Back Issues—2004', = '/msdnmag/backissues04.aspx', '', 'm96e30aa714574c66b42ce6275ca42c69', = '_S3_Node3_S1_Node2');=0A= this.items[n++] =3D new mnpPage('Back Issues—2003', = '/msdnmag/backissues03.aspx', '', 'me6db03d7b41641468869c09ab697dfd9', = '_S3_Node3_S1_Node3');=0A= this.items[n++] =3D new mnpPage('Back Issues—2002', = '/msdnmag/backissues02.aspx', '', 'm254a8ab1fec1c3abe032b83539b0a85a', = '_S3_Node3_S1_Node4');=0A= this.items[n++] =3D new mnpPage('Back Issues—2001', = '/msdnmag/backissues01.aspx', '', 'm085a11d8d8c493672ca085058be5eee9', = '_S3_Node3_S1_Node5');=0A= this.items[n++] =3D new mnpPage('Back Issues—2000', = '/msdnmag/backissues00.aspx', '', 'mf5861268d8d1944be2378e16b41c244b', = '_S3_Node3_S1_Node6');=0A= this.items[n++] =3D new mnpPage('MSJ', = '/isapi/gomscom.asp?TARGET=3D/msj/', '', = 'mad9576a1e9644518bcc4431524d008f4', '_S3_Node3_S1_Node7');=0A= this.items[n++] =3D new mnpPage('MIND', = '/isapi/gomscom.asp?TARGET=3D/mind/', '', = 'm9cca6fe513574a24b6356d6818d0a61f', '_S3_Node3_S1_Node8');=0A= this.items[n++] =3D new mnpPage('RSS Feeds', = '/msdnmag/rss/default.aspx', '', '', '_S3_Node3_S1_Node9');=0A= }=0A= =0A= function m8339c35b91e84e0aa6ba5fd1009ba90a()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('March 2005', = '/msdnmag/issues/05/03/default.aspx', '', '', = '_S3_Node3_S1_Node1_S1_Node1');=0A= this.items[n++] =3D new mnpPage('February 2005', = '/msdnmag/issues/05/02/default.aspx', '', '', = '_S3_Node3_S1_Node1_S1_Node2');=0A= this.items[n++] =3D new mnpPage('January 2005', = '/msdnmag/issues/05/01/default.aspx', '', '', = '_S3_Node3_S1_Node1_S1_Node3');=0A= }=0A= =0A= function m96e30aa714574c66b42ce6275ca42c69()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('December 2004', = '/msdnmag/issues/04/12/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node1');=0A= this.items[n++] =3D new mnpPage('November 2004', = '/msdnmag/issues/04/11/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node2');=0A= this.items[n++] =3D new mnpPage('October 2004', = '/msdnmag/issues/04/10/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node3');=0A= this.items[n++] =3D new mnpPage('September 2004', = '/msdnmag/issues/04/09/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node4');=0A= this.items[n++] =3D new mnpPage('August 2004', = '/msdnmag/issues/04/08/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node5');=0A= this.items[n++] =3D new mnpPage('July 2004', = '/msdnmag/issues/04/07/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node6');=0A= this.items[n++] =3D new mnpPage('June 2004', = '/msdnmag/issues/04/06/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node7');=0A= this.items[n++] =3D new mnpPage('May 2004', = '/msdnmag/issues/04/05/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node8');=0A= this.items[n++] =3D new mnpPage('April 2004', = '/msdnmag/issues/04/04/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node9');=0A= this.items[n++] =3D new mnpPage('March 2004', = '/msdnmag/issues/04/03/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node10');=0A= this.items[n++] =3D new mnpPage('February 2004', = '/msdnmag/issues/04/02/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node11');=0A= this.items[n++] =3D new mnpPage('January 2004', = '/msdnmag/issues/04/01/default.aspx', '', '', = '_S3_Node3_S1_Node2_S1_Node12');=0A= }=0A= =0A= function me6db03d7b41641468869c09ab697dfd9()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('December 2003', = '/msdnmag/issues/03/12/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node1');=0A= this.items[n++] =3D new mnpPage('November 2003', = '/msdnmag/issues/03/11/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node2');=0A= this.items[n++] =3D new mnpPage('October 2003', = '/msdnmag/issues/03/10/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node3');=0A= this.items[n++] =3D new mnpPage('September 2003', = '/msdnmag/issues/03/09/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node4');=0A= this.items[n++] =3D new mnpPage('August 2003', = '/msdnmag/issues/03/08/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node5');=0A= this.items[n++] =3D new mnpPage('July 2003', = '/msdnmag/issues/03/07/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node6');=0A= this.items[n++] =3D new mnpPage('June 2003', = '/msdnmag/issues/03/06/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node7');=0A= this.items[n++] =3D new mnpPage('May 2003', = '/msdnmag/issues/03/05/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node8');=0A= this.items[n++] =3D new mnpPage('April 2003', = '/msdnmag/issues/03/04/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node9');=0A= this.items[n++] =3D new mnpPage('March 2003', = '/msdnmag/issues/03/03/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node10');=0A= this.items[n++] =3D new mnpPage('February 2003', = '/msdnmag/issues/03/02/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node11');=0A= this.items[n++] =3D new mnpPage('January 2003', = '/msdnmag/issues/03/01/default.aspx', '', '', = '_S3_Node3_S1_Node3_S1_Node12');=0A= }=0A= =0A= function m254a8ab1fec1c3abe032b83539b0a85a()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('December 2002', = '/msdnmag/issues/02/12/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node1');=0A= this.items[n++] =3D new mnpPage('November 2002', = '/msdnmag/issues/02/11/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node2');=0A= this.items[n++] =3D new mnpPage('October 2002', = '/msdnmag/issues/02/10/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node3');=0A= this.items[n++] =3D new mnpPage('September 2002', = '/msdnmag/issues/02/09/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node4');=0A= this.items[n++] =3D new mnpPage('August 2002', = '/msdnmag/issues/02/08/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node5');=0A= this.items[n++] =3D new mnpPage('July 2002', = '/msdnmag/issues/02/07/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node6');=0A= this.items[n++] =3D new mnpPage('June 2002', = '/msdnmag/issues/02/06/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node7');=0A= this.items[n++] =3D new mnpPage('May 2002', = '/msdnmag/issues/02/05/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node8');=0A= this.items[n++] =3D new mnpPage('April 2002', = '/msdnmag/issues/02/04/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node9');=0A= this.items[n++] =3D new mnpPage('March 2002', = '/msdnmag/issues/02/03/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node10');=0A= this.items[n++] =3D new mnpPage('February 2002', = '/msdnmag/issues/02/02/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node11');=0A= this.items[n++] =3D new mnpPage('January 2002', = '/msdnmag/issues/02/01/default.aspx', '', '', = '_S3_Node3_S1_Node4_S1_Node12');=0A= }=0A= =0A= function m085a11d8d8c493672ca085058be5eee9()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('December 2001', = '/msdnmag/issues/01/12/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node1');=0A= this.items[n++] =3D new mnpPage('November 2001', = '/msdnmag/issues/01/11/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node2');=0A= this.items[n++] =3D new mnpPage('October 2001', = '/msdnmag/issues/01/10/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node3');=0A= this.items[n++] =3D new mnpPage('September 2001', = '/msdnmag/issues/01/09/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node4');=0A= this.items[n++] =3D new mnpPage('August 2001', = '/msdnmag/issues/01/08/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node5');=0A= this.items[n++] =3D new mnpPage('July 2001', = '/msdnmag/issues/01/07/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node6');=0A= this.items[n++] =3D new mnpPage('June 2001', = '/msdnmag/issues/01/06/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node7');=0A= this.items[n++] =3D new mnpPage('May 2001', = '/msdnmag/issues/01/05/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node8');=0A= this.items[n++] =3D new mnpPage('April 2001', = '/msdnmag/issues/01/04/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node9');=0A= this.items[n++] =3D new mnpPage('March 2001', = '/msdnmag/issues/01/03/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node10');=0A= this.items[n++] =3D new mnpPage('February 2001', = '/msdnmag/issues/01/02/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node11');=0A= this.items[n++] =3D new mnpPage('January 2001', = '/msdnmag/issues/01/01/default.aspx', '', '', = '_S3_Node3_S1_Node5_S1_Node12');=0A= }=0A= =0A= function mf5861268d8d1944be2378e16b41c244b()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('December 2000', = '/msdnmag/issues/1200/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node1');=0A= this.items[n++] =3D new mnpPage('November 2000', = '/msdnmag/issues/1100/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node2');=0A= this.items[n++] =3D new mnpPage('October 2000', = '/msdnmag/issues/1000/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node3');=0A= this.items[n++] =3D new mnpPage('September 2000', = '/msdnmag/issues/0900/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node4');=0A= this.items[n++] =3D new mnpPage('August 2000', = '/msdnmag/issues/0800/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node5');=0A= this.items[n++] =3D new mnpPage('July 2000', = '/msdnmag/issues/0700/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node6');=0A= this.items[n++] =3D new mnpPage('June 2000', = '/msdnmag/issues/0600/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node7');=0A= this.items[n++] =3D new mnpPage('May 2000', = '/msdnmag/issues/0500/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node8');=0A= this.items[n++] =3D new mnpPage('April 2000', = '/msdnmag/issues/0400/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node9');=0A= this.items[n++] =3D new mnpPage('March 2000', = '/msdnmag/issues/0300/default.aspx', '', '', = '_S3_Node3_S1_Node6_S1_Node10');=0A= }=0A= =0A= function mad9576a1e9644518bcc4431524d008f4()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('MSJ 2000', = '/isapi/gomscom.asp?TARGET=3D/msj/backissues00.aspx', '', '', = '_S3_Node3_S1_Node7_S1_Node1');=0A= this.items[n++] =3D new mnpPage('MSJ 1999', = '/isapi/gomscom.asp?TARGET=3D/msj/backissues99.aspx', '', '', = '_S3_Node3_S1_Node7_S1_Node2');=0A= this.items[n++] =3D new mnpPage('MSJ 1998', = '/isapi/gomscom.asp?TARGET=3D/msj/backissues98.aspx', '', '', = '_S3_Node3_S1_Node7_S1_Node3');=0A= this.items[n++] =3D new mnpPage('MSJ 1997', = '/isapi/gomscom.asp?TARGET=3D/msj/backissues97.aspx', '', '', = '_S3_Node3_S1_Node7_S1_Node4');=0A= this.items[n++] =3D new mnpPage('MSJ 1995-1996', = '/isapi/gomscom.asp?TARGET=3D/msj/backissues96.aspx', '', '', = '_S3_Node3_S1_Node7_S1_Node5');=0A= this.items[n++] =3D new mnpPage('MSJ 1986-1994', = '/isapi/gomscom.asp?TARGET=3D/msj/backissues86.aspx', '', '', = '_S3_Node3_S1_Node7_S1_Node6');=0A= }=0A= =0A= function m9cca6fe513574a24b6356d6818d0a61f()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('MIND 2000', = '/isapi/gomscom.asp?TARGET=3D/mind/backissues00.asp', '', '', = '_S3_Node3_S1_Node8_S1_Node1');=0A= this.items[n++] =3D new mnpPage('MIND 1999', = '/isapi/gomscom.asp?TARGET=3D/mind/backissues99.asp', '', '', = '_S3_Node3_S1_Node8_S1_Node2');=0A= this.items[n++] =3D new mnpPage('MIND 1998', = '/isapi/gomscom.asp?TARGET=3D/mind/backissues98.asp', '', '', = '_S3_Node3_S1_Node8_S1_Node3');=0A= this.items[n++] =3D new mnpPage('MIND 1997', = '/isapi/gomscom.asp?TARGET=3D/mind/backissues97.asp', '', '', = '_S3_Node3_S1_Node8_S1_Node4');=0A= this.items[n++] =3D new mnpPage('MIND 1996', = '/isapi/gomscom.asp?TARGET=3D/mind/backissues96.asp', '', '', = '_S3_Node3_S1_Node8_S1_Node5');=0A= }=0A= =0A= function mbf75615e0c7b0b018a47f1aaa4e9b7b9()=0A= {=0A= this.items =3D new Array();=0A= var n =3D 0;=0A= this.items[n++] =3D new mnpPage('Advanced Basics', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DAdvanced = Basics&words=3Dexact', '', '', '_S3_Node4_S1_Node1');=0A= this.items[n++] =3D new mnpPage('The ASP Column', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DThe ASP = Column&words=3Dexact', '', '', '_S3_Node4_S1_Node2');=0A= this.items[n++] =3D new mnpPage('Basic Instincts', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DBasic = Instincts&words=3Dexact', '', '', '_S3_Node4_S1_Node3');=0A= this.items[n++] =3D new mnpPage('Bugslayer', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DBugslayer&words=3D= exact', '', '', '_S3_Node4_S1_Node4');=0A= this.items[n++] =3D new mnpPage('C++ Q&A', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DC%2B%2B%20Q%26A&wo= rds=3Dexact', '', '', '_S3_Node4_S1_Node5');=0A= this.items[n++] =3D new mnpPage('Cutting Edge', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DCutting = Edge&words=3Dexact', '', '', '_S3_Node4_S1_Node6');=0A= this.items[n++] =3D new mnpPage('Data Points', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DData = Points&words=3Dexact', '', '', '_S3_Node4_S1_Node7');=0A= this.items[n++] =3D new mnpPage('Design Patterns', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DDesign = Patterns&words=3Dexact', '', '', '_S3_Node4_S1_Node8');=0A= this.items[n++] =3D new mnpPage('{ End Bracket }', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DEnd = Bracket&words=3Dexact', '', '', '_S3_Node4_S1_Node9');=0A= this.items[n++] =3D new mnpPage('.NET Column', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3D.NET = Column&words=3Dexact', '', '', '_S3_Node4_S1_Node10');=0A= this.items[n++] =3D new mnpPage('.NET Matters', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3D.NET = Matters&words=3Dexact', '', '', '_S3_Node4_S1_Node11');=0A= this.items[n++] =3D new mnpPage('Security Briefs', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DSecurity = Briefs&words=3Dexact', '', '', '_S3_Node4_S1_Node12');=0A= this.items[n++] =3D new mnpPage('Service Station', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DService = Station&words=3Dexact', '', '', '_S3_Node4_S1_Node13');=0A= this.items[n++] =3D new mnpPage('Test Run', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DTest = Run&words=3Dexact', '', '', '_S3_Node4_S1_Node14');=0A= this.items[n++] =3D new mnpPage('Web Q&A', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DWeb = Q%26A&words=3Dexact', '', '', '_S3_Node4_S1_Node15');=0A= this.items[n++] =3D new mnpPage('Wicked Code', = '/msdnmag/find/default.aspx?type=3DTi&phrase=3DWicked = Code&words=3Dexact', '', '', '_S3_Node4_S1_Node16');=0A= }=0A= =0A= ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/library/svy/broker.js // // // Copyright 2004 SurveySite. All rights reserved. // Create the configuration, globals, and constants namespaces. var SiteRecruit_Config =3D new Object(); var SiteRecruit_Globals =3D new Object(); var SiteRecruit_Constants =3D new Object(); // Browser information. SiteRecruit_Constants.browser =3D new Object(); SiteRecruit_Constants.browser.internetExplorer =3D 'Microsoft Internet = Explorer'; SiteRecruit_Constants.browser.mozilla =3D 'Netscape'; // Check browser information. SiteRecruit_Globals.browserName =3D navigator.appName;=20 SiteRecruit_Globals.browserVersion =3D parseInt(navigator.appVersion); // Initialize browser flags. SiteRecruit_Globals.isInternetExplorer =3D false; SiteRecruit_Globals.isMozilla =3D false; // Check for Internet Explorer based browsers. if (SiteRecruit_Globals.browserName =3D=3D = SiteRecruit_Constants.browser.internetExplorer) { if (SiteRecruit_Globals.browserVersion > 3) { SiteRecruit_Globals.isInternetExplorer =3D true; } } // Check for Mozilla based browsers. if (SiteRecruit_Globals.browserName =3D=3D = SiteRecruit_Constants.browser.mozilla) { if (SiteRecruit_Globals.browserVersion > 4) { SiteRecruit_Globals.isMozilla =3D true; } } // Cookie lifetime. SiteRecruit_Constants.cookieLifetimeType =3D new Object(); SiteRecruit_Constants.cookieLifetimeType.duration =3D 1; SiteRecruit_Constants.cookieLifetimeType.expireDate =3D 2; =20 // Invitation type. SiteRecruit_Constants.invitationType =3D new Object(); SiteRecruit_Constants.invitationType.immediate =3D 1; SiteRecruit_Constants.invitationType.domainDeparture =3D 2; =20 // Cookie type flags. SiteRecruit_Constants.cookieType =3D new Object(); SiteRecruit_Constants.cookieType.alreadyAsked =3D 1; SiteRecruit_Constants.cookieType.inProgress =3D 2; // Alignment types. SiteRecruit_Constants.horizontalAlignment =3D new Object(); SiteRecruit_Constants.horizontalAlignment.left =3D 1; SiteRecruit_Constants.horizontalAlignment.middle =3D 2; SiteRecruit_Constants.horizontalAlignment.right =3D 3; SiteRecruit_Constants.verticalAlignment =3D new Object(); SiteRecruit_Constants.verticalAlignment.top =3D 1; SiteRecruit_Constants.verticalAlignment.middle =3D 2; SiteRecruit_Constants.verticalAlignment.bottom =3D 3; // Survey cookie configuration. SiteRecruit_Config.cookieName =3D 'msresearch'; SiteRecruit_Config.cookieDomain =3D '.microsoft.com'; SiteRecruit_Config.cookiePath =3D '/'; // Cookie element join character. SiteRecruit_Constants.cookieJoinChar =3D ':'; // Settings for cookie lifetime. SiteRecruit_Config.cookieLifetimeType =3D 1; // Duration of the cookie in days. SiteRecruit_Config.cookieDuration =3D 90; // // // Copyright 2004 SurveySite. All rights reserved. // KeepAlive class definition. function SiteRecruit_KeepAlive() { // Time between page checks. this.keepAlivePollDelay =3D 1000; // Unique (well, sorta) ID for this page. this.id =3D Math.random(); // Attach methods. this.attemptStart =3D KeepAlive_attemptStart; this.checkCookie =3D KeepAlive_checkCookie; this.inProgressCookieExists =3D KeepAlive_inProgressCookieExists; // Start the KeepAlive if an in-progress cookie exists. function KeepAlive_attemptStart() { if (this.inProgressCookieExists()) { setInterval('SiteRecruit_Globals.keepAlive.checkCookie()', = this.keepAlivePollDelay); } } =20 // Check and update the cookie. function KeepAlive_checkCookie() { if (this.inProgressCookieExists()) { var j =3D SiteRecruit_Constants.cookieJoinChar; =20 // Update the cookie with the current time and location. var c =3D SiteRecruit_Config.cookieName + '=3D' + = SiteRecruit_Constants.cookieType.inProgress + j + escape(document.location) + j + (new Date()).getTime() + j + this.id + '; path=3D' + SiteRecruit_Config.cookiePath; =20 if (SiteRecruit_Config.cookieDomain !=3D '') { c +=3D '; domain=3D' + SiteRecruit_Config.cookieDomain; } =20 document.cookie =3D c; } } // Return true if an in-progress cookie exists. function KeepAlive_inProgressCookieExists() { var c =3D SiteRecruit_Config.cookieName + '=3D' + = SiteRecruit_Constants.cookieType.inProgress; =20 if (document.cookie.indexOf(c) !=3D -1) { return true; } =20 return false; } } // Create the KeepAlive if a suitable cookie exists. SiteRecruit_Globals.keepAlive =3D new SiteRecruit_KeepAlive(); SiteRecruit_Globals.keepAlive.attemptStart(); // // // Copyright 2004 SurveySite. All rights reserved. // Broker class definition. function SiteRecruit_PageConfigurationBroker() { this.urls =3D new Array(); this.pages =3D new Array(); =20 // Attach methods. this.start =3D PageConfigurationBroker_start; this.initializeMapping =3D = PageConfigurationBroker_initializeMapping; this.getConfigurationForPage =3D = PageConfigurationBroker_getConfigurationForPage; this.loadConfiguration =3D = PageConfigurationBroker_loadConfiguration; // Start the Broker. function PageConfigurationBroker_start(url) { this.initializeMapping(); =20 // Decide if there are surveys to run for this page. var configuration =3D this.getConfigurationForPage(url); =20 // If there is, load id up. if (configuration !=3D null) { this.loadConfiguration(configuration); } } =20 // Initializes the page mapping. function PageConfigurationBroker_initializeMapping() { var u =3D this.urls; var p =3D this.pages; =20 u[0] =3D = '//[\\w\\.-]+/vbasic((/)|(/default\\.mspx))?$'; p[0] =3D = '/library/svy/SiteRecruit_PageConfiguration_2475mt_VisualBasic_Page.js'; u[1] =3D '//[\\w\\.-]+((/)|(/default\\.aspx))?$'; p[1] =3D = '/library/svy/SiteRecruit_PageConfiguration_2641mt_HomePage_Page.js'; } =20 // Return the appropriate configuration for the given URL, if any. function PageConfigurationBroker_getConfigurationForPage(url) { var currentScore =3D 0; var currentMatch =3D -1; =20 // Iterate over each URL. for (var i =3D 0; i < this.urls.length; i++) { // Do the reg exp match. var r =3D new RegExp(this.urls[i], 'i'); if (url.toString().search(r) !=3D -1) { // Take the current if the score is equal or better. var newScore =3D this.urls[i].length; if (newScore >=3D currentScore) { currentMatch =3D i; currentScore =3D newScore; } } } =20 // If there was a match, return the appropriate page = configuration. var page =3D null; if (currentMatch >=3D 0) { page =3D this.pages[currentMatch]; } =20 return page; } =20 // Dynamically loads the associated configuration. function PageConfigurationBroker_loadConfiguration(configuration) { document.write(''); } } try { // Only run if the browser is supported. if (SiteRecruit_Globals.isInternetExplorer || = SiteRecruit_Globals.isMozilla) { // Create and start the Broker for the current location. SiteRecruit_Globals.broker =3D new = SiteRecruit_PageConfigurationBroker(); SiteRecruit_Globals.broker.start(window.location); } } catch (e) { // Suppress any errors. } ------=_NextPart_000_0000_01C5230F.CAC46F80 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://msdn.microsoft.com/msdnmag/js/msdnmag.js function Go(value) { if(value!=3D"0" && value!=3Dnull) { return true; =20 } else { return false; } } /* function Jump(value) { var re =3D /\d{6}/ if(re.test(value)&&value.length=3D=3D6) { return true; =20 } else { alert("Please enter a valid QuickJump Code"); return false; } } */ function OnPrintPage(){ var oWnd =3D window; var oDoc =3D oWnd.document; strLoc =3D "default.aspx?print=3Dtrue"; if (window.navigator.userAgent.indexOf("MSIE ")!=3D-1 && = navigator.appVersion.substr(0, 1) >=3D 4){ if( typeof(frmRatings)=3D=3D"object" ){ var oPrint =3D frmRatings.document.getElementById("Print"); if(oPrint !=3D null) oPrint.click(); } else{ if( oWnd.printHiddenFrame =3D=3D null){ oDoc.body.insertAdjacentHTML("beforeEnd", ""); framedoc =3D oWnd.printHiddenFrame.document; framedoc.open(); framedoc.write( "" + "" + ""); framedoc.close(); } else{ oWnd.printHiddenFrame.printMe.focus(); oWnd.printHiddenFrame.printMe.print(); } } =09 } else{ oWnd.location.href =3D strLoc; } return true; } function AuthorSearch(author) { var reSpace =3D /\s/ author=3Dauthor.replace(reSpace,"%20"); window.location.href=3D"/msdnmag/find/default.aspx?type=3DAu&phrase=3D" = + author; } function OpenUrl(url) { var childWin; childWin =3D = window.open(url,'window','height=3D300,width=3D640,status=3Dno,toolbar=3D= no,menubar=3Dno,location=3Dno,scrollbars=3Dyes,resizable=3Dyes'); childWin.focus(); //return false; } function ToggleDisplay(oButton, oItems) { if (oItems.style.display =3D=3D "none") { oItems.style.display =3D ""; oButton.src =3D "/msdnmag/images/minus.gif"; } else { oItems.style.display =3D "none"; oButton.src =3D "/msdnmag/images/plus.gif"; } return; } var x=3D0; function change() { var coll =3D document.all.tags("DIV"); if (x!=3D1){ {for (i=3D0; i-1){ coll[i].style.display=3D''; } } button1.value=3D" Collapse All " x=3D1 var coll2 =3D document.all.tags("IMG"); {for (i=3D0; i-1){ coll2[i].src=3D'/msdnmag/images/minus.gif'; } } } else { {for (i=3D0; i-1){ coll[i].style.display=3D'none'; } } button1.value=3D" Expand All " x=3D0 var coll2 =3D document.all.tags("IMG"); {for (i=3D0; i-1){ coll2[i].src=3D'/msdnmag/images/plus.gif'; } } } } ------=_NextPart_000_0000_01C5230F.CAC46F80--