�����JFIF��XX����������    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222�����"����4���������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu������������������������������������#ډb���_�N��?�����������wQ���5-�~�I���8���������������������������������TK<5o�Iv-������������������k�_U_������������������������������~b�M��d��������Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�����?_�'ϔ��_�Ջt������������������������=||I �����6�έ"�����D���/[�k�9����Y�8������ds|\���Ҿp6�Ҵ���]��.����6���z<�v��@]�i%������������������������$j��~����g��J>��no����pM[me�i$[�����������s�o�ᘨ�˸ nɜG-�ĨU�ycP���3.DB�li�;���������������������hj���x����7Z^�N�h��������N3u{�:j�����x�힞��#M��&��jL P@��_���� P�������������������&��o8��������9������@Sz���6�t7#O�ߋ �����s}Yf�T������lmr����Z)'N��k�۞p�����w\�T���������������ȯ?�8`���O��i{wﭹW�[�r�� ��Q4F�׊������3m&L�=��h3�������z~��#����\�l :�F,j@�� ʱ�wQT����8�"kJO����6�֚l������������������}����R�>ډK���]��y����&����p�}b������;N�1�m�r$����|��7�>e�@���B�TM*-i�H��g�D�)� E�m�|�ؘbҗ�a���Ҿ����������������t4�����o���G��*oCN�rP���Q��@z,|?W[0���������:�n,j���WiE��W������$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S���������������VN;���}�s?.����� w��9��˟<���Mq4�Wv'������{)0�1mB����V����W[��������8�/<� �%���wT^�5���b��)iM� p�g�N�&ݝ������������VO~��q���u���9��� ����!��J27�����$����O-���! �:���%H��� ـ�������y�ΠM=t{!S�� �oK8�������t<����è��������:a��������[������ա�H���~��w��Qz`�p����o�^ ������Q��n����� �,uu�C��$ ^���,�������8�#��:�6��e�|~�����������!�3��3.�\0�����q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<�����Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y���|�y��� ~�6�@c��1vOp��������Ig�����4��l�OD�����L����� R���c���j�_�uX�6��3?nk��Wy�f;^*B� ��@���~a�`��Eu�������+�����6�L��.ü>��}y���}_�O�6�͐�:�Yr���G�X��kG������l^w����������~㒶sy���Iu�!���� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT����G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2������#I/�׍qz��^t�̔���������b�Yz4x����t�){ OH�����+(E��A&�N�������XT��o��"�XC����'���)}�J�z�p� ����~5�}�^����+�6����w��c��Q�|�Lp�d�H��}�(�.|����k��c4^�����"�����Z?ȕ ��a<�������L�!0�39C� �Eu�����C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf����M}7����]�������s2tcS{�\icTx;�\��7K���P������ʇ Z O-��~�������c>"��?��������P�����E��O�8��@�8��G��Q�g�a�Վ���󁶠��䧘��_%#r�>�����1�z�a���eb��qcP��ѵ��n���#L��� =��׀t� L�7�`�����V����A{�C:�g���e@�����w1 Xp�3�c3�ġ�������p��M"'-�@n4���fG���B3�DJ�8[Jo�ߐ���gK)ƛ��$���� �������8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`�������?��K�����QK�d���������B`�s}�>���`������*�>��,*@J�d�oF*�����弝��O}�k��s��]��y�ߘ�������c1G�V���<=�7��7����6��q�PT��tXԀ�!9*4�4Tހ���3XΛex�46�������Y��D ����� ����BdemDa����\�_l,����G�/���֌7���Y�](�xTt^%�GE�����4�}bT����ڹ�����;��Y)���B�Q��u��>J/J ���⮶.�XԄ��j�ݳ������+E��d ���r�5�_D�����1 ���o�� �B�x�΢�#����<��W�����8���R6�@���g�M�.��� dr�D��>(otU��@�x=��~v���2� ӣ�d�oBd�����3�eO�6�㣷����������ݜ�6��6Y��Qz`����S��{���\P��~z m5{J/L��1������<�e�ͅPu���b�]�ϔ��������'�������f�b� Zpw��c`"��i���BD@:)ִ�:�]��h���v�E��w���T�l�������P����"Ju�}��وV ��J��G6��. J/�Qgl߭�e�����@�z�Zev2u����)]կ���������7x�������s�M�-<ɯ�c��r��v�����@��$�ޮ}lk���a����'����>x��O\�Z������Fu>������ck#��&:��`�$��ai�>2Δ����l���oF[h�������lE�ܺ�Π���k:)���`������� $[6�����9�����kOw�\|�����8}������ބ:��񶐕��������I�A1/���=�2[�,�!��.}gN#�u����b���� ~���������݊��}34q�����d�E��L��������c��$���"�[q�U�硬g^��%B ��z���r�p�������J�ru%v\h�����1Y�ne`������ǥ:g����pQM~�^��Xi� ��`S�:V2������9.�P���V������?B�k�� ��������AEvw%�_�9C�Q����wKekP�ؠ�\������;Io d�{ ߞo�c1eP�����\� `����E=���@K<�Y��������eڼ�J����w����{av�F�'�M�@��������������/J��+9p����|]���������Iw &`���8���&�M�hg���[�{�������Xj���%��Ӓ�������������������$��(�����ʹN�������<>�I���RY�����K2�NPlL�ɀ�)��&e��������B+ь����(������������������� � �JTx����_?EZ� }@���� 6�U���뙢ط�z��dWI��n` D����噥�[��uV��"�G&�����Ú����2�g�}&m���������������������?ċ���"����Om#�������������������������� ��{���������������������ON��"S�X���Ne��ysQ���@�������������Fn��Vg�����dX�~nj����������������������]J�<�K]:����FW���b�������62����������=��5f����JKw����bf�X������������������������55��~J �%^�������:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v�������g�8�1��f2�������������������������4;�V���ǔ�)�������������������9���1\������������������������������c��v�/'Ƞ�w������������������$�4�R-��t����������������������������������� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃�������������������������������������������A��20�c#���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@���� 0!1@AP"#2Q`$3V�%45a6�FRUq����� ������^7ׅ,$n��������+��F�`��2X'��0vM��p�L=�������5��8������u�p~���.�`r�����\����O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;�������S�T���1���i[U�ɵz�]��U)V�S6���3$K{��ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u��!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ����D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v������멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$��JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4��[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ��dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il���d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J���oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.����3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R�=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N������#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%����JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$�I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$����L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)��H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>��dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\��y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~�������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7���ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz���)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)�'��8Ϣ�ٔ���ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'��L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(�}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3��������QT��a�����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3��,#c�co��q�a)*P�t����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O����������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l��O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m����PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q��������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~��|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@�l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`�7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ�����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i�����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0���Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q���nxҍ!U�f�!eh�i�2�m����`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{�/ �?�͟��|1�:�#g��W�>$����d��J��d�B���=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H�����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l�����l�cGs�ځ�������y�Ac������\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6�����N6�q��������N� ���! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td���� ?�����N����a��3��m���C���w��������xA�m�q�m����m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4����r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0�������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ�����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G������Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q��(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9���3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M�����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#y�w��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa�����Q�#� WeF��ŮNj�p�J* mQ�N�����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]���陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv�:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WP�w���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*�� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp��BGv[]�u�Ov����0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND���.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J ��4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R���� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(��>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG���{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/���*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>�e]�����Q�r�:����g�,i"�����ԩA��*M�<�G��b�if��l^M��5�� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f������֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ����˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)���h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������� G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W��I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��B�S�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c����]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪��\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W������6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}������6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@��P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6������m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw��k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ�����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e���R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1�[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN���ĕ���0������� !01@Q"2AaPq3BR�������?�����@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j��ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^����ԯ̾9Z��F��������n��1��� ��]�[��)�'�������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ���&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0���;_���3������� !01"@AQa2Pq#3BR�������?����ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q�� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6�����������4B>��o��](��$B���m�����a�!=���?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{�E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)�����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a��84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b���$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7���k�� 403WebShell
403Webshell
Server IP : 103.30.72.248  /  Your IP : 216.73.216.144
Web Server : Microsoft-IIS/10.0
System : Windows NT WIN-CARKG80MF9A 10.0 build 17763 (Windows Server 2019) AMD64
User : IUSR ( 0)
PHP Version : 8.2.7
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  C:/Windows/diagnostics/system/Audio/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : C:/Windows/diagnostics/system/Audio/CL_Utility.ps1
��# Copyright � 2015, Microsoft Corporation. All rights reserved.

# :: ======================================================= ::



<#

	DESCRIPTION:	

	  CL_Utility is common library for audio troubleshooter.



	ARGUMENTS:

	  None



	RETURNS:

	  None



	FUNCTIONS:

	  Write-ExceptionTelemetry

	  GetAdapterName

	  GetAbsolutionPath

	  Get-AudioDeviceCount

	  Get-DeviceId

	  Get-DeviceName

	  Get-DeviceStateName

	  Get-DeviceTypeName

	  GetId

	  GetRuntimePath

	  GetSystemPath

	  Parse-List

	  RemoveDevice

	  RescanAllDevices

	  Set-DefaultEndpoint

	  Get-AudioSamplingRate

	  Start-AudioService

      Stop-AudioService

	  Get-AudioDriverSource32

	  Get-AudioDriverSource

	  PlaySound

	  Get-HDAudioID

	  Set-AudioEndpointProperty

#>



#====================================================================================

# Initialize

#====================================================================================

Import-LocalizedData -BindingVariable localizationString -FileName CL_LocalizationData



#====================================================================================

# Load Utilities

#====================================================================================

. .\CL_AudioDiagnosticSnapIn.ps1



#====================================================================================

# Main

#====================================================================================

function Pop-Msg {

	 param([string]$msg ="message",

	 [string]$ttl = "Title",

	 [int]$type = 64) 

	 $popwin = new-object -comobject wscript.shell

	 $null = $popwin.popup($msg,0,$ttl,$type)

	 remove-variable popwin

}



Function Write-ExceptionTelemetry($FunctionName, [System.Management.Automation.ErrorRecord] $ex)

{

    <#

    DESCRIPTION:

      Writes script error information into telemetry stream

     

    EXAMPLE:

      try

      {

         0 / 0

      }

      catch [System.Exception]

      {

         Write-ExceptionTelemetry "DivideByZeroTest" $_

      }

    #>



    $ExceptionMessage = $ex.Exception.Message

    $ScriptFullPath = $ex.InvocationInfo.ScriptName

    $ExceptionScript = [System.IO.Path]::GetFileName($ScriptFullPath)

    $ExceptionScriptLine = $ex.InvocationInfo.ScriptLineNumber

    $ExceptionScriptColumn = $ex.InvocationInfo.OffsetInLine

    

	Write-DiagTelemetry "ScriptError" "$ExceptionScript\$FunctionName\$ExceptionScriptLine\$ExceptionScriptColumn\$ExceptionMessage"

}



function StartProcess([string]$deviceId)

{

	$ExePath = [System.Environment]::SystemDirectory +"\" + "control.exe"

	Start-Process -FilePath $ExePath -ArgumentList "mmsys.cpl,,$deviceId,sysfx"



}





function GetAdapterName($deviceInfo=$("No device info is specified"))

{

	return ($deviceInfo | Select-Object AdapterName).AdapterName

}



function GetAbsolutionPath([string]$fileName = $(throw "No file name is specified"))

{

	if([string]::IsNullorEmpty($fileName))

	{

		throw "Invalid file name"

	}



	return Join-Path (Get-Location).Path $fileName

}



function Get-AudioDeviceCount()

{

	$audioDevices = Get-WmiObject Win32_SoundDevice

	[int]$deviceCount = ($audioDevices.Name).Count

	return $deviceCount

}



function Get-DeviceId([string]$deviceName, [string]$deviceTypes)

{

	[string]$deviceID = [String]::Empty

	try 

	{

		$devices = @()

		$EndPointListID = @()

		$AudioMethods = Get-AudioEndpoints

		$EndPointListID = $AudioMethods::GetAudioEndPointsbyType($deviceTypes)

		$devices += $EndPointListID.ForEach({[PSCustomObject]$_})

		

		foreach($devs in $devices)

		{

			$devId = GetId $devs

			$devName = GetAdapterName $devs



			if($deviceName -contains $devName)

			{

				$deviceID = [string]$devId

				break

			}

		}

	} 

	Catch [System.Exception]

	{

		Write-ExceptionTelemetry "GetDeviceId" $_

		$errorMsg =  $_.Exception.Message

		$errorMsg | ConvertTo-Xml | Update-DiagReport -Id "CL_Utility" -Name "CL_Utility" -Verbosity Debug

	}

	return $deviceID

}



# Function to get the localized device name

function Get-DeviceName([string]$deviceType=$(throw "No device type is specified")) {

	[string]$deviceName = $localizationString.unknownAudioDevice



	if("Render" -eq $deviceType) {

		$deviceName = $localizationString.audioPlayback

	}



	if("Capture" -eq $deviceType) {

		$deviceName = $localizationString.audioRecording

	}



	return $deviceName

}



# Function to get the audio endpoint state name

function Get-DeviceStateName([int]$stateCode=$(throw "No state code is specified")) {

	[string]$stateName = ""

	if(1 -eq $stateCode) {

		$stateName = $localizationString.stateEnabled

	} elseif (2 -eq $stateCode) {

		$stateName = $localizationString.stateDisabled

	} elseif (4 -eq $stateCode) {

		$stateName = $localizationString.stateNotPresent

	} elseif (8 -eq $stateCode) {

		$stateName = $localizationString.stateUnplugged

	} else {

		$stateName = $localizationString.stateUnknown

	}



	return $stateName

}



# Function to get the audio device type name

function Get-DeviceTypeName([string]$deviceType = $(throw "No device type name is specified"))

{

	[string]$deviceTypeName = ""

	if([String]::IsNullOrEmpty($deviceType))

	{

		return $deviceTypeName

	}



	if($deviceType -eq "Render")

	{

		$deviceTypeName = $localizationString.speaker + ", " + $localizationString.headset  + " " + $localizationString.or + " " + $localizationString.headphone

	}

	elseif ($deviceType -eq "Capture")

	{

		$deviceTypeName = $localizationString.microphone  + " " + $localizationString.or + " " + $localizationString.headset

	}



	return $deviceTypeName

}





function GetId($deviceInfo=$("No device info is specified"))

{

	return ($deviceInfo | Select-Object DeviceId).DeviceId

}



function GetRuntimePath([string]$fileName = $(throw "No file name is specified"))

{

	if([string]::IsNullorEmpty($fileName))

	{

		throw "Invalid file name"

	}



	 [string]$runtimePath =  [System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()

	 return Join-Path $runtimePath $fileName

}



function GetSystemPath([string]$fileName = $(throw "No file name is specified"))

{

	if([string]::IsNullorEmpty($fileName))

	{

		throw "Invalid file name"

	}



	 [string]$systemPath = [System.Environment]::SystemDirectory

	 return Join-Path $systemPath $fileName

}



# Function to import audio management types

function Get-AudioManager

{

[string]$code = @'

using System;

using System.Runtime.InteropServices;



namespace Microsoft.Windows.Diagnosis

{



	public static class AudioConfigManager

	{

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

		private static extern int AudioSetEndPointVisibility(string pszDeviceName, bool Status);



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

		private static extern int AudioSetDefaultdevice(string pszDeviceName);



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

		private static extern int SetAudioEndpointProperty(string pszDeviceName);



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

        private static extern int IsEndpointDefault(string pszDeviceName, string pDataFlow, ref IntPtr IsDefault);



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

        private static extern int GetDefaultEndpointID(string pDataFlow, ref IntPtr pDefaultId);

		

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

        private static extern float GetMasterVolumeLevel(string dataflow, out float pLevel);



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

        private static extern bool GetMute(string dataflow, ref bool pMute);



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

        private static extern void SetMute(string dataflow, bool pMute);

		

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

        private static extern void SetDeviceMute(string deviceId, bool pMute);

		

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

        private static extern float GetDeviceMasterVolumeLevel(string deviceId, out float pLevel);



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

        private static extern bool GetDeviceMute(string deviceId, ref bool pMute);



		public static string GetDefaultID(string dataFlow)

		{

			IntPtr pId = IntPtr.Zero;

			GetDefaultEndpointID(dataFlow, ref pId);

			

			string id = Marshal.PtrToStringAuto(pId);

			return id;

		}

		

		public static bool IsEndPointDefault(string deviceID, string dataFlow)

        {

                bool retBool = true;

                IntPtr pBool = IntPtr.Zero;

                IsEndpointDefault(deviceID, dataFlow, ref pBool);



                if (pBool.ToInt32() == 0)

                {

                    retBool = false;

                }

                return retBool;



        }



		public static int SetAudioProperty(string pszDeviceName)

        {

            return AudioConfigManager.SetAudioEndpointProperty(pszDeviceName);

        }



		public static int EnableDevice(string pszDeviceName, bool Status)

		{

			return AudioConfigManager.AudioSetEndPointVisibility(pszDeviceName, Status);

		}



		public static int SetDefault(string pszDeviceName)

		{

			return AudioConfigManager.AudioSetDefaultdevice(pszDeviceName);

		}



        public static bool GetMuteStatus(string deviceId)

        {

            bool mute = false;



            AudioConfigManager.GetMute(deviceId,ref mute);

            return mute;

        }

		

		public static bool GetDeviceMuteStatus(string deviceId)

        {

            bool mute = false;



            AudioConfigManager.GetDeviceMute(deviceId,ref mute);

            return mute;

        }



        public static void SetMuteStatus(string deviceId, bool muteStatus)

        {

            AudioConfigManager.SetMute(deviceId, muteStatus);

        }

		

		public static void SetDeviceMuteStatus(string deviceID, bool muteStatus)

        {

            AudioConfigManager.SetDeviceMute(deviceID, muteStatus);

        }		



        public static int GetVolume(string deviceId)

        {

            float retVal = 0.0f;



			AudioConfigManager.GetMasterVolumeLevel(deviceId, out retVal);

            return Convert.ToInt32(retVal * 100);

        }

		

        public static int GetDeviceVolume(string deviceId)

        {

            float retVal = 0.0f;



			AudioConfigManager.GetDeviceMasterVolumeLevel(deviceId, out retVal);

            return Convert.ToInt32(retVal * 100);

        }

		

	}

}



'@



Add-Type -TypeDefinition $code 



}





# Function to parse the the list with delimiter "/"

function Parse-List([string]$list = $(throw "No list is specified"))

{

	if($list -eq $null)

	{

		return $null

	}



	return $list.Split("/", [StringSplitOptions]::RemoveEmptyEntries)

}



# Function to Reinstall any devices.

function ReinstallDevice([string]$deviceID)

{

$ReinstallDeviceSource = @"

using System;

using System.Runtime.InteropServices;

using System.Threading;

namespace Microsoft.Windows.Diagnosis

{

	public sealed class DeviceManagement_ReinstallSingleDevice

	{

		private DeviceManagement_ReinstallSingleDevice()

		{

		}



		public const UInt32 CR_SUCCESS = 0;

		public const UInt32 CM_REENUMERATE_SYNCHRONOUS = 1;

		public const UInt32 CM_REENUMERATE_RETRY_INSTALLATION = 2;

		public const UInt32 CM_LOCATE_DEVNODE_NORMAL = 0;

		public const UInt32 WAIT_OBJECT_0 = 0;

		public const UInt32 INFINITE = 0xFFFFFFFF;



		public const UInt32 CONFIGFLAG_REINSTALL = 32;

		public const UInt32 ERROR_CLASS_MISMATCH = 0xE0000203;

		public const UInt32 DEVPROP_TYPE_UINT32 = 0x00000007;

		public static DEVPROPKEY DEVPKEY_Device_ConfigFlags = new DEVPROPKEY(new Guid("a45c254e-df1c-4efd-8020-67d146a850e0"), 12);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiGetDeviceProperty", CharSet = CharSet.Auto)]

		static extern UInt32 SetupDiGetDeviceProperty(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, ref DEVPROPKEY PropertyKey, ref UInt32 PropertyType, IntPtr PropertyBuffer, UInt32 PropertyBufferSize, ref UInt32 RequiredSize, UInt32 Flags);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiSetDeviceProperty", CharSet = CharSet.Auto)]

		static extern UInt32 SetupDiSetDeviceProperty(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, ref DEVPROPKEY PropertyKey, UInt32 PropertyType, IntPtr PropertyBuffer, UInt32 PropertyBufferSize, UInt32 Flags);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiOpenDeviceInfo", CharSet = CharSet.Auto)]

		static extern UInt32 SetupDiOpenDeviceInfo(IntPtr DeviceInfoSet, [MarshalAs(UnmanagedType.LPWStr)]string DeviceID, IntPtr Parent, UInt32 Flags, ref SP_DEVINFO_DATA DeviceInfoData);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiCreateDeviceInfoList", CharSet = CharSet.Unicode)]

		static extern IntPtr SetupDiCreateDeviceInfoList(IntPtr ClassGuid, IntPtr Parent);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiDestroyDeviceInfoList", CharSet = CharSet.Auto)]

		static extern UInt32 SetupDiDestroyDeviceInfoList(IntPtr DevInfo);



		[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CM_Locate_DevNode_Ex", CharSet = CharSet.Auto)]

		static extern UInt32 CM_Locate_DevNode_Ex(ref UInt32 DevInst, [MarshalAs(UnmanagedType.LPWStr)]string DeviceID, UInt32 Flags, IntPtr Machine);



		[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CM_Reenumerate_DevNode_Ex", CharSet = CharSet.Auto)]

		static extern UInt32 CM_Reenumerate_DevNode_Ex(UInt32 DevInst, UInt32 Flags, IntPtr Machine);



		[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CMP_WaitNoPendingInstallEvents", CharSet = CharSet.Auto)]

		static extern UInt32 CMP_WaitNoPendingInstallEvents(UInt32 TimeOut);



		public struct DEVPROPKEY

		{

			public DEVPROPKEY(Guid InputId, UInt32 InputDevId)

			{

				DEVPROPGUID = InputId;

				DEVID = InputDevId;

			}

			public Guid DEVPROPGUID;

			public UInt32 DEVID;

		}



		[StructLayout(LayoutKind.Sequential)]

		public struct SP_DEVINFO_DATA

		{

			public UInt32 Size;

			public Guid ClassGuid;

			public UInt32 DevInst;

			public IntPtr Reserved;

		}



		public static UInt32 GetDeviceInformation(string DeviceID, ref IntPtr DevInfoSet, ref SP_DEVINFO_DATA DevInfo)

		{

			DevInfoSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero);

			if (DevInfoSet == IntPtr.Zero)

			{

				return (UInt32)Marshal.GetLastWin32Error();

			}



			DevInfo.Size = (UInt32)Marshal.SizeOf(DevInfo);



			if(0 == SetupDiOpenDeviceInfo(DevInfoSet, DeviceID, IntPtr.Zero, 0, ref DevInfo))

			{

				SetupDiDestroyDeviceInfoList(DevInfoSet);

				return ERROR_CLASS_MISMATCH;

			}

			return 0;

		}



		public static void ReleaseDeviceInfoSet(IntPtr DevInfoSet)

		{

			SetupDiDestroyDeviceInfoList(DevInfoSet);

		}



		public static UInt32 ReinstallDevice(string DeviceID)

		{

			UInt32 ResultCode = 0;

			IntPtr LocalMachineInstance = IntPtr.Zero;

			UInt32 DeviceInstance = 0;

			UInt32 PendingTime = INFINITE;

			UInt32 PendingTimeDetecting = 100;

			UInt32 MaxTimes = 100;

			IntPtr DeviceInfoSet = IntPtr.Zero;



			SP_DEVINFO_DATA DeviceInfoData = new SP_DEVINFO_DATA();



			ResultCode = GetDeviceInformation(DeviceID, ref DeviceInfoSet, ref DeviceInfoData);

			if(0 != ResultCode)

			{

				return ResultCode;

			}



			UInt32 propertyType = 0;

			UInt32 bufferSize = 4;

			IntPtr propertyBuffer = Marshal.AllocHGlobal((int)bufferSize);

			if (0 != SetupDiGetDeviceProperty(DeviceInfoSet, ref DeviceInfoData, ref DEVPKEY_Device_ConfigFlags, ref propertyType, propertyBuffer, bufferSize, ref bufferSize, 0))

			{

				if (propertyType == DEVPROP_TYPE_UINT32)

				{

					UInt32 propertyValue = (UInt32)Marshal.ReadInt32(propertyBuffer);

					propertyValue = propertyValue | CONFIGFLAG_REINSTALL;



					Marshal.WriteInt32(propertyBuffer, (int)propertyValue);



					if (0 == SetupDiSetDeviceProperty(DeviceInfoSet, ref DeviceInfoData, ref DEVPKEY_Device_ConfigFlags, propertyType, propertyBuffer, bufferSize, 0))

					{

						ResultCode = (UInt32)Marshal.GetLastWin32Error();

					}

				}

			}

			else

			{

				ResultCode = (UInt32)Marshal.GetLastWin32Error();

			}



			if (IntPtr.Zero != propertyBuffer)

			{

				Marshal.FreeHGlobal(propertyBuffer);

			}



			ResultCode = CM_Locate_DevNode_Ex(ref DeviceInstance, DeviceID, CM_LOCATE_DEVNODE_NORMAL, LocalMachineInstance);

			if (CR_SUCCESS == ResultCode)

			{

				ResultCode = CM_Reenumerate_DevNode_Ex(DeviceInstance, CM_REENUMERATE_SYNCHRONOUS | CM_REENUMERATE_RETRY_INSTALLATION, LocalMachineInstance);



				if (CR_SUCCESS == ResultCode) {

					UInt32 Wait = 0;

					ResultCode = CMP_WaitNoPendingInstallEvents(PendingTimeDetecting);

					while (WAIT_OBJECT_0 == ResultCode)

					{

						Wait++;

						if (MaxTimes <= Wait)

						{

							break;

						}



						Thread.Sleep((int)PendingTimeDetecting);



						ResultCode = CMP_WaitNoPendingInstallEvents(PendingTimeDetecting);

					}



					ResultCode = CMP_WaitNoPendingInstallEvents(PendingTime);

				}

			}



			ReleaseDeviceInfoSet(DeviceInfoSet);



			return ResultCode;

		}

	}

}

"@



	Add-Type -TypeDefinition $ReinstallDeviceSource

	$DeviceManager = [Microsoft.Windows.Diagnosis.DeviceManagement_ReinstallSingleDevice]

	$ErrorCode = $DeviceManager::ReinstallDevice($deviceID)

	return $ErrorCode

}



# Function to Remove any devices.

function RemoveDevice([string]$deviceID)

{

$RemoveDeviceSource = @"

using System;

using System.Runtime.InteropServices;

using System.Text;

namespace Microsoft.Windows.Diagnosis

{

	public sealed class DeviceManagement_Remove

	{

		public const UInt32 ERROR_CLASS_MISMATCH = 0xE0000203;



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiOpenDeviceInfo", CharSet = CharSet.Auto)]

		static extern UInt32 SetupDiOpenDeviceInfo(IntPtr DeviceInfoSet, [MarshalAs(UnmanagedType.LPWStr)]string DeviceID, IntPtr Parent, UInt32 Flags, ref SP_DEVINFO_DATA DeviceInfoData);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiCreateDeviceInfoList", CharSet = CharSet.Unicode)]

		static extern IntPtr SetupDiCreateDeviceInfoList(IntPtr ClassGuid, IntPtr Parent);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiDestroyDeviceInfoList", CharSet = CharSet.Unicode)]

		static extern UInt32 SetupDiDestroyDeviceInfoList(IntPtr DevInfo);



		[DllImport("setupapi.dll", SetLastError = true, EntryPoint = "SetupDiRemoveDevice", CharSet = CharSet.Auto)]

		public static extern int SetupDiRemoveDevice(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData);



		[StructLayout(LayoutKind.Sequential)]

		public struct SP_DEVINFO_DATA

		{

			public UInt32 Size;

			public Guid ClassGuid;

			public UInt32 DevInst;

			public IntPtr Reserved;

		}



		private DeviceManagement_Remove()

		{

		}



		public static UInt32 GetDeviceInformation(string DeviceID, ref IntPtr DevInfoSet, ref SP_DEVINFO_DATA DevInfo)

		{

			DevInfoSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero);

			if (DevInfoSet == IntPtr.Zero)

			{

				return (UInt32)Marshal.GetLastWin32Error();

			}



			DevInfo.Size = (UInt32)Marshal.SizeOf(DevInfo);



			if(0 == SetupDiOpenDeviceInfo(DevInfoSet, DeviceID, IntPtr.Zero, 0, ref DevInfo))

			{

				SetupDiDestroyDeviceInfoList(DevInfoSet);

				return ERROR_CLASS_MISMATCH;

			}

			return 0;

		}



		public static void ReleaseDeviceInfoSet(IntPtr DevInfoSet)

		{

			SetupDiDestroyDeviceInfoList(DevInfoSet);

		}



		public static UInt32 RemoveDevice(string DeviceID)

		{

			UInt32 ResultCode = 0;

			IntPtr DevInfoSet = IntPtr.Zero;

			SP_DEVINFO_DATA DevInfo = new SP_DEVINFO_DATA();



			ResultCode = GetDeviceInformation(DeviceID, ref DevInfoSet, ref DevInfo);



			if (0 == ResultCode)

			{

				if (1 != SetupDiRemoveDevice(DevInfoSet, ref DevInfo))

				{

					ResultCode = (UInt32)Marshal.GetLastWin32Error();

				}

				ReleaseDeviceInfoSet(DevInfoSet);

			}



			return ResultCode;

		}

	}

}

"@

 

	Add-Type -TypeDefinition $RemoveDeviceSource

	$DeviceManager = [Microsoft.Windows.Diagnosis.DeviceManagement_Remove]

	$ErrorCode = $DeviceManager::RemoveDevice($deviceID)

	return $ErrorCode

}



# Rescans the device changes

function RescanAllDevices()

{

$RescanAllDevicesSource = @"

using System;

using System.Runtime.InteropServices;

using System.Threading;

namespace Microsoft.Windows.Diagnosis

{

	public sealed class DeviceManagement_Rescan

	{

		private DeviceManagement_Rescan()

		{

		}



		public const UInt32 CR_SUCCESS = 0;

		public const UInt32 CM_REENUMERATE_SYNCHRONOUS = 1;

		public const UInt32 CM_LOCATE_DEVNODE_NORMAL = 0;

		public const UInt32 WAIT_OBJECT_0 = 0;

		public const UInt32 INFINITE = 0xFFFFFFFF;



		[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CM_Locate_DevNode_Ex", CharSet = CharSet.Auto)]

		static extern UInt32 CM_Locate_DevNode_Ex(ref UInt32 DevInst, IntPtr DeviceID, UInt32 Flags, IntPtr Machine);



		[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CM_Reenumerate_DevNode_Ex", CharSet = CharSet.Auto)]

		static extern UInt32 CM_Reenumerate_DevNode_Ex(UInt32 DevInst, UInt32 Flags, IntPtr Machine);



		[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CMP_WaitNoPendingInstallEvents", CharSet = CharSet.Auto)]

		static extern UInt32 CMP_WaitNoPendingInstallEvents(UInt32 TimeOut);



		public static UInt32 RescanAllDevices()

		{

			//only connect to local device nodes

			UInt32 ResultCode = 0;

			IntPtr LocalMachineInstance = IntPtr.Zero;

			UInt32 DeviceInstance = 0;

			UInt32 PendingTime = INFINITE;

			UInt32 PendingTimeDetecting = 100;

			UInt32 MaxTimes = 100;



			ResultCode = CM_Locate_DevNode_Ex(ref DeviceInstance, IntPtr.Zero, CM_LOCATE_DEVNODE_NORMAL, LocalMachineInstance);

			if (CR_SUCCESS == ResultCode)

			{

				ResultCode = CM_Reenumerate_DevNode_Ex(DeviceInstance, CM_REENUMERATE_SYNCHRONOUS, LocalMachineInstance);



				UInt32 Wait = 0;

				ResultCode = CMP_WaitNoPendingInstallEvents(PendingTimeDetecting);

				while (WAIT_OBJECT_0 == ResultCode)

				{

					Wait++;

					if (MaxTimes <= Wait)

					{

						break;

					}



					Thread.Sleep((int)PendingTimeDetecting);



					ResultCode = CMP_WaitNoPendingInstallEvents(PendingTimeDetecting);

				}



				ResultCode = CMP_WaitNoPendingInstallEvents(PendingTime);

			}



			return ResultCode;

		}



	}

}

"@

	

	Add-Type -TypeDefinition $RescanAllDevicesSource

	$DeviceManager = [Microsoft.Windows.Diagnosis.DeviceManagement_Rescan]

	$ErrorCode = $DeviceManager::RescanAllDevices()

	return $ErrorCode

}



function Set-DefaultEndpoint([string]$id = $(throw "No id is specified"))

{

	if(!([String]::IsNullOrEmpty($id)))

	{

		try

		{

				Get-AudioManager

				[Microsoft.Windows.Diagnosis.AudioConfigManager]::SetDefault($id)

		}

		catch [System.Exception]

		{

			Write-ExceptionTelemetry "Set-DefaultEndpoint" $_

		}

	}

}



#Function Get-AudioSamplingRate()

#{

#<#

#	DESCRIPTION:

#	  Load the module related to Audio EndPointCtrl and get and set the default sampling rate of specific the audio device .



#	ARGUMENTS:

#	  None



#	RETURNS:

#	  AudioResetDeviceFormats Type 

##>

#    $audioSampleFormatSource = @"

#using System;

#using System.Collections.Generic;

#using System.Text;

#using System.Runtime.InteropServices;

#using System.ComponentModel;

#using System.Security.Permissions;

#using System.Globalization;



#namespace Microsoft.Windows.Diagnosis

#{

#    public static class AudioResetDeviceFormats

#    {

#        public enum EDataFlow

#        {

#            ERender,

#            ECapture,

#            EAll,

#            EDataFlowEnumCount

#        }



#        /// <summary>

#        /// Used by IMMDeviceEnumerator

#        /// </summary>

#        public enum ERole

#        {

#            EConsole,

#            EMultimedia,

#            ECommunications,

#            ERoleEnumCount

#        }



#        internal static class NativeMethods

#        {

#            [DllImport("ole32.Dll")]

#            internal static extern int CoCreateInstance(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)] object inner, uint context, ref Guid id, [MarshalAs(UnmanagedType.IUnknown)] out object pointer);

#        }



#        public class EndpointCtrl

#        {

#            #region Private internal vars



#            static object oEnumerator;

#            static IMMDeviceEnumerator iDeviceEnumerator;

#            static object oDevice;

#            static IMMDevice iDevice;



#            #endregion



#            #region Interface to COM objects



#            const int E_FAIL = 0x00000001;



#            static Guid CLSID_MMDeviceEnumerator = new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E");

#            static Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");



#            /// <summary>

#            /// interface IMMDevice

#            /// </summary>

#            [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

#            private interface IMMDevice

#            {

#                int Activate(ref Guid guid, uint context, IntPtr parameters, ref IntPtr pointer);

#                int OpenPropertyStore(uint access, ref IntPtr properties);

#                int GetId(ref IntPtr id);

#                int GetState(ref int state);

#            }



#            /// <summary>

#            /// interface IMMDeviceEnumerator

#            /// </summary>

#            [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

#            interface IMMDeviceEnumerator

#            {

#                int EnumAudioEndpoints(EDataFlow dataflow, int mask, ref IntPtr devices);

#                int GetDefaultAudioEndpoint(EDataFlow dataflow, ERole role, ref IntPtr endpoint);

#                int GetDevice(string id, ref IntPtr device);

#                int RegisterEndpointNotificationCallback(IntPtr client);

#                int UnregisterEndpointNotificationCallback(IntPtr client);

#            }



#            private static bool comInitialized;

#            #endregion



#            /// <summary>

#            /// Constructor, initialize com interfaces

#            /// </summary>

#            internal EndpointCtrl()

#            {

#                int result = 0;

#                //1.to obtain IMMDeviceEnumerator

#                result = InitializedInstance();

#                if (result != 0)

#                {

#                    throw new Win32Exception("Can't obtain IMMDeviceEnumerator: " + result);

#                }



#                //2.to obtain IMMDevice by IMMDeviceEnumerator

#                //result = GetAudioDevice(deviceId);

#                if (result != 0)

#                {

#                    throw new Win32Exception("Can't obtain IMMDevice: " + result);

#                }

#            }



#            /// <summary>

#            /// initialize com interfaces and get IMMDeviceEnumerator

#            /// </summary>

#            /// <returns></returns>

#            private static int InitializedInstance()

#            {

#                if (comInitialized == true)

#                {

#                    return 0;

#                }



#                const uint CLSCTX_INPROC_SERVER = 1;



#                //1.to obtain IMMDeviceEnumerator

#                int result = NativeMethods.CoCreateInstance(ref CLSID_MMDeviceEnumerator, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out oEnumerator);

#                if (result != 0)

#                {

#                    return result;

#                }



#                comInitialized = true;



#                if (oEnumerator == null)

#                {

#                    return E_FAIL;

#                }



#                iDeviceEnumerator = oEnumerator as IMMDeviceEnumerator;



#                if (iDeviceEnumerator == null)

#                {

#                    return E_FAIL;

#                }



#                return result;

#            }



#            /// <summary>

#            /// Get expected Audio Device

#            /// </summary>

#            /// <returns></returns>

#            int GetAudioDevice(string deviceId)

#            {

#                IntPtr pDevice = IntPtr.Zero;

#                int result = 0;



#                if (iDeviceEnumerator == null)

#                    return E_FAIL;



#                result = iDeviceEnumerator.GetDevice(deviceId, ref pDevice);

#                if (result != 0)

#                {

#                    throw new Win32Exception("Can't obtain IMMDevice: " + result);

#                }



#                oDevice = Marshal.GetObjectForIUnknown(pDevice);

#                iDevice = oDevice as IMMDevice;



#                iDevice.GetState(ref state);



#                return result;

#            }



#            /// <summary>

#            /// Get default Audio Device

#            /// </summary>

#            /// <returns></returns>

#            [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)]

#            static string GetDefaultAudioDeviceId(string type, ERole role)

#            {

#                IntPtr pDefaultDevice = IntPtr.Zero;

#                IntPtr pID = IntPtr.Zero;

#                string id = "";

#                int result = 0;

#                object oDefaultDevice;

#                IMMDevice iDefaultDevice;



#                if (iDeviceEnumerator == null)

#                    return "";



#                result = iDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.ERender, role, ref pDefaultDevice);

#                if (result != 0)

#                {

#                    throw new Win32Exception("Can't obtain IMMDevice: " + result);

#                }



#                oDefaultDevice = Marshal.GetObjectForIUnknown(pDefaultDevice);

#                iDefaultDevice = oDefaultDevice as IMMDevice;



#                if (iDefaultDevice != null)

#                {

#                    iDefaultDevice.GetId(ref pID);

#                }



#                id = Marshal.PtrToStringAuto(pID);



#                return id;

#            }





#            /// <summary>

#            /// Call this method to release all com objetcs

#            /// </summary>

#            [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)]

#            public virtual void Dispose()

#            {

#                if (iDevice != null)

#                {

#                    Marshal.ReleaseComObject(iDevice);

#                    iDevice = null;

#                }

#                if (oDevice != null)

#                {

#                    Marshal.ReleaseComObject(oDevice);

#                    oDevice = null;

#                }

#                if (iDeviceEnumerator != null)

#                {

#                    Marshal.ReleaseComObject(iDeviceEnumerator);

#                    iDeviceEnumerator = null;

#                }

#                if (oEnumerator != null)

#                {

#                    Marshal.ReleaseComObject(oEnumerator);

#                    oEnumerator = null;

#                }

#            }



#            #region Public properties





#            /// <summary>

#            /// Get the default device state.

#            /// </summary>

#            int state;

#            public int State

#            {

#                get

#                {

#                    return state;

#                }

#            }



#            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]

#            public string EndpointId

#            {

#                get

#                {

#                    IntPtr id = IntPtr.Zero;

#                    if (iDevice != null)

#                    {

#                        iDevice.GetId(ref id);

#                    }



#                    return Marshal.PtrToStringAuto(id);

#                }

#            }

#            #endregion



#            #region Public Method



#            public string GetDefaultSpeakerEndpoint()

#            {

#                return GetDefaultAudioDeviceId("speakers", ERole.EConsole);

#            }

#            #endregion

#        }



#        [StructLayout(LayoutKind.Sequential)]

#        public class WAVEFORMATEX

#        {

#            public UInt16 wFormatTag;

#            public UInt16 nChannels;

#            public UInt32 nSamplesPerSec;

#            public UInt32 nAvgBytesPerSec;

#            public UInt16 nBlockAlign;

#            public UInt16 wBitsPerSample;

#            public UInt16 cbSize;

#        }



#        [ComImport, Guid("870AF99C-171D-4f9e-AF0D-E63DF40C2BC9")]

#        public class IPolicyConfigClass { }



#		public static class LoadDLL

#        {



#            [DllImport("AudioDiagnosticUtil.dll", EntryPoint = "AudioGetDeviceFormat", CharSet = CharSet.Auto)]

#            public static extern int AudioGetDeviceFormat(string pszDeviceName, bool bDefault, ref IntPtr ppFormat);



#            [DllImport("AudioDiagnosticUtil.dll", EntryPoint = "AudioSetDeviceFormat", CharSet = CharSet.Auto)]

#            public static extern int AudioSetDeviceFormat(string pszDeviceName, IntPtr pEndpointFormat, IntPtr MixFormat);

#        }



#        public class IPolicyConfigHelper

#        {

            

#            public Byte[] GetDeviceFormat(string pszDeviceName, bool bDefault, out WAVEFORMATEX retFormat)

#            {

#                IntPtr ptrToWaveFormat = new IntPtr();



#                LoadDLL.AudioGetDeviceFormat(pszDeviceName, bDefault, ref ptrToWaveFormat);

#                WAVEFORMATEX format = (WAVEFORMATEX)Marshal.PtrToStructure(ptrToWaveFormat, typeof(WAVEFORMATEX));

#                int formatSize = format.cbSize + Marshal.SizeOf(typeof(WAVEFORMATEX));

#                Byte[] formatExtData = new Byte[format.cbSize + Marshal.SizeOf(typeof(WAVEFORMATEX))];

#                Marshal.Copy(ptrToWaveFormat, formatExtData, 0, formatSize);

#                retFormat = format;

#                return formatExtData;

#            }

#            public int SetDeviceFormat(string pszDeviceName, Byte[] formatExtData, int formatSize)

#            {

#                IntPtr ptrToFormat = Marshal.AllocHGlobal(formatSize);

#                Marshal.Copy(formatExtData, 0, ptrToFormat, formatSize);



#				int rval = LoadDLL.AudioSetDeviceFormat(pszDeviceName, ptrToFormat, IntPtr.Zero);

#                Marshal.FreeHGlobal(ptrToFormat);

#                return rval;

#            }





#        }

    

#        public static bool verifySamplingRate(string deviceID)

#        {

#            EndpointCtrl control = new EndpointCtrl();

#            bool result = false;

#            string defSpeakerEndpoint = deviceID;

#            IPolicyConfigHelper policyHelper = new IPolicyConfigHelper();

#            WAVEFORMATEX defaultFormatEx = new WAVEFORMATEX();

#            WAVEFORMATEX currentFormatEx = new WAVEFORMATEX();

#            Byte[] defaultFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, true, out defaultFormatEx);

#            Byte[] currentFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, false, out currentFormatEx);

#            if (defaultFormatEx.nAvgBytesPerSec != currentFormatEx.nAvgBytesPerSec)

#            {

#                result = true;

#            }

#            return result;

#        }

#        public static bool resetSamplingRate(string deviceID)

#        {

#            EndpointCtrl control = new EndpointCtrl();

#            string defSpeakerEndpoint = deviceID;

#            IPolicyConfigHelper policyHelper = new IPolicyConfigHelper();

#            WAVEFORMATEX defaultFormatEx = new WAVEFORMATEX();

#            WAVEFORMATEX currentFormatEx = new WAVEFORMATEX();

#            Byte[] defaultFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, true, out defaultFormatEx);

#            Byte[] currentFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, false, out currentFormatEx);



#            policyHelper.SetDeviceFormat(defSpeakerEndpoint, defaultFormat, defaultFormat.Length);

#            WAVEFORMATEX currentFormatEx2 = new WAVEFORMATEX();

#            Byte[] currentFormat2 = policyHelper.GetDeviceFormat(defSpeakerEndpoint, false, out currentFormatEx2);

#            control.Dispose();

#            return true;

#        }

#    }

#}

	

#"@

#    Add-Type -TypeDefinition $audioSampleFormatSource

#    $audioSampleFormat = [Microsoft.Windows.Diagnosis.AudioResetDeviceFormats]



#    return $audioSampleFormat

#}



Function Start-AudioService()

{

	<#

        .DESCRIPTION

           Function to start Audio service forcefully 

        .PARAMETER 

			None

        .OUTPUTS

            None

    #>

	$audioService = (Get-WmiObject -query "select * from win32_baseService where Name='Audiosrv'")

	if($audioService.State -ne "Running")

	{

		Set-Service Audiosrv -StartupType Automatic

		Start-Service Audiosrv -PassThru -ErrorAction SilentlyContinue

	}

}



Function Stop-AudioService()

{

	<#

        .DESCRIPTION

           Function to stop Audio service forcefully 

        .PARAMETER 

			None

        .OUTPUTS

            None

    #>

	$audioService = (Get-WmiObject -query "select * from win32_baseService where Name='Audiosrv'")

	if($audioService.State -eq "Running")

	{

		Stop-Service Audiosrv -PassThru -ErrorAction SilentlyContinue

	}

}



function Get-AudioEndPointsCount

{

	<#

	FUNCTION DESCRIPTION:

		Enum audio active endpoints 



	ARGUMENTS:

		None



	RETURNS:

		Total number of audio endpoints   

#>

	$audioEnumSource = @"

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Runtime.InteropServices;

    using System.ComponentModel;

    using System.Security.Permissions;

    using System.Globalization;



    namespace Microsoft.Windows.Diagnosis

	{

		public static class AudioEnumEndPoints

		{

            public enum EDataFlow

        {

            ERender,

            ECapture,

            EAll,

            EDataFlowEnumCount

        }



            /// <summary>

            /// Used by IMMDeviceEnumerator

            /// </summary>

            public enum ERole

            {

                EConsole,

                EMultimedia,

                ECommunications,

                ERoleEnumCount

            }

            [Flags]

		    enum DEVICE_STATE : uint

		    {

			    DEVICE_STATE_ACTIVE = 0x00000001,

			    DEVICE_STATE_DISABLED = 0x00000002,

			    DEVICE_STATE_NOTPRESENT = 0x00000004,

			    DEVICE_STATE_UNPLUGGED = 0x00000008,

			    DEVICE_STATEMASK_ALL = 0x0000000F

		    }

            internal static class NativeMethods

            {

                [DllImport("ole32.Dll")]

                internal static extern int CoCreateInstance(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)] object inner, uint context, ref Guid id, [MarshalAs(UnmanagedType.IUnknown)] out object pointer);

            }



        

            #region Private internal vars



            static object oEnumerator;

            static IMMDeviceEnumerator iDeviceEnumerator;

          

         



            #endregion



            #region Interface to COM objects



            const int E_FAIL = 0x00000001;



            static Guid CLSID_MMDeviceEnumerator = new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E");

            static Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");



            /// <summary>

            /// interface IMMDeviceEnumerator

            /// </summary>

            [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

            interface IMMDeviceEnumerator

            {

                int EnumAudioEndpoints(EDataFlow dataflow, uint mask, ref IntPtr devices);

                int GetDefaultAudioEndpoint(EDataFlow dataflow, ERole role, ref IntPtr endpoint);

                int GetDevice(string id, ref IntPtr device);

                int RegisterEndpointNotificationCallback(IntPtr client);

                int UnregisterEndpointNotificationCallback(IntPtr client);

            }



           

            #endregion

            [Guid("0BD7A1BE-7A1A-44DB-8397-CC5392387B5E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

            interface IMMDeviceCollection

            {

                //HRESULT GetCount(

                //  [out] UINT* pcDevices

                //);

                int GetCount(out int pcDevices);



                //HRESULT Item(

                //  [in]  UINT nDevice,

                //  [out] IMMDevice** ppDevice

                //);

                int Item(uint nDevice, ref IntPtr ppDevice);

            }

            

            /// <summary>

            /// Get expected Audio Device

            /// </summary>

            /// <returns></returns>

            public static int GetAudioEndPointsCount()

            {

                int result = 0;

                try

                {

                    IntPtr ppDevices = IntPtr.Zero;

                    object oDevices = null;

                    IMMDeviceCollection endpointCollection = null;

                    const uint CLSCTX_INPROC_SERVER = 1;

                    //1.to obtain IMMDeviceEnumerator

                    int result1 = NativeMethods.CoCreateInstance(ref CLSID_MMDeviceEnumerator, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out oEnumerator);



                    iDeviceEnumerator = oEnumerator as IMMDeviceEnumerator;

                    int hr = iDeviceEnumerator.EnumAudioEndpoints(EDataFlow.EAll, (uint)DEVICE_STATE.DEVICE_STATE_ACTIVE, ref ppDevices);

                    if (hr != 0)

                    {

                        throw new Exception("HResult from IMMDeviceEnumerator.EnumAudioEndpoints = " + hr);

                    }

                    else if (ppDevices == IntPtr.Zero)

                    {

                        throw new Exception("IMMDeviceEnumerator.EnumAudioEndpoints returned pointer was zero.");

                    }

                    oDevices = Marshal.GetObjectForIUnknown(ppDevices);

                    endpointCollection = oDevices as IMMDeviceCollection;

                    if (endpointCollection == null)

                    {

                        throw new Exception("Could not cast to IMMDeviceCollection");

                    }



                    int deviceCount;

                    hr = endpointCollection.GetCount(out deviceCount);

                    if (hr != 0)

                    {

                        throw new Exception("HResult from IMMDeviceCollection.GetCount = " + hr);

                    }

                    Console.WriteLine(deviceCount.ToString());

                    result = deviceCount;



                }

                catch (InvalidCastException icex)

                {

                    Console.WriteLine("Unexpected COM exception: " + icex.Message);

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex.Message);

                }

                return result;

            

            }

        }

    }



"@



    Add-Type -TypeDefinition $audioEnumSource

	$audioEndpoints = [Microsoft.Windows.Diagnosis.AudioEnumEndPoints]



	# Call IAudioClient::Initialize on all the Active endpoints

	$result = $audioEndpoints::GetAudioEndPointsCount()

	return $result

}



Function Get-AudioDriverSource32

{

    <#

        .DESCRIPTION

           Function get driver resources of the specific audio device on 32 bit OS

        .PARAMETER 

			None

        .OUTPUTS

            Returns data type of get driver resources

    #>

    $ChangeAudioDriverSource32 = @"

using System;

using System.Runtime.InteropServices;

namespace Microsoft.Windows.Diagnosis

{

	public static class ChangeAudioDriver32

    {

        public enum DIOD

        {

            None = (0),

            CANCEL_REMOVE = (0x00000004),

            // If this flag is specified and the device had been marked for pending removal, the OS cancels the pending removal. 

            INHERIT_CLASSDRVS = (0x00000002)

            //the resulting device information element inherits the class driver list, if any

        }



        public enum DICD

        {

            None = (0),

            GENERATE_ID = (0x00000001), // create unique device instance key

            INHERIT_CLASSDRVS = (0x00000002)  // inherit class driver list

        }



        public enum SPDIT

        {

            None = (0),

            SPDIT_COMPATDRIVER = (0x00000002), // Build a list of compatible drivers

            SPDIT_CLASSDRIVER = (0x00000001)  // Build a list of class drivers

        }



        public enum DI_FLAGS

        {

             DI_FLAGSEX_INSTALLEDDRIVER = (0x04000000),

             DI_FLAGSEX_ALLOWEXCLUDEDDRVS = (0x00000800)

        }



        [StructLayout(LayoutKind.Sequential)]

        public class SP_DEVINFO_DATA

        {

            /// <summary>

            /// Size of the structure, in bytes. 

            /// </summary>

            public Int32 cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA));



            /// <summary>

            /// GUID of the device interface class. 

            /// </summary>

            public Guid ClassGuid;



            /// <summary>

            /// Handle to this device instance. 

            /// </summary>

            public Int32 DevInst;



            /// <summary>

            /// Reserved; do not use. 

            /// </summary>

            public IntPtr Reserved;

        }

        // 64 bit: Pack=4

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack=1)]

        public class SP_DRVINFO_DATA

        {

            public Int32 cbSize;

            public Int32 DriverType;

            public IntPtr Reserved;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public String Description;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public String MfgName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public String ProviderName;

            public System.Runtime.InteropServices.ComTypes.FILETIME DriverDate;

            public Int64 DriverVersion;

        }

        // 64 bit: Pack=8

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]

        public class SP_DRVINFO_DETAIL_DATA

        {

            public Int32 cbSize;

            public System.Runtime.InteropServices.ComTypes.FILETIME InfDate;

            public Int32 CompatIDsOffset;

            public Int32 CompatIDsLength;

            public IntPtr Reserved;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public string SectionName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]

            public string InfFileName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public string DrvDescription;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)]

            public string HardwareID;

        }

        // 64 bit: Pack=8

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]

        public class SP_DEVINSTALL_PARAMS

        {

            public Int32 cbSize;

            public Int32 Flags;

            public DI_FLAGS FlagsEx;

            public IntPtr hwndParent;

            public IntPtr InstallMsgHandler;

            public IntPtr InstallMsgHandlerContext;

            public IntPtr FileQueue;

            public UIntPtr ClassInstallReserved;

            public Int32 Reserved;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]

            public string DriverPath;

        }



        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiOpenDeviceInfo(

            IntPtr DeviceInfoSet,

            string device,

            IntPtr handleToWindow,

            DIOD flag,

            SP_DEVINFO_DATA deviceInfoData

            );

        [DllImport("Setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]

        public extern static IntPtr SetupDiCreateDeviceInfoList

            (

            IntPtr ClassGuid,

            IntPtr hwndParent

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiBuildDriverInfoList(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SPDIT DriverType

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiEnumDriverInfo(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SPDIT DriverType,

            int MemberIndex,

            [In, Out] SP_DRVINFO_DATA DriverInfoData

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiGetDriverInfoDetail(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SP_DRVINFO_DATA DriverInfoData,

            [In, Out] SP_DRVINFO_DETAIL_DATA DriverInfoDetailData,

            int DriverInfoDetailDataSize,

            out int RequiredSize

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiSetDeviceInstallParams(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SP_DEVINSTALL_PARAMS DeviceInstallParams

            );

        [DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool DiInstallDevice(

            IntPtr hwndParent,

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SP_DRVINFO_DATA DriverInfoData,

            int Flags,

            out bool rebootRequired            

            );



		[DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool DiInstallDriver

        (

            [In] IntPtr hwndParent,

            [In] string FullInfPath,

            [In] uint Flags,

            [Out] bool NeedReboot

        );



        public static int ForceInstallDriver(string deviceId, string infPath)

        {

            int error = 0;

            IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero);

            SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();

            bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData);

            if (bRet == false)

            {

                return Marshal.GetLastWin32Error();

            }



            bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER);

            if (bRet == false)

            {

                return Marshal.GetLastWin32Error();

            }

            int driverItr = 0;

            bool bResult = true;

            while (bResult)

            {

                SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA();

                driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA));

                bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData);

                if (bRet == false)

                {

                    return Marshal.GetLastWin32Error();

                }



                int requiredSize = 0;

                SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA();

                driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA));

                int dataSize = Marshal.SizeOf(driverInfoDetailData);



                bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize);

                if (bRet == false)

                {

                    error = Marshal.GetLastWin32Error();

                    //122 - ERROR_INSUFFICIENT_BUFFER, expected error

                    if (error != 122)

                    {

                        Marshal.GetLastWin32Error();

                    }

                }



                if (driverInfoDetailData.InfFileName != null && driverInfoDetailData.InfFileName.Contains(infPath))

                {

                    bool bReboot = false;

                    //bRet = DiInstallDevice(IntPtr.Zero, hDevSet, deviceInfoData, driverInfoData, 0, out bReboot);

					//DIIRFLAG_FORCE_INF = 0x00000002 to force windows to honor the driver installation

					bRet = DiInstallDriver(IntPtr.Zero, driverInfoDetailData.InfFileName, 2, bReboot);

                    if (bRet == false)

                    {

                        error = Marshal.GetLastWin32Error();

                        driverItr++;

                        continue;

                    }

                    else

                    {

                        return 0;

                    }

                }

                driverItr++;

            }

            return -1;

        }

        public static int ForceInstallHDAudio(string deviceId)

        {

            return ForceInstallDriver(deviceId, "hdaudio.inf");

        }



        public static string GetCurrentDriverINF(string deviceId)

        {

            string infPath = "ErrorFindingINF";

            int error = 0;

            IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero);

            SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();



            bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }



            // Get Currently Installed Driver

            SP_DEVINSTALL_PARAMS deviceInstallParams = new SP_DEVINSTALL_PARAMS();

            deviceInstallParams.cbSize = Marshal.SizeOf(typeof(SP_DEVINSTALL_PARAMS));

            deviceInstallParams.FlagsEx = DI_FLAGS.DI_FLAGSEX_ALLOWEXCLUDEDDRVS | DI_FLAGS.DI_FLAGSEX_INSTALLEDDRIVER;

            bRet = SetupDiSetDeviceInstallParams(hDevSet, deviceInfoData, deviceInstallParams);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }



            bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }

            int driverItr = 0;

           

            SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA();

            driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA));

            bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }

            int requiredSize = 0;

            SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA();

            driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA));

            int dataSize = Marshal.SizeOf(driverInfoDetailData);

            // First get the required size

            bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                //122 - ERROR_INSUFFICIENT_BUFFER, expected error

                if (error != 122)

                {

                    return infPath;

                }

            }



            if (driverInfoDetailData.InfFileName != null)

            {

                infPath = driverInfoDetailData.InfFileName;

            }

            return infPath;

        }

    }

}

"@

    Add-Type -TypeDefinition $ChangeAudioDriverSource32

    $driverSource = [Microsoft.Windows.Diagnosis.ChangeAudioDriver32]

    return $driverSource

}



Function Get-AudioDriverSource

{

    <#

        .DESCRIPTION

           Function get driver resources of the specific audio device on 64 bit OS

        .PARAMETER 

			None

        .OUTPUTS

            Returns data type of get driver resources

    #>

     $ChangeAudioDriverSource = @"

using System;

using System.Runtime.InteropServices;

namespace Microsoft.Windows.Diagnosis

{

    public static class ChangeAudioDriver

    {

        public enum DIOD

        {

            None = (0),

            CANCEL_REMOVE = (0x00000004),

            // If this flag is specified and the device had been marked for pending removal, the OS cancels the pending removal. 

            INHERIT_CLASSDRVS = (0x00000002)

            //the resulting device information element inherits the class driver list, if any

        }



        public enum DICD

        {

            None = (0),

            GENERATE_ID = (0x00000001), // create unique device instance key

            INHERIT_CLASSDRVS = (0x00000002)  // inherit class driver list

        }



        public enum SPDIT

        {

            None = (0),

            SPDIT_COMPATDRIVER = (0x00000002), // Build a list of compatible drivers

            SPDIT_CLASSDRIVER = (0x00000001)  // Build a list of class drivers

        }



        public enum DI_FLAGS

        {

             DI_FLAGSEX_INSTALLEDDRIVER = (0x04000000),

             DI_FLAGSEX_ALLOWEXCLUDEDDRVS = (0x00000800)

        }



        [StructLayout(LayoutKind.Sequential)]

        public class SP_DEVINFO_DATA

        {

            /// <summary>

            /// Size of the structure, in bytes. 

            /// </summary>

            public Int32 cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA));



            /// <summary>

            /// GUID of the device interface class. 

            /// </summary>

            public Guid ClassGuid;



            /// <summary>

            /// Handle to this device instance. 

            /// </summary>

            public Int32 DevInst;



            /// <summary>

            /// Reserved; do not use. 

            /// </summary>

            public IntPtr Reserved;

        }

        // 64 bit: Pack=4

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack=4)]

        public class SP_DRVINFO_DATA

        {

            public Int32 cbSize;

            public Int32 DriverType;

            public IntPtr Reserved;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public String Description;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public String MfgName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public String ProviderName;

            public System.Runtime.InteropServices.ComTypes.FILETIME DriverDate;

            public Int64 DriverVersion;

        }

        // 64 bit: Pack=8

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]

        public class SP_DRVINFO_DETAIL_DATA

        {

            public Int32 cbSize;

            public System.Runtime.InteropServices.ComTypes.FILETIME InfDate;

            public Int32 CompatIDsOffset;

            public Int32 CompatIDsLength;

            public IntPtr Reserved;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public string SectionName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]

            public string InfFileName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

            public string DrvDescription;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)]

            public string HardwareID;

        }

        // 64 bit: Pack=8

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]

        public class SP_DEVINSTALL_PARAMS

        {

            public Int32 cbSize;

            public Int32 Flags;

            public DI_FLAGS FlagsEx;

            public IntPtr hwndParent;

            public IntPtr InstallMsgHandler;

            public IntPtr InstallMsgHandlerContext;

            public IntPtr FileQueue;

            public UIntPtr ClassInstallReserved;

            public Int32 Reserved;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]

            public string DriverPath;

        }



        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiOpenDeviceInfo(

            IntPtr DeviceInfoSet,

            string device,

            IntPtr handleToWindow,

            DIOD flag,

            SP_DEVINFO_DATA deviceInfoData

            );

        [DllImport("Setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]

        public extern static IntPtr SetupDiCreateDeviceInfoList

            (

            IntPtr ClassGuid,

            IntPtr hwndParent

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiBuildDriverInfoList(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SPDIT DriverType

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiEnumDriverInfo(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SPDIT DriverType,

            int MemberIndex,

            [In, Out] SP_DRVINFO_DATA DriverInfoData

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiGetDriverInfoDetail(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SP_DRVINFO_DATA DriverInfoData,

            [In, Out] SP_DRVINFO_DETAIL_DATA DriverInfoDetailData,

            int DriverInfoDetailDataSize,

            out int RequiredSize

            );

        [DllImport("Setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool SetupDiSetDeviceInstallParams(

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SP_DEVINSTALL_PARAMS DeviceInstallParams

            );

        [DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool DiInstallDevice(

            IntPtr hwndParent,

            IntPtr DeviceInfoSet,

            SP_DEVINFO_DATA DeviceInfoData,

            SP_DRVINFO_DATA DriverInfoData,

            int Flags,

            out bool rebootRequired            

            );



		[DllImport("Newdev.dll", SetLastError = true, CharSet = CharSet.Unicode)]

        public static extern bool DiInstallDriver

        (

            [In] IntPtr hwndParent,

            [In] string FullInfPath,

            [In] uint Flags,

            [Out] bool NeedReboot

        );



        public static int ForceInstallDriver(string deviceId, string infPath)

        {

            int error = 0;

            IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero);

            SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();

            bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData);

            if (bRet == false)

            {

                return Marshal.GetLastWin32Error();

            }



            bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER);

            if (bRet == false)

            {

                return Marshal.GetLastWin32Error();

            }

            int driverItr = 0;

            bool bResult = true;

            while (bResult)

            {

                SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA();

                driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA));

                bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData);

                if (bRet == false)

                {

                    return Marshal.GetLastWin32Error();

                }



                int requiredSize = 0;

                SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA();

                driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA));

                int dataSize = Marshal.SizeOf(driverInfoDetailData);



                bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize);

                if (bRet == false)

                {

                    error = Marshal.GetLastWin32Error();

                    //122 - ERROR_INSUFFICIENT_BUFFER, expected error

                    if (error != 122)

                    {

                        Marshal.GetLastWin32Error();

                    }

                }



                if (driverInfoDetailData.InfFileName != null && driverInfoDetailData.InfFileName.Contains(infPath))

                {

                    bool bReboot = false;

                    //bRet = DiInstallDevice(IntPtr.Zero, hDevSet, deviceInfoData, driverInfoData, 0, out bReboot);

					//DIIRFLAG_FORCE_INF = 0x00000002 to force windows to honor the driver installation

					bRet = DiInstallDriver(IntPtr.Zero, driverInfoDetailData.InfFileName, 2, bReboot);

                    if (bRet == false)

                    {

                        error = Marshal.GetLastWin32Error();

                        driverItr++;

                        continue;

                    }

                    else

                    {

                        return 0;

                    }

                }

                driverItr++;

            }

            return -1;

        }

        public static int ForceInstallHDAudio(string deviceId)

        {

            return ForceInstallDriver(deviceId, "hdaudio.inf");

        }



        public static string GetCurrentDriverINF(string deviceId)

        {

            string infPath = "ErrorFindingINF";

            int error = 0;

            IntPtr hDevSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero);

            SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();



            bool bRet = SetupDiOpenDeviceInfo(hDevSet, deviceId, IntPtr.Zero, 0, deviceInfoData);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }



            // Get Currently Installed Driver

            SP_DEVINSTALL_PARAMS deviceInstallParams = new SP_DEVINSTALL_PARAMS();

            deviceInstallParams.cbSize = Marshal.SizeOf(typeof(SP_DEVINSTALL_PARAMS));

            deviceInstallParams.FlagsEx = DI_FLAGS.DI_FLAGSEX_ALLOWEXCLUDEDDRVS | DI_FLAGS.DI_FLAGSEX_INSTALLEDDRIVER;

            bRet = SetupDiSetDeviceInstallParams(hDevSet, deviceInfoData, deviceInstallParams);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }



            bRet = SetupDiBuildDriverInfoList(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }

            int driverItr = 0;

           

            SP_DRVINFO_DATA driverInfoData = new SP_DRVINFO_DATA();

            driverInfoData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DATA));

            bRet = SetupDiEnumDriverInfo(hDevSet, deviceInfoData, SPDIT.SPDIT_COMPATDRIVER, driverItr, driverInfoData);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                return infPath;

            }

            int requiredSize = 0;

            SP_DRVINFO_DETAIL_DATA driverInfoDetailData = new SP_DRVINFO_DETAIL_DATA();

            driverInfoDetailData.cbSize = Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA));

            int dataSize = Marshal.SizeOf(driverInfoDetailData);

            // First get the required size

            bRet = SetupDiGetDriverInfoDetail(hDevSet, deviceInfoData, driverInfoData, driverInfoDetailData, dataSize, out requiredSize);

            if (bRet == false)

            {

                error = Marshal.GetLastWin32Error();

                //122 - ERROR_INSUFFICIENT_BUFFER, expected error

                if (error != 122)

                {

                    return infPath;

                }

            }



            if (driverInfoDetailData.InfFileName != null)

            {

                infPath = driverInfoDetailData.InfFileName;

            }

            return infPath;

        }

    }

}

"@

    Add-Type -TypeDefinition $ChangeAudioDriverSource

    $driverSource = [Microsoft.Windows.Diagnosis.ChangeAudioDriver]

    return $driverSource

}



Function PlaySound()

{

	<#

        .DESCRIPTION

           Function Play windows default sound file thrice

        .PARAMETER 

			None

        .OUTPUTS

            None

    #>

	$count = 1

	while($count -le 3)

	{

		$count++

		$playSound = (new-object Media.SoundPlayer  "$env:SystemDrive\Windows\Media\notify.wav").play()

		Start-Sleep 1

	}

}



Function Get-HDAudioID($deviceTypes)

{

	<#

        .DESCRIPTION

           Function to get the device ID of HD audio driver

        .PARAMETER 

			None

        .OUTPUTS

            Array of device ID

    #>

    try 

    {

        $devices = @()

        $devIds = @()

	    [string]$deviceFlow = $endPointtype

        $audioDevices = Get-WmiObject Win32_SoundDevice

        foreach ($device in $audioDevices)

        {



	        $pnpdevid = $device.PNPDeviceID



            $pnpSignedDriver = Get-WmiObject -Class Win32_PnPSignedDriver | Where-Object -FilterScript {$_.DeviceID -eq $pnpdevid}

            $infname = $pnpSignedDriver.InfName

	        $infname = $infname.ToLower()

	        if($infname.Contains("hdaudio"))

	        {

                $devName = $pnpSignedDriver.DeviceName

                break

            }

        }    

		

		$EndPointListID_HDAudioID = @()

		$AudioMethods_HDAudioID = Get-AudioEndpoints

		$EndPointListID_HDAudioID = $AudioMethods_HDAudioID::GetAudioEndPointsbyType($deviceTypes)

		$devices += $EndPointListID_HDAudioID.ForEach({[PSCustomObject]$_})



        foreach($devs in $devices)

		{

			$devId = GetId $devs

            $deviceName = GetAdapterName $devs

            if($deviceName.Contains($devName))

            {

                $devIds += $devId

            }

        }

    }

	catch

	{

		$errorMsg =  $_.Exception.Message

		$errorMsg | ConvertTo-Xml | Update-DiagReport -Id "CL_Utility" -Name "CL_Utility" -Verbosity Debug

	}

    

	return $devIds

}





function Set-AudioEndpointProperty($deviceType)

{

	<#

        .DESCRIPTION

           Function to set property related to audio MMdevice

        .PARAMETER 

			None

        .OUTPUTS

            Bool value True if property is set else false

    #>

	$flag = $false

	$ids = @()

	$ids = Get-HDAudioID $deviceTypes

	Get-AudioManager

	foreach($id in $ids)

	{

		if(!([String]::IsNullOrEmpty($id)))

		{

			try

			{

					$returnValue = [Microsoft.Windows.Diagnosis.AudioConfigManager]::SetAudioProperty($id)

					if($returnValue -eq "0")

					{

						$flag = $true

					}

			}

			catch [System.Exception]

			{

				Write-ExceptionTelemetry "Set-AudioEndpointProperty" $_



				$errorMsg =  $_.Exception.Message

				$errorMsg | ConvertTo-Xml | Update-DiagReport -Id "CL_Utility" -Name "CL_Utility" -Verbosity Debug

			}

		}

	}

	return $flag

}





Function Get-AudioEndpoints()

{

<#

	DESCRIPTION:

	  Load the module related to Audio EndPointCtrl and get and set the default sampling rate of specific the audio device .



	ARGUMENTS:

	  None



	RETURNS:

	  AudioResetDeviceFormats Type 

#>

$AudioEndpointsSource = @"

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using System.ComponentModel;

using System.Security.Permissions;

using System.Globalization;



namespace Microsoft.Windows.Diagnosis

{

     public static class AudioResetDeviceFormats

        {

            /// <summary>

            /// Used by IMMDeviceEnumerator

            /// </summary>

            public enum EDataFlow

            {

                ERender,

                ECapture,

                EAll,

                EDataFlowEnumCount

            }



            public enum DeviceState

            {

                Active = 0x00000001,

                Disabled = 0x00000002,

                NotPresent = 0x00000004,

                Unplugged = 0x00000008,

                All = 0x0000000f

            }



            /// <summary>

            /// Used by IMMDeviceEnumerator

            /// </summary>

            public enum ERole

            {

                EConsole,

                EMultimedia,

                ECommunications,

                ERoleEnumCount

            }



            /// <summary>

            /// PROPVARIANT, Used by IMMDevice::OpenPropertyStore

            /// </summary>

            [StructLayout(LayoutKind.Explicit)]

            private struct UnionMembers

            {

                [FieldOffset(0)]

                public IntPtr deviceName;

                [FieldOffset(0)]

                public uint deviceTypeValue;

            }



            [StructLayout(LayoutKind.Sequential, Size = 32)]

            private struct PROPVARIANT

            {

                private ushort variantType;

                private short reserved1;

                private short reserved2;

                private short reserved3;

                private UnionMembers unionmembers;



                public string DeviceName

                {

                    get

                    {



                        return Marshal.PtrToStringAuto(this.unionmembers.deviceName);

                    }

                }



                public uint DeviceTypeValue

                {

                    get

                    {

                        return this.unionmembers.deviceTypeValue;

                    }

                }

            }

            internal static class NativeMethods

            {

                [DllImport("ole32.Dll")]

                internal static extern int CoCreateInstance(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)] object inner, uint context, ref Guid id, [MarshalAs(UnmanagedType.IUnknown)] out object pointer);

            }



            public class EndpointList

            {

                public EndpointList(string deviceDes, string deviceId, string adapterName, int jackInfo, bool isDefault,int State)

                {

                    this.deviceDes = deviceDes;

                    this.deviceId = deviceId;

                    this.adapterName = adapterName;

                    this.jackInfo = jackInfo;

                    this.isDefault = isDefault;

                    this.state = State;



                }



                private string adapterName;

                public string AdapterName

                {

                    get

                    {

                        return adapterName;

                    }

                }



                private string deviceDes;

                public string DeviceDes

                {

                    get

                    {

                        return deviceDes;

                    }

                }



                private string deviceId;

                public string DeviceId

                {

                    get

                    {

                        return deviceId;

                    }

                }

                private int jackInfo;

                public int JackInfo

                {

                    get

                    {

                        return jackInfo;

                    }

                }

                private bool isDefault;

                public bool IsDefault

                {

                    get

                    {

                        return isDefault;

                    }

                }



                private int state;

                public int State

                {

                    get

                    {

                        return state;

                    }

                 

                }



            }



            public class EndpointCtrl

            {

                #region Private internal vars



                static object oEnumerator;

                static IMMDeviceEnumerator iDeviceEnumerator;

                static object oDevices;

                static IMMDevices iDeviceCollection;

                static object oDevice;

                static IMMDevice iDevice;



                static object oProperty;

                static IPropertyStore iProperty;



                #endregion



                #region Interface to COM objects



                const int E_FAIL = 0x00000001;

                const int STGM_READ = 0x00000000;

                const int STGM_WRITE = 0x00000001;

                const int STGM_READWRITE = 0x00000002;



                static Guid CLSID_MMDeviceEnumerator = new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E");

                static Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");

                static Guid IID_IDeviceTopology = new Guid("2A07407E-6497-4A18-9787-32F79BD0D98F");

                static Guid IID_IPart = new Guid("AE2DE0E4-5BCA-4F2D-AA46-5D13F8FDB3A9");

                static Guid IID_IKsJackDescription = new Guid("4509F757-2D46-4637-8E62-CE7DB944F57B");

                static int jackErrorInfo = 0;





                static PropertyKey PKEY_Device_DeviceDesc = new PropertyKey(new Guid("A45C254E-DF1C-4EFD-8020-67D146A850E0"), 2);

                static PropertyKey PKEY_AudioEndpoint_FormFactor = new PropertyKey(new Guid("1DA5D803-D492-4EDD-8C23-E0C0FFEE7F0E"), 0);

                static PropertyKey PKEY_DeviceInterface_FriendlyName = new PropertyKey(new Guid("026e516e-b814-414b-83cd-856d6fef4822"), 2);







                /// <summary>

                /// Interface IPropertyStore

                /// </summary>

                [Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                private interface IPropertyStore

                {



                    //virtual HRESULT STDMETHODCALLTYPE GetCount(/* [out] */ __RPC__out DWORD *cProps) = 0;



                    int GetCount(ref uint props);



                    //virtual HRESULT STDMETHODCALLTYPE GetAt( /* [in] */ DWORD iProp, /* [out] */ __RPC__out PROPERTYKEY *pkey) = 0;



                    int GetAt(uint prop, ref PropertyKey key);



                    //virtual HRESULT STDMETHODCALLTYPE GetValue(/* [in] */ __RPC__in REFPROPERTYKEY key, /* [out] */ __RPC__out PROPVARIANT *pv) = 0;



                    int GetValue(ref PropertyKey key, ref PROPVARIANT variant);

                    //int GetValue([MarshalAs(UnmanagedType.Struct)]ref PropertyKey key, [MarshalAs(UnmanagedType.Struct)]ref PROPVARIANT variant);



                    //virtual HRESULT STDMETHODCALLTYPE SetValue(/* [in] */ __RPC__in REFPROPERTYKEY key, /* [in] */ __RPC__in REFPROPVARIANT propvar) = 0;



                    int SetValue(ref PropertyKey key, ref PROPVARIANT variant);



                    //virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0;



                    int Commit();

                }



                /// <summary>

                /// interface IMMDevice

                /// </summary>

                [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                private interface IMMDevice

                {

                    int Activate(ref Guid guid, uint context, IntPtr parameters, ref IntPtr pointer);

                    int OpenPropertyStore(uint access, ref IntPtr properties);

                    int GetId(ref IntPtr id);

                    int GetState(ref int state);

                }



                /// <summary>

                /// interface IMMDeviceCollection

                /// </summary>

                [Guid("0BD7A1BE-7A1A-44DB-8397-CC5392387B5E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                private interface IMMDevices

                {

                    //HRESULT GetCount([out, annotation("__out")] UINT* pcDevices);



                    int GetCount(ref uint pcDevices);



                    //HRESULT Item([in, annotation("__in")]UINT nDevice, [out, annotation("__out")] IMMDevice** ppDevice);



                    int Item(uint deviceId, ref IntPtr ppDevice);

                }



                /// <summary>

                /// interface IMMDeviceEnumerator

                /// </summary>

                [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                interface IMMDeviceEnumerator

                {

                    int EnumAudioEndpoints(EDataFlow dataflow, int mask, ref IntPtr devices);

                    int GetDefaultAudioEndpoint(EDataFlow dataflow, ERole role, ref IntPtr endpoint);

                    int GetDevice(string id, ref IntPtr device);

                    int RegisterEndpointNotificationCallback(IntPtr client);

                    int UnregisterEndpointNotificationCallback(IntPtr client);

                }



                [Guid("2A07407E-6497-4A18-9787-32F79BD0D98F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                internal interface IDeviceTopology

                {

                    int GetConnectorCount(ref uint pConnectorCount);



                    int GetConnector(uint nIndex, ref IntPtr ppConnector);



                    int GetSubunitCount(ref uint pCount);



                    int GetSubunit(uint nIndex, ref IntPtr ppSubunit);



                    int GetPartById(uint nId, ref IntPtr ppPart);



                    int GetDeviceId(ref IntPtr ppwstrDeviceId);



                    int GetSignalPath(IntPtr pIPartFrom, IntPtr pIPartTo, bool bRejectMixedPaths, ref IntPtr ppParts);

                }



                [Guid("9C2C4058-23F5-41DE-877A-DF3AF236A09E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                internal interface IConnector

                {

                    int GetType(ref int pType);

                    int GetDataFlow(ref int pFlow);

                    int ConnectTo(ref IntPtr pConnectTo);

                    int Disconnect();

                    int IsConnected(ref bool pbConnected);

                    int GetConnectedTo(ref IntPtr ppConTo);

                    int GetConnectorIdConnectedTo(ref IntPtr ppwstrConnectorId);

                    int GetDeviceIdConnectedTo(ref IntPtr ppwstrDeviceId);

                }



                [Guid("AE2DE0E4-5BCA-4F2D-AA46-5D13F8FDB3A9"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                internal interface IPart

                {

                    int GetName(ref string ppwstrName);

                    int GetLocalId(ref uint pnId);

                    int GetGlobalId(ref IntPtr ppwstrGlobalId);

                    int GetPartType(IntPtr pPartType);

                    int GetSubType(ref Guid pSubType);

                    int GetControlInterfaceCount(ref uint pCount);

                    int GetControlInterface(uint nIndex, ref IntPtr ppInterfaceDesc);

                    int EnumPartsIncoming(ref IntPtr ppParts);

                    int EnumPartsOutgoing(ref IntPtr ppParts);

                    int GetTopologyObject(ref IntPtr ppTopology);

                    int Activate(int dwClsContext, ref Guid refiid, ref IntPtr ppvObject);

                    int RegisterControlChangeCallback(ref Guid riid, IntPtr pNotify);

                    int UnregisterControlChangeCallback(IntPtr pNotify);

                }



                [Guid("4509F757-2D46-4637-8E62-CE7DB944F57B"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

                internal interface IKsJackDescription

                {

                    int GetJackCount(ref uint pcJacks);

                    int GetJackDescription(uint nJack, out KSJACK_DESCRIPTION pDescription);

                }



                [StructLayout(LayoutKind.Sequential)]

                internal struct KSJACK_DESCRIPTION

                {

                    internal int ChannelMapping;

                    internal int Color;

                    internal uint ConnectionType;

                    internal uint GeoLocation;

                    internal uint GenLocation;

                    internal uint PortConnection;

                    internal bool IsConnected;

                }



                private struct PropertyKey

                {

                    public PropertyKey(Guid initId, uint initPid)

                    {

                        id = initId;

                        pid = initPid;

                    }



                    Guid id;

                    uint pid;

                }



                private static bool comInitialized;

                #endregion



                /// <summary>

                /// Constructor, initialize com interfaces

                /// </summary>

                internal EndpointCtrl()

                {

                    int result = 0;

                    //1.to obtain IMMDeviceEnumerator

                    result = InitializedInstance();

                    if (result != 0)

                    {

                        throw new Win32Exception("Can't obtain IMMDeviceEnumerator: " + result);

                    }



                    //2.to obtain IMMDevice by IMMDeviceEnumerator

                    //result = GetAudioDevice(deviceId);

                    if (result != 0)

                    {

                        throw new Win32Exception("Can't obtain IMMDevice: " + result);

                    }

                }



                /// <summary>

                /// initialize com interfaces and get IMMDeviceEnumerator

                /// </summary>

                /// <returns></returns>

                private static int InitializedInstance()

                {

                    if (comInitialized == true)

                    {

                        return 0;

                    }



                    const uint CLSCTX_INPROC_SERVER = 1;



                    //1.to obtain IMMDeviceEnumerator

                    int result = NativeMethods.CoCreateInstance(ref CLSID_MMDeviceEnumerator, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out oEnumerator);

                    if (result != 0)

                    {

                        return result;

                    }



                    comInitialized = true;



                    if (oEnumerator == null)

                    {

                        return E_FAIL;

                    }



                    iDeviceEnumerator = oEnumerator as IMMDeviceEnumerator;



                    if (iDeviceEnumerator == null)

                    {

                        return E_FAIL;

                    }



                    return result;

                }



                /// <summary>

                /// Jack Info method

                /// </summary>

                /// <param name="iDevice"></param>

                /// <returns></returns>

                private static int GetJackInfo(IMMDevice iDevice)

                {

                    IDeviceTopology deviceTopology = null;

                    IConnector connFrom = null;

                    IConnector connTo = null;

                    IPart part = null;

                    IKsJackDescription jackDesc = null;

                    IntPtr tempIntPtr = IntPtr.Zero;

                    IntPtr pPart = IntPtr.Zero;

                    object tempObject = null;

                    uint nJacks = 0;

                    const uint CLSCTX_ALL = 23;

                    int result = 0;

                    int jackInfo = -1;



                    if (iDevice == null)

                    {

                        throw new Exception("No device is specified");

                    }



                    result = iDevice.Activate(ref IID_IDeviceTopology, CLSCTX_ALL, IntPtr.Zero, ref tempIntPtr);

                    if (result != 0 || tempIntPtr == IntPtr.Zero)

                    {

                        return jackErrorInfo;

                    }

                    tempObject = Marshal.GetObjectForIUnknown(tempIntPtr);

                    deviceTopology = tempObject as IDeviceTopology;



                    tempIntPtr = IntPtr.Zero;

                    tempObject = null;

                    result = deviceTopology.GetConnector(0, ref tempIntPtr);

                    if (result != 0 || tempIntPtr == IntPtr.Zero)

                    {

                        return jackErrorInfo;

                    }

                    tempObject = Marshal.GetObjectForIUnknown(tempIntPtr);

                    connFrom = tempObject as IConnector;



                    tempIntPtr = IntPtr.Zero;

                    tempObject = null;

                    result = connFrom.GetConnectedTo(ref tempIntPtr);

                    if (result != 0 || tempIntPtr == IntPtr.Zero)

                    {

                        return jackErrorInfo;

                    }

                    tempObject = Marshal.GetObjectForIUnknown(tempIntPtr);

                    connTo = tempObject as IConnector;



                    tempObject = null;

                    result = Marshal.QueryInterface(tempIntPtr, ref IID_IPart, out pPart);

                    if (result != 0 || pPart == IntPtr.Zero)

                    {

                        return jackErrorInfo;

                    }

                    tempObject = Marshal.GetObjectForIUnknown(pPart);

                    part = tempObject as IPart;



                    tempIntPtr = IntPtr.Zero;

                    tempObject = null;

                    try

                    {

                        result = part.Activate(1, ref IID_IKsJackDescription, ref tempIntPtr);

                    }

                    catch

                    {

                        return jackErrorInfo;

                    }

                    if (result != 0 || tempIntPtr == IntPtr.Zero)

                    {

                        return jackErrorInfo;

                    }



                    tempObject = Marshal.GetObjectForIUnknown(tempIntPtr);

                    jackDesc = tempObject as IKsJackDescription;



                    result = jackDesc.GetJackCount(ref nJacks);

                    for (uint iJack = 0; iJack < nJacks; iJack++)

                    {

                        KSJACK_DESCRIPTION JackDescription = new KSJACK_DESCRIPTION();

                        result = jackDesc.GetJackDescription(iJack, out JackDescription);

                        if (result != 0)

                        {

                            return jackErrorInfo;

                        }



                        jackInfo = (int)JackDescription.GeoLocation;

                    }



                    return jackInfo;

                }





                /// <summary>

                /// Get expected Audio Device

                /// </summary>

                /// <returns></returns>

                int GetAudioDevice(string deviceId)

                {

                    IntPtr pDevice = IntPtr.Zero;

                    int result = 0;



                    if (iDeviceEnumerator == null)

                        return E_FAIL;



                    result = iDeviceEnumerator.GetDevice(deviceId, ref pDevice);

                    if (result != 0)

                    {

                        throw new Win32Exception("Can't obtain IMMDevice: " + result);

                    }



                    oDevice = Marshal.GetObjectForIUnknown(pDevice);

                    iDevice = oDevice as IMMDevice;



                    iDevice.GetState(ref state);



                    return result;

                }



                /// <summary>

                /// Get default Audio Device

                /// </summary>

                /// <returns></returns>

                [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)]

                static string GetDefaultAudioDeviceId(string type, ERole role)

                {

                    IntPtr pDefaultDevice = IntPtr.Zero;

                    IntPtr pID = IntPtr.Zero;

                    string id = "";

                    int result = 0;

                    object oDefaultDevice;

                    IMMDevice iDefaultDevice;

                    EDataFlow enumDataFlow = EDataFlow.ECapture;



                    if (iDeviceEnumerator == null)

                        return "";



                    if (type == "Render")

                    {

                        enumDataFlow = EDataFlow.ERender;

                    }





                    try

                    {

                        result = iDeviceEnumerator.GetDefaultAudioEndpoint(enumDataFlow, role, ref pDefaultDevice);

                        if (result != 0)

                        {

                            throw new Win32Exception("Can't obtain IMMDevice: " + result);

                        }



                        oDefaultDevice = Marshal.GetObjectForIUnknown(pDefaultDevice);

                        iDefaultDevice = oDefaultDevice as IMMDevice;



                        if (iDefaultDevice != null)

                        {

                            iDefaultDevice.GetId(ref pID);

                        }



                        id = Marshal.PtrToStringAuto(pID);

                        //return id;



                    }

                    catch (Exception)

                    {

                        id = "error";

                    }



                   //finally

                   // {

                   //     id = "none";

                   // }

                    

                    return id;

                }



                [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]

                internal class MMDeviceEnumerator

                {

                }



                /// <summary>

                /// Call this method to release all com objetcs

                /// </summary>

                [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)]

                public virtual void Dispose()

                {

                    if (iDevice != null)

                    {

                        Marshal.ReleaseComObject(iDevice);

                        iDevice = null;

                    }

                    if (oDevice != null)

                    {

                        Marshal.ReleaseComObject(oDevice);

                        oDevice = null;

                    }

                    if (iDeviceEnumerator != null)

                    {

                        Marshal.ReleaseComObject(iDeviceEnumerator);

                        iDeviceEnumerator = null;

                    }

                    if (oEnumerator != null)

                    {

                        Marshal.ReleaseComObject(oEnumerator);

                        oEnumerator = null;

                    }

                }



                #region Public properties





                /// <summary>

                /// Get the default device state.

                /// </summary>

                int state;

                public int State

                {

                    get

                    {

                        return state;

                    }

                }



                [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]

                public string EndpointId

                {

                    get

                    {

                        IntPtr id = IntPtr.Zero;

                        if (iDevice != null)

                        {

                            iDevice.GetId(ref id);

                        }



                        return Marshal.PtrToStringAuto(id);

                    }

                }

                #endregion



                #region Public Method



                public string GetDefaultSpeakerEndpoint()

                {

                    return GetDefaultAudioDeviceId("speakers", ERole.EConsole);

                }



                public EndpointList[] GetOutputDevicesByType(EDataFlow DataType)

                {

                    List<EndpointList> list = new List<EndpointList>();

                    IntPtr pDevices = IntPtr.Zero;

                    IntPtr pDevice = IntPtr.Zero;

                    IntPtr ID = IntPtr.Zero;



                    string deviceName = "";

                    string adapterName = "";

                    string id = "";

                    int state = 0;

                    int result = 0;

                    bool bIsDefault = false;

                    string DatatypeString = "Render";





                    if (DataType == EDataFlow.ECapture)

                    {

                        DatatypeString = "Capture";

                    }





                    result = InitializedInstance();

                    if (result != 0 || iDeviceEnumerator == null)

                    {

                        throw new Win32Exception("Can't obtain IMMDeviceEnumerator: " + result);

                    }

                    //2. Get audio device with certain type

                    if (iDeviceEnumerator == null)

                        return null;



                    result = iDeviceEnumerator.EnumAudioEndpoints(DataType, (int)DeviceState.All, ref pDevices);



                    if (result != 0)

                    {

                        return null;

                    }

                    if (pDevices == IntPtr.Zero)

                        return null;



                    oDevices = Marshal.GetObjectForIUnknown(pDevices);

                    iDeviceCollection = oDevices as IMMDevices;



                    uint deviceCount = 0;

                    result = iDeviceCollection.GetCount(ref deviceCount);



                    if (result != 0)

                    {

                        return null;

                    }





                    PROPVARIANT deviceProperty = new PROPVARIANT();

                    for (uint i = 0; i < deviceCount; i++)

                    {

                        // reset the isDefault bool value 

                        //bIsDefault = false;



                        result = iDeviceCollection.Item(i, ref pDevice);

                        if (result != 0 || pDevice == null)

                        {

                            return null;

                        }

                        oDevice = Marshal.GetObjectForIUnknown(pDevice);

                        iDevice = oDevice as IMMDevice;



                        result = iDevice.GetState(ref state);



                        if (result != 0)

                        {

                            continue;

                        }



                        if ((state & (int)DeviceState.NotPresent) != 0) { continue; }



                        IntPtr pProperty = IntPtr.Zero;



                        result = iDevice.OpenPropertyStore(STGM_READ, ref pProperty);

                        if (result != 0)

                        {

                            continue;

                        }



                        oProperty = Marshal.GetObjectForIUnknown(pProperty);

                        iProperty = oProperty as IPropertyStore;



                        result = iProperty.GetValue(ref PKEY_AudioEndpoint_FormFactor, ref deviceProperty);

                        if (result != 0)

                        {

                            continue;

                        }



                        result = iProperty.GetValue(ref PKEY_Device_DeviceDesc, ref deviceProperty);

                        if (result != 0)

                        {

                            continue;

                        }



                        deviceName = deviceProperty.DeviceName;



                        result = iProperty.GetValue(ref PKEY_DeviceInterface_FriendlyName, ref deviceProperty);

                        if (result != 0)

                        {

                            continue;

                        }



                        adapterName = deviceProperty.DeviceName;



                        // Get the endpointID

                        iDevice.GetId(ref ID);

                        if (ID == IntPtr.Zero)

                        {

                            continue;

                        }



                        id = Marshal.PtrToStringAuto(ID);



                        // Jack Info

                        int jackInfo = -1;

                        try

                        {

                            jackInfo = GetJackInfo(iDevice);

                        }

                        catch

                        {

                            jackInfo = jackErrorInfo;

                        }



                        // Get default Id

                        string defaultID = GetDefaultAudioDeviceId(DatatypeString, ERole.EConsole);



                        // Match the defaultID with the current ID

                        //if (defaultID != "none")

                        //{

                        //    if (defaultID == id)

                        //    {

                        //        bIsDefault = true;

                        //    }

                        //    else { bIsDefault = false; }

                        //}

                        //else { bIsDefault = false; }



                        if ((defaultID != "error") && (defaultID == id))

                        {

                            bIsDefault = true;

                        }else { bIsDefault = false; }







                        list.Add(new EndpointList(deviceName, id, adapterName, jackInfo, bIsDefault,state));

                    }

                    return list.ToArray();



                }

                #endregion

            }



            [StructLayout(LayoutKind.Sequential)]

            public class WAVEFORMATEX

            {

                public UInt16 wFormatTag;

                public UInt16 nChannels;

                public UInt32 nSamplesPerSec;

                public UInt32 nAvgBytesPerSec;

                public UInt16 nBlockAlign;

                public UInt16 wBitsPerSample;

                public UInt16 cbSize;

            }



            [ComImport, Guid("870AF99C-171D-4f9e-AF0D-E63DF40C2BC9")]

            public class IPolicyConfigClass { }



            public static class LoadDLL

            {



                [DllImport("AudioDiagnosticUtil.dll", EntryPoint = "AudioGetDeviceFormat", CharSet = CharSet.Auto)]

                public static extern int AudioGetDeviceFormat(string pszDeviceName, bool bDefault, ref IntPtr ppFormat);



                [DllImport("AudioDiagnosticUtil.dll", EntryPoint = "AudioSetDeviceFormat", CharSet = CharSet.Auto)]

                public static extern int AudioSetDeviceFormat(string pszDeviceName, IntPtr pEndpointFormat, IntPtr MixFormat);

            }



            [Guid("6be54be8-a068-4875-a49d-0c2966473b11"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

            public interface IPolicyConfig

            {

                int GetMixFormat(string pszDeviceName, ref IntPtr ppFormat);



                int GetDeviceFormat(string pszDeviceName, bool bDefault, ref IntPtr ppFormat);



                int ResetDeviceFormat(string pszDeviceName);



                int SetDeviceFormat(string pszDeviceName, IntPtr pEndpointFormat, IntPtr MixFormat);



                int GetProcessingPeriod(string pszDeviceName, bool bDefault, IntPtr pmftDefaultPeriod, IntPtr pmftMinimumPeriod);



                int SetProcessingPeriod(string pszDeviceName, IntPtr pmftPeriod);



                int GetShareMode(string pszDeviceName, IntPtr pMode);



                int SetShareMode(string pszDeviceName, IntPtr mode);



                int GetPropertyValue(string pszDeviceName, bool bFxStore, IntPtr key, IntPtr pv);



                int SetPropertyValue(string pszDeviceName, bool bFxStore, IntPtr key, IntPtr pv);



                int SetDefaultEndpoint(string pszDeviceName, ERole role);



                int SetEndpointVisibility(string pszDeviceName, bool bVisible);



                int SetScreenReaderState(bool bEnabled);



                int SetEndpointAbilityToBeDefault(string pszDeviceName, bool bEnable);



                int SetApplicationDefaultEndpoint(Int32 processId, ERole role, string pszInterfaceId);



                int ClearApplicationDefaultEndpoint(Int32 processId, ERole role, EDataFlow flow);



                int RegisterProxyAudioProcess();



                int SetDuckingGainForId(string pszStr1, float floatVal);



                int SetLayoutGainForId(Int32 something1, float floatVal);

            }



            public class IPolicyConfigHelper

            {



                public Byte[] GetDeviceFormat(string pszDeviceName, bool bDefault, out WAVEFORMATEX retFormat)

                {

                    IntPtr ptrToWaveFormat = new IntPtr();



                    LoadDLL.AudioGetDeviceFormat(pszDeviceName, bDefault, ref ptrToWaveFormat);

                    WAVEFORMATEX format = (WAVEFORMATEX)Marshal.PtrToStructure(ptrToWaveFormat, typeof(WAVEFORMATEX));

                    int formatSize = format.cbSize + Marshal.SizeOf(typeof(WAVEFORMATEX));

                    Byte[] formatExtData = new Byte[format.cbSize + Marshal.SizeOf(typeof(WAVEFORMATEX))];

                    Marshal.Copy(ptrToWaveFormat, formatExtData, 0, formatSize);

                    retFormat = format;

                    return formatExtData;

                }

                public int SetDeviceFormat(string pszDeviceName, Byte[] formatExtData, int formatSize)

                {

                    IntPtr ptrToFormat = Marshal.AllocHGlobal(formatSize);

                    Marshal.Copy(formatExtData, 0, ptrToFormat, formatSize);



                    int rval = LoadDLL.AudioSetDeviceFormat(pszDeviceName, ptrToFormat, IntPtr.Zero);

                    Marshal.FreeHGlobal(ptrToFormat);

                    return rval;

                }





            }



            public static bool verifySamplingRate(string deviceID)

            {

                EndpointCtrl control = new EndpointCtrl();

                bool result = false;

                string defSpeakerEndpoint = deviceID;

                IPolicyConfigHelper policyHelper = new IPolicyConfigHelper();

                WAVEFORMATEX defaultFormatEx = new WAVEFORMATEX();

                WAVEFORMATEX currentFormatEx = new WAVEFORMATEX();

                Byte[] defaultFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, true, out defaultFormatEx);

                Byte[] currentFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, false, out currentFormatEx);

                if (defaultFormatEx.nAvgBytesPerSec != currentFormatEx.nAvgBytesPerSec)

                {

                    result = true;

                }

                return result;

            }

            public static bool resetSamplingRate(string deviceID)

            {

                EndpointCtrl control = new EndpointCtrl();

                string defSpeakerEndpoint = deviceID;

                IPolicyConfigHelper policyHelper = new IPolicyConfigHelper();

                WAVEFORMATEX defaultFormatEx = new WAVEFORMATEX();

                WAVEFORMATEX currentFormatEx = new WAVEFORMATEX();

                Byte[] defaultFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, true, out defaultFormatEx);

                Byte[] currentFormat = policyHelper.GetDeviceFormat(defSpeakerEndpoint, false, out currentFormatEx);



                policyHelper.SetDeviceFormat(defSpeakerEndpoint, defaultFormat, defaultFormat.Length);

                WAVEFORMATEX currentFormatEx2 = new WAVEFORMATEX();

                Byte[] currentFormat2 = policyHelper.GetDeviceFormat(defSpeakerEndpoint, false, out currentFormatEx2);

                control.Dispose();

                return true;

            }



            public static EndpointList[] GetAudioEndPointsbyType(string type)

            {



                EDataFlow dataflowtype = new EDataFlow();



                if (type == "Render")

                {

                    dataflowtype = EDataFlow.ERender;

                }

                else { dataflowtype = EDataFlow.ECapture; }



                EndpointCtrl control = new EndpointCtrl();

                EndpointList[] list = control.GetOutputDevicesByType(dataflowtype);









                return list;



            }

        }

   

}

	

"@

    Add-Type -TypeDefinition $AudioEndpointsSource

    $AudioEndpoints =  [Microsoft.Windows.Diagnosis.AudioResetDeviceFormats]



    return $AudioEndpoints

}





# Check whether TS_Main is running or Detecting Additional Problems on Windows 8.1 and above

Function Test-PostBack

{

    [CmdletBinding()]

    PARAM

    (

        [Alias('S')]

        [Parameter(Position = 1, Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]

        [string] $CurrentScriptName

    )

    PROCESS 

    {

        # Writing the trace to current directory

        $CurrentScriptName = ("{0}.temp" -f [System.IO.Path]::GetFileNameWithoutExtension($CurrentScriptName))



        if(Test-Path($CurrentScriptName))

        {

            return $true

        }



        'Executed' >> $CurrentScriptName

        return $false

    }

}












Youez - 2016 - github.com/yon3zu
LinuXploit