{\rtf1\ansi \deff4\deflang1033{\fonttbl{\f1\froman\fcharset2\fprq2 Symbol;}{\f4\froman\fcharset0\fprq2 Times New Roman;}{\f5\fswiss\fcharset0\fprq2 Arial;}{\f11\fmodern\fcharset0\fprq1 Courier New;}} {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; \red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\nowidctlpar \f4\fs20 \snext0 Normal;}{\s1\sb200\sa80\sl-440\slmult0\keepn\nowidctlpar \f4\fs34 \sbasedon0\snext0 heading 1;}{\s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 \sbasedon1\snext0 heading 2;}{\s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 \sbasedon2\snext0 heading 3;}{\s4\sa60\keepn\nowidctlpar \b\f5\fs20 \sbasedon0\snext0 heading 4;}{ \s5\sb240\sa60\nowidctlpar \f4\fs20 \sbasedon0\snext0 heading 5;}{\s6\sb240\sa60\nowidctlpar \i\f4\fs22 \sbasedon0\snext0 heading 6;}{\s7\sb240\sa60\nowidctlpar \f5\fs20 \sbasedon0\snext0 heading 7;}{\s8\sb240\sa60\nowidctlpar \i\f5\fs20 \sbasedon0\snext0 heading 8;}{\s9\sb240\sa60\nowidctlpar \b\i\f5\fs18 \sbasedon0\snext0 heading 9;}{\*\cs10 \additive Default Paragraph Font;}{\s15\keepn\nowidctlpar \f11\fs18 \sbasedon4\snext15 Code;}{\*\cs16 \additive\b\i\fs20\cf6 \sbasedon10 Rob's Notes;}{\*\cs17 \additive\f11\fs20 \sbasedon10 Code (character);}{\*\cs18 \additive\fs20\super \sbasedon10 footnote reference;}{\*\cs19 \additive\b\fs20 \sbasedon10 API (character);}{\s20\nowidctlpar \b\f4\fs20 \sbasedon0\snext0 API;}{ \s21\sb240\sa60\nowidctlpar \b\f5\fs72\kerning28 \sbasedon0\snext21 Title;}{\s22\nowidctlpar\tqc\tx4320\tqr\tx8640 \f4\fs20 \sbasedon0\snext22 header;}{\s23\nowidctlpar\tqc\tx4320\tqr\tx8640 \f4\fs20 \sbasedon0\snext23 footer;}{\*\cs24 \additive\fs20 \sbasedon10 page number;}{\s25\fi-2160\li3600\nowidctlpar \f4\fs16 \sbasedon0\snext25 Body Text 2;}{\s26\sa160\nowidctlpar \f4\fs21 \snext26 n,Normal1,body text,Blockquote,P;}{\s27\sb20\sa60\sl-220\slmult0\keepn\nowidctlpar \b\f4\fs19 \snext0 Tt,TT;}{ \s28\sb540\sa540\sl-540\slmult0\keepn\nowidctlpar \f4\fs44 \snext0 Ch;}{\s29\sb20\sa60\sl-220\slmult0\nowidctlpar\tx280\tx560 \f4\fs19 \sbasedon0\snext29 Tpf;}{\s30\li200\sa80\nowidctlpar \f4\fs21 \sbasedon0\snext0 Def1,VAR,DL,DFN;}{\s31\sl-220\slmult0 \nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 \snext31 Ex,CODE,PRE,CITE;}{\s32\fi-360\li360\sa80\nowidctlpar\tx360{\*\pn \pnlvl10 \pnf5\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\f4\fs21 \sbasedon26\snext32 List Bullet,UL,Lb1,b1;}{\s33\fi-360\li360\sa80\nowidctlpar\tqr\tx160\tx280{\*\pn \pnlvl10\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\f4\fs21 \sbasedon26\snext33 List Number;}{ \s34\sl-240\slmult0\keepn\nowidctlpar \f4\fs21 \snext30 Term1,DT;}{\s35\sb20\sa60\sl-220\slmult0\keepn\nowidctlpar \b\f4\fs19 \sbasedon0\snext0 Thf;}{\s36\sl-220\slmult0\keepn\nowidctlpar\tqr\tldot\tx8640 \f4\fs19 \sbasedon0\snext37 toc 1;}{ \s37\li280\sl-220\slmult0\nowidctlpar\tqr\tldot\tx8640 \f4\fs19 \sbasedon36\snext37 toc 2;}{\s38\li560\sl-220\slmult0\nowidctlpar\tqr\tldot\tx8640 \f4\fs19 \sbasedon36\snext38 toc 3;}{\s39\sb20\sa60\sl-220\slmult0\nowidctlpar \f4\fs19 \sbasedon29\snext39 tph;}{\s40\li600\nowidctlpar \f4\fs20 \sbasedon0\snext0 toc 4;}{\s41\li800\nowidctlpar \f4\fs20 \sbasedon0\snext0 toc 5;}{\s42\li1000\nowidctlpar \f4\fs20 \sbasedon0\snext0 toc 6;}{\s43\li1200\nowidctlpar \f4\fs20 \sbasedon0\snext0 toc 7;}{ \s44\li1400\nowidctlpar \f4\fs20 \sbasedon0\snext0 toc 8;}{\s45\li1600\nowidctlpar \f4\fs20 \sbasedon0\snext0 toc 9;}{\s46\li547\sa80\nowidctlpar \f4\fs21 \sbasedon30\snext46 Def2;}{\s47\li835\sl-220\slmult0 \keepn\nowidctlpar\tqr\tldot\tx6960\tqr\tldot\tx8640 \f4\fs19 \sbasedon36\snext47 TOC4,toc4;}{\s48\li1109\sl-220\slmult0\keepn\nowidctlpar\tqr\tldot\tx6960\tqr\tldot\tx8640 \f4\fs19 \sbasedon36\snext48 TOC5,toc5;}{\s49\sa160\nowidctlpar \b\f4\fs21\cf6 \sbasedon26\snext49 Comment;}{\s50\nowidctlpar \f4\fs20 \sbasedon0\snext50 footnote text;}{\s51\fi-1440\li2880\nowidctlpar \f4\fs16 \sbasedon0\snext51 Body Text Indent 2;}{\s52\qr\sl-160\slmult0\widctlpar \f4\fs12 \sbasedon0\snext0 Le,e;}{ \s53\li-1800\sb80\sa240\widctlpar\tx0\tx280\tx560 \f4\fs28 \snext0 Art;}{\s54\nowidctlpar \b\f4\fs20\cf2 \sbasedon0\snext54 Body Text;}}{\info{\title VXDCLNT--Sample Ring-0 HID Device Mapper}{\author Denys Howard}{\operator Denys Howard} {\creatim\yr1997\mo3\dy21\hr16\min50}{\revtim\yr1997\mo4\dy18\hr9\min43}{\printim\yr1997\mo4\dy17\hr16\min12}{\version2}{\edmins36}{\nofpages12}{\nofwords2624}{\nofchars14959}{\*\company Microsoft}{\vern57443}} \facingp\widowctrl\ftnbj\aenddoc\aftnnar\hyphcaps0\formshade \fet0\sectd \sbkodd\pgnrestart\linex0\endnhere\titlepg {\headerl \pard\plain \s22\qr\widctlpar\brdrb\brdrs\brdrw15\brsp20 \tqc\tx4320\tqr\tx8640 \f4\fs20 {\field{\*\fldinst {\b\f5\fs18 styleref Ch \\* Mergeformat }}{\fldrslt {\b\f5\fs18\lang1024 VXDCLNT\emdash Sample Ring-0 HID Device Mapper}}}{\b\f5\fs18 }{\b\f5\fs18\expnd-7\expndtw-35 }{\b\f5\fs18 \emdash }{\b\f5\fs18\expnd-7\expndtw-35 }{\b\f5\fs18 }{\field{\*\fldinst { \b\f5\fs18 page }}{\fldrslt {\b\f5\fs18\lang1024 12}}}{\b\f5\fs18 \par }\pard \s22\widctlpar\tqc\tx4320\tqr\tx8640 \par }{\headerr \pard\plain \s22\qr\widctlpar\brdrb\brdrs\brdrw15\brsp20 \tqc\tx4320\tqr\tx8640 \f4\fs20 {\field{\*\fldinst {\b\f5\fs18 styleref Ch \\* Mergeformat }}{\fldrslt {\b\f5\fs18\lang1024 VXDCLNT\emdash Sample Ring-0 HID Device Mapper}}}{\b\f5\fs18 } {\b\f5\fs18\expnd-7\expndtw-35 }{\b\f5\fs18 \emdash }{\b\f5\fs18\expnd-7\expndtw-35 }{\b\f5\fs18 }{\field{\*\fldinst {\b\f5\fs18 page }}{\fldrslt {\b\f5\fs18\lang1024 11}}}{\b\f5\fs18 \par }\pard \s22\widctlpar\tqc\tx4320\tqr\tx8640 \par }{\footerl \pard\plain \s23\widctlpar\tqc\tx4320\tqr\tx8640 \f4\fs20 {\b\i\f5\fs22 Microsoft Confidential Draft. Do Not Redistribute.}{\b\fs22 \line }{\i\f5\fs16 \'a9 1997 Microsoft Corporation. All rights reserved.}{\f5\fs16 \par }}{\footerr \pard\plain \s23\widctlpar\tqc\tx4320\tqr\tx8640 \f4\fs20 {\b\i\f5\fs22 Microsoft Confidential Draft. Do Not Redistribute.}{\b\fs22 \line }{\i\f5\fs16 \'a9 1997 Microsoft Corporation. All rights reserved.} \par }{\footerf \pard\plain \s23\widctlpar\tqc\tx4320\tqr\tx8640 \f4\fs20 {\b\i\f5\fs22 Microsoft Confidential Draft. Do Not Redistribute.}{\b\fs22 \line }{\i\f5\fs16 \'a9 1997 Microsoft Corporation. All rights reserved.} \par }{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5 \pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s26\sa160\widctlpar\brdrb\brdrs\brdrw45\brsp200 \tqr\tx8476 \f4\fs21 {\b\i\f5\fs60\expnd16\expndtw80 Microsoft}{\b\i\f5\fs16\expnd12\expndtw60 \'ae \line }{\b\i\f5\fs36 Memphis Developer's Release Device Driver Kit}{\fs36 \par }\pard\plain \s28\sb540\sa540\sl-540\slmult0\keepn\widctlpar \f4\fs44 {\fs40 VXDCLNT\emdash Sample Ring-0 HID Device Mapper \par }\pard\plain \s29\sb20\sa60\sl-220\slmult0\widctlpar\tx280\tx560 \f4\fs19 This document is for informational purposes only. MICROSOFT{\b }MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS DOCUMENT. \par \pard \s29\sb20\sa60\sl-220\slmult0\widctlpar\tx280\tx560 Microsoft Corporation may have patents o r pending patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. The furnishing of this document does not give you any license to the patents, trademarks, copyrights, or other intellect ual property rights except as expressly provided in any written license agreement from Microsoft Corporation. \par \pard \s29\sb20\sa60\sl-220\slmult0\widctlpar\tx280\tx560 Microsoft does not make any representation or warranty regarding specifications in this document or any product or item developed based on these sp ecifications. Microsoft disclaims all express and implied warranties, including but not limited to the implied warranties or merchantability, fitness for a particular purpose and freedom from infringement. Without limiting the generality of the foregoing, Microsoft does not make any warranty of any kind that any item developed based on these specifications, or any portion of a specification, will not infringe any copyright, patent, trade secret or other intellectual property right of any person or entity in any country. It is your responsibility to seek licenses for such intellectual property rights where appropriate. Microsoft shall not be liable for any damages arising out of or in connection with the use of these specifications, including liability for l ost profit, business interruption, or any other damages whatsoever. Some states do not allow the exclusion or limitation of liability or consequential or incidental damages; the above limitation may not apply to you. \par \pard \s29\sb20\sa60\sl-220\slmult0\widctlpar\tx280\tx560 ActiveMovie, ActiveVRML, ActiveX, BackOf fice, Developer Studio, Direct3D, DirectDraw, DirectInput, DirectMIDI, DirectMPEG, DirectMusic, DirectPlay, DirectSound, DirectX, Microsoft, NetMeeting, OpenType, Visual Basic, Visual C++, Win32, Windows, and Windows\~ NT are trademarks or registered trademarks of Microsoft Corporation in the United States and/or other countries. Other product and company names mentioned herein may be the trademarks of their respective owners. \par \pard \s29\sb20\sa60\sl-220\slmult0\widctlpar\tx280\tx560 \'a9\~1997\~Microsoft\~Corporation. All rights reserved. \par \pard\plain \s1\sb200\sa80\sl-440\slmult0\keepn\widctlpar \f4\fs34 \page {\*\bkmkstart _Toc383742559}{\*\bkmkstart _Toc384008987}{\*\bkmkstart _Toc379612476}Introduction{\*\bkmkend _Toc383742559}{\*\bkmkend _Toc384008987} \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 A HID mapper VxD is one which maps I/O to and from a USB HID device (or some other HID-controllable device) to a legacy interface. Memphis includes three such mappers: \par {\pntext\pard\plain\f1\fs21 \'b7\tab}\pard\plain \s32\fi-360\li360\sa80\widctlpar\tx280{\*\pn \pnlvlblt\pnf1\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\f4\fs21 Kbhid.vxd maps keyboard HID reports to Vkd.vxd. \par {\pntext\pard\plain\f1\fs21 \'b7\tab}Mouhid.vxd maps mouse HID reports to Vmd.vxd. \par {\pntext\pard\plain\f1\fs21 \'b7\tab}Joyhid.vxd maps HID reports from joysticks and other game devices to Vjoyd.vxd. \par \pard\plain \s52\qr\sl-160\slmult0\widctlpar \f4\fs12 \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 The following diagram shows the relationships of these files: \par \pard \s26\qc\sa160\nowidctlpar {\pard\plain \s26\qc\sa160\nowidctlpar \f4\fs21 {\object\objemb\objw6356\objh3353{\*\objclass }{\*\objdata 01050000020000000f000000576f72642e506963747572652e3800000000000000000000760000 d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffdffffff11000000fefffffffeffffff05000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f00000010000000feffffff29000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e00 00001f00000020000000feffffff22000000230000002400000025000000260000002700000028000000fefffffffeffffff2b0000002c0000002d0000002e0000002f0000003000000031000000feffffff33000000340000003500000036000000370000003800000039000000feffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff040000000709020000000000c000000000000046000000000000000000000000a0fc 14a0174cbc0103000000800100000000000001004f006c00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000000000000000000000001400000000000000030050004900430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0002010100000003000000ffffffff0000000000000000000000000000000000000000000000000000 00000000000000000000010000004c0000000000000003004d004500540041000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000201ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000040000001618000000000000feffffff02000000feffffff04000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0100000200000000000000000000000000000000ffffffff00c0000000600100ffffffff000000000000000000000000000000000000000000000000d002c0214c0000000000000000000800c92b000019170000d3180000180d00000000 0000000000000000000000000000e8030000e80300000000000000000000000000000000000000000000000000000000000000000000d002c0210000000000000000ee0200002d070000100e00005c0000008e4000008f40000007000000000000000100feff030a0000ffffffff0709020000000000c000000000000046 170000004d6963726f736f667420576f72642050696374757265000a0000004d53576f7264446f63000f000000576f72642e506963747572652e3800f439b271000000000000000000000000ffffffff000000000000000000000000000000000000000000000300d002c0210000000000000000ee02000036080000100e 0000640000009b400000a64000000700000000000000ffff0000ffffffff00c0000000600100ffffffff000000000000000000000000000000000000000000000000d002c0210000000000000000ee0200009a080000100e00008b000000a6400000d64000000700000000000000ffff0000ffffffff00c0000000600100 ffffffff000000000000000000000000000000000000000000000000d002c02100000000000000000800c92b19170000010009000003070c000006003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b0200000000050000000c027505580a 1c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c008a0100000a00040000002d0100000500000002010100000007000000fc020000ffffff000000040000002d01010008000000fa0200000700000000000000040000002d0102000c0000002403 040087031903cf061903cf0665028703650208000000fa0200000000000000000000040000002d01030004000000f001020007000000fc020000ffffff000000040000002d01020004000000f0010100050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01010008000000 fa0200000700000000000000040000002d0104000c000000240304000b071903530a1903530a65020b076502040000002d01030004000000f0010400040000002d01020004000000f001010005000000020101000000050000000201010000001c000000fb02adff0000000000009001000000000400001254696d657320 4e657720526f6d616e006b7eed77c057ef7701040a6d00000a00040000002d01010005000000090200000000050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c000000240304000b074504530a4504 530a91030b079103040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c0000002403040087034504cf064504cf069103 87039103040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c00000024030400030045044b0345044b03910303009103 040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c0000002403040003007105530a7105530abd040300bd0404000000 2d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c00000024030400030019034b0319034b03650203006502040000002d010300 04000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c000000240304000300b700530ab700530a030003000300040000002d01030004000000 f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c000000240304000300ed011b06ed011b06390103003901040000002d01030004000000f0010500 040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c000000240304009306ed01530aed01530a390193063901040000002d01030004000000f001050004000000 2d01020004000000f0010400050000000201010000000500000002010100000005000000020101000000030000001e000700000016046a05b807c504630205000000020101000000040000002d0101003a000000320ad6049e021f00040000000000580a750548494420436c617373204472697665722028484944434c41 53532e53595329003c001c003c0015003800170025002000200015003c001c0017002a0025001c0015001c003c001c003c00380033003c002e002e0015002e003c002e001c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604ba0004071500 170305000000020101000000040000002d01010028000000320a2600b2031300040000000000580a75054c6567616379204170706c69636174696f6e7300330025002a00250025002a0015003c002a002a001700170025002500170017002a002a00200005000000020101000000040000002701ffff0500000002010100 000005000000020101000000030000001e000700000016040204d40999034f0705000000020101000000040000002d0101001a000000320aaa0396070a00040000000000580a75054a4f594849442e56584420003c003c003c001c003c0015003c003c003c0005000000020101000000040000002701ffff050000000201 0100000005000000020101000000030000001e00070000001604020450069903cb0305000000020101000000040000002d0101001a000000320aaa0306040a00040000000000580a75054b42444849442e5658443c0038003c003c001c003c0015003c003c003c0005000000020101000000040000002701ffff05000000 02010100000005000000020101000000030000001e000700000016040204cc029903470005000000020101000000040000002d0101001a000000320aaa0379000a00040000000000580a75054d4f554849442e5658444a003c003c003c001c003c0015003c003c003c0005000000020101000000040000002701ffff0500 000002010100000005000000020101000000030000001e00070000001604d602cc026d02470005000000020101000000040000002d01010016000000320a7e02c3000700040000000000580a7505564d442e565844003c004a003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100 000005000000020101000000030000001e00070000001604d6028c066d02cb0305000000020101000000040000002d01010016000000320a7e026c040700040000000000580a7505564b442e565844003c003c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000 020101000000030000001e00070000001604d602100a6d024f0705000000020101000000040000002d01010019000000320a7e02c2070900040000000000580a7505564a4f59442e565844003c0020003c003c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000 020101000000030000001e00070000001604c801100a5f014f0705000000020101000000040000002d01010019000000320a7001b6070900040000000000580a750557494e4d4d2e444c4c004f001c003c004a004a0015003c003300330005000000020101000000040000002701ffff0500000002010100000005000000 020101000000030000001e00070000001604c801ac045f01bf0005000000020101000000040000002d01010017000000320a7001ef010800040000000000580a7505555345522e4558453c002e0033003800150033003c00330005000000020101000000040000002701ffff0500000002010100000008000000fa020000 0600000000000000040000002d010400050000001402d700a7010500000013022301a701040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300bb011c0193011c01a7013901040000002d010200 04000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009301de00bb01de00a701c100040000002d01020004000000f0010400040000002d01030004000000f001050005000000 0201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014020302a7010500000013024f02a701040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000 24030300bb01480293014802a7016502040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a0000002403030093010a02bb010a02a701ed01040000002d01020004000000 f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014022f03a7010500000013027b03a701040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000 fa0200000100000000000000040000002d0105000a00000024030300bb01740393017403a7019103040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300 93013603bb013603a7011903040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014025b04a701050000001302a704a701040000002d01030004000000f00104000700 0000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300bb01a0049301a004a701bd04040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa020000 0100000000000000040000002d0105000a0000002403030093016204bb016204a7014504040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014025b042b0505000000 1302a7042b05040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303003f05a0041705a0042b05bd04040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc02 0000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300170562043f0562042b054504040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa020000060000000000 0000040000002d0104000500000014022f032b050500000013027b032b05040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303003f057403170574032b059103040000002d01020004000000f001 0400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300170536033f0536032b051903040000002d01020004000000f0010400040000002d01030004000000f001050005000000020101000000 0500000002010100000008000000fa0200000600000000000000040000002d01040005000000140203022b050500000013024f022b05040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303003f05 4802170548022b056502040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a0000002403030017050a023f050a022b05ed01040000002d01020004000000f00104000400 00002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d010400050000001402d7002b0505000000130223012b05040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100 000000000000040000002d0105000a000000240303003f051c0117051c012b053901040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303001705de003f05 de002b05c100040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014025b04af08050000001302a704af08040000002d01030004000000f001040007000000fc020000 000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300c308a0049b08a004af08bd04040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa020000010000000000 0000040000002d0105000a000000240303009b086204c3086204af084504040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014022f03af080500000013027b03af08 040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300c30874039b087403af089103040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc02000000000000 0000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b083603c3083603af081903040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa020000060000000000000004000000 2d0104000500000014020302af080500000013024f02af08040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300c30848029b084802af086502040000002d01020004000000f001040004000000 2d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b080a02c3080a02af08ed01040000002d01020004000000f0010400040000002d01030004000000f001050005000000020101000000050000000201 0100000008000000fa0200000600000000000000040000002d010400050000001402d700af080500000013022301af08040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300c3081c019b081c01 af083901040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b08de00c308de00af08c100040000002d01020004000000f0010400040000002d010300 04000000f001050005000000020101000000040000002d01000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000031005400610062006c006500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0002010200000006000000ffffffff00000000000000000000000000000000000000000000000000000000 0000000000000000120000004b1d000000000000010043006f006d0070004f0062006a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 0000000000000000000003000000680000000000000003004f0062006a0049006e0066006f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010500000008000000ffffffff000000000000000000000000000000000000000000000000 00000000000000000000000005000000040000000000000057006f007200640044006f00630075006d0065006e007400000000000000000000000000000000000000000000000000000000000000000000000000000000001a000200ffffffffffffffffffffffff00000000000000000000000000000000000000000000 000000000000000000000000000021000000001000000000000012000f000a0001005b000f00020000000000000024000040f1ff02002400000006004e006f0072006d0061006c0000000200000004006d4809040000000000000000000000000000000000003c004140f2ffa1003c000000160044006500660061007500 6c0074002000500061007200610067007200610070006800200046006f006e00740000000000000000000000000000000000210000002d00000039000000450000004e000000570000006200000077000000820000008c000000af00000001000000000000000000ffffffff0c0400000000000001000000000000000000 ffffffff0e0400000000000001000000000000000000ffffffff0f0400000000000001000000000000000000ffffffff100400000000000001000000000000000000ffffffff110400000000000001000000000000000000ffffffff120400000000000001000000000000000000ffffffff130400000000000001000000 000000000000ffffffff0d0400000000000001000000000000000000ffffffff140400000000000001000000000000000000ffffffff150400000000000001000000000000000000ffffffff000000000000000000000000210000002d00000039000000450000004e000000570000006200000077000000820000008c00 00008f000000000000000000010000000000020000000000030000000000040000000000050000000000060000000000070000000000080000000000090000000000ffff0000000000000000af0000000600000c00000000ffffffff010000000420ffff01000000000000000000af00000000000000000000040000af04 00000300000000040000af0400000400000000040000ae040000050000000f0000f038000000000006f01800000022040000020000002100000001000000010000002200000040001ef110000000ffff00000000ff0080808000f7000010000f0002f0a2110000100008f00800000021000000210400000f0003f0401100 000f0004f028000000010009f0100000000000000000000000000000000000000002000af00800000000040000050000000f0004f0c800000002000af00800000002040000000a000023010bf0980000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ff ffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f0200000200bf032000200005000500f0ff0000f24d164ef24d164e0000000000000000f24d060008000200004000ac040000ac01600080000010f00400000017000000000011f0040000 00010000000f0004f0c800000002000af00800000003040000000a000023010bf0980000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d701020000 00ff01100010003f0200000200bf032000200005000500f0ff0000f24d164ef24d164e0000000000000000f24d060008000200004000ac040000ac01600080000010f00400000019000000000011f004000000010000000f0004f0c200000002000af00800000004040000000a000013010bf0920000004201204e000043 01204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f020000020005000500f0ff0000f24d164ef24d164e0000000000000000f24d0600080002 00004000ac040000ac01600080000010f00400000011000000000011f004000000010000000f0004f0c200000002000af00800000005040000000a000013010bf0920000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100 000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f020000020005000500f0ff0000f24d164ef24d164e0000000000000000f24d060008000200004000ac040000ac01600080000010f00400000012000000000011f004000000010000000f0004f0c200000002000af008 00000006040000000a000013010bf0920000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f020000020005000500f0 ff0000f24d164ef24d164e0000000000000000f24d060008000200004000ac040000ac01600080000010f00400000014000000000011f004000000010000000f0004f0c200000002000af00800000007040000000a000013010bf0920000004201204e00004301204e000045c11400000046c1120000007f010100010080 01000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f020000020005000500f0ff0000f24d1d4ef24d1d4e0000000000000000f24d060008000200004000ac040000ac01600080000010f004000000100000 00000011f004000000010000000f0004f0c200000002000af00800000008040000000a000013010bf0920000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100 000000d70102000000ff01100010003f020000020005000500f0ff0000f24d164ef24d164e0000000000000000f24d060008000200004000ac040000ac01600080000010f00400000013000000000011f004000000010000000f0004f0c200000002000af00800000009040000000a000013010bf0920000004201204e00 004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f020000020005000500f0ff0000f24d1d4ef24d1d4e0000000000000000f24d060008 000200004000ac040000ac01600080000010f0040000001f000000000011f004000000010000000f0004f0c200000002000af0080000000a040000000a000013010bf0920000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c0 0100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f020000020005000500f0ff0000f24d1b4ef24d1b4e0000000000000000f24d060008000200004000ac040000ac01600080000010f0040000001d000000000011f004000000010000000f0004f0c200000002000a f0080000000b040000000a000013010bf0920000004201204e00004301204e000045c11400000046c1120000007f01010001008001000000008101ffffff008301ffffff00bf0110001000c00100000000cb012b2a0000ce0100000000d00100000000d10100000000d70102000000ff01100010003f0200000200050005 00f0ff0000f24d174ef24d174e0000000000000000f24d060008000200004000ac040000ac01600080000010f0040000001e000000000011f004000000010000000f0004f06c00000012000af0080000000c040000000a000083000bf03000000080000000010081009c31000082009c31000083009c31000084009c3100 00bf0100001000ff01000008003f0200000200000010f0040000000c000000000011f0040000000100000000000df004000000000001000f0004f06c00000012000af0080000000d040000000a000083000bf03000000080000000080081009c31000082009c31000083009c31000084009c310000bf0100001000ff0100 0008003f0200000200000010f0040000001a000000000011f0040000000100000000000df004000000000008000f0004f06c00000012000af0080000000e040000000a000083000bf03000000080000000020081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f020000020000 0010f0040000000d000000000011f0040000000100000000000df004000000000002000f0004f06c00000012000af0080000000f040000000a000083000bf03000000080000000030081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f0040000000e0000 00000011f0040000000100000000000df004000000000003000f0004f06c00000012000af00800000010040000000a000083000bf03000000080000000040081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f0040000000f000000000011f00400000001 00000000000df004000000000004000f0004f06c00000012000af00800000011040000000a000083000bf03000000080000000050081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f00400000015000000000011f0040000000100000000000df0040000 00000005000f0004f06c00000012000af00800000012040000000a000083000bf03000000080000000060081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f00400000016000000000011f0040000000100000000000df004000000000006000f0004f06c 00000012000af00800000013040000000a000083000bf03000000080000000070081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f00400000018000000000011f0040000000100000000000df004000000000007000f0004f06c00000012000af0080000 0014040000000a000083000bf03000000080000000090081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f0040000001b000000000011f0040000000100000000000df004000000000009000f0004f06c00000012000af00800000015040000000a000083 000bf030000000800000000a0081009c31000082009c31000083009c31000084009c310000bf0100001000ff01000008003f0200000200000010f0040000001c000000000011f0040000000100000000000df00400000000000a000f0004f05a00000042010af00800000016040000000a000073000bf02a000000d00101 000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f0040000000b000000000011f004000000010000000f0004f05a00000042010af00800000017040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d5 01000000003f0200000200000010f0040000000a000000000011f004000000010000000f0004f05a00000042010af00800000018040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000009000000000011f004 000000010000000f0004f05a00000042010af00800000019040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000008000000000011f004000000010000000f0004f05a00000042010af0080000001a04000000 0a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000007000000000011f004000000010000000f0004f05a00000042010af0080000001b040000000a000073000bf02a000000d00101000000d10101000000d201000000 00d30100000000d40100000000d501000000003f0200000200000010f00400000006000000000011f004000000010000000f0004f05a00000042010af0080000001c040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010 f00400000005000000000011f004000000010000000f0004f05a00000042010af0080000001d040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000004000000000011f004000000010000000f0004f05a0000 0042010af0080000001e040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000003000000000011f004000000010000000f0004f05a00000042010af0080000001f040000000a000073000bf02a000000d00101 000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000002000000000011f004000000010000000f0004f05a00000042010af00800000020040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d5 01000000003f0200000200000010f00400000001000000000011f004000000010000000f0004f05a00000042010af00800000021040000000a000073000bf02a000000d00101000000d10101000000d20100000000d30100000000d40100000000d501000000003f0200000200000010f00400000000000000000011f004 000000010000000f0004f04200000012000af00800000001040000000e000053000bf01e000000bf0100001000cb0100000000ff01000008000403090000003f0301000100000011f00400000001000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b 0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000af00000021040000d02f000030210000d12f0000512200006a000000000020040000d02f000000240000d1 2f0000212500006a00000000001f040000d02f0000d0260000d12f0000f12700006a00000000001e040000d02f0000a0290000d12f0000c12a00006a00000000001d040000602700003021000061270000512200006a00000000001c040000602700000024000061270000212500006a00000000001b04000060270000d0 26000061270000f12700006a00000000001a04000060270000a029000061270000c12a00006a000000000019040000f01e0000a0290000f11e0000c12a00006a000000000018040000f01e0000d0260000f11e0000f12700006a000000000017040000f01e000000240000f11e0000212500006a000000000016040000f0 1e000030210000f11e0000512200006a00000000000c040000a0200000c02a0000912d0000712c00006a00000000000e040000702c0000f0270000a1320000112900006a00000000000f04000000240000f0270000312a0000112900006a000000000010040000901b0000f0270000c1210000112900006a000000000007 040000001b0000c02a0000c0330000702c00006a000000000004040000e02b0000f0270000c1330000a02900006a00000000000504000070230000f0270000512b0000a02900006a000000000008040000001b000020250000e1220000d02600006a000000000006040000001b0000f0270000e1220000a02900006a0000 00000011040000901b000020250000c1210000412600006a0000000000120400000024000020250000c12a0000412600006a0000000000020400007023000020250000502b0000d02600006a400000000013040000702c00002025000031330000412600006a000000000003040000e02b000020250000c0330000d02600 006a40000000000d04000050220000801f0000e12b0000312100006a000000000014040000702c00009822000031330000b92300006a000000000015040000b01c00009822000041260000b92300006a00000000000a040000001b000050220000a0290000002400006a00000000000b040000c02a000050220000c03300 00002400006a000000000009040000001b0000691f0000c0330000192100006a00000000000000000021000000ad000000b0000000070007000700ff404850204c617365724a657420355369005c5c6d737072696e74395c636f7270620050434c35454d53004850204c617365724a657420355369004850204c61736572 4a6574203553690000000000000000000000000000000000000401049400400003770004010001007107df03000001000f0158020100010058020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000020000000000000000000000010040004d53554432034850204c617365724a6574203553690000000000000000000000000000000000e50300000f010000250100000000040064000a0000004850204c617365724a657420355369000000000000000000000000000000000000040104940040000377000401000100 7107df03000001000f01580201000100580204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000010040004d53554432034850204c617365724a65742035536900 00000000000000000000000000000000e50300000f010000250100000000040064000a000000008001000000000000000000546b74000000000000000000000000000000000000000000021000000000000000af000000600000080040000003000000471690010000020206030504050203040300000000000000000000 00000000000100000000000000540069006d006500730020004e0065007700200052006f006d0061006e00000035169001020005050102010706020507000000000000001000000000000000000000008000000000530079006d0062006f006c000000332690010000020b06040202020202040300000000000000000000 0000000000010000000000000041007200690061006c00000022000400f10888180000d0020000680100000000af8d1406b89014a600000000030001000000040000001b00000001000100000004008310010000000000000000000000010001000000010000000000000021030000008400000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a506c007b400b4008000123000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000002000000cd01ffff120000000000000000000000000000000c00440065006e0079007300200048006f00770061007200640002006500700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000eca5c1004700090400000012bf000000000000100000000000040000af0400000e00626a626a66da66da000000000000000000000000000000000000090416001e0c000004b0010004b001002100000000000000000000000000000000000000000000008d0000000000 0000ffff0f000000000000000000ffff0f000000000000000000ffff0f00000000000000000000000000000000005d00000000009200000000000000920000009200000000000000920000000000000026020000000000002602000000000000260200001400000000000000000000005602000000000000560200000000 000056020000000000005602000000000000560200000c000000620200000c00000056020000000000005b1a0000b60000007a020000000000007a020000000000007a020000000000007a020000000000007a020000000000002918000000000000291800000000000029180000000000003f1800000200000041180000 00000000411800000000000041180000390000007a180000d40000004e190000d4000000221a000024000000111b0000f4010000051d000046000000461a00001500000000000000000000000000000000000000260200000000000029180000000000000000000000000000000000000000000065140000c40300002918 00000000000029180000000000002918000000000000461a0000000000003f18000000000000920000000000000092000000000000007a0200000000000000000000000000007a020000eb1100007a020000000000003f180000000000003f180000000000003f1800000000000029180000160000009200000022010000 7a0200000000000026020000000000007a020000000000003f18000000000000000000000000000000000000000000003a0200000e000000480200000e000000920000000000000092000000000000009200000000000000920000000000000029180000000000003f180000000000003f180000000000003f1800000000 000000000000000000003f18000000000000b401000072000000260200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f180000000000007a020000000000006e0200000c00000040d2a1f4de4bbc0156020000 0000000056020000000000003f180000000000003f180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000008080808080808080808080808080808080808080808080808080808080808080d48494420436c617373204472697665722028484944434c4153532e535953290d0d4a4f594849442e5658440d0d4b42444849442e5658440d0d 4d4f554849442e5658440d0d564d442e5658440d0d564b442e5658440d0d564a4f59442e5658440d0d4c6567616379204170706c69636174696f6e730d0d57494e4d4d2e444c4c0d0d555345522e4558450d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000020040000af040000f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000d036a000000005508016d4800040002000400002104000041040000420400004d0400004e040000590400005a04000065040000660400006e0400006f040000770400007804000082040000830400009704000098040000a204 0000a3040000ac040000ad040000ae040000af040000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa000000000000000000000000 fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fa0000000000000000 00000000fd000000000000000000000000fa000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000324010001000000170004000021040000ae040000fefe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020101021c001fb0c04e20b0c04e21b0f81a22b0f71a2390611f2490482225b0000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500530075006d006d0061007200790049006e0066006f0072006d006100740069006f006e0000000000 00000000000000000000000000000000000000000000280002010700000009000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000002a0000000010000000000000050044006f00630075006d0065006e007400530075006d006d0061007200790049006e0066006f00 72006d006100740069006f006e000000000000000000000038000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000003200000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff0000040a02000000000000000000000000000000000001000000e0859ff2f94f 6810ab9108002b27b3d9300000007c01000012000000010000009800000002000000a000000003000000ac00000004000000b800000005000000d000000006000000dc00000007000000e800000008000000f8000000090000000401000012000000100100000a0000002c0100000b000000380100000c00000044010000 0d000000500100000e0000005c0100000f00000064010000100000006c010000130000007401000002000000e40400001e00000001000000000073001e00000001000000000073001e0000000d00000044656e797320486f7761726400006f001e0000000100000000656e791e0000000100000000656e791e0000000700 00004e6f726d616c006f1e000000030000006570006d1e000000020000003300006d1e000000130000004d6963726f736f667420576f726420382e300000400000000046c32300000000400000000000000000000000400000000022fceebb4bbc01400000000038ebb7de4bbc0103000000010000000300000004000000 030000001b00000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000feff0000040a0200000000000000000000000000000000000200000002d5cdd59c2e1b10939708002b2cf9ae4400000005d5cdd59c2e1b10939708002b2cf9ae600100001c0100000d00000001000000700000000f0000007800000004000000 9800000005000000a000000006000000a800000011000000b000000017000000b80000000b000000c000000010000000c800000013000000d000000016000000d80000000d000000e00000000c000000ed00000002000000e40400001e000000160000004d6963726f736f667420436f72706f726174696f6e0031000300 0000002e000003000000010000000300000001000000030000002100000003000000b30d08000b000000000000000b000000000000000b000000000000000b000000000000001e1000000100000001000000000c100000040000001e000000060000005469746c650003000000010000001e000000010000000003000000 00000000980000000300000000000000200000000100000036000000020000003e00000001000000020000000a0000005f5049445f475549440002000000e4040000410000004e0000007b00350045003500370043003700320030002d0042003700390037002d0031003100440030002d0042003600420038002d003000 300041004100300030003600460046004500440036007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}{\result {\fs20 {\pict\wmetafile8\picw11210\pich5913\picwgoal6355\pichgoal3352 010009000003070c000006003a00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b0200000000050000000c027505580a1c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a00060000000c 008a0100000a00040000002d0100000500000002010100000007000000fc020000ffffff000000040000002d01010008000000fa0200000700000000000000040000002d0102000c0000002403040087031903cf061903cf0665028703650208000000fa0200000000000000000000040000002d01030004000000f0010200 07000000fc020000ffffff000000040000002d01020004000000f0010100050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01010008000000fa0200000700000000000000040000002d0104000c000000240304000b071903530a1903530a65020b076502040000002d0103 0004000000f0010400040000002d01020004000000f001010005000000020101000000050000000201010000001c000000fb02adff0000000000009001000000000400001254696d6573204e657720526f6d616e006b7eed77c057ef7701040a6d00000a00040000002d010100050000000902000000000500000002010100 00000500000002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c000000240304000b074504530a4504530a91030b079103040000002d01030004000000f0010500040000002d01020004000000f001040005000000020101000000050000 0002010100000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c0000002403040087034504cf064504cf06910387039103040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100 000007000000fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c00000024030400030045044b0345044b03910303009103040000002d01030004000000f0010500040000002d01020004000000f00104000500000002010100000005000000020101000000070000 00fc020000ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c0000002403040003007105530a7105530abd040300bd04040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000 ffffff000000040000002d01040008000000fa0200000700000000000000040000002d0105000c00000024030400030019034b0319034b03650203006502040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff0000 00040000002d01040008000000fa0200000700000000000000040000002d0105000c000000240304000300b700530ab700530a030003000300040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff00000004000000 2d01040008000000fa0200000700000000000000040000002d0105000c000000240304000300ed011b06ed011b06390103003901040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000007000000fc020000ffffff000000040000002d01040008 000000fa0200000700000000000000040000002d0105000c000000240304009306ed01530aed01530a390193063901040000002d01030004000000f0010500040000002d01020004000000f0010400050000000201010000000500000002010100000005000000020101000000030000001e000700000016046a05b807c504 630205000000020101000000040000002d0101003a000000320ad6049e021f00040000000000580a750548494420436c617373204472697665722028484944434c4153532e53595329003c001c003c0015003800170025002000200015003c001c0017002a0025001c0015001c003c001c003c00380033003c002e002e0015 002e003c002e001c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604ba0004071500170305000000020101000000040000002d01010028000000320a2600b2031300040000000000580a75054c6567616379204170706c69636174696f6e7300 330025002a00250025002a0015003c002a002a001700170025002500170017002a002a00200005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e000700000016040204d40999034f0705000000020101000000040000002d0101001a000000320aaa0396070a0004 0000000000580a75054a4f594849442e56584420003c003c003c001c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604020450069903cb0305000000020101000000040000002d0101001a000000320aaa0306040a00 040000000000580a75054b42444849442e5658443c0038003c003c001c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e000700000016040204cc029903470005000000020101000000040000002d0101001a000000320aaa0379000a 00040000000000580a75054d4f554849442e5658444a003c003c003c001c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604d602cc026d02470005000000020101000000040000002d01010016000000320a7e02c300 0700040000000000580a7505564d442e565844003c004a003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604d6028c066d02cb0305000000020101000000040000002d01010016000000320a7e026c0407000400000000 00580a7505564b442e565844003c003c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604d602100a6d024f0705000000020101000000040000002d01010019000000320a7e02c2070900040000000000580a7505564a 4f59442e565844003c0020003c003c003c0015003c003c003c0005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604c801100a5f014f0705000000020101000000040000002d01010019000000320a7001b6070900040000000000580a750557494e 4d4d2e444c4c004f001c003c004a004a0015003c003300330005000000020101000000040000002701ffff0500000002010100000005000000020101000000030000001e00070000001604c801ac045f01bf0005000000020101000000040000002d01010017000000320a7001ef010800040000000000580a750555534552 2e4558453c002e0033003800150033003c00330005000000020101000000040000002701ffff0500000002010100000008000000fa0200000600000000000000040000002d010400050000001402d700a7010500000013022301a701040000002d01030004000000f001040007000000fc020000000000000000040000002d 01040008000000fa0200000100000000000000040000002d0105000a00000024030300bb011c0193011c01a7013901040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00 0000240303009301de00bb01de00a701c100040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014020302a7010500000013024f02a701040000002d01030004000000f0 01040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300bb01480293014802a7016502040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000 fa0200000100000000000000040000002d0105000a0000002403030093010a02bb010a02a701ed01040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014022f03a70105 00000013027b03a701040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300bb01740393017403a7019103040000002d01020004000000f0010400040000002d01030004000000f001050007000000 fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a0000002403030093013603bb013603a7011903040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000 000000040000002d0104000500000014025b04a701050000001302a704a701040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300bb01a0049301a004a701bd04040000002d01020004000000f001 0400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a0000002403030093016204bb016204a7014504040000002d01020004000000f0010400040000002d01030004000000f00105000500000002010100000005 00000002010100000008000000fa0200000600000000000000040000002d0104000500000014025b042b05050000001302a7042b05040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303003f05a004 1705a0042b05bd04040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300170562043f0562042b054504040000002d01020004000000f0010400040000002d 01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014022f032b050500000013027b032b05040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa020000010000000000 0000040000002d0105000a000000240303003f057403170574032b059103040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300170536033f0536032b0519 03040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d01040005000000140203022b050500000013024f022b05040000002d01030004000000f001040007000000fc020000000000000000 040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303003f054802170548022b056502040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d 0105000a0000002403030017050a023f050a022b05ed01040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d010400050000001402d7002b0505000000130223012b05040000002d010300 04000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303003f051c0117051c012b053901040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d0104 0008000000fa0200000100000000000000040000002d0105000a000000240303001705de003f05de002b05c100040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d010400050000001402 5b04af08050000001302a704af08040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300c308a0049b08a004af08bd04040000002d01020004000000f0010400040000002d01030004000000f00105 0007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b086204c3086204af084504040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa020000 0600000000000000040000002d0104000500000014022f03af080500000013027b03af08040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a00000024030300c30874039b087403af089103040000002d01020004 000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b083603c3083603af081903040000002d01020004000000f0010400040000002d01030004000000f0010500050000000201 010000000500000002010100000008000000fa0200000600000000000000040000002d0104000500000014020302af080500000013024f02af08040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303 00c30848029b084802af086502040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b080a02c3080a02af08ed01040000002d01020004000000f0010400 040000002d01030004000000f0010500050000000201010000000500000002010100000008000000fa0200000600000000000000040000002d010400050000001402d700af080500000013022301af08040000002d01030004000000f001040007000000fc020000000000000000040000002d01040008000000fa02000001 00000000000000040000002d0105000a00000024030300c3081c019b081c01af083901040000002d01020004000000f0010400040000002d01030004000000f001050007000000fc020000000000000000040000002d01040008000000fa0200000100000000000000040000002d0105000a000000240303009b08de00c308 de00af08c100040000002d01020004000000f0010400040000002d01030004000000f001050005000000020101000000040000002d010000030000000000000000000000000000000000000000}}}}} \par \pard \s26\sa160\nowidctlpar Note that this diagram is simplified to show only the flow that occurs when legacy applications require the services of HID-enabled devices. The presence of the legacy device drivers, for example, means that a legacy device minidriver can co-exist with th is HID architecture. And HID-aware applications can take a more direct path to the HID Class Driver. \par The VXDCLNT files comprise a nearly-complete code outline for a HID mapper VxD. The source code is fairly self-explanatory through comments. Use code from the sample to create your own VxD mapper. Search for the string \ldblquote <>\rdblquote to identify sections requiring device-specific code, which you will need to provide. \par \pard \s26\sa160\nowidctlpar This paper describes kernel routines that must be used by a HID mapper VxD. It also covers some programming considerations specific to this sort of driver. \par \pard\plain \s1\sb200\sa80\sl-440\slmult0\keepn\nowidctlpar\tx720 \f4\fs34 HID Mapper Implementation \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 The basic activity of VXDCLNT is fairly simple. \par \pard \s26\sa160\nowidctlpar Whenever a device is plugged in (i.e . VXDCLNT.VXD gets the SYS_DYNAMIC_DEVICE_INIT or PNP_NEW_DEVNODE message), it checks for new devices by calling ConnectNTDeviceDrivers(). This dispatches WorkItemCallback_Open() on a worker thread (see Programming Considerations for a discussion of work items) which invokes IoGetDeviceClassAssociations() to get a list of available devices. VXDCLNT opens these devices in turn via _NtKernCreateFile() and uses IOCTL calls to query each device in order to determine if the device is one that VXDCLNT wants to control. \par \pard \s26\sa160\nowidctlpar If VXDCLNT is not interested in the device, the device is promptly closed. Otherwise, VXDCLNT builds a {\i deviceContext} context for the device and does an initial read on the device via NtKernReadFile(). NtKernReadFile() has an asynchronous behavior \endash the read data is returned via a callback routine, which in VXDCLNT is ReadCompletion(). ReadCompletion() processes a devic e report as follows: it uses HIDPARSE functions to parse meaningful values out of the report and then calls some legacy driver to act on the new device state. ReadCompletion() then dispatches another worker thread to do the next read via another NtKernReadFile() call. \par \pard \s26\sa160\nowidctlpar If a read ever fails the mapper must close the device and then try to re-open it. If the mapper ever gets a SYS_DYNAMIC_DEVICE_EXIT message, it must wait for all reads to complete, then close all devices, free all resources, and exit. \par \pard \s26\sa160\nowidctlpar That\rquote s it. That\rquote s the entire behavior of a HID mapper. \par \pard\plain \s1\sb200\sa80\sl-440\slmult0\keepn\nowidctlpar\tx720 \f4\fs34 Kernel Functions \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 This section describes kernel support routines for Ring-0 HID mapper V xDs. A mapper must explicitly import some of its kernel support routines; others get imported implicitly by libraries in the Memphis DDK. See the GetImportFunctionPtrs() function in VXDCLNT.C for an example of how to explicitly import functions. Prototype s for the support routines are given below. \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 NTKERN.VXD functions \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 The following functions are imported from NTKERN.VXD. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 IoGetDeviceClassAssociations \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Returns a list of symbolic names of devices, which are usable as file names for _NtKernCreateFile(). \par \pard\plain \s31\sl-220\slmult0\keep\widctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS IoGetDeviceClassAssociations ( \par \tab IN LPGUID\tab \tab \tab ClassGuid, \par \tab IN PDEVICE_OBJECT\tab PhysicalDeviceObject OPTIONAL, \par \tab IN ULONG\tab \tab \tab \tab Flags, \par \tab OUT PWSTR\tab \tab \tab *SymbolicLinkList \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ClassGuid \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pass in address of GUID_CLASS_INPUT, defined in HIDCLASS.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PhysicalDeviceObject \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Optional. Pass NULL \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Flags \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 None currently defined. Pass 0. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i SymbolicLinkList \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Receives a pointer to a wide-char unicode-NULL separated multi-string of symbolic links to HID devices. The string is terminated by a double unicode-NULL \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 _NtKernCloseFile \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Closes an open device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS _NtKernCloseFile( \par \tab IN HANDLE FileHandle \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i FileHandle}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Device handle returned by _NtKernCreateFile. \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 _NtKernCreateFile \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Opens a device using a symbolic link. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS NtKernCreateFile( \par \tab PHANDLE\tab \tab \tab \tab FileHandle, \par \tab ACCESS_MASK\tab \tab \tab DesiredAccess, \par \tab POBJECT_ATTRIBUTES\tab ObjectAttributes, \par \tab PIO_STATUS_BLOCK \tab IoStatusBlock, \par \tab PLARGE_INTEGER \tab \tab AllocationSize, \par \tab ULONG \tab \tab \tab \tab FileAttributes, \par \tab ULONG \tab \tab \tab \tab ShareAccess, \par \tab ULONG \tab \tab \tab \tab CreateDisposition, \par \tab ULONG \tab \tab \tab \tab CreateOptions, \par \tab PVOID \tab \tab \tab \tab EaBuffer, \par \tab ULONG \tab \tab \tab \tab EaLength \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i FileHandle}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Receives a handle to the open file/device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i DesiredAccess}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Bitmask describing requested access rights. The bits are defined in WDM.H. Typical for mappers is (GENERIC_READ | SYNCHRONIZE | FILE_READ_ATTRIBUTES). \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ObjectAttributes} \par \pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Address of structure initialized with a symbolic link name using InitializeObjectAttributes(). See the sample. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i IoStatusBlock}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Address of structure to receive status information. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i AllocationSize}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pass NULL. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i FileAttributes} \par \pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A FILE_ATTRIBUTE_xxx value defined in WDM.H. Use FILE_ATTRIBUTE_NORMAL. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ShareAccess} \par \pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Bitmask describing sharing behavior. Use (FILE_SHARE_READ | FILE_SHARE_WRITE) to allow both read and write sharing. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i CreateDisposition}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Type of creation. Use FILE_OPEN. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i CreateOptions}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pass 0. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i EaBuffer}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Optional. Pass NULL. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i EaLength}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pass 0. \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 _NtKernDeviceIoControl \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Passes an IOCTL to query a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS _NtKernDeviceIoControl( \par \tab IN\tab HANDLE\tab \tab \tab \tab FileHandle, \par \tab IN\tab HANDLE\tab \tab \tab \tab Event OPTIONAL, \par \tab IN\tab PIO_APC_ROUTINE\tab \tab ApcRoutine OPTIONAL, \par \tab IN\tab PVOID\tab \tab \tab \tab ApcContext OPTIONAL, \par \tab OUT\tab PIO_STATUS_BLOCK\tab \tab IoStatusBlock, \par \tab IN\tab ULONG\tab \tab \tab \tab IoControlCode, \par \tab IN\tab PVOID\tab \tab \tab \tab InputBuffer OPTIONAL, \par \tab IN\tab ULONG\tab \tab \tab \tab InputBufferLength, \par \tab OUT\tab PVOID\tab \tab \tab \tab OutputBuffer OPTIONAL, \par \tab IN\tab ULONG\tab \tab \tab \tab OutputBufferLength \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i FileHandle \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Device handle returned by _NtKernCreateFile \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Event \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Only used if blocking a thread on this read. Pass NULL in most cases. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ApcRoutine \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Optional completion routine. Pass NULL, since IOCTLs are synchronous and don\rquote t require a callback. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ApcContext \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Context for completion routine. Pass 0. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i IoStatusBlock \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to an IO_STATUS_BLOCK structure, which receives status information about the call. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i IoControlCode \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 IOCTL code. Of interest to HID mappers are: \par \pard \s30\fi520\li200\sa80\nowidctlpar IOCTL_HID_GET_COLLECTION_INFORMATION \par \pard \s30\li200\sa80\nowidctlpar \tab \tab Initializes HID_COLLECTION_INFORMATION structure. \par \pard \s30\fi520\li200\sa80\nowidctlpar IOCTL_HID_GET_COLLECTION_DESCRIPTOR \par \pard \s30\li200\sa80\nowidctlpar \tab \tab Initializes HIDP_PREPARSED_DATA structure. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i InputBuffer \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 No input data is required for the IOCTLs that HID mappers commonly use. Pass NULL. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i InputBufferLength \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Length of InputBuffer in bytes. Pass 0 if not passing InputBuffer. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i OutputBuffer \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to buffer which receives data. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i OutputBufferLength \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Length of OutputBuffer in bytes. \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 _NtKernReadFile \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Reads a raw report from a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS _NtKernReadFile( \par \tab IN\tab HANDLE\tab \tab \tab \tab FileHandle, \par \tab IN\tab HANDLE\tab \tab \tab \tab Event OPTIONAL, \par \tab IN\tab PIO_APC_ROUTINE\tab \tab ApcRoutine OPTIONAL, \par \tab IN\tab PVOID\tab \tab \tab \tab ApcContext OPTIONAL, \par \tab OUT\tab PIO_STATUS_BLOCK\tab \tab IoStatusBlock, \par \tab OUT\tab PVOID\tab \tab \tab \tab Buffer, \par \tab IN\tab ULONG\tab \tab \tab \tab Length, \par \tab IN\tab PLARGE_INTEGER\tab \tab ByteOffset OPTIONAL, \par \tab IN\tab PULONG\tab \tab \tab \tab Key OPTIONAL \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i FileHandle \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Device handle returned by _NtKernCreateFile \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Event \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Only used if blocking a thread on this read. Pass NULL in most cases. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ApcRoutine \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Read completion routine which is called with the result of the read. The completion routine has the following prototype: \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 \tab VOID ReadCompletion( \par \tab \tab IN PVOID\tab \tab \tab \tab Context, \par \tab \tab IN PIO_STATUS_BLOCK\tab IoStatusBlock, \par \tab \tab IN ULONG\tab \tab \tab \tab Reserved \par \tab \tab ); \par \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ApcContext \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Context to be passed to the completion routine. VXDCLNT passes a pointer to its device context here. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i IoStatusBlock \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to a static IO_STATUS_BLOCK structure to receive status information for the read call. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Buffer \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to a static buffer that receives a raw report from the device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Length \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Length of the device\rquote s read report. Pass the InputReportByteLength field of the HIDP_CAPS structure returned by HidP_GetCaps(). \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ByteOffset \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to a LARGE_INTEGER indicating the offset within the \ldblquote file\rdblquote at which to start reading. For a device, always pass a pointer to a LARGE_INTEGER initialized to zero. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Key \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Optionally specifies a key to be used if there are locks associated with the file. Pass NULL in most cases. \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 _NtKernWriteFile \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Writes a raw report to a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS _NtKernWriteFile( \par \tab IN\tab HANDLE\tab \tab \tab \tab FileHandle, \par \tab IN\tab HANDLE\tab \tab \tab \tab Event OPTIONAL, \par \tab IN\tab PIO_APC_ROUTINE\tab \tab ApcRoutine OPTIONAL, \par \tab IN\tab PVOID\tab \tab \tab \tab ApcContext OPTIONAL, \par \tab OUT\tab PIO_STATUS_BLOCK\tab \tab IoStatusBlock, \par \tab IN\tab PVOID\tab \tab \tab \tab Buffer, \par \tab IN\tab ULONG\tab \tab \tab \tab Length, \par \tab IN\tab PLARGE_INTEGER\tab \tab ByteOffset OPTIONAL, \par \tab IN\tab PULONG\tab \tab \tab \tab Key OPTIONAL \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i FileHandle \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Device handle returned by _NtKernCreateFile \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Event \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Only used if blocking a thread on this read. Pass NULL in most cases. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ApcRoutine \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Optional write completion routine. You probably don\rquote t need one and can just pass NULL, as does VXDCLNT. Otherwise, pass a function with the following prototype: \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 \tab VOID WriteCompletion( \par \tab \tab IN PVOID\tab \tab \tab \tab Context, \par \tab \tab IN PIO_STATUS_BLOCK\tab IoStatusBlock, \par \tab \tab IN ULONG\tab \tab \tab \tab Reserved); \par \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ApcContext \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Context for write completion routine. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i IoStatusBlock \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to a static IO_STATUS_BLOCK structure to receive status information for the read call. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Buffer \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to a buffer containing the raw report to be written to the device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Length \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Length of the report in bytes. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ByteOffset \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to a LARGE_INTEGER indicating the offset within the \ldblquote file\rdblquote at which to start writing. For a device, always pass a pointer to a LARGE_INTEGER initialized to zero. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Key \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Optionally specifies a key to be used if there are locks associated with the file. Pass NULL in most cases. \par \pard\plain \s2\sb140\sa60\sl-380\slmult0\keepn\nowidctlpar \f4\fs30 HIDPARSE.SYS functions \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 The following functions are imported from HIDPARSE.SYS. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_GetCaps \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Retrieves capabilities information for a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS HidP_GetCaps ( \par \tab IN\tab \tab PHIDP_PREPARSED_DATA\tab \tab PreparsedData, \par \tab OUT\tab \tab PHIDP_CAPS\tab \tab \tab \tab Capabilities \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Capabilities \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Receives device capabilities information. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_GetUsages\tab \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Retrieves usage information for a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS HidP_GetUsages ( \par \tab IN\tab \tab HIDP_REPORT_TYPE\tab \tab \tab ReportType, \par \tab IN\tab \tab USAGE\tab \tab \tab \tab \tab UsagePage, \par \tab IN\tab \tab USHORT\tab \tab \tab \tab \tab LinkCollection, // Optional \par \tab OUT\tab \tab USAGE\tab \tab \tab \tab \tab *UsageList, \par \tab IN OUT\tab ULONG\tab \tab \tab \tab \tab *UsageLength, \par \tab IN\tab \tab PHIDP_PREPARSED_DATA\tab \tab PreparsedData, \par \tab IN\tab \tab PCHAR\tab \tab \tab \tab \tab Report, \par \tab IN\tab \tab ULONG\tab \tab \tab \tab \tab ReportLength \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportType \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HIDP_REPORT_TYPE constant defined in HIDPI.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsagePage \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HID_USAGE_PAGE_xxx value defined in HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i LinkCollection \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection number of collection interface on device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsageList \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Receives list of values. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsageLength \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Before call: length of UsageList (number of usages). After call: number of usages written to UsageList. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Report \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Raw device report. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportLength \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Report length in bytes. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_GetUsageValue \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Retrieves current values associated with specific usages on a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS HidP_GetUsageValue ( \par \tab IN\tab \tab HIDP_REPORT_TYPE\tab \tab \tab ReportType, \par \tab IN\tab \tab USAGE\tab \tab \tab \tab \tab UsagePage, \par \tab IN\tab \tab USHORT\tab \tab \tab \tab \tab LinkCollection, // Optional \par \tab IN\tab \tab USAGE\tab \tab \tab \tab \tab Usage, \par \tab OUT\tab \tab PULONG\tab \tab \tab \tab \tab UsageValue, \par \tab IN\tab \tab PHIDP_PREPARSED_DATA \tab PreparsedData, \par \tab IN\tab \tab PCHAR\tab \tab \tab \tab \tab Report, \par \tab IN\tab \tab ULONG\tab \tab \tab \tab \tab ReportLength \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportType}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HIDP_REPORT_TYPE constant defined in HIDPI.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsagePage}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HID_USAGE_PAGE_xxx value defined in HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i LinkCollection}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection number of collection interface on device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Usage}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 HID_USAGE_xxx value from HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsageValue}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Receives usage value. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Report}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Raw device report. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportLength}{\fs16 - \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Report length in bytes. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_SetUsages \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Sends a raw report to a device, along with a list of usages as context. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS HidP_SetUsages ( \par \tab IN\tab \tab HIDP_REPORT_TYPE\tab \tab \tab ReportType, \par \tab IN\tab \tab USAGE\tab \tab \tab \tab \tab UsagePage, \par \tab IN\tab \tab USHORT\tab \tab \tab \tab \tab LinkCollection, // Optional \par \tab IN\tab \tab PUSAGE\tab \tab \tab \tab \tab UsageList, \par \tab IN OUT\tab PULONG\tab \tab \tab \tab \tab UsageLength, \par \tab IN\tab \tab PHIDP_PREPARSED_DATA\tab \tab PreparsedData, \par \tab IN OUT\tab PCHAR\tab \tab \tab \tab \tab Report, \par \tab IN\tab \tab ULONG\tab \tab \tab \tab \tab ReportLength \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportType}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HIDP_REPORT_TYPE constant defined in HIDPI.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsagePage}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HID_USAGE_PAGE_xxx value defined in HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i LinkCollection}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection number of collection interface on device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsageList}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 List of values. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsageLength}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Before a call: length of UsageList (number of usages). After a call: number of usages consumed. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Report \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Raw device report. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportLength}{\fs16 \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Report length in bytes. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_GetScaledUsageValue \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Retrieves current values associated with specific usages on a device, as does HidP_GetUsageValue, but does scaling if the device has both physical and logical min/max defined. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS HidP_GetScaledUsageValue ( \par \tab IN\tab \tab HIDP_REPORT_TYPE\tab \tab \tab ReportType, \par \tab IN\tab \tab USAGE\tab \tab \tab \tab \tab UsagePage, \par \tab IN\tab \tab USHORT\tab \tab \tab \tab \tab LinkCollection, // Optional \par \tab IN\tab \tab USAGE\tab \tab \tab \tab \tab Usage, \par \tab OUT\tab \tab PLONG\tab \tab \tab \tab \tab UsageValue, \par \tab IN\tab \tab PHIDP_PREPARSED_DATA\tab \tab PreparsedData, \par \tab IN\tab \tab PCHAR\tab \tab \tab \tab \tab Report, \par \tab IN\tab \tab ULONG\tab \tab \tab \tab \tab ReportLength \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportType \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HIDP_REPORT_TYPE constant defined in HIDPI.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsagePage \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HID_USAGE_PAGE_xxx value defined in HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i LinkCollection \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection number of collection interface on device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Usage \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 HID_USAGE_xxx value from HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsageValue \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Receives usage value. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i Report \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Raw device report. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportLength \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Report length in bytes. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_MaxUsageListLength \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Retrieves the number of usages of a given type on a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 ULONG HidP_MaxUsageListLength ( \par \tab IN\tab \tab HIDP_REPORT_TYPE\tab \tab \tab ReportType, \par \tab IN\tab \tab USAG\tab \tab \tab \tab \tab \tab UsagePage, \par \tab IN\tab \tab PHIDP_PREPARSED_DATA\tab \tab PreparsedData \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportType \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HIDP_REPORT_TYPE constant defined in HIDPI.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i UsagePage \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HID_USAGE_PAGE_xxx value defined in HIDUSAGE.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 HidP_GetValueCaps \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Import explicitly. Retrieves capabilities information for a device. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 NTSTATUS HidP_GetValueCaps ( \par \tab IN\tab \tab HIDP_REPORT_TYPE\tab \tab \tab ReportType, \par \tab OUT\tab \tab PHIDP_VALUE_CAPS\tab \tab \tab ValueCaps, \par \tab IN OUT\tab PULON\tab \tab \tab \tab \tab ValueCapsLength, \par \tab IN\tab \tab PHIDP_PREPARSED_DATA\tab \tab PreparsedData \par \tab );{\*\bkmkend _Toc379612476} \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ReportType \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 A HIDP_REPORT_TYPE constant defined in HIDPI.H. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ValueCaps \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to array of HIDP_VALUE_CAPS structures To receive capabilities information for device. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i ValueCapsLength \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Before call: number of HIDP_VALUE_CAPS stuctures pointed to by ValueCaps. After call: number of structures used. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i PreparsedData \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Collection descriptor returned by IOCTL_HID_GET_COLLECTION_DESCRIPTOR IOCTL. See the sample. \par \pard\plain \s1\sb200\sa80\sl-440\slmult0\keepn\nowidctlpar \f4\fs34 Programming Considerations \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 In order to avoid doing I/O on NTKERN\rquote s thread, a mapper should queue its I/O tasks and execute them on \ldblquote worker\rdblquote threads. See the sample code to clarify where this is appropriate. The system provides the following support routines for work items. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 ExInitializeWorkItem \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Initializes a work item. \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 VOID ExInitializeWorkItem(\tab \par \tab WORK_QUEUE_ITEM\tab *workItem, \par \tab PVOID\tab \tab \tab callback, \par \tab PVOID\tab \tab \tab context \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i workItem \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to work item structure to be initialized. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i callback \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 callback function with the following prototype: \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 \tab \tab PVOID callbackFunction(PVOID context); \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i context \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 User-definable context to be passed to callback routine. \par \pard\plain \s3\sb80\sa40\sl-280\slmult0\keepn\nowidctlpar \f4\fs28 NtKernQueueWorkItem \par \pard\plain \s26\sa160\nowidctlpar \f4\fs21 Queues a work item. Use this function instead of ExQueueWorkItem(). \par \pard\plain \s31\sl-220\slmult0\nowidctlpar\tx390\tx780\tx1170\tx1560\tx1950\tx2340\tx2730\tx3120\tx3510\tx3900\tx4290\tx4680\tx5070\tx5460\tx5850\tx6240\tx6630 \f11\fs16 VOID _NtKernQueueWorkItem( \par \tab WORK_QUEUE_ITEM\tab *workItem, \par \tab WORK_QUEUE_TYPE\tab workQueueType \par \tab ); \par \par \pard\plain \s26\sa160\widctlpar \f4\fs21 {\b Parameters: \par }\pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i workItem \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 Pointer to initialized work item. \par \pard\plain \s34\sl-240\slmult0\keepn\widctlpar \f4\fs21 {\i workQueueType \par }\pard\plain \s30\li200\sa80\nowidctlpar \f4\fs21 The priority of the work queue on which this item is to be queued. Use DelayedWorkQueue for most devices. Using Critic alWorkQueue or any of the other queues may hurt system performance although it will give the work item higher priority. Microsoft very strongly recommends that you use DelayedWorkQueue. \par }