From f1674c21a34812806b5a0d873b143b5e54eb88cd Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Wed, 11 Feb 2026 04:22:13 -0700 Subject: [PATCH] Initial commit: Genpix SkyWalker-1 DVB-S driver source and DiSEqC docs Includes original BDA driver source (headers, C++ implementation, INF installer files), DiSEqC implementation PDF with extracted markdown and SVG vector graphics. --- .gitignore | 2 + docs/diseqc/DiSEqC for the Skywalker-1.pdf | Bin 0 -> 214265 bytes docs/diseqc/diseqc-skywalker-1.md | 79 + .../DiSEqC for the Skywalker-1_page_1.svg | 323 ++ .../DiSEqC for the Skywalker-1_page_2.svg | 186 ++ .../DiSEqC for the Skywalker-1.pdf | Bin 0 -> 214265 bytes .../Include/SkyWalker1AntennaPin.h | 102 + .../Include/SkyWalker1CaptureFilter.h | 72 + .../Include/SkyWalker1CapturePin.h | 161 + .../Include/SkyWalker1CommonDef.h | 149 + .../Include/SkyWalker1Control.h | 127 + .../Include/SkyWalker1Device.h | 187 ++ .../Include/SkyWalker1Extended.h | 109 + .../Include/SkyWalker1Main.h | 69 + .../Include/SkyWalker1PnP.h | 56 + .../Include/SkyWalker1TransportPin.h | 84 + .../Include/SkyWalker1TunerFilter.h | 140 + .../Include/SkyWalker1TunerPin.h | 82 + .../Include/SkyWalker1USB.h | 126 + .../Include/SkyWalker1Utility.h | 91 + .../SkyWalker1_Final_Release/Source/MakeFile | 2 + .../Source/SkyWalker1AntennaPin.cpp | 546 ++++ .../Source/SkyWalker1CaptureFilter.cpp | 165 ++ .../SkyWalker1CaptureFilterDefinitions.cpp | 336 +++ .../Source/SkyWalker1CapturePin.cpp | 693 +++++ .../Source/SkyWalker1Control.cpp | 704 +++++ .../Source/SkyWalker1Device.cpp | 1142 +++++++ .../Source/SkyWalker1Installer.inf | 142 + .../Source/SkyWalker1Main.cpp | 137 + .../Source/SkyWalker1PnP.cpp | 336 +++ .../Source/SkyWalker1TransportPin.cpp | 414 +++ .../Source/SkyWalker1TunerFilter.cpp | 1402 +++++++++ .../SkyWalker1TunerFilterDefinitions.cpp | 717 +++++ .../Source/SkyWalker1TunerPin.cpp | 212 ++ .../Source/SkyWalker1USB.cpp | 2101 +++++++++++++ .../Source/SkyWalker1Utility.cpp | 2620 +++++++++++++++++ .../Source/SkyWalker2Installer.inf | 142 + .../SkyWalker1_Final_Release/Source/Sources | 62 + .../Skywalker-1 BDA Driver 08172009.zip | Bin 0 -> 48970 bytes .../SkyWalker1Installer.inf | 142 + .../SkyWalker1TVTuner.sys | Bin 0 -> 105728 bytes .../SkyWalker2Installer.inf | 142 + .../bdasup.sys | Bin 0 -> 12288 bytes firmware-driver/Source.zip | Bin 0 -> 305561 bytes 44 files changed, 14302 insertions(+) create mode 100644 .gitignore create mode 100644 docs/diseqc/DiSEqC for the Skywalker-1.pdf create mode 100644 docs/diseqc/diseqc-skywalker-1.md create mode 100644 docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_1.svg create mode 100644 docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_2.svg create mode 100644 firmware-driver/SkyWalker1_Final_Release/DiSEqC for the Skywalker-1.pdf create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1AntennaPin.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CaptureFilter.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CapturePin.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CommonDef.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Control.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Device.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Extended.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Main.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1PnP.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TransportPin.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerFilter.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerPin.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1USB.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Utility.h create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/MakeFile create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1AntennaPin.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilter.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilterDefinitions.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CapturePin.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Control.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Device.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Installer.inf create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Main.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1PnP.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TransportPin.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilter.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilterDefinitions.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerPin.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1USB.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Utility.cpp create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker2Installer.inf create mode 100644 firmware-driver/SkyWalker1_Final_Release/Source/Sources create mode 100644 firmware-driver/Skywalker-1 BDA Driver 08172009.zip create mode 100644 firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1Installer.inf create mode 100644 firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1TVTuner.sys create mode 100644 firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker2Installer.inf create mode 100644 firmware-driver/Skywalker-1 BDA Driver 08172009/bdasup.sys create mode 100644 firmware-driver/Source.zip diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bac1a7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Empty extraction directories +docs/diseqc/images/ diff --git a/docs/diseqc/DiSEqC for the Skywalker-1.pdf b/docs/diseqc/DiSEqC for the Skywalker-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..575bcc081b92fc7b6852fb19e806a7420d68dd38 GIT binary patch literal 214265 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

*oO>UH;^j7^bHIGZ8$-%5h$$%74!jN| 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

mCh+AMeG$%s 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 Jne$(U|1WP~bzuMi literal 0 HcmV?d00001 diff --git a/docs/diseqc/diseqc-skywalker-1.md b/docs/diseqc/diseqc-skywalker-1.md new file mode 100644 index 0000000..9bb74c1 --- /dev/null +++ b/docs/diseqc/diseqc-skywalker-1.md @@ -0,0 +1,79 @@ +# DiSEqC for the GenPix Skywalker-1 BDA Driver (Extended) + +**Implementation Guidelines for Applications** + +*Author: Devendra | Created: 2009-07-09 | Source: Microsoft Office Word 2007* + +--- + +## I. GUID for the SkyWalker1 Extended property + +```c +//Used to extend the feature of the BDA +//{0B5221EB-F4C4-4976-B959-EF74427464D9} +#define STATIC_KSPROPSETID_BdaExtendedProperty \ + 0x0B5221EB, 0xF4C4, 0x4976, 0xB9, 0x59, 0xEF, 0x74, 0x42, 0x74, 0x64, 0xD9 + +DEFINE_GUIDSTRUCT("0B5221EB-F4C4-4976-B959-EF74427464D9", KSPROPSETID_BdaExtendedProperty); +#define KSPROPSETID_BdaExtendedProperty DEFINE_GUIDNAMED(KSPROPSETID_BdaExtendedProperty) +``` + +## II. Extended Property List (Only DiSEqC support is extended) + +```c +//Extended Property List +typedef enum __KSPROPERTY_EXTENDED +{ + /* DiSEqC Command */ + //Used to send the Digital Satellite Equipment Control (DiSEqC) + //Commands by application + KSPROPERTY_BDA_DISEQC = 0, //Extension Property 1 +} KSPROPERTY_EXTENDED; +``` + +## III. Enumeration for the Simple Tone Burst + +```c +typedef enum enSimpleToneBurst +{ + SEC_MINI_A, + SEC_MINI_B +} SIMPLE_TONE_BURST; +``` + +## IV. DiSEqC Command Structure + +```c +typedef struct __DISEQC_COMMAND +{ + UCHAR ucMessage[MAX_DISEQC_COMMAND_LENGTH]; + /* Byte - 0 : Framing, + Byte - 1 : Address, + Byte - 2 : Command, + Byte - 3 : Data[0], + Byte - 4 : Data[1], + Byte - 5 : Data[2] */ + + UCHAR ucMessageLength; + /* The Valid values for DiSEqC Command are 3...6 + If this value is 1 then Byte 0 is taken as Simple "Tone Burst" + Control Command */ +} DISEQC_COMMAND, *PDISEQC_COMMAND; +``` + +## V. Operation + +### i. To send the Simple Burst command + +1. Create the `DISEQC_COMMAND` Structure +2. Set `ucMessage[0]` to either `SEC_MINI_A` or `SEC_MINI_B` +3. Set `ucMessageLength` as `1` + +### ii. To send DiSEqC commands + +1. Create the `DISEQC_COMMAND` Structure +2. Set the Framing value to `ucMessage[0]` (e.g. `0xE0`) +3. Set the Device Address to `ucMessage[1]` (e.g. `0x01`) +4. Send the Command for the Device to `ucMessage[2]` +5. If required, set the Data bytes `ucMessage[3]`, `ucMessage[4]`, `ucMessage[5]` +6. Set `ucMessageLength` accordingly. Valid values are 3 to 6. diff --git a/docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_1.svg b/docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_1.svg new file mode 100644 index 0000000..142a674 --- /dev/null +++ b/docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_1.svg @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + +DiSEqC for SkyWalker +- +1 + + + + + + + + + + + + + + + + + + +1 + + + + + + +DiSEqC +for the GenPix Skywalker +- +1 BDA Driver + +(Extended) + + +Implementation Guidelines + +for Applications + + +I. + +GUID for the SkyWalker1 +Extended + +property + + +//Used to extend the feature of the BDA + +//{0B5221EB +- +F4C4 +- +4976 +- +B959 +- +EF74427464D9} + +#define + +STATIC_KSPROPSETID_BdaExtendedProperty +\ + + +0x0B5221EB, 0xF4C4, 0x4976, 0xB9, 0x59, 0xEF, 0x74, 0x42, 0x74, 0x64, 0xD9 + +DEFINE_GUIDSTRUCT( +"0B5221EB +- +F4C4 +- +4976 +- +B959 +- +EF74427464D9" +, KSPROPSETID_BdaExtendedProperty); + +#define + +KSPROPSETID_BdaExtendedProperty DEFINE_GUIDNAMED(KSPROPSETID_BdaExtendedProperty) + + +II. + +Extended Prope +rty List + +(Only DiSEqC +support is extended +) + + +//Extended Property List + +typedef + +enum + +__KSPROPERTY_EXTENDED + +{ + +/* DiSEqC Co +mmand */ + +//Used to send the Digital Sattelite Equipment Control (DiSEqC) + +//Commands by application + +KSPROPERTY_BDA_DISEQC = 0, +//Extension Property 1 + +}KSPROPERTY_EXTENDED; + +III. + +Enumeration for the Simple Tone Burst + + +typedef + +enum + +enSimpleToneBurst + +{ + +SEC_MINI_A, + +SEC_MINI_B + +}SIMPLE_TONE_BURST; + +IV. + +DiSEqC Command Structure + + +typedef + +struct + +__DISEQC_COMMAND + +{ + + +UCHAR ucMessage[MAX_DISEQC_COMMAND_LENGTH]; + +/* +Byte +- + +0 : Framing, + + + + + + + + +Byte +- + +1 : Address, + + + + + + + + +Byte +- + +2 : Command, + + + + + + + + +Byte +- + +3 : Data[0], + + + + + + + + +Byte +- + +4 : Data[1], + + + + + + + + +Byte +- + +5 : Data[2] + + + + + + + + +*/ + + +UCHAR ucMessageLength; +/* The Valid values for DiSEqC Command are 3...6 + +If this value is 1 then the Byte 0 is taken as Simple "Tone Burst" +Control + +Command */ + + +}DISEQC_COMMAND,*PDISEQC_COMMAND; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_2.svg b/docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_2.svg new file mode 100644 index 0000000..62544f2 --- /dev/null +++ b/docs/diseqc/vectors/DiSEqC for the Skywalker-1_page_2.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + +DiSEqC for SkyWalker +- +1 + + + + + + + + + + + + + + + + + + +2 + + + + + +V. + +Operation: + + +I. + +To send +the +Simple burst comman +d + +a. + +Create the DISEQC_COMMAND Structure + +b. + +Set the ucMessage[0] to either SEC_MINI_A or SEC_MINI_B + +c. + +Set the ucMessageLength as 1 + + +II. + +To send +the DiSEqC +comman +d +s + +a. + +Create the DISEQC_COMMAND Structure + +b. + +Set the +Framing value to +ucMessage[0] +e.g. E0 + +c. + +Set the +Device +Address +to ucMessage[1] e.g. 01 + +d. + +Send the Command for the Device +to ucMessage[2] + +e. + +I +f +require set the Data bytes ucMessage[3], + +ucMessage[ +4 +] +, + +ucMessage[ +5 +] + +f. + +Set the ucMessageLength accordingly.Valid ucMessageLength values are 3 to 6. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware-driver/SkyWalker1_Final_Release/DiSEqC for the Skywalker-1.pdf b/firmware-driver/SkyWalker1_Final_Release/DiSEqC for the Skywalker-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..575bcc081b92fc7b6852fb19e806a7420d68dd38 GIT binary patch literal 214265 zcmcG#1z26X)-Ft;xD|I;#ihu?-QC?C7Vhp^ph$t@ZpB)pxVsi8?pEB375BU7KGJ>n zIp;g~`M-b7C(L9f85zktGcw1UK%poqP7h>YLq?#e1^NZ}7`c@_r% zvOVAQ0KZp%&iPAqu%1q!=jzYp8I?iK_O4DQAZM@|;`Vkf&o?08mn=qcW&p>pLgFj{ zu0JBI0N``~l^Mm^0Ki`j^Yb$*I@z13fLwGK!9&HU3i5Dal(Genh43FYkw0!y&#E!X zflMupgzY_az(SY+>_Bh}T+Dg^aF6U6t=`&c{+{`**nTiUpQoEXJzj9fsX zAQO925Th)}&fLWUz{&(LKGOoQNxl@heg2+c3)=y|6N9MhWxRlg)QO zBq(#vY+RW!Gvp z-(bW+5OXm~=0?h*Bg-O9C#7O;l8r&)NbbCu3{vFG41SNGs23Y*26$*`c77nduq=!U zw6Gay1giX$RdjGh!HLQQ1Us6^I|xbJh87f$)R2Qx*ESJhJ_|7s(xS9LQ@?pPQcZ}$ z+7O0D!}2*$K}HmJ%;}Yeg)?M;N)Rh_`Lsu6Re`BTLl6~cc$%;GRAgqjA zme0wDP^M^Bx+(w|gGSvRr>f_v7atS5~3DrlapsP7c_ z0kN6A4`-9;E7mS74-6c-6>12BT#n$QVI*1ZJ@vQO8d}lj^ywrp(z?+vCkvZjW*6*K z!s=)7IW-Z+RFbk*pvk_2#ASemwSx2;d;3BhkjNfH6ZpBZv?~t+Ugo6KWylIwum(?1 z;g!N`8cg8nhime?BHUCeiGHX!4l96s@jLos&Q}j_NiA$aDASYIKT-CGVYZU4gbdCp z&D-8aBrsu~NT>VE`lgB0LT}Ax2o|XM_hn-Rq8}vQgd`U^thoe*tq39}n8vhsUNyA$ zdvO>91c}K23yqAZ)A3CTa3^DhRO6Gn=7erubgm6kwW|Zg2z`{xk?6Of%Oj9xqG1lj zP^XX_MLBz#f=(5_tZKNrj>o*~T&S1XT2QS@wBpvL#*SDQZmm>A3OQ3tshSQML`;S} z%MPKzBn=Ry_IH@hK`Ef4qL+-ZKkgvncxZ)W>h!LE-~;)|p31&=D5mnTgApitSpn7H zDJXk+HJEiuK6A_wPeY1{cWlBG(2M)Jnw5n=9!Z&1LvG;!?;E+HC#s<*gx9fRZl&)} zN1KtE?{7@3zoDQc!oIOk;+ZiMw8_vqF~RKNA&{lkJ^=B>Tk<0tPBq zFowbEQ-5~O@NpYHr1>D97bw!^AHJ%?--9msv#JiTRml}Fv&T(G>3LNC3wL+v{ zH7t%Dkl?DDt@MKnVw5U?rB)xkW=<4YPXMz#XA>h9FFXUdi`PoKZ%vFUIHfg%Rfq65 zw|15WP=Ph=Pmjb13tr-%?OoYgyR^t>ryKlIG)&!WQBYxFff8w` zWek_TkSI&;Hz2%p@#2JO<84K4`^bp(x|I#ho#_uUW3&Wr651E{_7*I0C zLr3wPS?)?=Gc5Zn<)04*Y9eM#m%f=&k1`^BNN6$*K`H3O|I9}~6cruA@Z{@udvv%r z@8H7Qz}te4DkrF}QFMm4o!@WqLG-W&wyF$>g9Ajdcr6-iqGFlu-cuUa_7b6AbTvDL zCCA$6jVbT(){4*DcEAlsl)!!8ZpU#qxAQ{2`Q7Eak7!dRl|72MvTwEop9UO70JDH^zVp(C4=s8~ zS+-vz`4ypbI7HboVDJxv557hs-PRqlt{vH^sz~UYjvd(*NmZiA>3O2n^(&j>6{@?%`LfM-4L3|vrgu%Tpk> zbkuB^ucXc`M**-F9eN7|dHK3y;|*)<*Ilod!|VK7N&vHNR12XkhvuONj6&+$q{pJ7T%rxrzTtL;KNjC!|AOeJ;YufW*W z_f?5~9EuPYV%}KHy=jzVli0MtK6EHZ%_=xK`+j)n;U$)JEFr{L5s0X%oH4M_gdk9p zr(23swup7*S8dF6!}_V8W79@=c6vC!{Oid<_vTSu+6+^lC13V(Y-ASExtIXVn-_AJ zD#*1oWEKag*koT9B^+2;zPC_4`I2um^DO=7(Fq%;5G9y}nNUWurdw(;iZdINFYQ^@ zUN#Ndb#QRt;^ZfI^bmcN`iXOT$fFX+LGFHN)R^Ig+O1DHJvT{6$c>nhR&YX&dJ-+! z%X9y^8_K_C^Mj_*VVxyps?;`xs?}U(aHT3^#%+(ZZL>1H;&p;Dy&2qUlW0(hPaecWBLJ!7M=k;j)~VxY;p@1+CLHQ~x4bWkK@JnD2Pui{vZo>1F3zIs^t#nmb@iv;@Nn^Ty5GM3xhm%Jf&-6cQvuIMBDWK9 z+)~;_M<2W72Yk{=^s+dEoM)@m0Eu}&RneEQ*|QmtZ&speZx9ewm+BMBcz+UM~l4Rr;^CTL=up7ayN1{H$Vz%Q8ie6AACp|bXbsUU&Z z!Nd3!?D5y`{`mbzzxz+z0$kUiUjO7TVfOm(+n!#@XlJD9-6;B9ojbxHry}4@5cKT6 zw-2bby4^UbjNX2MvT8jMe>Cij5{p4Qyw;+qX)8gP72h78e0F+hdP}oV1*cw@KKni) z4~jWqZU&(@I(t<*!Xqr292FgWhv4LtbgwE$j{XpXj4W^f6 z=)+Dqwj7a=1o3 z)ta@Cz@OnE?CVy;Eq1!DKQx%N`VhaW=~9ey{|W_TUVnGyhsK~XmmQTgfd9Hti+>1ZOwI@O+aa#Fyb@~J7K{MRM{Kiq{HQrRkwvS1= zL=QIyR=1xX39Wna*hU-Kkak<9FEXO|H8zV*hc_ecx!XL8j|MJm+FB5;?aQKfu-3Ga zdWpR-y1e*tg(46a?Sec3O5@v6CO+HVPWEyXC&BB!sh@mb5l)InQyrY*aB{R!xd~+P zb`yCT*KKCoLOKxhy6)SJ^>M!S^a8G0;JIL2xn+~v`+l3bgI4sR)omH` zHS@>M6-|RJC%4djcOIyRjpx>-BtW{;;#k1p%3K~ojYtW?4|wO7Rl^MnbNT98?})Y6 zyFFe9#v~KlT=JFYPMUVz>dO z5Zjpdv$_Nx%Sff?K#(^?nN)Oq3caUK;7UfX0QakF0k{cHB@J9{2D2x5!AOg!!ZHf$ zt3mg-LtR#m%Q>Ir8iR+GU&+hHL8D+3z?f4#O05r<(sK^ympPp$DY(%c&>&9F9Dywb`f-mX!Te^*s z2J|B}F1udq?lzZHP=*XskDaKOG`K2B@Dl@y;D* zP-q#aKYk{=V+h2OX+w0u+UvWa)`Qt=isYC~aXNWQ?>-FrMVtKHasNAm^2}uX-R=Ly z);yCOj4H0iF3;4BDwuKk^;F)-76c|f7=?|TLBC1}35$q|iP4D|*;pDoSu%>*fms4e zJ99=2OFJPuXUl)2p9_nEoK2i89bD|40PMf$3vo*)XBQC*BPRe0GnfkcTO7y?1Xnk8 zv2X?enSSvczw;B%HUFaMKPCSnXMSnF>V-hWXzC^G4X-#`M2Nhx0$610KPDfb$E*-<5r?_!njWXK?<|?tcj(Am?ugae&o* z9^Stp#PP2Y0{#ghE|$L|#KQG25c);+{od(k%I`0o{&xtm{0oF^!86C`{|zDFAKd7F zF@b(z`MbKms{Tda{|M4=3jSx1xc)San3;c{MjV`s|C~nbz~4av{x=}8{|*uh2NxJ5 zX7G$*VPOGqaB%)#)94os`=?(2g^vDZzW$AYWBm;!Fg7;-kKp`48UJf=ew#mkfcPgZ z|3YN{*>3(Cfz|M?vxBq#!@Q9N89iHh01M0C zj2tV+@92PQgV6zZkC};y3BbV&M(0nx{0raypRi#24U4}mHee>+668e2%p?zT|F4Z2 z*xddiy?N7Pb&{I5I_$W4`62j2O!IzCk%Ll0X#T=>hoW|2%h&;{+BjI z*a5)5?U?-kv^@g+;{)S=XMY6vr*ZlH1LWUtkTA1xa6DK0`*)T{#;}&H{SrI+qg}^S zAc=b<3w>LBSe~G9kyym-Le~4sV564=?c{BJZu>Ucn=30UB2sim5kJd=p-{>a3piN_ z`A5GwkQ23e=zjnHh9P-<(H_;{O>*SW)vU(){mGBDjo!8S`zcVJ)qh77} zQt1t@7esLmYTJ#RT5pk^6yANU0vs(ZscGadqO zth3r*nF|~pw+6Xy8to*gIMAYGa%U4wnX+Zjim9nhNmrYxmkyvyN|$}atg)%V>f}uI z5tn*Jy&mRDus%KTfwT10`A?%ppN8~x3tOT1>ufm@7 z<7FR_12LjGAt!dcZaZ$WGRSYplyeGmW8!DXCSnmSWjT3K^7-W9J|&f`NG7;QE_~SM zr0i9l07zo`jCfjMM(zlvulOlvAM61R=%q%Zov;g*aeZjaGmt7@jp<3Cim7Bnq9?{j zutIG1jvSoXmDO)s#6;=sQBH}NbF@#lAseP_-q3!iK{BMHrurxe^AasjGmw5GRAsJA zMN|R62ziWk&1EAP|CAG5Z%(5^x&k49AMi>?Ugeu%KH+v$V!+F;uWb;=P;oj02!~_1 zV2^HMWBT#&We}5ybPp|h@u)UMZl6@uI$>V-nsx zdBw?NxL{=je3M1Lz4EGu7yVg2tfxuP&*u6Rv~s5juO{JKx9d#;=E0fgIuOOvCHMpV!e`SBgRk^ z>;X}wfJ1x;Txf@P!eru#(vhYM!k;j~3;@CxwoqxhVQacA}r8C+(|{ z)c3?DaQWKSlqJ4#3ab0rNAaP37ip)ec6dUDpXd~o53qq5&1p*Bt>H~8W2i5+at(xh zOe_y)RY%Rurv~}Q#C#yvr-r_793%K2z<9Hae2hvkOFCW@Z}^N^Y=OmHv|DID?y};W zLDDl1dv6S7Z+V{TwXaaoh?$J)vTAM}XC85GFO z-r-=^yvf}OvcbS`-Qb!BJ4Nk$6{>~i816yF3rX8A)UlKarBJB7M0Rb2Jjo4G<|K|8 zS2biz1)bEs9*U(m_p#jYGL4HAzLkP(k2x;;1zfPBliaRy(%8zn9zn&A++AsOHbHkVe=5;h(PfW%1EB&{~77r{jGC>7L7&ii8vIAZ|)=C6bX*|?pqaur5*!B ztEf-rx3UoCc|UJd4tK0LQ{sw~?PU2IBTu`NH_ZAFcS2p52tR#U9I_VF04c2DsbEXo=BkkwBLY|JKV=q$e*X|+9AarV{j#1v`uwfNqWQ73zlM|dFjnK$ z%QH2dSBqXAJ?{yKxHSR{mUuVq?4>?QXG$=n(YI2ExiPb{3U?P8pCa)1o&~$65cw)? zKq*?N%w=qgD4eYM%zg)wG{QH2kB%`6yKVkCZk@OHsSUE?Jle7X<~E;@nPb}Y9G=3W zn^B%}U$|IM+4?8kQQ9}X*^4)4r|cG{*h6A|C?1h($)Ns(RS_pOE3Nme;ufqpPsLdg z7C%K^h}JS&_ZAofn)G)UL*}d94?{<+w|z!-1G#jt#30gzYw(kIo7HGVOLS1x7wGGW zd0XF=+P3;TP>(c3(3hYIZdH}jS{1C=t*D2&q86Pwu0I5Ki$q2ebhe4{FNkKRB0Lab zI2GIqcp5h6SJhh`kbG)UCUvWty7u|dt|X=J(_o9*)tQzqrQUO^peK=j*a<(fQCS|L z;&J-bn|aB2EzF?5p=j2Up?$R zYF|A;bi1@3smL7_U3y>KaQ>4!kQYUiq}06^9?AzbFDiM)V^0Q2qBC3U-R)~%PG7yr zkhTJQ2)YN}!#zF5QA|o&lvDF>Glhj;OvP^#2i&kjLXWEj_f$F#b7dk}y&iZGr&Flv zPO0M#MB+mxR3^hK4jf!$@8IIfFh$rX)f~&z$T+pj&_uOge?LE}^E5EAVu0a_B2HAM zhWaWdvSp1W>h~r>_k436qO%YPBEJZ2Qe24U!YOlU!k2BGW>0%{oWA>EEYw*{_QI^G zSbGID+^AkwZ6k*xNRV_unkFz`kc5AG!q?#+o9~+YiS?T{w|@ySP;S1adTY+lt<++x zVtqGptVuU>NF1K3+`neCw*L~8d^f1**>`7$X(BH-x6O4)d(? zZp$G{)P3%De=hROg7#>oI9~f{hw{`uLALL`Y5JEe+^?_Vzxd|=j!R(w%`GhP7tQx7&8PD_~Q7R1WS86 zQSgB)YEf>m`^?3}!Ndh*2ePxVf=|fF*_-~mEb!qnQ&$tv|A*Fp_i~v3;{7QYTdBC% zGRgxuSr~sY8(>EgOv(J)6JlJPY=8ED4wHxMmL!qHu3r2^y${A7Fy;&Bh%9B6e1+@g z7W@WAimU_=Rvs4j$=5D?`hDe_PmL*{0Jr4nCfA6T(lByq3@OTC@{ovF)%8!Ytn2yt z7>=LvWxK*L>s83qiXB2wHwI6nh;nR6=@Yoil?Q_isM+p$J_seHlrkNu^ugtr-xr8B z3Yw|n#>w^qgs8FNq}2eHs%0PKRCOqq?BIIdYL~B)F43Tou6~L!;qxhG2C|q!(?f*T zG~fqzlSaXft(%$EAm_qWlI|g8nTc3@^$!|pLLCcCMsQi3e@WyKn#1Cuo{Hd+ipK7N zC)6o5Qmgc$s3SJW4>}mYS{|<$(nji@KZ0eZzDwXD=-6#|Ema7A(|rKXp99C-xnkUk z4kI!~dK9q&?buC^_Ht5@2Bi7+^S%w1wok1-H)eUR0c3ulea5HU>`p>lx|y+dBlaA{ z;zu(V#PKESHLV7DB<2Y7T$&_6ro;S;$v@qUwPMmN6ABN$PBBy9WYFIk_sg*(_s-VyA?2w4%CKx zPQc^RzxYUDSo1P!hR(Y$qXi~oCSVeOj*Zo@1}17IU>u)G8%o@|V;3`JoMzP-;W~q~ z*|}o}^Mvd0?gxg&X7q-QxsK-a>R0#SuzFO3>_=yAdRMoZ2Vgc_fk8RlVqEb-({0o{ z^JscfVjk=sOwvJirDRb=v`M!a9Dg%!GgR?albQ!~&-zAOlPN)|GcPAls;<`T*3N)! z%t9eWWjV$oi}8kS-kWfG(IvO40*Vi_8olV2i(hf9gJ*HZ(HmPiwS5D14eVu17ez14 zS16o)d+Adi_B@>fb(OOvvL$fE2;@=S#l?51A>)^dcHk(h?8_K0FU%_nc5Q|qPKO4v z#kMj`fc%e_lO0r6C7t}_zTC=_Ot-f=LW#-8%6_NjoD@ElS%{HcU1Xpi{u{^No zIXV9?u3nm7SM%M`?8@CXWem;hk3=PI30sqsR~u`O=htULdy^Zd9#)5Y-n_ml=4uF~YnKJoT z*YiFI3llqlneCZ=Vq@a?x8YyaW&?A;Y^HxcxSywDHI^0`&xVXSKFT1egI>~L|;nS<|u+d&@gtEU|h(M%`AkY>{K_czM zqE|0-{Ul>sOFJ{OpuSYAMt+m!yuy_NV0iLdxjL9Vo=xYy@*MF_^8SAH=1Nu)AS7zH zB+FV>YSwk#il;LndH;Yan$`5v5mc*?w5csct}m95qQh^eytnL&+9poQE{f@D>Z9ce zy_JHUb1z~+;e227iOmG{&RS~I1^w`G<2r4%K|#O5HP&N~G7ocQDy=JzB2xPUm0#G; z_ro&j>bz~2Ie4}j=zCbh*6KHx`o60&dCCbu9h_3lhVw{9%6@c;wHu%%V!C>Hj?2%D z8y>}#N{4|)MEphjJ1V6uqdc8#9oF_wTQQAC=rsa}H{Cd$hASq)&c<{TzBu%HwU>bg zQ8%%Ybd*kgnQZN@^T&^;mn@>$GidXKGD#d91vZR_fLnq=9TY}e?Pk)ep&xj~F^{qK zT9XquT=df%WP^++4f+5dc4vM*NLCs!ZS^#i9(X3+hR$q|S4zGJFW ze(#iMeO&5HTyz==ZT^kuBPOqgNV#1Ew#MsO^b27YY-v9h zs%*C^GA50uStU0Ca_1C%%UYch&*-e$yEG|7wd2UNh-GAX7;yqpj_u*RQ z@<1=*Nh9kuqYBSO_(=Zb)Aa4Fd5Z7Tq&{$}Hca{XypAh@b379XXtd zIQ!cA%kloz2u9Rbn zG={uZ5plEesJY$R^zFwi_l&B%zOi>I+j{5S8=u>StNngdPl52I7tcMX96q<~ZcV+q zfB|rlfC#+#j&X+{fumz1g+Gc3s26`CfYRNBR&d8Z(%kh=#b}>x3|@T32sTgfyThxZ zpB(?r{=kIH)A%^hCT_EsfZbjo^H}7|ecH07wFEn(~}BCbAuLt-g& zTk!DNz1a&}E&Fq{r-FTRU09V@?F|DcRsE_i^XELZiF|(PF73DDl_v*JEtrR;Tam4) z0{bHVl~ng3_nplB2{)D0OLOf!IbehGLH_AFaKA)P;-R*E0)713v1ESoJFc1@Rw&R4 zo1)#62+=9D$E)`k$FT-8;|#Bl!!J2}KR)@lF@2HZy*fVX_5bpu|J3^EeOjRy93nO2QwDH-r6>7DpnngE$9E6Ye_TrbDZBFmXcI7O`L-XY7qH#q>cl zjf8=y-0chPOaFX-Pk|=?VEJi*j3L@y0mo1{r9?Nz_tW}CHnvpTUv*f|!ft=It7t6B z_pUqRm&z55FTBJL;M$y^EtV`P6nc_w^zSZ^h#e6qLqnE?C$mL2=@8o_!=PAw!yOx{ z0?j`p*Q-^ZG$QC?HmR#EYrU(xAapgs&%Nt>t$sao%}&JP>K=a|F7x7^Ad)*?u_)9` zbf4Aeyg{B***x+1-o$k3^~3ADBlp*vF`3NgHmzTdfL`nc&05~VU&i`dSdKI0j%}E| z7{}UkSJwi595!J1z3*dDXe%VhR(0{sBc9T^;J)5^Yff{*23tE+k*zvTXoZ&c4hQ7} zC9_yo3MGDzO{M4?oRVJrN}+pE8|>uBk{)E^c24r>ly8O9Dm4Sf5kM_D_799O5vO^Y zs!Evr@k0k2@%{**HP|<)sp2dCj&kQ$2~hp~v5#$js!xJXicgYHnopYvhv(-i`XPOK zp0cW_9rjBa6Q3myY&)PkxLr1MP6G~kNR3_Y21rg0R{Zw_%2No3NmLk^+CWDc^VMeT zQ?t<4)`c1h>D-{7`JclvX!|u1k`to|2&nO#Z+Df7-oGIR`e?3oyny!Pn)iM1ZJ}W( zBKvMv-KUxN@f)QchN|Mx7mM={Cw!4YLVwT}MCv6+=h#&D81Bzb)$wN8ud^1IXBP~3 zf&hN= zT@R{YC*BC>jcX8p)~qgWZK*^$be$_Lc$~PIc>z6TR4cTQBkcKzMMP>J#q>5w!%sU* z9J|@aMsk$F-U?o>q@0fN%oH?Dz)s7yfFPC_n)klWClZuxS^eeXs^Z;NCQ90D3d!QS zy=9sj&P2N6Cp|`c`*zmNZ>Se%$sxC8cPa?FStPV4$%$bOXZ#&D#<(Tc z_GJV0KF5+WMCd^Pq#T;T5DyGio{tJyhUS}YMLita^Dl6X_ZtlmNc>zdk=FZBv>&Wq zYgoR+PbaGt4%q@#8MOVp>|;L4u^BSZbB_&mA=$&-Kl?!twA`S7NtU1*Av8c^|HWGC z)lYUWZ6*Pn>wR9WTtU7rjpHxr28d4!|;a+%= zN>;jx<{P@Sdrp4U8V*;t`eEy1xR(nW2^FjV-rVTJ`o%OZ@F9Tg3U91R3X*E zKQA~!AyiyN9h^iCedd8&uSyGT3P#D$U;yJ~Elg)isIfARfLRmIJjlrK9 zOD`wUWt?zDi1ex!uaUCbFh89K8jn4)3f}5yYHnMR9hn_t5i(RxA2&Zi3=UYg=wuK{ zn00Xxxj=BRwVp?gMA0TDdELMIG16Z)Y%I@MME&XB@pZa?MoqG$H~iwqd_H^(5pwvK z5=T;p@BMzLq$s*>qVZz6&gXxrZf>q)IM5m$zkMTHt0gF+M@>oM-OlArI`}@>;;pAo zaap6(WpI#dm7UAw+ifpdooPUXEL?9+NQxvPwUW`)he@==G$1>!;730K^xV2zMc+0b zi{*7M6K)=1)ja{^?h)HG=gnY*gGG#cvA%^K9$`&^RamAjtR zBwEAo`9&8+huKp0TavZ;Y*J(B#}imq0;Vwr$oG=6Y^!xdfKcOrwt_n31eu8pB0YoA zOb+E_afH?R=vZXF!9BD=NoY}6EeunG6JMGp+DLxN^iN0mdylnqTBb$slkz?gRhcVT zbZw7b*j8Les(~Vx$ZS5aqg1nLdl5%A9L(2dF1z214(~f6Q=bea2WO;ga=i(J>EG|PLKDUxU_MZ>ETI90-X zrQawU=b|Gfq5vc3zP_-m;R<~T!@Y=Jw>Nf)PpDeO_8)%v<#h1 zT2>=ZJKR!QR?Rp9Jw7odUo;UNBQYgMv;ci0u~;!rH=LP5IuW<1N0S0lI)NG}9zL0f zTh>EOA+KVbkKQXCrD)uM-kpH^x#tx{L;`MU4}bz85x2Mpf&wAot43Zs`a{B36;h3G zLW-)y-IBKk;r!C3G;1ndC8CAsc+&ZFYf7YY;i?qM36kohQt4^zl8RlQ-im~K zP^>3Z(4m#Qm4h!q2TE%uyi+HYhOb7aq;R2NrFe^uiI%4m&Oi}OcUp_ypKvW5&X{;z zg#M(sj!40;vCcxlueOds!LPnfM!~PT4n+}7d)kKXud!|~eXkaNm2e%2eoT96PVt!E z!y|pK6keamnb)Hu-SVl2K>A)Nd^XWTE_{XVl!roJZM|N)C9h{lx+T9SQuqc~UI>%&mp2P-~ zaGrz)z3|0^2DNY^>7~4$VQCwUbxI05)pZz(IvU4T^jR9mGW1#MO11Ek#OqXa0kw5n zigML;1d2Lp$42z@L<@~|Drw!qo&sqb<#lw5sY;1rlNiN*;@oIHVIuFh+?Q~!KhXB) z$o_{63pL?P|F_&vaITMN`}bs1H{kzwh*8`j$sG~+-^}=@Mm1zpmJ-F2(TYVxx$->1 znQm{n58+%F(DrM{q_3m`Rh&7Uqj1c(9SR9tUKcUInP~ zau+&xgGO@7?n^+lJnWhb~h8+xVPrWHjl|`1lkad+cXBsv{V4h~4W|A}i zY?ju?nrMkIX<8^Ht0s%lodur*FPmsIDmvy-7*SD#ph|ox3z-N^WPZQVQmM<>q1tuP z$CNq3nkEx%%>BM3#+23!zmqk?5|@KL!4j@sxra5y@)d{rSJv1AWJ6lRLG%65sTi6V zn&k8mqrq+VJLa3zTZc(4S^n}J(4gs{p|tr=rh<^k!T{w|KYZs+fBnvO;LmXlOIIkxfyG)PrSZxe3_h;VGFVU07W4#Cja% zeTQA5_UK0L;#8hYZ(%2KWV6Fmtc0>dRICKEo%S&bV^aCoTTr?zBWaY`rVAX%hMj%I?%_F^4M|CJ!!4Gd6jWXG+DB?$s*W} zOf?G8+I7xMU|{U^VUI(W(c!~RYL>}HwQReYSLmLG?xtm7(cCrpBx7opA@{d)M1~vA zB4QKno^$FQzOHj70up1d*u58p!LpgUKOu^a%oj#oNG97Hl;Nof<+TjsI?TP-Ci<)%$RmWY#Ex=t)b3#ooxE_jm#vgut%lw%Y| zSG;4rvN$2jh=MrGdavAIg=~#D*i9V$=J*I}K3GC&7>r(wm}uj;)d!4h?OUgg7-@Ic zq*-E3O4~IhmShjtkp8fPq2K9CavUg-l}Q;f=8m@n&g%5k#Cq2Sl#H5Nt;G$?o~5Lv z;HPdg4;vMkJCB+HhfRwJ8uq;W6p1GBmX`7Ea{%?qL#o}ZnV-0SAOsYK=>3FO>1N<+ zEqbem6G$1R2PGKaAc-~EQ-Qbx2@F(8l--!uM02x!nHZ**95mQfekN34q(NYz%b5$w znnVMBQCTT70p9e$h3VJ*HDA%Q4>mp^JV50*`Ic3NlazBez{bv6&x zjeDb>IIr5RG8j@h6xjw`p`09c*cLm}d4wIlIi?@u5V41~3u;5NT@I+L%Pl)FYDQ_m zZh)CX&_%vSy6}s*EU%J3)wj&tZ|!OtYwq6ux}fRo-E^d|GJI zYIa|(KD$+?m>pA9T^{+R38mC+=v=)KJ2%siI4i(N@CES?eL~fbb(evLq

*oO>UH;^j7^bHIGZ8$-%5h$$%74!jN| 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

mCh+AMeG$%s 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 Jne$(U|1WP~bzuMi literal 0 HcmV?d00001 diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1AntennaPin.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1AntennaPin.h new file mode 100644 index 0000000..fa36639 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1AntennaPin.h @@ -0,0 +1,102 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1AntennaPin.h + Author : + Date : + Purpose : This File Holds the Antenna Pin related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_ANTENNA_PIN_H +#define __SKYWALKER1_ANTENNA_PIN_H + +/* Include the Library and Other header file */ +#include "SkyWalker1TunerPin.h" +#include "SkyWalker1Extended.h" //For the Extended BDA +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +//Antenna Pin class. +class CAntennaPin : public CTunerPin +{ +public: + + static NTSTATUS PinSetDeviceState( + IN PKSPIN Pin, + IN KSSTATE ToState, + IN KSSTATE FromState + ); + + static NTSTATUS IntersectDataFormat( + IN PVOID pContext, + IN PIRP pIoRequestPacket, + IN PKSP_PIN Pin, + IN PKSDATARANGE DataRange, + IN PKSDATARANGE MatchingDataRange, + IN ULONG DataBufferSize, + OUT PVOID Data OPTIONAL, + OUT PULONG DataSize + ); + + //Network provider and AVStream use these functions + //to set and get properties of nodes that are controlled + //by the input pin. + + static NTSTATUS GetTunerProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + + static NTSTATUS SetTunerProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + + + + //Network provider and AVStream use these functions + //to set and get properties of nodes that are controlled + //by the input pin. + static NTSTATUS GetTunerLnbProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + + static NTSTATUS SetTunerLnbProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + +private: + + KSSTATE m_KsState; +}; + + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_TRANSPORT_PIN_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CaptureFilter.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CaptureFilter.h new file mode 100644 index 0000000..bbe9723 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CaptureFilter.h @@ -0,0 +1,72 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CaptureFilter.h + Author : + Date : + Purpose : This file contains the filter level header for + the capture filter. + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef SKYWALKER1_CAPTURE_FILTER_H +#define SKYWALKER1_CAPTURE_FILTER_H + +/* Include the Library and Other header file */ +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +//The Capture filter class. +class CCaptureFilter +{ +public: + + //The capture filter object constructor. Since the new operator will + //have zeroed the memory, do not bother initializing any NULL or 0 + //fields. Only initialize non-NULL, non-0 fields. + CCaptureFilter (IN PKSFILTER Filter); + + //The capture filter destructor. + ~CCaptureFilter (); + + //This is the filter creation dispatch for the capture filter. It + //creates the CCaptureFilter object, associates it with the AVStream + //object, and bags it for easy cleanup later. + static NTSTATUS Create( IN OUT PKSFILTER pKSFilter, + IN PIRP pIoRequestPacket); + + +private: + + //The AVStream filter object associated with this CCaptureFilter. + PKSFILTER m_Filter; + + //This is the bag cleanup callback for the CCaptureFilter. Not providing + //one would cause ExFreePool to be used. This is not good for C++ + //constructed objects. We simply delete the object here. + static void Cleanup ( IN CCaptureFilter *CapFilter ); + +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*SKYWALKER1_CAPTURE_FILTER_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CapturePin.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CapturePin.h new file mode 100644 index 0000000..28d06f5 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CapturePin.h @@ -0,0 +1,161 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CapturePin.h + Author : + Date : + Purpose : This file contains header for the video capture pin on the capture + filter. + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +/* Include the Library and Other header file */ +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +//This Structure can be used in future for the +//better stream management +typedef struct _STREAM_POINTER_CONTEXT +{ + ULONG ulFrameIndex; + +} STREAM_POINTER_CONTEXT, *PSTREAM_POINTER_CONTEXT; + + +//The video capture pin class. +class CCapturePin : public ICaptureSink +{ + +private: + + //The AVStream pin we're associated with. + PKSPIN m_Pin; + + //Pointer to the internal device object for our capture device. + //We access the Device through this object. + CSkyWalker1Device *m_Device; + + //The state we've put the hardware into. This allows us to keep track + //of whether to do things like unpausing or restarting. + HARDWARE_STATE m_HardwareState; + + //The clock we've been assigned. As with other capture filters, we do + //not expose a clock. If one has been assigned, we will use it to + //time stamp packets (plus a reasonable delta to work the capture stream + //in a preview graph). + PIKSREFERENCECLOCK m_Clock; + + //The transport information for this capture pin. The settings for device will be + //programmed for this transport info. + PBDA_TRANSPORT_INFO m_TransportInfo; + + //This Variable is used to keep the count of the Streams sent for the + //Data read + ULONG m_CurrentFrameIndex; + + //An indication of whether or not this pin has acquired the necessary + //hardware resources to operate. When the pin reaches KSSTATE_ACQUIRE, + //we attempt to acquire the hardware. This flag will be set based on + //our success / failure. + BOOLEAN m_AcquiredResources; + + //Clean up any references we hold on frames in the queue. This is called + //when we abruptly stop the fake hardware. + NTSTATUS CleanupReferences (); + + //This is the state transition handler for the capture pin. It attempts + //to acquire resources for the capture pin (or releasing them if + //necessary) and starts and stops the hardware as required. + NTSTATUS SetState ( IN KSSTATE ToState,IN KSSTATE FromState); + + //This is the processing dispatch for the capture pin. It handles + //sending the Streams to the Device. + NTSTATUS Process(); + + //This routine is not required as the Transport Information is already + //provided into the CCapturePin but still using it to make the + //settings flexible + PBDA_TRANSPORT_INFO CaptureBdaTransportInfo (); + + //This is the free callback from the bagged item (CCapturePin). If we + //do not provide a callback when we bag the CCapturePin, ExFreePool + //would be called. This is not desirable for C++ constructed objects. + //We merely delete the object here. + static void Cleanup (IN CCapturePin *Pin) + { + delete Pin; + } + +public: + + + //The capture pin's constructor. Initialize any non-0, non-NULL fields + //(since new will have zero'ed the memory anyway) and set up our + //device level pointers for access during capture routines. + CCapturePin (IN PKSPIN Pin); + + //The capture pin's destructor. + ~CCapturePin (); + + CSkyWalker1Device* GetDevice() + { + return m_Device; + } + + //This is the capture sink notification mechanism for mapping completion. + //When the device DPC detects that a given number of mappings have been + //completed by the fake hardware, it signals the capture sink of this + //through this method. + virtual void ReleaseStream(IN ULONG ulStreamIndex); + + //This is the creation dispatch for the capture pin. It creates + //the CCapturePin object and associates it with the AVStream object + //bagging it in the process. + static NTSTATUS PinCreate( IN OUT PKSPIN pKSPin, + IN PIRP pIoRequestPacket + ); + + //This is the set device state dispatch for the pin. The routine bridges + //to SetState() in the context of the CCapturePin. + static NTSTATUS DispatchSetState ( + IN PKSPIN Pin, + IN KSSTATE ToState, + IN KSSTATE FromState + ) + { + return + (reinterpret_cast(Pin->Context))-> + SetState(ToState, FromState); + } + + //This is the processing dispatch for the capture pin. The routine + //bridges to Process() in the context of the CCapturePin. + static NTSTATUS DispatchProcess (IN PKSPIN Pin) + { + return + (reinterpret_cast(Pin->Context))->Process(); + } +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + + diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CommonDef.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CommonDef.h new file mode 100644 index 0000000..bf9ec7d --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1CommonDef.h @@ -0,0 +1,149 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CommonDef.h + Author : + Date : + Purpose : File to hold the common definitions for the Driver + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +#ifndef __SKYWALKER1_COMMON_DEF_H +#define __SKYWALKER1_COMMON_DEF_H + +/* Include the Library and Other header file */ +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +#define TUNER_MEM_TAG 'MNUT' +#define CAPTURE_MEM_TAG 'MPAC' + +// Implementation GUID for SkyWalker1 Tuner and Capture +// Must match the KSSTRING used in the installation INFs interface sections +//Tuner Filter GUID {5C4E764F-AB43-46A9-B21E-8529C70F0A23} +#define GUID_SKYWALKER_TUNER_FILTER\ + 0x5C4E764F, 0xAB43, 0x46A9, 0xB2, 0x1E, 0x85, 0x29, 0xC7, 0x0F, 0x0A, 0x23 +DEFINE_GUIDSTRUCT("5C4E764F-AB43-46A9-B21E-8529C70F0A23", SKYWALKER_TUNER_FILTER); +#define SKYWALKER_TUNER_FILTER DEFINE_GUIDNAMED(SKYWALKER_TUNER_FILTER) + +//Capture Filter GUID {0F8F74D9-E524-4D05-BB60-F0C69ACB1756} +#define GUID_SKYWALKER_CAPTURE_FILTER\ + 0x0F8F74D9, 0xE524, 0x4D05, 0xBB, 0x60, 0xF0, 0xC6, 0x9A, 0xCB, 0x17, 0x56 +DEFINE_GUIDSTRUCT("0F8F74D9-E524-4D05-BB60-F0C69ACB1756", SKYWALKER_CAPTURE_FILTER); +// Defines the SKYWALKER_CAPTURE_FILTER as a GUID. +#define SKYWALKER_CAPTURE_FILTER DEFINE_GUIDNAMED(SKYWALKER_CAPTURE_FILTER) + +//Medium GUID {2AEB4A94-FBB7-4FB1-8D74-243B91886EAB} +#define GUID_SKYWALKER_TUNER_OUT_MEDIUM\ + 0x2AEB4A94, 0xFBB7, 0x4FB1, 0x8D, 0x74, 0x24, 0x3B, 0x91, 0x88, 0x6E, 0xAB +DEFINE_GUIDSTRUCT("2AEB4A94-FBB7-4FB1-8D74-243B91886EAB", SKYWALKER_TUNER_OUT_MEDIUM); +// Defines the SKYWALKER_TUNER_OUT_MEDIUM as a GUID. +#define SKYWALKER_TUNER_OUT_MEDIUM DEFINE_GUIDNAMED(SKYWALKER_TUNER_OUT_MEDIUM) + +#define TRANSPORT_PACKET_SIZE 128 //188 +#define TRANSPORT_PACKET_COUNT 64 //512 +#define NUMBER_OF_FRAMES 8 +#define PACKET_PER_FRAME 2 + +#define SYMBOL_RATE_MIN 1000 +#define SYMBOL_RATE_MAX 45000 + +#define TUNER_FREQ_MIN 800000 +#define TUNER_FREQ_MAX 2250000 + +#define IS_VALID(X) (((X)!=NULL)?true:false) + +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ + +// Structure for the Tuner Parameters + +typedef struct _BDATUNER_DEVICE_PARAMETER +{ + //Tuner Properties + ULONG ulCarrierFrequency; + ULONG ulFrequencyMultiplier; + ULONG ulBandWidth; + Polarisation Polarity; + ULONG ulRange; + ULONG ulTransponder; + + //LNB Parameters + ULONG ulLnbLowLOFrequency; + ULONG ulLnbHighLOFrequency; + ULONG ulLnbSwitchFrequency; + + //Demodulator Properties + ULONG ulInnerFecType; + BinaryConvolutionCodeRate InnerFecRate; + ULONG ulOuterFecType; + BinaryConvolutionCodeRate OuterFecRate; + ModulationType CurrentModulationType; + TransmissionMode CurrentTransmissionMode; + GuardInterval CurrentGuardInterval; + SpectralInversion CurrentSpectralInversion; + ULONG ulSymbolRate; + +} BDATUNER_DEVICE_PARAMETER, * PBDATUNER_DEVICE_PARAMETER; + + +// Define a structure that represents the underlying device status. +// +typedef struct _BDATUNER_DEVICE_STATUS +{ + //Tuner Status + DWORD dwSignalStrength; + DWORD dwSignalQuality; + BOOLEAN fCarrierPresent; + + //Demodulator Status + BOOLEAN fSignalLocked; +} BDATUNER_DEVICE_STATUS, * PBDATUNER_DEVICE_STATUS; + +// ICaptureSink: +// +// This is a capture sink interface. The device level calls back the +// CompleteMappings method passing the number of completed mappings for +// the capture pin. This method is called during the device DPC. + +class ICaptureSink +{ +public: + + virtual void ReleaseStream (IN ULONG ulStreamIndex) = 0; +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +extern const BDA_FILTER_TEMPLATE TunerFilterTemplate; +extern const BDA_FILTER_TEMPLATE SkyWalker1CaptureTemplate; +extern const KSFILTER_DESCRIPTOR SkyWalker1TunerFilterDescriptor; +extern const KSFILTER_DESCRIPTOR SkyWalker1CaptureFilterDescriptor; + +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +typedef enum _HARDWARE_STATE { + + HardwareStopped = 0, + HardwarePaused, + HardwareRunning + +} HARDWARE_STATE, *PHARDWARE_STATE; + +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif // __SKYWALKER1_COMMON_DEF_H + + + diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Control.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Control.h new file mode 100644 index 0000000..d1f9093 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Control.h @@ -0,0 +1,127 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Control.cpp + Author : + Date : + Purpose : This File Holds the Device Control related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_CONTROL_H +#define __SKYWALKER1_CONTROL_H + +/* Include the Library and Other header file */ +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ + +/* gp8psk commands */ + +/* Twinhan Vendor requests */ +#define TH_COMMAND_IN 0xC0 +#define TH_COMMAND_OUT 0xC1 + +/* gp8psk commands */ + +#define GET_8PSK_CONFIG 0x80 /* in */ +#define SET_8PSK_CONFIG 0x81 +#define I2C_WRITE 0x83 +#define I2C_READ 0x84 +#define ARM_TRANSFER 0x85 +#define TUNE_8PSK 0x86 +#define GET_SIGNAL_STRENGTH 0x87 /* in */ +#define LOAD_BCM4500 0x88 +#define BOOT_8PSK 0x89 /* in */ +#define START_INTERSIL 0x8A /* in */ +#define SET_LNB_VOLTAGE 0x8B +#define SET_22KHZ_TONE 0x8C +#define SEND_DISEQC_COMMAND 0x8D +#define SET_DVB_MODE 0x8E +#define SET_DN_SWITCH 0x8F +#define GET_SIGNAL_LOCK 0x90 /* in */ +#define GET_SERIAL_NUMBER 0x93 /* in */ +#define USE_EXTRA_VOLT 0x94 +#define CW3K_INIT 0x9d + +/* PSK_configuration bits */ +#define bm8pskStarted 0x01 +#define bm8pskFW_Loaded 0x02 +#define bmIntersilOn 0x04 +#define bmDVBmode 0x08 +#define bm22kHz 0x10 +#define bmSEL18V 0x20 +#define bmDCtuned 0x40 +#define bmArmed 0x80 + +/* Satellite modulation modes */ +#define ADV_MOD_DVB_QPSK 0 /* DVB-S QPSK */ +#define ADV_MOD_TURBO_QPSK 1 /* Turbo QPSK */ +#define ADV_MOD_TURBO_8PSK 2 /* Turbo 8PSK (also used for Trellis 8PSK) */ +#define ADV_MOD_TURBO_16QAM 3 /* Turbo 16QAM (also used for Trellis 8PSK) */ + +#define ADV_MOD_DCII_C_QPSK 4 /* Digicipher II Combo */ +#define ADV_MOD_DCII_I_QPSK 5 /* Digicipher II I-stream */ +#define ADV_MOD_DCII_Q_QPSK 6 /* Digicipher II Q-stream */ +#define ADV_MOD_DCII_C_OQPSK 7 /* Digicipher II offset QPSK */ +#define ADV_MOD_DSS_QPSK 8 /* DSS (DIRECTV) QPSK */ +#define ADV_MOD_DVB_BPSK 9 /* DVB-S BPSK */ + +#define GET_USB_SPEED 0x07 +#define USB_SPEED_LOW 0 +#define USB_SPEED_FULL 1 +#define USB_SPEED_HIGH 2 + +#define RESET_FX2 0x13 + +#define FW_VERSION_READ 0x0B +#define VENDOR_STRING_READ 0x0C +#define PRODUCT_STRING_READ 0x0D +#define FW_BCD_VERSION_READ 0x14 + +#define SEC_VOLTAGE_13 0 +#define SEC_VOLTAGE_18 1 + +#define SEC_TONE_ON 0 +#define SEC_TONE_OFF 1 + +#define SWITCH_ON_TUNER 1 +#define SWITCH_OFF_TUNER 0 +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +NTSTATUS GetSignalStatus( IN PKSDEVICE pKSDeviceObject, + OUT PBOOLEAN pbSignalLockStatus + ); +NTSTATUS ReadTunerSignalStrength( IN PKSDEVICE pKSDeviceObject, + OUT PULONG pulSigStrength + ); +NTSTATUS SetLnbVoltage(IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucVoltage); +NTSTATUS TuneDevice(IN PKSDEVICE pKSDeviceObject, + IN PBDATUNER_DEVICE_PARAMETER pDeviceParameter); +NTSTATUS SetupTunerPower( IN PKSDEVICE pKSDeviceObject, + IN BOOLEAN bOnOff); +NTSTATUS SetStreamingControl( IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucOnOff); +NTSTATUS SetTunerTone( IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucTone); +NTSTATUS ConfigureTuner(IN PKSDEVICE pKSDeviceObject, + IN PBDATUNER_DEVICE_PARAMETER pNewConfiguration); +NTSTATUS DiseqcCommand( IN PKSDEVICE pKSDeviceObject, + IN PDISEQC_COMMAND pCommand); +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_CONTROL_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Device.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Device.h new file mode 100644 index 0000000..e53f9f7 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Device.h @@ -0,0 +1,187 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Device.h + Author : + Date : + Purpose : Main Skywalker Device level Implementation + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + 01 Initial Version + +*****************************************************************************/ + +#ifndef SKYWALKER1_TUNER_DEVICE_H +#define SKYWALKER1_TUNER_DEVICE_H + +/* Include the Library and Other header file */ +#include "SkyWalker1USB.h" +#include "SkyWalker1Extended.h" +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ + +//The SkyWalker1 Device class. +class CSkyWalker1Device +{ +public: + + //Device Initialization and Dispatch Related definitions + NTSTATUS Create(IN PKSDEVICE pKSDeviceObject); + NTSTATUS Start( + IN PKSDEVICE pKSDeviceObject, + IN PIRP pIrp, + IN PCM_RESOURCE_LIST pResourceList OPTIONAL, + IN PCM_RESOURCE_LIST pTranslatedResourceList OPTIONAL + ); + + NTSTATUS Stop( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); + + NTSTATUS Close( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); + NTSTATUS SetPower( + IN PKSDEVICE pKSDeviceObject, //Pointer to the device object + //provided by the system. + IN PIRP pIoRequestPacket,//Pointer to the IRP related to this request. + IN DEVICE_POWER_STATE To, //Requested power state. + IN DEVICE_POWER_STATE From //Current power state. + ); + + NTSTATUS InitializeTuner( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); + + // Device access related Function definitions + // An instance of the filter uses these functions + // to manage resources on the device. + + NTSTATUS Acquire(IN PBDATUNER_DEVICE_PARAMETER pNewResource, + OUT PULONG pulAcquiredResourceID); + + NTSTATUS Update( IN PBDATUNER_DEVICE_PARAMETER pNewResource, + IN ULONG ulResourceID); + + NTSTATUS SendDiseqcCommand( + IN PDISEQC_COMMAND pDiseqcCommand, + IN ULONG ulResourceID + ); + + NTSTATUS Release(IN ULONG ulResourceID); + + NTSTATUS GetStatus(PBDATUNER_DEVICE_STATUS pDeviceStatus); + + //DMA Adapter related Functions + NTSTATUS InitializeAdapterStream(IN PKSDEVICE pKSDeviceObject); + + //Stream Capture Related Fuctions + NTSTATUS SetupCaptureSink ( + IN ICaptureSink * pCapturePin, + IN PBDA_TRANSPORT_INFO TransportInfo + ); + void RemoveCaptureSink (); + + NTSTATUS StartStream (); + NTSTATUS PauseStream (IN BOOLEAN Pausing); + NTSTATUS StopStream (); + NTSTATUS ReadStream(IN ULONG ulStreamIndex); + void ProcessStream(IN ULONG ulStreamIndex); + + BOOLEAN TimeToReadSignalStatus(void); + + PKSDEVICE m_pKSDevice; + + //USB Related definitions + USB_DEVICE_DESCRIPTOR USBDeviceDescriptor; + USBD_PIPE_INFORMATION ReadPipe; + USBD_PIPE_INFORMATION WritePipe; + USBSTATE UsbDeviceState; + USBSTATE PreviousUsbDeviceState; + //Pending I/O queue state + QUEUE_STATE QueueState; + + //obtain and hold this lock while changing the device state, + //the queue state and while processing the queue. + KSPIN_LOCK DeviceStateLock; + //Current Usb Irp + PIRP pUsbStreamIrp[PACKET_PER_FRAME * NUMBER_OF_FRAMES]; + //Device Stop Event + KEVENT EvDeviceStopOk; + //Device Remove Event + KEVENT EvDeviceRemoveOk; + //Outstanding IO Count for the Driver + ULONG ulOutStandingIoCount; + //Outstanding IO Count Lock + KSPIN_LOCK kIoCountLock; + + PDMA_ADAPTER m_pDMAAdapter; + + ULONG m_SampleSize; + + //Temporary Bytes Read Counter + ULONG m_NumberOfBytesRead[NUMBER_OF_FRAMES]; + + PUCHAR GetSynthBuffer(ULONG ulStreamIndex) + { + return m_SynthesisBuffer[ulStreamIndex]; + } + +private: + + ULONG m_ulDeviceInstance; + BDATUNER_DEVICE_PARAMETER m_CurResource; + BDATUNER_DEVICE_STATUS m_TunerStatus; + ULONG m_ulCurResourceID; + ULONG m_ulcResourceUsers; + LARGE_INTEGER m_PreviousStatusReadTime; + + //The synthesis buffer. This is a private buffer we use to store the + //references of the Streaming Data.It is used for the Reading data + //from the device and also Copying Data to the Stream Buffer sent + //by the application + PUCHAR m_SynthesisBuffer[NUMBER_OF_FRAMES]; + + //Key information regarding the frames we generate. + LONGLONG m_TimePerFrame; + ULONG m_PacketSize; + ULONG m_PacketsPerSample; + + //The current state of the Device + HARDWARE_STATE m_HardwareState; + + //The pause / stop hardware flag and event. + BOOLEAN m_StopHardware; + KEVENT m_HardwareEvent; + + //Number of pins with resources acquired. This is used as a locking + //mechanism for resource acquisition on the device. + LONG m_PinsWithResources; + + //The capture sink. When we complete stream reading, we + //notify the capture sink. + ICaptureSink *m_CaptureSink; + + //The video info header we're basing hardware settings on. The pin + //provides this to us when acquiring resources and must guarantee its + //stability until resources are released. + PBDA_TRANSPORT_INFO m_TransportInfo; +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*SKYWALKER1_TUNER_DEVICE_H*/ + diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Extended.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Extended.h new file mode 100644 index 0000000..047d686 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Extended.h @@ -0,0 +1,109 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1AntennaPin.h + Author : + Date : + Purpose : This File Holds the Extended BDA Definitions + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_EXTENDED_H +#define __SKYWALKER1_EXTENDED_H + +/* Include the Library and Other header file */ +#if !defined(_KSMEDIA_) +#error KSMEDIA.H must be included before BDAMEDIA.H +#endif // !defined(_KSMEDIA_) + +#if !defined(_BDATYPES_) +#error BDATYPES.H must be included before BDAMEDIA.H +#endif // !defined(_BDATYPES_) + +#if !defined(_BDAMEDIA_) +#define _BDAMEDIA_ +#endif // !defined(_BDAMEDIA_) + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ + +#define MAX_DISEQC_COMMAND_LENGTH 6 + +/* Extended Property*/ + +//Used to extend the feature of the BDA +//{0B5221EB-F4C4-4976-B959-EF74427464D9} +#define STATIC_KSPROPSETID_BdaExtendedProperty \ + 0x0B5221EB, 0xF4C4, 0x4976, 0xB9, 0x59, 0xEF, 0x74, 0x42, 0x74, 0x64, 0xD9 +DEFINE_GUIDSTRUCT("0B5221EB-F4C4-4976-B959-EF74427464D9", KSPROPSETID_BdaExtendedProperty); +#define KSPROPSETID_BdaExtendedProperty DEFINE_GUIDNAMED(KSPROPSETID_BdaExtendedProperty) + +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +//Extended Property List +typedef enum __KSPROPERTY_EXTENDED +{ + /* DiSEqC Command */ + //Used to send the Digital Sattelite Equipment Control (DiSEqC) + //Commands by application + KSPROPERTY_BDA_DISEQC = 0, //Extension Property 1 + + //Add New Extended Commands Here + +}KSPROPERTY_EXTENDED; + +//Enumeration can be used during Simple Tone Burst Command +typedef enum enSimpleToneBurst +{ + SEC_MINI_A, + SEC_MINI_B +}SIMPLE_TONE_BURST; + +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +//DiSEqC Command related Structure definitions +typedef struct __DISEQC_COMMAND +{ + UCHAR ucMessage[MAX_DISEQC_COMMAND_LENGTH]; /* + Byte - 0 : Framing, + Byte - 1 : Address, + Byte - 2 : Command, + Byte - 3 : Data[0], + Byte - 4 : Data[1], + Byte - 5 : Data[2] + */ + UCHAR ucMessageLength;/* The Valid values for DiSEqC Command are 3...6 + If this value is 1 then the Byte 0 is taken as Simple "Tone Burst" Control + Command */ + +}DISEQC_COMMAND,*PDISEQC_COMMAND; + +//Property that will be used to send the Diseqc command by the application +#define DEFINE_KSPROPERTY_ITEM_BDA_DISEQC(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_BDA_DISEQC,\ + (GetHandler),\ + sizeof(KSP_NODE),\ + sizeof(DISEQC_COMMAND),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_EXTENDED_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Main.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Main.h new file mode 100644 index 0000000..a072e07 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Main.h @@ -0,0 +1,69 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Main.h + Author : + Date : + Purpose : Entry point for the Driver + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_MAIN_H +#define __SKYWALKER1_MAIN_H + +/* Include the Library and Other header file */ +#include +#include +#include //Kernel Streaming Driver +#include +#include +#include +#include +#include + +#include +#include +#include "SkyWalker1AntennaPin.h" +#include "SkyWalker1CaptureFilter.h" +#include "SkyWalker1CapturePin.h" +#include "SkyWalker1CommonDef.h" +#include "SkyWalker1Control.h" +#include "SkyWalker1Device.h" +#include "SkyWalker1TransportPin.h" +#include "SkyWalker1TunerFilter.h" +#include "SkyWalker1TunerPin.h" +#include "SkyWalker1Extended.h" + +extern "C" +{ +#include //For the Mutex +#include //For the WCHAR and swprintf +#include //For sprintf() function + +#include "SkyWalker1PnP.h" //Header for the PnP related definitions +#include "SkyWalker1USB.h" +#include "SkyWalker1Utility.h" + +} + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_MAIN_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1PnP.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1PnP.h new file mode 100644 index 0000000..1b54c69 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1PnP.h @@ -0,0 +1,56 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1PnP.h + Author : + Date : + Purpose : PnP IRP Message Handler + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +#ifndef __SKYWALKER1_PNP_H +#define __SKYWALKER1_PNP_H + +/* Include the Library and Other header file */ +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +NTSTATUS SkyWalker1AddDevice(IN PKSDEVICE pKSDeviceObject); +VOID SkyWalker1Remove( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS SkyWalker1Start(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket, + IN PCM_RESOURCE_LIST pResourceList, + IN PCM_RESOURCE_LIST pCIResourceListTranslated); +VOID SkyWalker1Stop(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS SkyWalker1QueryStop( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +VOID SkyWalker1SetPower +( + IN PKSDEVICE pKSDeviceObject, //Pointer to the device object + //provided by the system. + IN PIRP pIoRequestPacket, //Pointer to the IRP related to this request. + IN DEVICE_POWER_STATE To, //Requested power state. + IN DEVICE_POWER_STATE From //Current power state. +); +/* End of Function prototype definitions */ + +#endif // __SKYWALKER1_PNP_H diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TransportPin.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TransportPin.h new file mode 100644 index 0000000..5a4ab97 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TransportPin.h @@ -0,0 +1,84 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1TransportPin.h + Author : + Date : + Purpose : This file contains header for the Transport pin on the Tuner + filter. + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_TRANSPORT_PIN_H +#define __SKYWALKER1_TRANSPORT_PIN_H + +/* Include the Library and Other header file */ +//#include "SkyWalker1CommonDef.h" +#include "SkyWalker1TunerPin.h" +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +//The Trasport Pin class. +class CTransportPin : public CTunerPin +{ +public: + + + //Define a data intersection handler function for the + //pin (KSPIN_DESCRIPTOR_EX structure). + //Network provider and AVStream use this function + //to connect the output pin with a downstream filter. + static NTSTATUS IntersectDataFormat( + IN PVOID pContext, + IN PIRP pIoRequestPacket, + IN PKSP_PIN Pin, + IN PKSDATARANGE DataRange, + IN PKSDATARANGE MatchingDataRange, + IN ULONG DataBufferSize, + OUT PVOID Data OPTIONAL, + OUT PULONG DataSize + ); + + static NTSTATUS GetDigitalDemodProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + + static NTSTATUS SetDigitalDemodProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + + //Function to send the Extended BDA Commands to the Tuner + static NTSTATUS SetExtendedProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); +}; + + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_TRANSPORT_PIN_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerFilter.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerFilter.h new file mode 100644 index 0000000..2993d68 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerFilter.h @@ -0,0 +1,140 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1TunerFilter.h + Author : + Date : + Purpose : Tuner Filter Class Definition + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef SKYWALKER1_TUNER_FILTER_H +#define SKYWALKER1_TUNER_FILTER_H + +/* Include the Library and Other header file */ +#include "SkyWalker1CommonDef.h" +#include "SkyWalker1Device.h" +#include "SkyWalker1Extended.h" +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +//The Tuner Filter class. +class CTunerFilter +{ +public: + + //Functions to Create and Close Filter + static NTSTATUS Create( IN OUT PKSFILTER pKSFilter, + IN PIRP pIoRequestPacket); + + static NTSTATUS FilterClose( IN OUT PKSFILTER pKSFilter, + IN PIRP pIoRequestPacket); + + //KSMETHODSETID_BdaChangeSync pKSFilter change sync methods + static NTSTATUS StartChanges( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored); + + static NTSTATUS CheckChanges( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored); + + static NTSTATUS CommitChanges( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored); + + static NTSTATUS GetChangeState( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OUT PULONG pulChangeState); + + + //KSMETHODSETID_BdaDeviceConfiguration Method to modify filter topology. + static NTSTATUS CreateTopology( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored); + + + //pKSFilter Implementation Methods + (class CSkyWalker1Device *) GetDevice() + { + return m_pDevice; + }; + + NTSTATUS SetDeviceState(KSSTATE NewKsState) + { + m_KsState = NewKsState; + return STATUS_SUCCESS; + }; + + + //Tuner Node Properties + NTSTATUS GetTunerProperty(OUT PBDATUNER_DEVICE_PARAMETER pTunerParameter); + NTSTATUS SetFrequency(IN ULONG ulBdaParameter); + NTSTATUS SetMultiplier(IN ULONG ulBdaParameter); + NTSTATUS SetBandwidth(IN ULONG ulBdaParameter); + NTSTATUS SetPolarity(IN Polarisation NewPolarity); + NTSTATUS SetRange(IN ULONG ulBdaParameter); + NTSTATUS SetTransponder(IN ULONG ulBdaParameter); + NTSTATUS SetLowLOFrequency(IN ULONG ulBdaParameter); + NTSTATUS SetHighLOFrequency(IN ULONG ulBdaParameter); + NTSTATUS SetSwitchFrequency(IN ULONG ulBdaParameter); + + //Demodulator Node Properties + NTSTATUS GetDemodProperty(OUT PBDATUNER_DEVICE_PARAMETER pDemodParameter); + NTSTATUS SetModulatorType(IN ModulationType NewModulatorType); + NTSTATUS SetInnerFecType(IN ULONG ulNewInnerFecType); + NTSTATUS SetInnerFecRate(IN BinaryConvolutionCodeRate NewFecRate); + NTSTATUS SetOuterFecType(IN ULONG ulNewOuterFecType); + NTSTATUS SetOuterFecRate(IN BinaryConvolutionCodeRate NewFecRate); + NTSTATUS SetSymbolRate(IN ULONG ulNewSymbolRate); + NTSTATUS SetSpectralInversion(IN SpectralInversion SpecInv); + NTSTATUS SetGuardInterval(IN GuardInterval GuardInt); + NTSTATUS SetTransmissionMode(IN TransmissionMode TransMode); + + //Extended Property + NTSTATUS SendDiseqcCommand(IN PDISEQC_COMMAND pDiseqcCommand); + + //Function to retrive the Device Status. + NTSTATUS GetStatus(PBDATUNER_DEVICE_STATUS pDeviceStatus); + + //Functions to get and release device access + NTSTATUS AcquireResources(); + NTSTATUS ReleaseResources(); + + +private: + class CSkyWalker1Device * m_pDevice; + + //Filter Resources + KSSTATE m_KsState; + BDA_CHANGE_STATE m_BdaChangeState; + BDATUNER_DEVICE_PARAMETER m_CurResource; + BDATUNER_DEVICE_PARAMETER m_NewResource; + ULONG m_ulResourceID; + BOOLEAN m_fResourceAcquired; + CTunerFilter(); + ~CTunerFilter(); +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*SKYWALKER1_TUNER_FILTER_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerPin.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerPin.h new file mode 100644 index 0000000..b815d67 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1TunerPin.h @@ -0,0 +1,82 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1TunerPin.h + Author : + Date : + Purpose : This File Holds the Generic Tuner Pin related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_TUNER_PIN_H +#define __SKYWALKER1_TUNER_PIN_H + +/* Include the Library and Other header file */ +#include "SkyWalker1CommonDef.h" +#include "SkyWalker1TunerFilter.h" +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ + +// The Tuner Pin class. +class CTunerPin +{ +public: + + + //Creates the Pin + static NTSTATUS PinCreate( IN OUT PKSPIN pKSPin, + IN PIRP pIoRequestPacket + ); + + //Closes the Opened Pin + static NTSTATUS PinClose( IN OUT PKSPIN pKSPin, + IN PIRP pIoRequestPacket + ); + + //Member Function to get the Various Signal attributes + static NTSTATUS GetSignalStatus( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ); + + + (class CTunerFilter *) GetFilter(void) + { + return m_pFilter; + }; + + void SetFilter(class CTunerFilter * pFilter) + { + m_pFilter = pFilter; + }; + +protected: + + class CTunerFilter* m_pFilter; + +}; + + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_TUNER_PIN_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1USB.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1USB.h new file mode 100644 index 0000000..1f41a30 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1USB.h @@ -0,0 +1,126 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Usb.h + Author : + Date : + Purpose : This File Holds all the USB Device access related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +#ifndef __SKYWALKER1_USB_H +#define __SKYWALKER1_USB_H + +/* Include the Library and Other header file */ +extern "C" +{ +//USB Related Headers +#include +#pragma warning(disable:4200) +#include +#include +#include +#include +#include "SkyWalker1Device.h" + +} +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +#define MAX_BULK_PACKET_SIZE 8 * 512 +#define MAX_BULK_TRANSFER_SIZE (TRANSPORT_PACKET_COUNT * TRANSPORT_PACKET_SIZE) //Suppoting max Frame Size +/* End of Macro Definitions */ + +/* Declare Enumerations here */ +typedef enum __USBSTATE { + + NotStarted, // not started + Stopped, // device stopped + Working, // started and working + PendingStop, // stop pending + PendingRemove, // remove pending + SurpriseRemoved, // removed by surprise + Removed // removed + +}USBSTATE; + +typedef enum _QUEUE_STATE { + + HoldRequests, // device is not started yet + AllowRequests, // device is ready to process + FailRequests // fail both existing and queued up requests + +} QUEUE_STATE; + +#define INITIALIZE_PNP_STATE(_Data_) \ + (_Data_)->UsbDeviceState = NotStarted;\ + (_Data_)->PreviousUsbDeviceState = NotStarted; + +#define SET_NEW_PNP_STATE(_Data_, _state_) \ + (_Data_)->PreviousUsbDeviceState = (_Data_)->UsbDeviceState;\ + (_Data_)->UsbDeviceState = (_state_); + +#define RESTORE_PREVIOUS_PNP_STATE(_Data_) \ + (_Data_)->UsbDeviceState = (_Data_)->PreviousUsbDeviceState; + +/* End of Enumeration declaration */ + +/* Global & Static variables Declaration */ +//BulkUsb Read Write Context +typedef struct _BULKUSB_RW_CONTEXT { + + PURB pUSBRequestBlock; + PUCHAR pTransferBuffer; + ULONG ulRemainingByteTransfer; // remaining to xfer + ULONG ulCompletedByteTransfer; // cumulate xfer + ULONG ulStreamIndex; + class CSkyWalker1Device * pDevice; + +} BULKUSB_RW_CONTEXT, * PBULKUSB_RW_CONTEXT; +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Function Prototypes */ +//Usb Access functions +NTSTATUS InitializeUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoReqestPacket); +NTSTATUS DeconfigureUsbDevice(IN PKSDEVICE pKSDeviceObject); +NTSTATUS StopUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS ReadWriteUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN ULONG ulStreamIndex, + IN ULONG ulPacketIndex, + IN PUCHAR pucTransferBuffer, + IN ULONG ulTransferLength, + IN BOOLEAN bRead); +NTSTATUS ControlUsbDevice( IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucRequest, + IN USHORT usValue, + IN USHORT usIndex, + IN PUCHAR pucTransferBuffer, + IN ULONG ulTransferLength, + IN BOOLEAN bRead); +NTSTATUS RemoveUsbDevice( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS SurpriseUsbDeviceRemoval(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS CancelRemoveUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS QueryRemoveUsbDevice( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS QueryStopUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); +NTSTATUS CancelStopUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket); + +/* End of Function prototype definitions */ + +#endif /*__SKYWALKER1_USB_H*/ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Utility.h b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Utility.h new file mode 100644 index 0000000..f018fbc --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Include/SkyWalker1Utility.h @@ -0,0 +1,91 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Utility.h + Author : + Date : + Purpose : This file basically holds the Utility related Common Declarations + used in the SkyWalker Driver Module + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +#ifndef SKYWALKER1_UTILITY_H +#define SKYWALKER1_UTILITY_H + +/* Include the Library and Other header file */ +#include +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +#define SKYWALKER1_DRIVER_NAME "SkyWalker1TVTuner" + +extern int nCurrentDebugLevel; + +#define DEBUG_ON +#ifdef DEBUG_ON + +#define SkyWalkerDebugPrint(DebugLevel,_ARGUMENTS_) \ + if((DebugLevel) <= nCurrentDebugLevel) \ + { \ + DbgPrint _ARGUMENTS_; \ + } + +#else + +#define SkyWalkerDebugPrint(DebugLevel,__ARGUMENTS__) + +#endif + +#define TRUE 1 +#define FALSE 0 + +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ + +/* ENUM : enDebugLevels */ +/* PURPOSE : To Define Different Debug Levels */ +enum enDebugLevels +{ + DISABLE_DEBUG = 0, + ENTRY_LEVEL, + INTERMEDIATE_LEVEL, + EXTREME_LEVEL, +}; +/* End of Enumeration declaration */ + +/* Function Prototypes */ +void PrintFunctionEntry(IN char * pcFunctionName); +void PrintFunctionExit(IN char * pcFunctionName, IN NTSTATUS ntReturnCode); +char * GetCurrentIrqlString(void); +VOID Delay(IN ULONG ulDelayInMicroSeconds); //To Delay the Execution Thread + +NTSTATUS LowerDeviceCompletedIrp(IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIoRequestPacket, + IN PVOID pContext); +NTSTATUS PassDownIRPAndWaitForCompletion(IN PDEVICE_OBJECT pLowerDeviceObject, + IN PIRP pIoRequestPacket, + IN BOOLEAN bCopyStackLocation); +NTSTATUS PassDownIRPAndForget(IN PDEVICE_OBJECT pLowerDeviceObject, + IN PIRP pIoRequestPacket); +VOID CompleteIrpInDispatch(IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIoRequestPacket); +PUCHAR NTStatusToString(NTSTATUS Status) ; +VOID PrintDeviceChangeState(IN KSSTATE ToState,IN KSSTATE FromState); +/* End of Function prototype definitions */ + + + +#endif /*SKYWALKER1_UTILITY_H*/ + diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/MakeFile b/firmware-driver/SkyWalker1_Final_Release/Source/MakeFile new file mode 100644 index 0000000..7a3ac54 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/MakeFile @@ -0,0 +1,2 @@ +USER_INCLUDES=..\Include;..\.. +!INCLUDE $(NTMAKEENV)\makefile.def \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1AntennaPin.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1AntennaPin.cpp new file mode 100644 index 0000000..589edca --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1AntennaPin.cpp @@ -0,0 +1,546 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1AntennaPin.cpp + Author : + Date : + Purpose : This File Holds the Antenna Pin related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +PCHAR GetTunerPropertyString(ULONG ulTunerProperty); +PCHAR GetTunerLnbPropertyString(ULONG ulTunerLnbProperty); +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : CAntennaPin::IntersectDataFormat + Description : Enables connection of the input pin with a upstream filter. + IN PARAM : + OUT PARAM : Status of the IntersectDataFormat + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CAntennaPin::IntersectDataFormat( + IN PVOID pContext, + IN PIRP pIoRequestPacket, + IN PKSP_PIN Pin, + IN PKSDATARANGE pDataRange, + IN PKSDATARANGE pMatchingDataRange, + IN ULONG ulDataBufferSize, + OUT PVOID pData OPTIONAL, + OUT PULONG pulDataSize + ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if ( ulDataBufferSize < sizeof(KS_DATARANGE_BDA_ANTENNA) ) + { + *pulDataSize = sizeof( KS_DATARANGE_BDA_ANTENNA ); + ntStatus = STATUS_BUFFER_OVERFLOW; + goto ExitDataFormat; + } + else if (pDataRange->FormatSize < sizeof (KS_DATARANGE_BDA_ANTENNA)) + { + ntStatus = STATUS_NO_MATCH; + goto ExitDataFormat; + } + else + { + *pulDataSize = sizeof( KS_DATARANGE_BDA_ANTENNA ); + RtlCopyMemory( pData, (PVOID)pDataRange, sizeof(KS_DATARANGE_BDA_ANTENNA)); + ntStatus = STATUS_SUCCESS; + } + +ExitDataFormat: + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + +} + +/***************************************************************************** + Function : CAntennaPin::PinSetDeviceState + Description : An AVStream minidriver's AVStrMiniPinSetDeviceState + routine is called when the state of a KSPIN structure is + changed due to the arrival of a connection state property + 'set' IOCTL. Typically, this will be provided by minidrivers + that need to change the state of hardware. + + The KSSTATE enumeration lists possible states of a kernel + streaming object. + typedef enum { + KSSTATE_STOP; + KSSTATE_ACQUIRE; + KSSTATE_PAUSE; + KSSTATE_RUN; + } KSSTATE; + + Enumerators + KSSTATE_STOP + Indicates that the object is in minimum resource consumption mode. + KSSTATE_ACQUIRE + Indicates that the object is acquiring resources. + KSSTATE_PAUSE + Indicates that the object is preparing to make instant transition to Run state. + KSSTATE_RUN + Indicates that the object is actively streaming. + + Because the most upstream pin (input pin) is the last + to transition, use this pin's state to set the state + of the filter. + Also, release filter resouces if the pin's state + transitions to stop, and acquire resources if the pin's + state transitions from stop. + IN PARAM : Pointer to the KSPIN structure for which state is changing. + The target KSSTATE after receipt of the IOCTL. + The previous KSSTATE. + OUT PARAM : Status of the PinSetDeviceState + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CAntennaPin::PinSetDeviceState( + IN PKSPIN pKSPin, + IN KSSTATE ToState, + IN KSSTATE FromState + ) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + PKSDEVICE pKSDevice = NULL; + CAntennaPin * pPin = NULL; + CSkyWalker1Device * pDevice = NULL; + + PrintFunctionEntry(__FUNCTION__); + + //Obtain a pointer to the device object from + //the passed in pointer to the KSPIN structure. + pKSDevice = KsPinGetDevice( pKSPin); + + //Obtain a pointer to the pin object from context member of + //the passed in pointer to the KSPIN structure. + pPin = reinterpret_cast(pKSPin->Context); + + //Obtain a pointer to the device object from context member of + //the retrieved pointer to the KSDEVICE structure. + pDevice = reinterpret_cast(pKSDevice->Context); + + pPin->m_pFilter->SetDeviceState( pPin->m_KsState); + + if ((ToState == KSSTATE_STOP) && (FromState != KSSTATE_STOP)) + { + //Because the driver allocates resources on a filter wide basis, + //inform the filter to release resources when the last pin + //(that is, the most upstream pin) transitions to the stop state. + // + //The input pin is the last pin to transition to the stop state, + //therefore inform the filter to release its resources. + // + ntSetStatus = pPin->m_pFilter->ReleaseResources(); + pPin->m_KsState = ToState; + } + else if ((ToState == KSSTATE_ACQUIRE) && (FromState == KSSTATE_STOP)) + { + //Because the driver allocates resources on a filter wide basis, + //inform the filter to acquire resources when the last pin + //(that is, the most upstream pin) transitions from the stop state. + // + //The input pin is the last pin to transition from the stop state, + //therefore inform the filter to acquire its resources. + // + ntSetStatus = pPin->m_pFilter->AcquireResources(); + if (NT_SUCCESS( ntSetStatus)) + { + pPin->m_KsState = ToState; + } + } + else if (ToState > KSSTATE_RUN) + { + + SkyWalkerDebugPrint(EXTREME_LEVEL, + ("Invalid Device State. ToState 0x%08x. FromState 0x%08x.", + ToState, FromState)); + ntSetStatus = STATUS_INVALID_PARAMETER; + } + else + { + pPin->m_KsState = ToState; + } + + PrintDeviceChangeState(ToState,FromState); + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + + + +/***************************************************************************** + Function : CAntennaPin::GetTunerProperty + Description : Retrieves the value of the Tuner node Properties + IN PARAM : IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + OUT PARAM : Status SUCCESS in case Valid Property request + STATUS_INVALID_PARAMETER in case of Invalid property request + Else error from the lower device + PreCondition : None + PostCondtion : Tuner propery read in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CAntennaPin::GetTunerProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + ) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + CAntennaPin * pPin = NULL; + CTunerFilter* pFilter = NULL; + BDATUNER_DEVICE_PARAMETER TunerProperty; + + PrintFunctionEntry(__FUNCTION__); + //Call the BDA support library to + //validate that the node type is associated with the pin. + + //The BdaValidateNodeProperty function validates that a node property + //request is associated with a specific pin. + ntGetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntGetStatus)) + { + //Obtain a pointer to the pin object. + + //Because the property dispatch table calls the CAntennaPin::GetTunerProperty() + //method directly, the method must retrieve a pointer to the underlying pin object. + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + //Retrieve the filter context from the pin context. + pFilter = pPin->GetFilter(); + + ntGetStatus = pFilter->GetTunerProperty(&TunerProperty); + //Retrieve the actual filter parameter. + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_RF_TUNER_FREQUENCY: + *pulProperty = TunerProperty.ulCarrierFrequency; + break; + case KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER: + *pulProperty = TunerProperty.ulFrequencyMultiplier; + break; + case KSPROPERTY_BDA_RF_TUNER_BANDWIDTH: + *pulProperty = TunerProperty.ulBandWidth; + break; + case KSPROPERTY_BDA_RF_TUNER_POLARITY: + *pulProperty = TunerProperty.Polarity; + break; + case KSPROPERTY_BDA_RF_TUNER_RANGE: + *pulProperty = TunerProperty.ulRange; + break; + case KSPROPERTY_BDA_RF_TUNER_TRANSPONDER: + *pulProperty = TunerProperty.ulTransponder; + break; + default: + ntGetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Get : %s : %ul",GetTunerPropertyString(pKSProperty->Id),*pulProperty)); + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; +} + +/***************************************************************************** + Function : CAntennaPin::SetTunerProperty + Description : Sets the value of the Tuner node Freq. Properties + IN PARAM : IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + OUT PARAM : Status SUCCESS in case Valid Property request + STATUS_INVALID_PARAMETER in case of Invalid property request + Else error from the lower device + PreCondition : None + PostCondtion : Tuner Freq. property read in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CAntennaPin::SetTunerProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + CAntennaPin * pPin; + CTunerFilter* pFilter; + + PrintFunctionEntry(__FUNCTION__); + //Call the BDA support library to + //validate that the node type is associated with the pin. + + //The BdaValidateNodeProperty function validates that a node property + //request is associated with a specific pin. + ntSetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntSetStatus)) + { + //Obtain a pointer to the pin object. + + //Because the property dispatch table calls the CAntennaPin::SetTunerProperty() + //method directly, the method must retrieve a pointer to the underlying pin object. + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + //Retrieve the filter context from the pin context. + pFilter = pPin->GetFilter(); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set : %s : %lu\n", + GetTunerPropertyString(pKSProperty->Id), + *pulProperty)); + //Retrieve the actual filter parameter. + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_RF_TUNER_FREQUENCY: + ntSetStatus = pFilter->SetFrequency(*pulProperty); + break; + case KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER: + ntSetStatus = pFilter->SetMultiplier(*pulProperty); + break; + case KSPROPERTY_BDA_RF_TUNER_BANDWIDTH: + ntSetStatus = pFilter->SetBandwidth(*pulProperty); + break; + case KSPROPERTY_BDA_RF_TUNER_POLARITY: + ntSetStatus = pFilter->SetPolarity((Polarisation) *pulProperty); + break; + case KSPROPERTY_BDA_RF_TUNER_RANGE: + ntSetStatus = pFilter->SetRange(*pulProperty); + break; + case KSPROPERTY_BDA_RF_TUNER_TRANSPONDER: + ntSetStatus = pFilter->SetTransponder(*pulProperty); + break; + default: + ntSetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CAntennaPin::GetTunerLnbProperty + Description : Retrieves the value of the Tuner Lnb node Properties + IN PARAM : IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + OUT PARAM : Status SUCCESS in case Valid Property request + STATUS_INVALID_PARAMETER in case of Invalid property request + Else error from the lower device + PreCondition : None + PostCondtion : Tuner lnb propery read in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CAntennaPin::GetTunerLnbProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + ) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + CAntennaPin * pPin; + CTunerFilter* pFilter; + BDATUNER_DEVICE_PARAMETER LnbProperty; + + PrintFunctionEntry(__FUNCTION__); + //Call the BDA support library to + //validate that the node type is associated with the pin. + + //The BdaValidateNodeProperty function validates that a node property + //request is associated with a specific pin. + ntGetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntGetStatus)) + { + //Obtain a pointer to the pin object. + + //Because the property dispatch table calls the CAntennaPin::GetTunerProperty() + //method directly, the method must retrieve a pointer to the underlying pin object. + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + //Retrieve the filter context from the pin context. + pFilter = pPin->GetFilter(); + + ntGetStatus = pFilter->GetTunerProperty(&LnbProperty); + + //Retrieve the actual filter parameter. + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_LNB_LOF_LOW_BAND: + *pulProperty = LnbProperty.ulLnbLowLOFrequency; + break; + case KSPROPERTY_BDA_LNB_LOF_HIGH_BAND: + *pulProperty = LnbProperty.ulLnbHighLOFrequency; + break; + case KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY: + *pulProperty = LnbProperty.ulLnbSwitchFrequency; + break; + default: + ntGetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Get : %s : %ul",GetTunerLnbPropertyString(pKSProperty->Id),*pulProperty)); + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; +} + +/***************************************************************************** + Function : CAntennaPin::SetTunerLnbProperty + Description : Sets the value of the Tuner Lnb node Properties + IN PARAM : IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + OUT PARAM : Status SUCCESS in case Valid Property request + STATUS_INVALID_PARAMETER in case of Invalid property request + Else error from the lower device + PreCondition : None + PostCondtion : Tuner propery Set in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CAntennaPin::SetTunerLnbProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + CAntennaPin * pPin; + CTunerFilter* pFilter; + + PrintFunctionEntry(__FUNCTION__); + //Call the BDA support library to + //validate that the node type is associated with the pin. + + //The BdaValidateNodeProperty function validates that a node property + //request is associated with a specific pin. + ntSetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntSetStatus)) + { + //Obtain a pointer to the pin object. + + //Because the property dispatch table calls the CAntennaPin::SetTunerProperty() + //method directly, the method must retrieve a pointer to the underlying pin object. + + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + //Retrieve the filter context from the pin context. + pFilter = pPin->GetFilter(); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set : %s : %lu(%l)", + GetTunerLnbPropertyString(pKSProperty->Id), + *pulProperty, + *((LONG*)(pulProperty)))); + //Retrieve the actual filter parameter. + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_LNB_LOF_LOW_BAND: + ntSetStatus = pFilter->SetLowLOFrequency(*pulProperty); + break; + case KSPROPERTY_BDA_LNB_LOF_HIGH_BAND: + ntSetStatus = pFilter->SetHighLOFrequency(*pulProperty); + break; + case KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY: + ntSetStatus = pFilter->SetSwitchFrequency(*pulProperty); + break; + default: + ntSetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + + + + +PCHAR GetTunerPropertyString(ULONG ulTunerProperty) +{ + switch(ulTunerProperty) + { + case KSPROPERTY_BDA_RF_TUNER_FREQUENCY: + return "KSPROPERTY_BDA_RF_TUNER_FREQUENCY"; + case KSPROPERTY_BDA_RF_TUNER_POLARITY: + return "KSPROPERTY_BDA_RF_TUNER_POLARITY"; + case KSPROPERTY_BDA_RF_TUNER_RANGE: + return "KSPROPERTY_BDA_RF_TUNER_RANGE"; + case KSPROPERTY_BDA_RF_TUNER_TRANSPONDER: + return "KSPROPERTY_BDA_RF_TUNER_TRANSPONDER"; + case KSPROPERTY_BDA_RF_TUNER_BANDWIDTH: + return "KSPROPERTY_BDA_RF_TUNER_BANDWIDTH"; + case KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER: + return "KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER"; + default: + return "KSPROPERTY_BDA_INVALID_PROPERTY"; + } +} + +PCHAR GetTunerLnbPropertyString(ULONG ulTunerLnbProperty) +{ + switch(ulTunerLnbProperty) + { + case KSPROPERTY_BDA_LNB_LOF_LOW_BAND: + return "KSPROPERTY_BDA_LNB_LOF_LOW_BAND"; + case KSPROPERTY_BDA_LNB_LOF_HIGH_BAND: + return "KSPROPERTY_BDA_LNB_LOF_HIGH_BAND"; + case KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY: + return "KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY"; + default: + return "KSPROPERTY_BDA_INVALID_PROPERTY"; + } +} diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilter.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilter.cpp new file mode 100644 index 0000000..304d258 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilter.cpp @@ -0,0 +1,165 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CaptureFilter.cpp + Author : + Date : + Purpose : This file contains the filter level header for the + capture filter. + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Main Header file + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : CCaptureFilter + Description : Constructor of the CCaptureFilter Class + The capture filter object constructor. Since the new operator will + have zeroed the memory, do not bother initializing any NULL or 0 + fields.Only initialize non-NULL, non-0 fields. + IN PARAM : Filter + OUT PARAM : NONE + PreCondition : Filter Object is not created + PostCondtion : Filter Object is created and Initialzed on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +CCaptureFilter::CCaptureFilter(IN PKSFILTER pKSFilter) : + m_Filter (pKSFilter) +{ + +} + +/***************************************************************************** + Function : CCaptureFilter + Description : Destructor of the CCaptureFilter Class + Destroys the filter object + IN PARAM : NONE + OUT PARAM : NONE + PreCondition : Filter Object is created + PostCondtion : Filter Object is Removed and Memory freed + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +CCaptureFilter::~CCaptureFilter() +{ + +} + +/***************************************************************************** + Function : CCaptureFilter::Cleanup() + Description : This is the bag cleanup callback for the CCaptureFilter. + Destroys the filter object + IN PARAM : Reference to the current Object + OUT PARAM : NONE + PreCondition : Filter Object is created + PostCondtion : Filter Object is Removed and Memory freed + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +void CCaptureFilter::Cleanup (IN CCaptureFilter *pFilter) +{ + delete pFilter; +} + + +/***************************************************************************** + Function : CCaptureFilter::Create() + Description : It creates the CCaptureFilter object, associates it with + the AVStream filter object, and bag the CCaptureFilter + for later cleanup. + IN PARAM : Pointer to KSFILTER that just created + Pointer to IRP_MJ_CREATE for Filter + OUT PARAM : Status of the Filter Create routine + STATUS_SUCCESS on Routine success + Else Error code from the attempt to create the Filter + PreCondition : Filter is not created + PostCondtion : Filter is created and Initialzed on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +STDMETHODIMP_(NTSTATUS) CCaptureFilter::Create( IN OUT PKSFILTER pKSFilter, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntFilterCreationStatus = STATUS_SUCCESS; + ULONG ulPinId; // just useful when no network provider is present + PKSDEVICE pKSDeviceObject = NULL; + CSkyWalker1Device * pDevice = NULL; + + PrintFunctionEntry(__FUNCTION__); + + //Create a filter object for the filter instance. + CCaptureFilter* pFilter = new(NonPagedPool,CAPTURE_MEM_TAG) CCaptureFilter(pKSFilter); // Tags the allocated memory + if (!IS_VALID(pFilter)) + { + //Exit if the Filter Memory could not be allocated + ntFilterCreationStatus = STATUS_INSUFFICIENT_RESOURCES; + goto ErrorFilterCreate; + } + else + { + // Add the item to the object bag if we we were successful. + // Whenever the filter closes, the bag is cleaned up and we will be + // freed. + // + ntFilterCreationStatus = KsAddItemToObjectBag ( + pKSFilter -> Bag, + reinterpret_cast (pFilter), + reinterpret_cast (CCaptureFilter::Cleanup) + ); + + if (!NT_SUCCESS (ntFilterCreationStatus)) + { + goto ErrorFilterCreate; + } + else + { + pKSFilter->Context = reinterpret_cast (pFilter); + } + } + +CompleteFilterCreate : + + PrintFunctionExit(__FUNCTION__,ntFilterCreationStatus); + return ntFilterCreationStatus; + +ErrorFilterCreate: + if (IS_VALID(pFilter)) + { + delete pFilter; + } + + goto CompleteFilterCreate; +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilterDefinitions.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilterDefinitions.cpp new file mode 100644 index 0000000..91f7ad2 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CaptureFilterDefinitions.cpp @@ -0,0 +1,336 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CaptureFilterDefinitions.cpp + Author : + Date : + Purpose : Capture Filter Definition + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Main Header file + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ + +const KSPIN_DISPATCH CaptureInputPinDispatch={ + /* Create */ CCapturePin::PinCreate, + /* Close */ NULL, + /* Process */ NULL, + /* Reset */ NULL, + /* SetDataFormat */ NULL, + /* SetDeviceState */ NULL, + /* Connect */ NULL, + /* Disconnect */ NULL, + /* Allocator */ NULL +}; + +DEFINE_KSAUTOMATION_TABLE(NullAutomation) { + DEFINE_KSAUTOMATION_PROPERTIES_NULL, + DEFINE_KSAUTOMATION_METHODS_NULL, + DEFINE_KSAUTOMATION_EVENTS_NULL +}; + +//The list of category GUIDs for the capture filter. +const GUID SkyWalker1CaptureCatagories [] = { + STATICGUIDOF (KSCATEGORY_BDA_RECEIVER_COMPONENT) +}; + +//Medium GUIDs for the Transport Output Pin. +// +//Pin Medium descriptor containing all medium accepted to be connected to +//the tuner output pin.This insures contection to the correct Capture Filter pin. +// +//{2AEB4A94-FBB7-4FB1-8D74-243B91886EAB} + +const KSPIN_MEDIUM TransportPinMediums[] = +{ + { + GUID_SKYWALKER_TUNER_OUT_MEDIUM, + 0, + 0 + } +}; + +// +//This is the data range description of the capture input pin. +//This is same as the Outpin of the Tuner i.e. The Transport Pin +//The Output of the Tuner is given to the Capture thus it has to +//be same +// +const KS_DATARANGE_BDA_TRANSPORT FormatCaptureIn = +{ + //insert the KSDATARANGE and KSDATAFORMAT here + { + sizeof( KS_DATARANGE_BDA_TRANSPORT), //FormatSize + 0, //Flags - (N/A) + 0, //SampleSize - (N/A) + 0, //Reserved + { STATIC_KSDATAFORMAT_TYPE_STREAM }, //MajorFormat + { STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT }, //SubFormat + { STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT } //Specifier + }, + //insert the BDA_TRANSPORT_INFO here + { + TRANSPORT_PACKET_SIZE, //ulcbPhyiscalPacket + TRANSPORT_PACKET_COUNT*TRANSPORT_PACKET_SIZE, //ulcbPhyiscalFrame + 0, //ulcbPhyiscalFrameAlignment (no requirement) + 0 //AvgTimePerFrame (not known) + } +}; + +const PKSDATARANGE CaptureInPinDataRanges[]={ + (PKSDATARANGE)&FormatCaptureIn, +}; + +//Capture Outout Pin Definitions +const KSPIN_DISPATCH CaptureOutputPinDispatch={ + /* Create */ CCapturePin::PinCreate, + /* Close */ NULL, + /* Process */ CCapturePin::DispatchProcess, + /* Reset */ NULL, + /* SetDataFormat */ NULL, + /* SetDeviceState */ CCapturePin::DispatchSetState, + /* Connect */ NULL, + /* Disconnect */ NULL, + /* Allocator */ NULL +}; + + +// +//This is the data range description of the capture output pin. +// +const KSDATARANGE FormatCaptureOut = +{ + //insert the KSDATARANGE and KSDATAFORMAT here + { + sizeof( KSDATARANGE), //FormatSize + 0, //Flags - (N/A) + TRANSPORT_PACKET_COUNT*TRANSPORT_PACKET_SIZE, //SampleSize + 0, //Reserved + { STATIC_KSDATAFORMAT_TYPE_STREAM }, //MajorFormat + { STATIC_KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT },//SubFormat + { STATIC_KSDATAFORMAT_SPECIFIER_NONE } //Specifier + } +}; + +const PKSDATARANGE CaptureOutPinDataRanges[]={ + (PKSDATARANGE)&FormatCaptureOut, +}; + +// +//CapturePinAllocatorFraming: +// +//This is the simple framing structure for the capture pin. Note that this +//will be modified via KsEdit when the actual capture format is determined. +// +DECLARE_SIMPLE_FRAMING_EX ( + CapturePinAllocatorFraming, //FramingExName + STATICGUIDOF (KSMEMORY_TYPE_KERNEL_NONPAGED), //MemoryType + KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY | + KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY, //Flags + NUMBER_OF_FRAMES, //Frames + 0, //Alignment + TRANSPORT_PACKET_COUNT*TRANSPORT_PACKET_SIZE, //MinFrameSize + TRANSPORT_PACKET_COUNT*TRANSPORT_PACKET_SIZE //MaxFrameSize + ); + +/**********************************************************************************/ + +//Not Supporting Filter Methods,Properties and Events +DEFINE_KSAUTOMATION_TABLE(SkyWalker1CaptureAutomationTable) +{ + DEFINE_KSAUTOMATION_PROPERTIES_NULL, + DEFINE_KSAUTOMATION_METHODS_NULL, + DEFINE_KSAUTOMATION_EVENTS_NULL +}; +/**********************************************************************************/ +// +//CaptureFilterDispatch: +// +//This is the dispatch table for the capture filter. It provides notification +//of creation, closure, processing (for filter-centrics, not for the capture +//filter), and resets (for filter-centrics, not for the capture filter). +// +const KSFILTER_DISPATCH SkyWalker1CaptureDispatchTable = +{ + /* Create */ CCaptureFilter::Create, //Routine called when the Filter is created + /* Close */ NULL, //Routine called when the Filter is closed + /* Process */ NULL, + /* Reset */ NULL +}; + +// +//Capture Pin Descriptors +// +//This data structure defines the pin types available in the filters +//template topology. These structures will be used to create a +//KDPinFactory for a pin type when BdaCreatePin or BdaMethodCreatePin +//are called. +// +//This structure defines ALL pins the filter is capable of supporting, +//including those pins which may only be created dynamically by a ring +//3 component such as a Network Provider. + +//The list of pin descriptors on the capture filter. +const KSPIN_DESCRIPTOR_EX SkyWalker1CapturePinDescriptors[]={ + { //Capture Filter input pin + &CaptureInputPinDispatch, //Dispatch Table + &NullAutomation, //Automation Table + { + 0, //Interfaces + NULL, + SIZEOF_ARRAY(TransportPinMediums), //Medium Count + TransportPinMediums, //Medium + SIZEOF_ARRAY(CaptureInPinDataRanges), //Range Count + CaptureInPinDataRanges, //Ranges + KSPIN_DATAFLOW_IN, //Specifies that data flow is into the pin + KSPIN_COMMUNICATION_BOTH, //Specifies that the pin factory instantiates pins + //that are both IRP sinks and IRP sources + (GUID *) &PINNAME_BDA_TRANSPORT, //Category GUID + (GUID *) &PINNAME_BDA_TRANSPORT, //GUID of the localized Unicode string + 0 + }, + KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT| + KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING| + KSPIN_FLAG_FIXED_FORMAT, + 1, //Maximum Possible Instances of the Pin + 1, //Mandatory Instances of this for the Filter function + NULL,//Allocator Framing + NULL //Data Interaction Handler + }, + { //Capture Filter output pin + &CaptureOutputPinDispatch, //Dispatch Table + &NullAutomation, //Automation Table + { + NULL, + 0, + NULL, + 0, + SIZEOF_ARRAY(CaptureOutPinDataRanges), //Range Count + CaptureOutPinDataRanges, + KSPIN_DATAFLOW_OUT, //Specifies that data flow is out of the pin + KSPIN_COMMUNICATION_BOTH,//Specifies that the pin factory instantiates pins + //that are both IRP sinks and IRP sources + (GUID *) &PINNAME_BDA_TRANSPORT, //Category GUID + (GUID *) &PINNAME_BDA_TRANSPORT, //GUID of the localized Unicode string + 0 + }, +#if !defined(_BUILD_SW_TUNER_ON_X64) + KSPIN_FLAG_GENERATE_MAPPINGS | //Pin Flags +#endif + KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY, + 1,//Maximum Possible Instances of the Pin + 1,//Mandatory Instances of this for the Filter function + &CapturePinAllocatorFraming, + NULL + }, +}; + + +/*****************************************************************************************/ +//Define BDA Template Topology Connections +// +//Lists the Connections that are possible between pin types and +//node types. This, together with the Template Filter Descriptor, and +//the Pin Pairings, describe how topologies can be created in the filter. +// +// ================= +//TransportPin ----| Capture Filter | +// ================= +// +//The Capture Filter is controlled by the Transport input pin. +//Capture Filter properties will be set as NODE properties (with NodeType == 0) +//on the filter's Tranport Pin +// +const KSTOPOLOGY_CONNECTION SkyWalker1CaptureConnections[]={ + {KSFILTER_NODE, 0, KSFILTER_NODE, KSNODEPIN_STANDARD_IN}, //Transport pin -> Capture Filter pin 0 +}; + +/*****************************************************************************************/ + +//Define the Filter Factory Descriptor for the filter +//This structure brings together all of the structures that define +//the tuner filter as it appears when it is first instantiated. +//Note that not all of the template pin and node types may be exposed as +//pin and node factories when the filter is first instanciated. + +//The KSFILTER_DESCRIPTOR structure describes the characteristics of a filter created by a given filter factory. +DEFINE_KSFILTER_DESCRIPTOR(SkyWalker1CaptureFilterDescriptor) +{ + &SkyWalker1CaptureDispatchTable, //Dispatch (Filter Specific Driver) + NULL, //AutomationTable + KSFILTER_DESCRIPTOR_VERSION, //Version + 0, //Flags + &SKYWALKER_CAPTURE_FILTER, //ReferenceGuid + DEFINE_KSFILTER_PIN_DESCRIPTORS(SkyWalker1CapturePinDescriptors), + //PinDescriptorsCount; must expose at least one pin + //PinDescriptorSize; size of each item + //PinDescriptors; table of pin descriptors + DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_RECEIVER_COMPONENT), + //CategoriesCount; number of categories in the table + //Categories; table of categories + DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL, + //NodeDescriptorsCount; + //NodeDescriptorSize; + //NodeDescriptors; + DEFINE_KSFILTER_CONNECTIONS(SkyWalker1CaptureConnections), + //Automatically fills in the connections table for a filter which defines no explicit connections + //ConnectionsCount; number of connections in the table + //Connections; table of connections + NULL //ComponentId; +}; + +//Array of BDA_PIN_PAIRING structures that are used to determine +//which nodes get duplicated when more than one output pin type is +//connected to a single input pin type or when more that one input pin +//type is connected to a single output pin type. +// +const BDA_PIN_PAIRING SkyWalker1CapturePinPairings[] = +{ + //Input pin to Output pin Topology Joints + // + { + 0, //ulInputPin; 0 element in the TemplatePinDescriptors array. + 1, //ulOutputPin; 1 element in the TemplatePinDescriptors array. + 1, //ulcMaxInputsPerOutput + 1, //ulcMinInputsPerOutput + 1, //ulcMaxOutputsPerInput + 1, //ulcMinOutputsPerInput + 0, //ulcTopologyJoints + NULL //pTopologyJoints; array of joints + } + //If applicable, list topology of joints between other pins. + // +}; + + +//BDA_FILTER_TEMPLATE structure describes the template topology for BDA Driver +const BDA_FILTER_TEMPLATE SkyWalker1CaptureTemplate = +{ + &SkyWalker1CaptureFilterDescriptor,//Pointer to KS_FILTER_DESCRIPTOR which describes the Filter for BDA Device + SIZEOF_ARRAY(SkyWalker1CapturePinPairings), //Number of PAIRS of pins in BDA_PIN_PAIRING Array + SkyWalker1CapturePinPairings //Array of Pin Pairing describes topology between a pair of Filter's Input and Output Pins +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CapturePin.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CapturePin.cpp new file mode 100644 index 0000000..ad5680b --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1CapturePin.cpp @@ -0,0 +1,693 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CapturePin.cpp + Author : + Date : + Purpose : This file contains header for the video capture pin on + the capture filter. + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +VOID PrintStream(IN PKSSTREAM_POINTER pStreamPointer); +/* End of Function prototype definitions */ + + +/***************************************************************************** + Function : CCapturePin + Description : Constructor of the CCapturePin Class + IN PARAM : NONE + OUT PARAM : NONE + PreCondition : pKSPin Object is not created + PostCondtion : pKSPin Object is created and Initialzed on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +CCapturePin::CCapturePin(IN PKSPIN pKSPin) : + m_Pin (pKSPin) +{ + PKSDEVICE pKSDevice = KsPinGetDevice (pKSPin); + + PrintFunctionEntry(__FUNCTION__); + + //Set up our device pointer. This gives us access to "Hardware I/O" + //during the capture routines. + m_Device = reinterpret_cast (pKSDevice->Context); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); +} + +/***************************************************************************** + Function : CCapturePin + Description : Destructor of the CCapturePin Class + IN PARAM : NONE + OUT PARAM : NONE + PreCondition : pKSPin Object is created + PostCondtion : pKSPin Object is Removed and Memory freed + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +CCapturePin::~CCapturePin() +{ + PrintFunctionEntry(__FUNCTION__); + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); +} + +/***************************************************************************** + Function : CCapturePin::PinCreate + Description : An AVStream minidriver's AVStrMiniPinCreate routine is + called when a pin is created. Typically, this routine is + used by minidrivers that want to initialize the context + and resources associated with the pin. + IN PARAM : Pointer to the KSPIN that was just created. + Pointer to the IRP_MJ_CREATE for pKSPin + OUT PARAM : STATUS_SUCCESS in case of successful pin creation + Failure Code in other cases + PreCondition : None + PostCondtion : Create a new capture pin. This is the creation dispatch for + the video capture pin. + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CCapturePin::PinCreate ( IN PKSPIN pKSPin, + IN PIRP pIoRequestPacket + ) +{ + + NTSTATUS ntCreateStatus = STATUS_SUCCESS; + PBDA_TRANSPORT_INFO pTransportInfo = NULL; + CCapturePin *pCapturePin = new (NonPagedPool, CAPTURE_MEM_TAG) CCapturePin (pKSPin); + + PrintFunctionEntry(__FUNCTION__); + + if (!IS_VALID(pCapturePin)) + { + //Return failure if we couldn't create the pin. + ntCreateStatus = STATUS_INSUFFICIENT_RESOURCES; + + } + else + { + //Add the item to the object bag if we we were successful. + //Whenever the pin closes, the bag is cleaned up and we will be + //freed. + + ntCreateStatus = KsAddItemToObjectBag ( + pKSPin->Bag, + reinterpret_cast (pCapturePin), + reinterpret_cast (CCapturePin::Cleanup) + ); + + if (!NT_SUCCESS (ntCreateStatus)) + { + delete pCapturePin; + } + else + { + pKSPin->Context = reinterpret_cast (pCapturePin); + } + + } + + //If we succeeded so far, stash the video info header away and change + //our allocator framing to reflect the fact that only now do we know + //the framing requirements based on the connection format. + if (NT_SUCCESS (ntCreateStatus)) + { + + pTransportInfo = pCapturePin->CaptureBdaTransportInfo(); + if (!pTransportInfo) + { + ntCreateStatus = STATUS_INSUFFICIENT_RESOURCES; + } + } + + if (NT_SUCCESS (ntCreateStatus)) + { + //We need to edit the descriptor to ensure we don't mess up any other + //pins using the descriptor or touch read-only memory. + + ntCreateStatus = KsEdit (pKSPin, &pKSPin->Descriptor, CAPTURE_MEM_TAG); + + if (NT_SUCCESS (ntCreateStatus)) + { + ntCreateStatus = KsEdit ( + pKSPin, + &(pKSPin->Descriptor->AllocatorFraming), + CAPTURE_MEM_TAG + ); + } + + //If the edits proceeded without running out of memory, adjust + //the framing based on the video info header. + if (NT_SUCCESS (ntCreateStatus)) + { + + //We've KsEdit'ed this... I'm safe to cast away constness as + //long as the edit succeeded. + PKSALLOCATOR_FRAMING_EX pFraming = + const_cast ( + pKSPin->Descriptor-> AllocatorFraming + ); + + pFraming->FramingItem[0].Frames = NUMBER_OF_FRAMES; + + //The physical and optimal ranges must be biSizeImage. We only + //support one frame size, precisely the size of each capture + //image. + pFraming->FramingItem[0].PhysicalRange.MinFrameSize = + pFraming->FramingItem[0].PhysicalRange.MaxFrameSize = + pFraming->FramingItem[0].FramingRange.Range.MinFrameSize = + pFraming->FramingItem[0].FramingRange.Range.MaxFrameSize = + pTransportInfo->ulcbPhyiscalFrame; + + pFraming->FramingItem[0].PhysicalRange.Stepping = + pFraming->FramingItem[0].FramingRange.Range.Stepping = + 0; + + } + + } + + PrintFunctionExit(__FUNCTION__,ntCreateStatus); + return ntCreateStatus; + +} + +/***************************************************************************** + Function : CCapturePin::CaptureBdaTransportInfo + Description : Capture the video info header out of the connection format. + This is what we use to base synthesized images off. + IN PARAM : NONE + OUT PARAM : The captured video info header or + NULL if there is insufficient memory. + PreCondition : None + PostCondtion : Create a new capture pin. This is the creation dispatch for + the video capture pin. + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +PBDA_TRANSPORT_INFO CCapturePin::CaptureBdaTransportInfo() +{ + PrintFunctionEntry(__FUNCTION__); + + m_TransportInfo = reinterpret_cast ( + ExAllocatePoolWithTag ( + NonPagedPool, + sizeof(BDA_TRANSPORT_INFO), + CAPTURE_MEM_TAG + ) + ); + + if (!IS_VALID(m_TransportInfo)) + { + return NULL; + } + + //Bag the newly allocated header space. This will get cleaned up + //automatically when the pin closes. + NTSTATUS Status = + KsAddItemToObjectBag ( + m_Pin->Bag, + reinterpret_cast (m_TransportInfo), + NULL + ); + + if (!NT_SUCCESS (Status)) + { + ExFreePoolWithTag (m_TransportInfo, CAPTURE_MEM_TAG); + return NULL; + + } + else + { + m_TransportInfo->ulcbPhyiscalPacket = TRANSPORT_PACKET_SIZE; + m_TransportInfo->ulcbPhyiscalFrame = TRANSPORT_PACKET_SIZE * TRANSPORT_PACKET_COUNT; + m_TransportInfo->ulcbPhyiscalFrameAlignment = 1; + m_TransportInfo->AvgTimePerFrame = ((ULONGLONG)(19200)/* Maximum Sample Frequency */ * + 10000 /* Maximum Bits Per second */ * + NUMBER_OF_FRAMES) /*Maximum Channels */ / + (TRANSPORT_PACKET_SIZE * TRANSPORT_PACKET_COUNT); + + } + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + return m_TransportInfo; + +} + +/***************************************************************************** + Function : CCapturePin::CleanupReferences + Description : Clean up any references we're holding on frames after + we abruptly stop the hardware. + IN PARAM : NONE + OUT PARAM : Success / Failure + PreCondition : NONE + PostCondtion : NONE + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CCapturePin::CleanupReferences () +{ + PKSSTREAM_POINTER pCloneStream = KsPinGetFirstCloneStreamPointer(m_Pin); + PKSSTREAM_POINTER pNextCloneStream = NULL; + + PrintFunctionEntry(__FUNCTION__); + + //Walk through the clones, deleting them, and setting DataUsed to + //zero since we didn't use any data! + while (pCloneStream) + { + + pNextCloneStream = KsStreamPointerGetNextClone(pCloneStream); + + pCloneStream->StreamHeader->DataUsed = 0; + KsStreamPointerDelete (pCloneStream); + + pCloneStream = pNextCloneStream; + + } + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + return STATUS_SUCCESS; +} + +/***************************************************************************** + Function : CCapturePin::SetState + Description : This is called when the caputre pin transitions state. + The routine attempts to acquire / release any hardware + resources and start up or shut down capture based on + the states we are transitioning to and away from. + IN PARAM : ToState : The state we're transitioning to + FromState : The state we're transitioning away from + OUT PARAM : Success / Failure + PreCondition : NONE + PostCondtion : NONE + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CCapturePin::SetState ( + IN KSSTATE ToState, + IN KSSTATE FromState + ) +{ + + NTSTATUS ntSetStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + PrintDeviceChangeState(ToState,FromState); + + switch (ToState) + { + + case KSSTATE_STOP: + //Stopping the Device Operation + if (m_HardwareState != HardwareStopped) + { + ntSetStatus = m_Device->StopStream(); + m_HardwareState = HardwareStopped; + } + + + //The Device is Stopped + //It has cancelled the IRPs and Stopped the Streaming + //In case any Streaming Pointer is left Clean it up + ntSetStatus = CleanupReferences(); + + //Release any hardware resources related to this pin. + if (m_AcquiredResources) + { + //Release the Clock Reference on the Pin + if (m_Clock) + { + m_Clock->Release(); + m_Clock = NULL; + } + + m_Device->RemoveCaptureSink(); + m_AcquiredResources = FALSE; + } + break; + + case KSSTATE_ACQUIRE: + + //Acquire Hardware resources here instead of Filter + //Creation Time.So that the Filter creation does not + //Fail because of Limited Hardware resources. + if (FromState == KSSTATE_STOP) + { + ntSetStatus = m_Device->SetupCaptureSink(this,m_TransportInfo); + + if (NT_SUCCESS (ntSetStatus)) + { + m_AcquiredResources = TRUE; + + //Attempt to get an interface to the master clock. + //This will fail if one has not been assigned. Since + //one must be assigned while the pin is still in + //KSSTATE_STOP, this is a guranteed method of getting + //the clock should one be assigned. + + if (!NT_SUCCESS (KsPinGetReferenceClockInterface(m_Pin, + &m_Clock))) + { + //If we could not get an interface to the clock, + //don't use one. + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Clock Assigned to the Pin\n")); + m_Clock = NULL; + + } + + } + else + { + m_AcquiredResources = FALSE; + } + + } + else + { + // + //Standard transport pins will always receive transitions in + //+/- 1 manner. This means we'll always see a PAUSE->ACQUIRE + //transition before stopping the pin. + // + //The below is done because on DirectX 8.0, when the pin gets + //a message to stop, the queue is inaccessible. The reset + //which comes on every stop happens after this (at which time + //the queue is inaccessible also). So, for compatibility with + //DirectX 8.0, I am stopping the hardware at this + //point and cleaning up all references we have on frames.See + //the comments above regarding the CleanupReferences call. + + if (m_HardwareState != HardwareStopped) + { + ntSetStatus = m_Device->StopStream(); + m_HardwareState = HardwareStopped; + } + + ntSetStatus = CleanupReferences (); + } + + break; + + case KSSTATE_PAUSE: + + //Stop the Streaming if we're coming down from run. + if (FromState == KSSTATE_RUN) + { + + ntSetStatus = m_Device->PauseStream(TRUE); + + if (NT_SUCCESS (ntSetStatus)) + { + m_HardwareState = HardwarePaused; + } + + } + break; + + case KSSTATE_RUN: + + //Start the Streaming or unpause it depending on + //whether we're initially running or we've paused and restarted. + if (m_HardwareState == HardwarePaused) + { + ntSetStatus = m_Device->PauseStream (FALSE); + } + else + { + ntSetStatus = m_Device->StartStream(); + } + + if (NT_SUCCESS (ntSetStatus)) + { + m_HardwareState = HardwareRunning; + } + + break; + + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Completed the State Change\n")); + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; + +} + +/***************************************************************************** + Function : CCapturePin::Process + Description : The process dispatch for the pin bridges to this location. + We handle setting up scatter gather mappings, etc... + IN PARAM : NONE + OUT PARAM : Success / Failure + PreCondition : NONE + PostCondtion : NONE + Logic : NONE + Assumption : NONE + Note : Future Approach for the Streaming Buffer + 1) Create a Buffer of Size Stream->Data/m_SampleSize Here + 2) Store the reference of the Newly Created Buffer into the + Stream Context + 3) Send the Buffer to the ReadStream(BufferPointer) + 4) When CompleteMapping is returned Copy Data from Stream + Context to Stream->Data + Revision History: + *****************************************************************************/ +NTSTATUS CCapturePin::Process() +{ + NTSTATUS ntProcessStatus = STATUS_SUCCESS; + PKSSTREAM_POINTER pLeadingStream = NULL; + PKSSTREAM_POINTER pCloneStream = NULL; + PSTREAM_POINTER_CONTEXT pStreamContext = NULL; + + PrintFunctionEntry(__FUNCTION__); + + pLeadingStream = KsPinGetLeadingEdgeStreamPointer ( + m_Pin, + KSSTREAM_POINTER_STATE_LOCKED + ); + + + if( !pLeadingStream ) + { + //no system buffer available + //This case can happen if it is the last pointer in the queue or + //the system cannot give us the required buffer + SkyWalkerDebugPrint(ENTRY_LEVEL,("Warning: No system buffer available\n")); + ntProcessStatus = STATUS_UNSUCCESSFUL; + goto CompleteProcessing; + } + else + { + + //First thing we need to do is clone the leading edge. This allows + //us to keep reference on the frames while they're in DMA. + ntProcessStatus = KsStreamPointerClone ( + pLeadingStream, + NULL, + sizeof (STREAM_POINTER_CONTEXT), + &pCloneStream + ); + + if( !NT_SUCCESS(ntProcessStatus) ) + { + //No System Buffer Available + SkyWalkerDebugPrint(ENTRY_LEVEL, + ("Error: Streampointer cloning unsuccessful\n")); + ntProcessStatus = STATUS_UNSUCCESSFUL; + goto CompleteProcessing; + } + + //Is the buffer size correct + if( pCloneStream->StreamHeader->FrameExtent < + (static_cast (m_TransportInfo->ulcbPhyiscalFrame)) ) + { + //Buffer size incorrect + KsStreamPointerDelete(pCloneStream); //void function + SkyWalkerDebugPrint(ENTRY_LEVEL,("Error: Buffer size Incorrect\n")); + ntProcessStatus = STATUS_UNSUCCESSFUL; + goto CompleteProcessing; + } + + //Set the stream header data used to 0. We update this + //in the USB Data Read completions. + pCloneStream->StreamHeader->DataUsed = 0; + + pStreamContext = reinterpret_cast + (pCloneStream->Context); + + //Set the Stream Index + pStreamContext->ulFrameIndex = m_CurrentFrameIndex; + + PrintStream(pLeadingStream); + + //(Refer NOTE above) Create a Stream Buffer Here and Submit + //it for the Reading / DMA + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Current Stream Index = %lu",m_CurrentFrameIndex)); + m_Device->ReadStream(m_CurrentFrameIndex); + m_CurrentFrameIndex = (m_CurrentFrameIndex+1) % NUMBER_OF_FRAMES; + + //Advance Stream pointer to the next available data frame + ntProcessStatus = KsStreamPointerAdvance(pLeadingStream); + + if( (ntProcessStatus != STATUS_DEVICE_NOT_READY) && + (ntProcessStatus != STATUS_SUCCESS) ) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, + ("Error: Video Capture Streampointer Advacement Failed\n")); + } + } + +CompleteProcessing: + + PrintFunctionExit(__FUNCTION__,ntProcessStatus); + return ntProcessStatus; +} + +/***************************************************************************** + Function : CCapturePin::ReleaseStream + Description : Called to notify the pin that a given Stream is completed + IN PARAM : The Stream Index + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : Stream data is filled from the Internal Stream Buffer + Other Stream Parameters are set and Clone is Deleted + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +void CCapturePin::ReleaseStream(IN ULONG ulStreamIndex) +{ + + PrintFunctionEntry(__FUNCTION__); + + //Walk through the clones list and delete clones whose time has come. + //The list is guaranteed to be kept in the order they were cloned. + SkyWalkerDebugPrint(EXTREME_LEVEL,("Completing Stream %lu\n",ulStreamIndex)); + + PKSSTREAM_POINTER pCloneStream = KsPinGetFirstCloneStreamPointer (m_Pin); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Clone Stream pointer = 0x%p\n",pCloneStream)); + + if(pCloneStream) + { + //Copy the Stream data from the Corresponding Streaming Buffer + RtlCopyMemory((PUCHAR)pCloneStream->StreamHeader->Data, + m_Device->GetSynthBuffer(ulStreamIndex), + m_TransportInfo->ulcbPhyiscalFrame); + + pCloneStream->StreamHeader->DataUsed = m_TransportInfo->ulcbPhyiscalFrame; + + SkyWalkerDebugPrint(EXTREME_LEVEL,("pCloneStream->StreamHeader->DataUsed = " + "%lu\n", + pCloneStream->StreamHeader->DataUsed)); + + pCloneStream->StreamHeader->Duration = m_TransportInfo->AvgTimePerFrame; + + pCloneStream->StreamHeader->PresentationTime.Numerator = + pCloneStream->StreamHeader->PresentationTime.Denominator = 1; + + //If a clock has been assigned, timestamp the packets with the + //time shown on the clock. + if (m_Clock) + { + + LONGLONG ClockTime = m_Clock->GetTime (); + pCloneStream->StreamHeader->PresentationTime.Time = ClockTime; + pCloneStream->StreamHeader->OptionsFlags = + KSSTREAM_HEADER_OPTIONSF_TIMEVALID | + KSSTREAM_HEADER_OPTIONSF_DURATIONVALID; + + } + else + { + + //If there is no clock, don't time stamp the packets. + pCloneStream->StreamHeader->PresentationTime.Time = 0; + + } + + PrintStream(pCloneStream); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Stream Processed thus deleting the Clone\n")); + KsStreamPointerDelete (pCloneStream); + + } + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + +} + +VOID PrintStream(IN PKSSTREAM_POINTER pStreamPointer) +{ + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Context = 0x%p\n",pStreamPointer->Context)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Pin = 0x%p\n",pStreamPointer->Pin)); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader = 0x%p\n",pStreamPointer->StreamHeader)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->Size = %lu\n",pStreamPointer->StreamHeader->Size)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->TypeSpecificFlags = %lu\n",pStreamPointer->StreamHeader->TypeSpecificFlags)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->PresentationTime.Time= %l\n",pStreamPointer->StreamHeader->PresentationTime.Time)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->PresentationTime.Numerator= %lu\n",pStreamPointer->StreamHeader->PresentationTime.Numerator)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->PresentationTime.Denominator= %lu\n",pStreamPointer->StreamHeader->PresentationTime.Denominator)); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->Duration = %l\n",pStreamPointer->StreamHeader->Duration)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->FrameExtent = %lu\n",pStreamPointer->StreamHeader->FrameExtent)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->DataUsed = %lu\n",pStreamPointer->StreamHeader->DataUsed)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->Data = 0x%p\n",pStreamPointer->StreamHeader->Data)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->StreamHeader->OptionsFlags = %lu\n",pStreamPointer->StreamHeader->OptionsFlags)); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Offset = 0x%p\n",pStreamPointer->Offset)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Offset->Data = 0x%p\n",pStreamPointer->Offset->Data)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Offset->Mappings = 0x%p\n",pStreamPointer->Offset->Mappings)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Offset->Count = %lu\n",pStreamPointer->Offset->Count)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->Offset->Remaining = %lu\n",pStreamPointer->Offset->Remaining)); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetIn.Data = 0x%p\n",pStreamPointer->OffsetIn.Data)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetIn.Mappings = 0x%p\n",pStreamPointer->OffsetIn.Mappings)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetIn.Count = %lu\n",pStreamPointer->OffsetIn.Count)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetIn.Remaining = %lu\n",pStreamPointer->OffsetIn.Remaining)); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetOut.Data = 0x%p\n",pStreamPointer->OffsetOut.Data)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetOut.Mappings = 0x%p\n",pStreamPointer->OffsetOut.Mappings)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetOut.Count = %lu\n",pStreamPointer->OffsetOut.Count)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamPointer->OffsetOut.Remaining = %lu\n",pStreamPointer->OffsetOut.Remaining)); +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Control.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Control.cpp new file mode 100644 index 0000000..0f698d2 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Control.cpp @@ -0,0 +1,704 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Control.cpp + Author : + Date : + Purpose : This File Holds the Device Control related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +VOID PrintDiseqcCommand(PDISEQC_COMMAND pDiseqcCommand); +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : GetSignalStatus + Description : This Function Get the Signal Lock Status + IN PARAM : Pointer to the KSDevice Object + true in case of Signal Locked else False + OUT PARAM : STATUS_SUCCESS in case of successful Lock Read + Failure Code in other cases + PreCondition : None + PostCondtion : Gets the Signal Lock Status in case of successful execution + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS GetSignalStatus( IN PKSDEVICE pKSDeviceObject, + OUT PBOOLEAN pbSignalLockStatus + ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + UCHAR ucSignalStatus = 0; + + PrintFunctionEntry(__FUNCTION__); + + //gp8psk_usb_in_op(st->d, GET_SIGNAL_LOCK, 0, 0, &lock,1) + ntStatus = ControlUsbDevice( pKSDeviceObject, + GET_SIGNAL_LOCK, + 0, + 0, + &ucSignalStatus, + 1, + true); + if(NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("ucSignalStatus = 0x%02X\n",ucSignalStatus)); + + if(ucSignalStatus) + { + *pbSignalLockStatus = TRUE; + } + else + { + *pbSignalLockStatus = FALSE; + } + } + + //if (lock) + // *status = FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_SIGNAL | FE_HAS_CARRIER; + //else + // *status = 0; + + if(ucSignalStatus) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Lock = 0x%02X\n",*pbSignalLockStatus)); + } + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + +} + +/***************************************************************************** + Function : ReadTunerSignalStrength + Description : This Function reads the Tuner Signal Strength + IN PARAM : Pointer to the KSDevice Object + Pointer to hold the Signal Strength + OUT PARAM : STATUS_SUCCESS in case of successful read + Failure Code in other cases + PreCondition : None + PostCondtion : Reads the Signal Strength + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS ReadTunerSignalStrength( IN PKSDEVICE pKSDeviceObject, + OUT PULONG pulSigStrength + ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + UCHAR ucBuffer[6] = {0,0,0,0,0,0}; + ULONG ulSignalStrength = 0L; + + PrintFunctionEntry(__FUNCTION__); + + //gp8psk_usb_in_op(st->d, GET_SIGNAL_STRENGTH, 0,0,buf,6); + ntStatus = ControlUsbDevice( pKSDeviceObject, + GET_SIGNAL_STRENGTH, + 0, + 0, + ucBuffer, + 6, + true); + if(NT_SUCCESS(ntStatus)) + { + ulSignalStrength = (int)(ucBuffer[1]) << 8 | ucBuffer[0]; + SkyWalkerDebugPrint(EXTREME_LEVEL,("ulSignalStrength = %lu,ucBuffer[1] = 0x%02X, ucBuffer[2] = 0x%02X\n", + ulSignalStrength,ucBuffer[1],ucBuffer[0])); + //*pulSigStrength = (int)(ucBuffer[1]) << 8 | ucBuffer[0]; + /* snr is reported in dBu*256 */ + /* snr / 38.4 ~= 100% strength */ + /* snr * 17 returns 100% strength as 65535 */ + if (ulSignalStrength <= 0x0F00) + { + *pulSigStrength = (ulSignalStrength <<4) + ulSignalStrength; + } + else + { + *pulSigStrength = 0xFFFF; + } + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Strength = %lu\n",*pulSigStrength)); + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + +} + +/***************************************************************************** + Function : SetLnbVoltage + Description : This Function Sets the LNB Voltage + IN PARAM : Pointer to the KSDevice Object + Voltage to set 1 for 18V and 0 for 13V + OUT PARAM : STATUS_SUCCESS in case of successful Set + Failure Code in other cases + PreCondition : None + PostCondtion : Sets the LNB Voltage in case of successful execution + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS SetLnbVoltage(IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucVoltage) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("New Lnb Voltage (0 = 13V, 1 = 18V) = %02d \n",ucVoltage)); + + //gp8psk_usb_out_op(state->d,SET_LNB_VOLTAGE, + // voltage == SEC_VOLTAGE_18, 0, NULL, 0) + ntStatus = ControlUsbDevice( pKSDeviceObject, + SET_LNB_VOLTAGE, + (ucVoltage == SEC_VOLTAGE_18), + 0, + NULL, + 0, + false); + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + + +} + + +/***************************************************************************** + Function : TuneDevice + Description : This Function Tunes the Tuner + IN PARAM : Pointer to the KSDevice Object + Tuner parameters to set + OUT PARAM : STATUS_SUCCESS in case of successful Set + Failure Code in other cases + PreCondition : None + PostCondtion : Tuners the Tuner in case of successful execution + Logic : NONE + Assumption : NONE + Note : To tune the Tuner following command needs to be sent + 9 8 7 6 5 4 3 2 1 0 +================================================================================= +| FECR | MOD | TFQ0 | TFQ0 | TFQ0 | TFQ0 | SBR3 | SBR2 | SBR1 | SBR0 | +================================================================================= +Where FECR -> Inner FEC Rate (1 Byte) +MOD = Modulation = QPSK (1 Byte) +TF = Tuner Frequency (4 Bytes) +SBR = Symbol Rate (4 Bytes) + + Revision History: + *****************************************************************************/ +NTSTATUS TuneDevice(IN PKSDEVICE pKSDeviceObject, + IN PBDATUNER_DEVICE_PARAMETER pDeviceParameter) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + UCHAR ucCommand[10]; + ULONG ulTempFrequency = 0L; + ULONG ulTunerFrequency = 0L; + ULONG ulLOFrequency = 0L; + ULONG ulTempSymbolRate = 0L; + + PrintFunctionEntry(__FUNCTION__); + + //Setting the Local Oscillator Frequency + if(pDeviceParameter->ulLnbSwitchFrequency >= pDeviceParameter->ulCarrierFrequency) + { + ulLOFrequency = pDeviceParameter->ulLnbLowLOFrequency; + } + else + { + ulLOFrequency = pDeviceParameter->ulLnbHighLOFrequency; + } + + //Getting the Frequency to be tuned based on the Carrier frequency and + //Local Oscillator frequency (LOF) + if(pDeviceParameter->ulCarrierFrequency > ulLOFrequency) + { + ulTempFrequency = pDeviceParameter->ulCarrierFrequency - ulLOFrequency; + } + else + { + ulTempFrequency = ulLOFrequency - pDeviceParameter->ulCarrierFrequency; + } + + if( (ulTempFrequency < TUNER_FREQ_MIN) || + (ulTempFrequency > TUNER_FREQ_MAX)) + { + SkyWalkerDebugPrint(EXTREME_LEVEL, + ("Frequency Out of Bound %lu, Resetting to %lu\n", + ulTempFrequency,TUNER_FREQ_MIN)); + ulTempFrequency = TUNER_FREQ_MIN; + } + ulTunerFrequency= ulTempFrequency * pDeviceParameter->ulFrequencyMultiplier; + + //Symbol Rate should be in Sample Per Second thus converting the + //Kilo Samples per Second (ksps) to Samples Per Second (sps) + ulTempSymbolRate = pDeviceParameter->ulSymbolRate * 1000; + + SkyWalkerDebugPrint(EXTREME_LEVEL,("New Symbol Rate = %lu sps (%lu ksps)\n" + "Carrier Frequency = %lu\n" + "Local Oscillator Freq = %lu\n" + "Frequency Multiplier = %lu\n" + "Tuner Frequency = %lu\n" + "New Modulation Type (QPSK = 0)= %lu\n" + "New FEC Rate (VITERBI = 1)= %lu \n", + ulTempSymbolRate, + pDeviceParameter->ulSymbolRate, + pDeviceParameter->ulCarrierFrequency, + ulLOFrequency, + pDeviceParameter->ulFrequencyMultiplier, + ulTunerFrequency, + ADV_MOD_DVB_QPSK, + pDeviceParameter->InnerFecRate)); + + ucCommand[0] = (UCHAR)(ulTempSymbolRate & 0xFF); + ucCommand[1] = (UCHAR)((ulTempSymbolRate >> 8) & 0xFF); + ucCommand[2] = (UCHAR)((ulTempSymbolRate >> 16) & 0xFF); + ucCommand[3] = (UCHAR)((ulTempSymbolRate >> 24) & 0xFF); + + ucCommand[4] = (UCHAR)(ulTunerFrequency & 0xFF); + ucCommand[5] = (UCHAR)((ulTunerFrequency >> 8) & 0xFF); + ucCommand[6] = (UCHAR)((ulTunerFrequency >> 16) & 0xFF); + ucCommand[7] = (UCHAR)((ulTunerFrequency >> 24) & 0xFF); + + ucCommand[8] = ADV_MOD_DVB_QPSK; + ucCommand[9] = 0x05; + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Tune Command : Symbol Rate = 0x%02X%02X%02X%02X," + "Frequency = 0x%02X%02X%02X%02X", + ucCommand[3],ucCommand[2],ucCommand[1],ucCommand[0], + ucCommand[7],ucCommand[6],ucCommand[5],ucCommand[4])); + + //gp8psk_usb_out_op(state->d,TUNE_8PSK,0,0,cmd,10); + ntStatus = ControlUsbDevice( pKSDeviceObject, + TUNE_8PSK, + 0, + 0, + ucCommand, + 10, + false); + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : SetupTunerPower + Description : Function to used to Setup the SkyWalker1 Device Power + IN PARAM : Pointer to Device Object which needs Power setup + Switch on / Switch Off + OUT PARAM : ntStatus of the SkyWalker1 Power Setup + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Device ready for the Operation + Logic : Linux Method to Setup the Device + 1) Download Firmware (Not done here) + 2) Set Power State to ON + 3) Read 8PSK Config ntStatus + 4) if(Device not Started) then Start it + 5) if(BCM4500 Firmware not loaded) then load it + 6) if (LNB Power not set) then Set it + 7) Set DVB_MODE to 1 + 8) Read Again the 8PSK Config ntStatus + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS SetupTunerPower( IN PKSDEVICE pKSDeviceObject, + IN BOOLEAN bOnOff) +{ + + NTSTATUS ntStatus = STATUS_SUCCESS; + UCHAR ucDeviceConfig = 0; + UCHAR ucBuffer = 0; + + PrintFunctionEntry(__FUNCTION__); + + if (bOnOff) + { + //If Tuner Power On + + //Read the Tuner Configuration First + //gp8psk_usb_in_op(d, GET_8PSK_CONFIG,0,0,&status,1); + ntStatus = ControlUsbDevice( pKSDeviceObject, + GET_8PSK_CONFIG, + 0, + 0, + &ucDeviceConfig, + 1, + true); + + if(!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Read the Device Configuration\n")); + goto ExitSetupPower; + + } + + SkyWalkerDebugPrint(EXTREME_LEVEL, + ("Device Status Bit0:Device Start,Bit1:Firmware Loaded," \ + "Bit2:LNB Powerup = 0x%02X\n", + ucDeviceConfig)); + + if (!(ucDeviceConfig & bm8pskStarted)) /* Device Start ntStatus BIT-0 */ + { + //Device Not Started + //Send the Boot Command to the Device + //gp8psk_usb_in_op(d, BOOT_8PSK, 1, 0, &buf, 1)) + ntStatus = ControlUsbDevice( pKSDeviceObject, + BOOT_8PSK, + 1, + 0, + &ucBuffer, + 1, + true); + if(!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Boot the Device\n")); + goto ExitSetupPower; + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Boot Response 0x%02X\n",ucBuffer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Device Bootedup\n")); + + } + + if (!(ucDeviceConfig & bm8pskFW_Loaded)) /* Firmware ntStatus BIT-1 */ + { + //Firmware Not Loaded + SkyWalkerDebugPrint(ENTRY_LEVEL,("Firmware not Loaded\n")); + } + + if (!(ucDeviceConfig & bmIntersilOn)) /* LNB Power Status BIT-2 */ + { + //LNB Not powered On + //Sent the Power On Command to the LNB + ucBuffer = 0; + //gp8psk_usb_in_op(d, START_INTERSIL, 1, 0,&buf, 1)) + ntStatus = ControlUsbDevice( pKSDeviceObject, + START_INTERSIL, + 1, + 0, + &ucBuffer, + 1, + true); + if(!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Powerup the Device\n")); + goto ExitSetupPower; + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("LNB Powerup Response 0x%02X\n",ucBuffer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Device Poweredup\n")); + + } + + /* Abort possible TS (if previous tune crashed) */ + //gp8psk_usb_out_op(d, ARM_TRANSFER, 0, 0, NULL, 0) + ntStatus = ControlUsbDevice( pKSDeviceObject, + ARM_TRANSFER, + 0, + 0, + NULL, + 0, + false); + + //Reread the Device Configuration + //gp8psk_usb_in_op(d, GET_8PSK_CONFIG,0,0,&status,1); + ntStatus = ControlUsbDevice( pKSDeviceObject, + GET_8PSK_CONFIG, + 0, + 0, + &ucDeviceConfig, + 1, + true); + + if(!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Read the Device Configuration\n")); + goto ExitSetupPower; + + } + + SkyWalkerDebugPrint(EXTREME_LEVEL, + ("Device ntStatus Bit0:Device Start,Bit1:Firmware Loaded," \ + "Bit2:LNB Powerup = 0x%02X\n", + ucDeviceConfig)); + + + } + else + { + //Turn Off LNB Power + //gp8psk_usb_in_op(d, START_INTERSIL, 0, 0, &buf, 1) + ucBuffer = 0; + ntStatus = ControlUsbDevice( pKSDeviceObject, + START_INTERSIL, + 0, + 0, + &ucBuffer, + 1, + true); + if(!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Powerdown the LNB\n")); + goto ExitSetupPower; + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("LNB Powerdown Response 0x%02X\n",ucBuffer)); + + //Turn Off 8PSK Power + //gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1) + ucBuffer = 0; + ntStatus = ControlUsbDevice( pKSDeviceObject, + BOOT_8PSK, + 0, + 0, + &ucBuffer, + 1, + true); + if(!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Powerdown the SkyWalker1\n")); + goto ExitSetupPower; + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Tuner Powerdown Response 0x%02X\n",ucBuffer)); + } + +ExitSetupPower: + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + +} +/***************************************************************************** + Function : SetStreamingControl + Description : This Function Enables / Disables the Streaming + IN PARAM : Pointer to the KSDevice Object + Streaming Control 1 for ON and 0 for OFF + OUT PARAM : STATUS_SUCCESS in case of successful Set + Failure Code in other cases + PreCondition : None + PostCondtion : Controls Streaming in case of successful execution + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS SetStreamingControl( IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucOnOff) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Streaming Control (0 = OFF, 1 = ON) = %02d \n",ucOnOff)); + + //gp8psk_usb_out_op(adap->dev, ARM_TRANSFER, onoff, 0 , NULL, 0); + ntStatus = ControlUsbDevice( pKSDeviceObject, + ARM_TRANSFER, + ucOnOff, + 0, + NULL, + 0, + false); + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : SetTunerTone + Description : This Function Sets the Tuner Tone + IN PARAM : Pointer to the KSDevice Object + Tuner Tone : 0 for TONE ON and 1 for TONE OFF + OUT PARAM : STATUS_SUCCESS in case of successful Set + Failure Code in other cases + PreCondition : None + PostCondtion : Sets the Tuner Tone in case of successful execution + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS SetTunerTone( IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucTone) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Tuner Tone (0 = TONE_ON, 1 = TONE_OFF) = %02d \n",ucTone)); + + //gp8psk_usb_out_op(state->d,SET_22KHZ_TONE, + // (tone == SEC_TONE_ON), 0, NULL, 0) + ntStatus = ControlUsbDevice( pKSDeviceObject, + SET_22KHZ_TONE, + (ucTone == 0), + 0, + NULL, + 0, + false); + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : ConfigureTuner + Description : This Function Configures Tuner Frequency, Polarity, + Symbol Rate, Tone etc. + IN PARAM : Pointer to the KSDevice Object + Configuration to tune + OUT PARAM : STATUS_SUCCESS in case of successful Set + Failure Code in other cases + PreCondition : None + PostCondtion : Configures the Tuner with the COnfiguration provided + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS ConfigureTuner(IN PKSDEVICE pKSDeviceObject, + IN PBDATUNER_DEVICE_PARAMETER pNewConfiguration) +{ + + NTSTATUS ntStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + //Set the LNB Voltage based on the Polarity + if((pNewConfiguration->Polarity == BDA_POLARISATION_LINEAR_H) || + (pNewConfiguration->Polarity == BDA_POLARISATION_CIRCULAR_L)) + { + //Set the LNB Voltage to 18 Volts + ntStatus = SetLnbVoltage(pKSDeviceObject,SEC_VOLTAGE_18); + } + else + { + //Set the LNB Voltage to 13 Volts + ntStatus = SetLnbVoltage(pKSDeviceObject,SEC_VOLTAGE_13); + } + if(NT_SUCCESS(ntStatus)) + { + ntStatus = SetTunerTone(pKSDeviceObject,SEC_TONE_OFF); + if(NT_SUCCESS(ntStatus)) + { + //Configure the updated resource on the hardware here. + ntStatus = TuneDevice(pKSDeviceObject,pNewConfiguration); + } + } + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : DiseqcCommand + Description : This Function Sends Diseqc Command to the Tuner + IN PARAM : Pointer to the KSDevice Object + Command to be sent to the Device + OUT PARAM : STATUS_SUCCESS in case of successful Set + Failure Code in other cases + PreCondition : None + PostCondtion : Diseqc Command sent to the Tuner + Logic : 1) Validate the Diseqc Message + 2) Check the Diseqc Message Length + 3) If length == 1 + Treat the Diseqc Command as the Simple Tone Burst + 4) Else + Treat it as normal Diseqc Command + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS DiseqcCommand( IN PKSDEVICE pKSDeviceObject, + IN PDISEQC_COMMAND pCommand) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + if( !IS_VALID(pCommand) || + (pCommand->ucMessageLength == 0) || + (pCommand->ucMessageLength == 2) || + (pCommand->ucMessageLength > MAX_DISEQC_COMMAND_LENGTH)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Invalid Diseqc Command Received \n")); + ntStatus = STATUS_INVALID_PARAMETER; + goto ExitDiseqcCommand; + } + + if(pCommand->ucMessageLength == 1) + { + //Simple Tone Burst + UCHAR ucBurst = (pCommand->ucMessage[0] == SEC_MINI_A) ? 0x00 : 0x01; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Sending Simple Tone Burst Command = 0x%02X \n",ucBurst)); + //gp8psk_usb_out_op(st->d,SEND_DISEQC_COMMAND, cmd, 0,&cmd, 0) + ntStatus = ControlUsbDevice( pKSDeviceObject, + SEND_DISEQC_COMMAND, + ucBurst, + 0, + &ucBurst, + 0, + false); + + } + else + { + //Normal Diseqc Command + SkyWalkerDebugPrint(EXTREME_LEVEL,("Sending Normal Diseqc Command\n")); + PrintDiseqcCommand(pCommand); + //gp8psk_usb_out_op(st->d,SEND_DISEQC_COMMAND, m->msg[0], 0,m->msg, m->msg_len) + ntStatus = ControlUsbDevice( pKSDeviceObject, + SEND_DISEQC_COMMAND, + pCommand->ucMessage[0], + 0, + pCommand->ucMessage, + pCommand->ucMessageLength, + false); + + } + +ExitDiseqcCommand: + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +VOID PrintDiseqcCommand(PDISEQC_COMMAND pDiseqcCommand) +{ + if(pDiseqcCommand) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessage[0] = 0x%02X\n",pDiseqcCommand->ucMessage[0])); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessage[1] = 0x%02X\n",pDiseqcCommand->ucMessage[1])); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessage[2] = 0x%02X\n",pDiseqcCommand->ucMessage[2])); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessage[3] = 0x%02X\n",pDiseqcCommand->ucMessage[3])); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessage[4] = 0x%02X\n",pDiseqcCommand->ucMessage[4])); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessage[5] = 0x%02X\n",pDiseqcCommand->ucMessage[5])); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pDiseqcCommand->ucMessageLength = %02u\n",pDiseqcCommand->ucMessageLength)); + } +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Device.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Device.cpp new file mode 100644 index 0000000..9464d05 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Device.cpp @@ -0,0 +1,1142 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Device.cpp + Author : + Date : + Purpose : Main Skywalker Device level Implementation + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Header for the Tuner related definitions + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +static ULONG ulDeviceInstance = 0; +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +void PrintDMAAdapter(PDMA_ADAPTER pDMAAdapter); +void PrintMappingInfo(IN PKSMAPPING pMapping); + +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : CSkyWalker1Device::Create + Description : This Function is called during the Add Device IRP Processing + IN PARAM : Pointer to the Enumerated Physical Device + KSDEVICE is a WDM Functional Device which is managed by the AVStream + OUT PARAM : ntStatus of the Device Addition + STATUS_SUCCESS when the Device added to the System + Reason for Failure incase of Error + PreCondition : Driver is Loaded without Functional/ Filter Device Objects + PostCondtion : Functional Device Object [FDO] or Filter Device Object [FiDO] are created + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::Create(IN PKSDEVICE pKSDeviceObject) +{ + NTSTATUS ntCreateStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if (pKSDeviceObject) + { + + //Point the KSDEVICE at our device class. + pKSDeviceObject->Context = this; + + m_pKSDevice = pKSDeviceObject; + + //Make the resource available for a filter to use. + m_ulcResourceUsers = 0; + m_ulCurResourceID = 0; + + //Get the instance number of this device. + m_ulDeviceInstance = ulDeviceInstance++; + + //Hold requests until the device is started + QueueState = HoldRequests; + + //Initialize the stop event to signaled. + KeInitializeEvent(&EvDeviceStopOk, //PKEVENT + NotificationEvent, //Type + TRUE); //State + + //Initialize the remove event to not-signaled. + KeInitializeEvent(&EvDeviceRemoveOk, //PKEVENT + NotificationEvent, //Type + FALSE); //State + + //The KeInitializeSpinLock routine initializes a variable of + //type KSPIN_LOCK. + KeInitializeSpinLock(&DeviceStateLock); + INITIALIZE_PNP_STATE(this); + + //OutstandingIo count biased to 1. + //Transition to 0 during remove device means IO is finished. + //Transition to 1 means the device can be stopped + + ulOutStandingIoCount = 1; + KeInitializeSpinLock(&kIoCountLock); + + } + else + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Invalid KS Device Object Received\n")); + ntCreateStatus = STATUS_INVALID_PARAMETER; + } + + PrintFunctionExit(__FUNCTION__,ntCreateStatus); + return ntCreateStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::Start + Description : This function Initializes the Tuner Hardware + IN PARAM : Reference to Device to be Started + IoRequest Packet + Resource List + Translated Resource List + OUT PARAM : ntStatus of the Tuner Start + STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : Stopped Device or Device Enumerated for the First Time + PostCondtion : Device Initialized with the Newly allocated Resources, + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ + +NTSTATUS CSkyWalker1Device::Start( + IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket, + IN PCM_RESOURCE_LIST pResourceList OPTIONAL, + IN PCM_RESOURCE_LIST pTranslatedResourceList OPTIONAL + ) +{ + NTSTATUS ntStartStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = NULL; + PKSFILTERFACTORY pKSFilterFactory = NULL; + + PrintFunctionEntry(__FUNCTION__); + + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + //Initialize the Tuner Hardware. + ntStartStatus = pDevice->InitializeTuner(pKSDeviceObject,pIoRequestPacket); + SkyWalkerDebugPrint(EXTREME_LEVEL,("USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE = %d",USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE)); + + if (ntStartStatus == STATUS_SUCCESS) + { + //Create the the Filter Factory. This factory is used to + //create instances of the filter. + ntStartStatus = BdaCreateFilterFactoryEx( + pKSDeviceObject, + &SkyWalker1TunerFilterDescriptor, + &TunerFilterTemplate, + &pKSFilterFactory + ); + } + + if ((ntStartStatus == STATUS_SUCCESS) && pKSFilterFactory) + { + BdaFilterFactoryUpdateCacheData( + pKSFilterFactory, + TunerFilterTemplate.pFilterDescriptor + ); + } + + + PrintFunctionExit(__FUNCTION__,ntStartStatus); + return ntStartStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::Stop + Description : This routine is invoked when the device is stopped. + This routine services Irp of minor type IRP_MN_STOP_DEVICE + IN PARAM : Pointer to KS Device Object + STOP DEVICE Irp + OUT PARAM : ntStatus of the Device Stop + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : USB Device Stopped + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::Stop( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntDeviceStopStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + if(m_pDMAAdapter) + { + m_pDMAAdapter->DmaOperations->PutDmaAdapter(m_pDMAAdapter); + m_pDMAAdapter = NULL; + } + + //Maintain the USB ntStatus i.e Remove the Selected Configuration by sending Null descriptor + ntDeviceStopStatus = StopUsbDevice(pKSDeviceObject,pIoRequestPacket); + + PrintFunctionExit(__FUNCTION__,ntDeviceStopStatus); + + return ntDeviceStopStatus; +} + + +/***************************************************************************** + Function : CSkyWalker1Device::Close + Description : This routine is invoked when the device is Removed. + This routine services Irp of minor type IRP_MN_REMOVE_DEVICE + IN PARAM : Pointer to KS Device Object + STOP DEVICE Irp + OUT PARAM : ntStatus of the Device Remove + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : USB Device Removed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::Close( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntDeviceCloseStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + ntDeviceCloseStatus = RemoveUsbDevice(pKSDeviceObject,pIoRequestPacket); + + PrintFunctionExit(__FUNCTION__,ntDeviceCloseStatus); + + return ntDeviceCloseStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::SetPower + Description : This routine is invoked when the Power Irp is received + This routine services Irp of minor type IRP_MJ_POWER + IN PARAM : Pointer to KS Device Object + STOP DEVICE Irp + OUT PARAM : ntStatus of the Set POwer + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : Power Condition Managed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::SetPower( + IN PKSDEVICE pKSDeviceObject, //Pointer to the device object + //provided by the system. + IN PIRP pIoRequestPacket, //Pointer to the IRP related to this request. + IN DEVICE_POWER_STATE To, //Requested power state. + IN DEVICE_POWER_STATE From //Current power state. +) +{ + NTSTATUS ntSetPowerStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + //Set USB Power condition from here + + PrintFunctionExit(__FUNCTION__,ntSetPowerStatus); + + return ntSetPowerStatus; +} + + +/***************************************************************************** + Function : CSkyWalker1Device::InitializeTuner + Description : This function is used to setup and initialize the Tuner + Interface + IN PARAM : Reference to Device to be Started + IoRequest Packet + OUT PARAM : ntStatus of the Tuner Initializations + STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : Stopped Device or Device Enumerated for the First Time + PostCondtion : Device Initialized with the Newly allocated Resources, + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::InitializeTuner( + IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntInitStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //Initialize the USB hardware here. + ntInitStatus = InitializeUsbDevice(pKSDeviceObject,pIoRequestPacket); + if(!NT_SUCCESS(ntInitStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Failed to Initialize the USB Device\n")); + goto ExitInitTuner; + } + + //Setup the SkyWalker1 Device + ntInitStatus = SetupTunerPower(pKSDeviceObject,SWITCH_ON_TUNER); + if(!NT_SUCCESS(ntInitStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Failed to Setup the SkyWalker1 Device\n")); + goto ExitInitTuner; + } + + //Initialize Adapter + ntInitStatus = InitializeAdapterStream(pKSDeviceObject); + if(!NT_SUCCESS(ntInitStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Failed to Initialize the Adapter Stream\n")); + goto ExitInitTuner; + } + +ExitInitTuner: + + PrintFunctionExit(__FUNCTION__,ntInitStatus); + return ntInitStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::InitializeAdapterStream + Description : This function is used to Register the Adapter Object and + setup the Private Memory for the Streams + IN PARAM : Reference to KS Device Object + OUT PARAM : ntStatus of the Adapter Stream Initialization + STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Adapter Object Registered with the AVStream and Streaming + Memory allocated + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::InitializeAdapterStream( + IN PKSDEVICE pKSDeviceObject) +{ + + NTSTATUS ntInitStatus = STATUS_SUCCESS; + DEVICE_DESCRIPTION DeviceDescription; //Object to hold the Device description + ULONG ulMaxDMAMapRegisters = 0L; + + PrintFunctionEntry(__FUNCTION__); + + //Create DMA adapter + + memset(&DeviceDescription, 0, sizeof(DeviceDescription)); + + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; + DeviceDescription.Master = TRUE; + DeviceDescription.ScatterGather = TRUE; + DeviceDescription.Dma32BitAddresses = TRUE; + DeviceDescription.Dma64BitAddresses = FALSE; + DeviceDescription.DmaChannel = ((ULONG) ~0); + DeviceDescription.InterfaceType = PCIBus; + DeviceDescription.MaximumLength = 0xfffffff8; + + //not used + DeviceDescription.IgnoreCount; + DeviceDescription.DemandMode; + DeviceDescription.AutoInitialize; + DeviceDescription.DmaWidth; + DeviceDescription.Reserved1; + DeviceDescription.DmaSpeed; + DeviceDescription.DmaPort; + + //The IoGetDmaAdapter routine returns a pointer to the DMA adapter structure + //for a physical device object. + m_pDMAAdapter = IoGetDmaAdapter( + pKSDeviceObject->PhysicalDeviceObject, //Pointer to Physical Device Object + //requesting the DMA Adapter structure + &DeviceDescription, //Pointer to the Device Descriptor Structure which + //describes the attributes of the Structure + &ulMaxDMAMapRegisters); //Maximum Map registers that driver can allocate for + //Dma transfer + if(!IS_VALID(m_pDMAAdapter)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to get the Dma Adapter for the Device\n")); + ntInitStatus = STATUS_UNSUCCESSFUL; + goto ExitInitAdapter; + + } + + if(!IS_VALID(m_pDMAAdapter->DmaOperations)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Dma Operatios found for the DMA Adapter\n")); + ntInitStatus = STATUS_UNSUCCESSFUL; + goto ExitInitAdapter; + } + + //Print the DMA Adapter details + PrintDMAAdapter(m_pDMAAdapter); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Number of Map Registers = %lu\n",ulMaxDMAMapRegisters)); + + //Register the DMA Adapter with the AVStream + //The KsDeviceRegisterAdapterObject function registers a DMA adapter object with + //AVStream for performing scatter/gather DMA on the specified device. + KsDeviceRegisterAdapterObject( + pKSDeviceObject, //Device For which to register an adapter object + m_pDMAAdapter, //Pointer to DMA Adapter (IoGetDmaAdapter) + 0xfffffff8, //Maximum number of bytes that device can handle for a single mapping + sizeof(KSMAPPING)); //Number of bytes each entry in the mapping table requires + + //Allocate the Space for storing the Streaming contents + KeInitializeEvent (&m_HardwareEvent,SynchronizationEvent,FALSE); + + RtlZeroMemory(pUsbStreamIrp,sizeof(pUsbStreamIrp)); + +ExitInitAdapter: + + PrintFunctionExit(__FUNCTION__,ntInitStatus); + return ntInitStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::ReadStream + Description : This function is called when streaming data from the USb + is requested to read.This function is called when the streaming + is started and every time after Stream processing to read a + new Stream + IN PARAM : Index of the Stream to Read + OUT PARAM : ntStatus of the Read Stream + STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Stream Read + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::ReadStream(IN ULONG ulStreamIndex) +{ + NTSTATUS ntReadStreamStatus = STATUS_SUCCESS; + PUCHAR pStreamBuffer = NULL; + ULONG ulPacketCount = PACKET_PER_FRAME; + ULONG ulPacketSize = MAX_BULK_PACKET_SIZE ; + + PrintFunctionEntry(__FUNCTION__); + + //Get the Stream buffer related to the Current Stream index + pStreamBuffer = m_SynthesisBuffer[ulStreamIndex]; + //Set the number of Bytes read + m_NumberOfBytesRead[ulStreamIndex] = 0; + + //Send the Read request of the 4K Size Each + for(ULONG ulPacketIndex = 0; ulPacketIndex <= ulPacketCount-1 ; ulPacketIndex++) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("pStreamBuffer[%03lu] = 0x%p",ulPacketIndex,pStreamBuffer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("m_SampleSize = %lu",m_SampleSize)); + if(IS_VALID(pStreamBuffer)) + { + if(ulPacketIndex == 23) + { + ulPacketSize = 2048; + } + ntReadStreamStatus = ReadWriteUsbDevice( m_pKSDevice, + ulStreamIndex, + ulPacketIndex, + pStreamBuffer, + ulPacketSize , + true + ); + + + if(NT_SUCCESS(ntReadStreamStatus)) + { + SkyWalkerDebugPrint(EXTREME_LEVEL, ("Sent the Stream Read Request\n")); + } + else + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to Send Stream Read from the Device")); + } + + pStreamBuffer += ulPacketSize; + } + else + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Invalid Stream Aborting Stream Read\n")); + break; + } + } + PrintFunctionExit(__FUNCTION__,ntReadStreamStatus); + + return ntReadStreamStatus; + + +} + +/***************************************************************************** + Function : CSkyWalker1Device::GetStatus + Description : This function is used to Get the Current ntStatus of the + Tuner i.e. Current Carrier Freq. Signal Locked status etc. + IN PARAM : Device ntStatus + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Device ntStatus updated and returned + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::GetStatus(OUT PBDATUNER_DEVICE_STATUS pDeviceStatus) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + pDeviceStatus->fCarrierPresent = FALSE; + pDeviceStatus->fSignalLocked = FALSE; + pDeviceStatus->dwSignalQuality = 0; + pDeviceStatus->dwSignalStrength = 0; + + PrintFunctionEntry(__FUNCTION__); + + if(m_HardwareState != HardwareRunning) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Streaming is not started yet\n")); + ntStatus = STATUS_UNSUCCESSFUL; + goto ExitGetStatus; + + } + + if(TimeToReadSignalStatus()) + { + //It's Time to read Signal Status + //Get the signal status from the HW here + ReadTunerSignalStrength(m_pKSDevice, + &m_TunerStatus.dwSignalStrength); + + m_TunerStatus.dwSignalQuality = (m_TunerStatus.dwSignalStrength * 100)/65535; + + GetSignalStatus(m_pKSDevice, + &m_TunerStatus.fSignalLocked); + + + if(m_TunerStatus.fSignalLocked) + { + m_TunerStatus.fCarrierPresent = TRUE; + } + } + + *pDeviceStatus = m_TunerStatus; + +#ifdef FAKE_SIGNAL + pDeviceStatus->dwSignalStrength = 2; + pDeviceStatus->dwSignalQuality = 99; + pDeviceStatus->fCarrierPresent = TRUE; + pDeviceStatus->fSignalLocked = TRUE; +#endif + +ExitGetStatus : + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::TimeToReadSignalStatus + Description : This function is used Check whether time to read + the status from device has occurred or not + IN PARAM : NONE + OUT PARAM : TRUE = Time to read status from Device, + FALSE otherwise + PreCondition : None + PostCondtion : Whether time to read from device has occurred or not + is checked + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +BOOLEAN CSkyWalker1Device::TimeToReadSignalStatus(void) +{ + LARGE_INTEGER CurrentTime; + ULONG ulReadPeriod = 10 * 1000 * 1000; + KeQuerySystemTime (&CurrentTime); + + //If Current time is greater than the last + if(m_TunerStatus.fSignalLocked == FALSE) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Not Locked Reading Status @ 100msec\n")); + ulReadPeriod = 10 * 1000 * 100; + } + if(CurrentTime.QuadPart - m_PreviousStatusReadTime.QuadPart >= ulReadPeriod) + { + m_PreviousStatusReadTime.QuadPart = CurrentTime.QuadPart; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Time to read signal status\n")); + return TRUE; + } + + return FALSE; +} + +/***************************************************************************** + Function : CSkyWalker1Device::Acquire + Description : This function is used to set the Tuner parameters and + called once when the tuner resources are acquired + From this function various device related command are executed + to set the device parameters + IN PARAM : New Device Parameters to be set + Resource ID + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Device ntStatus updated and returned + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::Acquire( + IN PBDATUNER_DEVICE_PARAMETER pNewResource, + OUT PULONG pulAcquiredResourceID + ) +{ + NTSTATUS ntAcquireStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //Continue only if the Device is acquired currently + if (!m_ulcResourceUsers) + { + m_CurResource = *pNewResource; + + //Generate a new resource ID and hand it back. + m_ulCurResourceID += 25; + *pulAcquiredResourceID = m_ulCurResourceID; + m_ulcResourceUsers += 1; + + //Configure the new resource on the hardware here. + //Send the Tune, SetLnbVoltage etc Commands from here + ConfigureTuner(m_pKSDevice,pNewResource); + + } + else + { + //Only one active filter is allowed + ntAcquireStatus = STATUS_DEVICE_BUSY; + } + + PrintFunctionExit(__FUNCTION__,ntAcquireStatus); + return ntAcquireStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::Update + Description : This function is used to set the Tuner parameters and + called everytime after the tuner resources are acquired + From this function various device related command are executed + to set the device parameters + IN PARAM : New Device Parameters to be set + Resource ID + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Device ntStatus updated and returned + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::Update( + IN PBDATUNER_DEVICE_PARAMETER pNewResource, + IN ULONG ulResourceID + ) +{ + NTSTATUS ntUpdateStatus = STATUS_SUCCESS; + LONGLONG ulhzFrequency; + + PrintFunctionEntry(__FUNCTION__); + + //Continue only if the Device is acquired currently + if (m_ulcResourceUsers && (ulResourceID == m_ulCurResourceID)) + { + m_CurResource = *pNewResource; + + //Configure the new resource on the hardware here. + //Send the Tune, SetLnbVoltage etc Commands from here + ConfigureTuner(m_pKSDevice,pNewResource); + + } + else + { + //Only one active filter is allowed + ntUpdateStatus = STATUS_INVALID_DEVICE_REQUEST; + } + + PrintFunctionExit(__FUNCTION__,ntUpdateStatus); + return ntUpdateStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::SendDiseqcCommand + Description : This function is used to send the Diseqc Command to the Tuner + IN PARAM : Diseqc Command to be sent to the Tuner + Resource ID + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Diseqc Command sent to the Tuner + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::SendDiseqcCommand( + IN PDISEQC_COMMAND pDiseqcCommand, + IN ULONG ulResourceID + ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //Continue only if the Device is acquired currently + //if (m_ulcResourceUsers && (ulResourceID == m_ulCurResourceID)) + { + + SkyWalkerDebugPrint(EXTREME_LEVEL,("m_ulcResourceUsers = %lu\n",m_ulcResourceUsers)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("ulResourceID = %lu\n",ulResourceID)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("m_ulCurResourceID = %lu\n",m_ulCurResourceID)); + //Send the Diseqc Command to the Tuner device + DiseqcCommand(m_pKSDevice,pDiseqcCommand); + + } + //else + //{ + // //Only one active filter is allowed + // ntStatus = STATUS_INVALID_DEVICE_REQUEST; + // } + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::Release + Description : This function is used to decrement the Resource User count + to allow other filters to use the resources + IN PARAM : Resource ID + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Device ntStatus updated and returned + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::Release(IN ULONG ulResourceID) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + if(m_ulcResourceUsers && (ulResourceID == m_ulCurResourceID)) + { + //Free the resource to be used by another filter. + m_ulcResourceUsers--; + } + else + { + ntStatus = STATUS_INVALID_DEVICE_REQUEST; + } + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : CSkyWalker1Device::StartStream + Description : This function is used to Initialize the Prestreaming + parameters and also it sends the Streaming command to + the Tuner + IN PARAM : NONE + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Streaming Started on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::StartStream () +{ + + NTSTATUS ntStreamStartStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //Initializing the Streaming Parameters + + m_TimePerFrame = m_TransportInfo->AvgTimePerFrame; + m_SampleSize = m_TransportInfo->ulcbPhyiscalFrame; + m_PacketSize = m_TransportInfo->ulcbPhyiscalPacket; + m_PacketsPerSample = m_TransportInfo->ulcbPhyiscalFrame / m_TransportInfo->ulcbPhyiscalPacket; + m_TunerStatus.fCarrierPresent = FALSE; + m_TunerStatus.fSignalLocked = FALSE; + m_TunerStatus.dwSignalQuality = 0; + m_TunerStatus.dwSignalStrength = 0; + + + //Allocate a scratch buffer for the Streaming Buffer. + + for(int nBufferIndex = 0 ; + nBufferIndex < SIZEOF_ARRAY(m_SynthesisBuffer); + nBufferIndex++) + { + m_SynthesisBuffer[nBufferIndex] = reinterpret_cast ( + ExAllocatePoolWithTag ( + NonPagedPool, + m_SampleSize, + CAPTURE_MEM_TAG + ) + ); + + if (!IS_VALID(m_SynthesisBuffer)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Insufficient Resource for Scatter/Gather DMA\n")); + ntStreamStartStatus = STATUS_INSUFFICIENT_RESOURCES; + goto ExitStreamStart; + } + + } + + //Send Device Streaming Start Control + SetStreamingControl(m_pKSDevice,1); + m_HardwareState = HardwareRunning; + +ExitStreamStart: + PrintFunctionExit(__FUNCTION__,ntStreamStartStatus); + return ntStreamStartStatus; + +} + +/***************************************************************************** + Function : CSkyWalker1Device::PauseStream + Description : This function is used to Pause/Run the Streaming if On/Off. + IN PARAM : True : Pause Streaming , False : Start Streaming + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Streaming Paused/Started on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::PauseStream (BOOLEAN bPausing) +{ + + NTSTATUS ntStreamPauseStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //If Streaming is in Progress then Stop the Streaming by + //Stop sending read requests and Cancelling any on going IRP + if (bPausing && (m_HardwareState == HardwareRunning)) + { + m_StopHardware = TRUE; + //Stop Streaming + SetStreamingControl(m_pKSDevice,0); + + for(int ulPacketIndex = 0; + ulPacketIndex < SIZEOF_ARRAY(pUsbStreamIrp) ; + ulPacketIndex++) + { + if(pUsbStreamIrp[ulPacketIndex]) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Cancelling pUsbStreamIrp[%lu] = 0x%p\n", + ulPacketIndex,pUsbStreamIrp[ulPacketIndex])); + IoCancelIrp(pUsbStreamIrp[ulPacketIndex]); + pUsbStreamIrp[ulPacketIndex] = NULL; + + KeWaitForSingleObject ( + &m_HardwareEvent, + Suspended, + KernelMode, + FALSE, + NULL + ); + + KeResetEvent(&m_HardwareEvent); + m_StopHardware = TRUE; + } + } + + m_HardwareState = HardwarePaused; + + } + else if (!bPausing && (m_HardwareState == HardwarePaused) ) + { + + m_HardwareState = HardwareRunning; + + //Start Streaming + SetStreamingControl(m_pKSDevice,1); + + } + + PrintFunctionExit(__FUNCTION__,ntStreamPauseStatus); + return ntStreamPauseStatus; + +} + +/***************************************************************************** + Function : CSkyWalker1Device::StopStream + Description : This function is used to Stop the Streaming if On. + IN PARAM : NONE + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Streaming Stopped on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device::StopStream () +{ + + NTSTATUS ntStreamStopStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //Stop the Streaming in case it's already on + if (m_HardwareState == HardwareRunning) + { + m_StopHardware = TRUE; + //Stop Streaming + SetStreamingControl(m_pKSDevice,0); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("SIZEOF_ARRAY[pUsbStreamIrp] = %d\n", + SIZEOF_ARRAY(pUsbStreamIrp))); + + for(int ulPacketIndex = 0; + ulPacketIndex < SIZEOF_ARRAY(pUsbStreamIrp) ; + ulPacketIndex++) + { + if(pUsbStreamIrp[ulPacketIndex]) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Cancelling pUsbStreamIrp[%lu] = 0x%p\n", + ulPacketIndex,pUsbStreamIrp[ulPacketIndex])); + IoCancelIrp(pUsbStreamIrp[ulPacketIndex]); + pUsbStreamIrp[ulPacketIndex] = NULL; + + KeWaitForSingleObject ( + &m_HardwareEvent, + Suspended, + KernelMode, + FALSE, + NULL + ); + + KeResetEvent(&m_HardwareEvent); + m_StopHardware = TRUE; + } + } + + } + + m_HardwareState = HardwareStopped; + + for(int nBufferIndex = 0 ; + nBufferIndex < SIZEOF_ARRAY(m_SynthesisBuffer) ; + nBufferIndex++) + { + if (m_SynthesisBuffer[nBufferIndex]) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Freeing Streaming Buffer m_SynthesisBuffer[%lu] = 0x%p\n", + nBufferIndex,m_SynthesisBuffer[nBufferIndex])); + ExFreePool (m_SynthesisBuffer[nBufferIndex]); + m_SynthesisBuffer[nBufferIndex] = NULL; + } + } + + PrintFunctionExit(__FUNCTION__,ntStreamStopStatus); + return ntStreamStopStatus; + +} + +/***************************************************************************** + Function : CSkyWalker1Device::ProcessStream + Description : This function is used to Process the Streaming Data after + reading it.This function is called from the USB Read Write + Completion routine + IN PARAM : Index of the Stream whose read completed + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Read Stream is processed and Streaming data is filled into the + used Buffer. + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +void CSkyWalker1Device::ProcessStream(ULONG ulStreamIndex) +{ + + PrintFunctionEntry(__FUNCTION__); + + //The hardware can be in a pause state in which case, it issues interrupts + //but does not complete mappings. In this case, don't bother synthesizing + //a frame and doing the work of looking through the mappings table. + + if (m_HardwareState == HardwareRunning) + { + + SkyWalkerDebugPrint(EXTREME_LEVEL,("(%d * %d) = %lu\n", TRANSPORT_PACKET_SIZE, + TRANSPORT_PACKET_COUNT, + m_SampleSize)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("m_NumberOfBytesRead[%lu] = %lu\n", + ulStreamIndex, + m_NumberOfBytesRead[ulStreamIndex])); + + if (InterlockedCompareExchange((LONG *)&m_NumberOfBytesRead[ulStreamIndex], + m_SampleSize, m_SampleSize) == m_SampleSize) + { + //Inform the capture sink + m_CaptureSink->ReleaseStream(ulStreamIndex); + } + + } + + if (m_StopHardware) + { + + //If someone is waiting on the hardware to stop, raise the stop + //event and clear the flag. + SkyWalkerDebugPrint(EXTREME_LEVEL,("Sending the Stop Event\n")); + m_StopHardware = FALSE; + KeSetEvent (&m_HardwareEvent, IO_NO_INCREMENT, FALSE); + } + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + +} + +/***************************************************************************** + Function : CSkyWalker1Device::SetupCaptureSink + Description : Acquire hardware resources for the capture hardware. + If the resources are already acquired, this will return + an error.The hardware configuration must be passed as + a VideoInfoHeader. + IN PARAM : The capture sink attempting to acquire + resources. When scatter /gather mappings are completed, + the capture sink specified here is what is notified + of the completions. + Information about the capture stream. + This **MUST** remain stable until the caller releases + hardware resources. Note that this could also be guaranteed + by bagging it in the device object bag as well. + OUT PARAM : STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : None + PostCondtion : Capture Pin to the notified and Video Info Header set in case + of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CSkyWalker1Device:: SetupCaptureSink( + IN ICaptureSink *CaptureSink, + IN PBDA_TRANSPORT_INFO TransportInfo + ) +{ + + NTSTATUS ntStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //If we're the first pin to go into acquire (remember we can have + //a filter in another graph going simultaneously), grab the resources. + if (InterlockedCompareExchange(&m_PinsWithResources,1,0) == 0) + { + m_TransportInfo = TransportInfo; + m_CaptureSink = CaptureSink; + + } + else + { + + ntStatus = STATUS_SHARING_VIOLATION; + } + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + +} + +/***************************************************************************** + Function : CSkyWalker1Device::RemoveCaptureSink + Description : Release hardware resources. This should only be called by + an object which has acquired them. + IN PARAM : NONE + OUT PARAM : NONE + PreCondition : None + PostCondtion : Video Info Header and Capture Sink info cleared + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +void CSkyWalker1Device::RemoveCaptureSink() +{ + + PrintFunctionEntry(__FUNCTION__); + + m_TransportInfo = NULL; + m_CaptureSink = NULL; + + //Release our "lock" on hardware resources. This will allow another + //pin (perhaps in another graph) to acquire them. + InterlockedExchange(&m_PinsWithResources,0); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + +} + +void PrintDMAAdapter(PDMA_ADAPTER pDMAAdapter) +{ + SkyWalkerDebugPrint(ENTRY_LEVEL,("pDMAAdapter->Version = %u\n",pDMAAdapter->Version)); + SkyWalkerDebugPrint(ENTRY_LEVEL,("pDMAAdapter->Size = %u\n",pDMAAdapter->Size)); + SkyWalkerDebugPrint(ENTRY_LEVEL,("pDMAAdapter->DmaOperations = 0x%p\n",pDMAAdapter->DmaOperations)); +} + +void PrintMappingInfo(IN PKSMAPPING pMapping) +{ + SkyWalkerDebugPrint(ENTRY_LEVEL,("pMapping->PhysicalAddress = %llu\n",pMapping->PhysicalAddress.QuadPart)); + SkyWalkerDebugPrint(ENTRY_LEVEL,("pMapping->ByteCount = %lu\n",pMapping->ByteCount)); + SkyWalkerDebugPrint(ENTRY_LEVEL,("pMapping->Alignment = %lu\n",pMapping->Alignment)); + +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Installer.inf b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Installer.inf new file mode 100644 index 0000000..1a42430 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Installer.inf @@ -0,0 +1,142 @@ +; SkyWalker1Installer.INF -- This file installs SkyWalker1 Driver +; +[Version] +signature="$CHICAGO$" +Class=Media +ClassGUID={4d36e96c-e325-11ce-bfc1-08002be10318} +Provider=%SGI% +CatalogFile=SkyWalker1Installer.cat +DriverVer= 8/17/2009 + +; F i l e c o p y i n g s e c t i o n s (where the files go to). +; +[DestinationDirs] +DefaultDestDir=10,system32\drivers + +[Manufacturer] +%SGI%=SGI + +[ControlFlags] +;ExcludeFromSelect=* +;ExcludeFromSelect.NT=* + +; =================== Generic ================================== + +[SGI] +%SkyWalker1.DeviceDesc%=Skywalker1.Device,USB\VID_09C0&PID_0203 ;SkyWalker1 + +[Skywalker1.Device] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration, KSCAPTUR.Registration, BDA.Installation +AddReg = Skywalker1.AddReg +CopyFiles = Skywalker1.CopyDrivers + +[Skywalker1.Device.NT] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration.NT, KSCAPTUR.Registration.NT, BDA.Installation.NT +;AddReg = Skywalker1.AddReg +CopyFiles = Skywalker1.CopyDrivers +; KnownFiles = Skywalker1.KnownFiles + +[Skywalker1.Device.NT.Services] +Addservice=SkyWalker1TVTuner, 0x00000002, Skywalker1.AddService + +[Skywalker1.AddService] +DisplayName=%SkyWalker1.FriendlyName% +ServiceType=1 ; SERVICE_KERNEL_DRIVER +StartType=3 ; SERVICE_DEMAND_START +ErrorControl=1 ; SERVICE_ERROR_NORMAL +ServiceBinary=%10%\System32\Drivers\SkyWalker1TVTuner.sys +LoadOrderGroup=ExtendedBase + +[Skywalker1.CopyDrivers] +SkyWalker1TVTuner.sys + +[Skywalker1.AddReg] +HKR,,DevLoader,,*NTKERN +HKR,,NTMPDriver,,SkyWalker1TVTuner.sys +HKR,,PageOutWhenUnopened,3,01 + +[Skywalker1.Device.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,Skywalker1.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,Skywalker1.Tuner.Interfaces + +[Skywalker1.Device.NT.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,Skywalker1.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,Skywalker1.Tuner.Interfaces + +[Skywalker1.Tuner.Interfaces] +AddReg=Skywalker1.Tuner.Interfaces.AddReg + +[Skywalker1.Tuner.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker1.Tuner.FriendlyName% + +[Skywalker1.Receiver.Interfaces] +AddReg=Skywalker1.Receiver.Interfaces.AddReg + +[Skywalker1.Receiver.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker1.Receiver.FriendlyName% + + +[Strings] +;non-localizable +SGI="Plethorasoft" +MfgName="SGI" +SkyWalker1.DeviceDesc="SkyWalker1 BDA TVTuner" +SkyWalker1.Tuner.FriendlyName="SkyWalker1 TV Tuner" +SkyWalker1.Receiver.FriendlyName="SkyWalker1 TV Receiver" +SkyWalker1.Tuner="SkyWalker1.Tuner" +KSProxy.CLSID="{17CCA71B-ECD7-11D0-B908-00A0C9223196}" +KSCATEGORY_BDA_NETWORK_TUNER="{71985F48-1CA1-11d3-9CC8-00C04F7971E0}" +KSCATEGORY_BDA_RECEIVER_COMPONENT="{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}" +SKYWALKER_TUNER="{5C4E764F-AB43-46A9-B21E-8529C70F0A23}" +SKYWALKER_CAPTURE="{0F8F74D9-E524-4D05-BB60-F0C69ACB1756}" + +; +; ServiceType values +SERVICE_KERNEL_DRIVER = 0x00000001 +SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 +SERVICE_ADAPTER = 0x00000004 +SERVICE_RECOGNIZER_DRIVER = 0x00000008 +SERVICE_WIN32_OWN_PROCESS = 0x00000010 +SERVICE_WIN32_SHARE_PROCESS = 0x00000020 +SERVICE_INTERACTIVE_PROCESS = 0x00000100 +SERVICE_INTERACTIVE_SHARE_PROCESS = 0x00000120 + +; StartType values +SERVICE_BOOT_START = 0x00000000 +SERVICE_SYSTEM_START = 0x00000001 +SERVICE_AUTO_START = 0x00000002 +SERVICE_DEMAND_START = 0x00000003 +SERVICE_DISABLED = 0x00000004 + +; ErrorControl values +SERVICE_ERROR_IGNORE = 0x00000000 +SERVICE_ERROR_NORMAL = 0x00000001 +SERVICE_ERROR_SEVERE = 0x00000002 +SERVICE_ERROR_CRITICAL = 0x00000003 + +; Characteristic flags +NCF_VIRTUAL = 0x0001 +NCF_WRAPPER = 0x0002 +NCF_PHYSICAL = 0x0004 +NCF_HIDDEN = 0x0008 +NCF_NO_SERVICE = 0x0010 +NCF_NOT_USER_REMOVABLE = 0x0020 +NCF_HAS_UI = 0x0080 +NCF_MODEM = 0x0100 + +; Registry types +REG_MULTI_SZ = 0x10000 +REG_EXPAND_SZ = 0x20000 +REG_DWORD = 0x10001 + +; Win9x Compatible Types +REG_BINARY = 17 +REG_SZ = 0 + +; Service install flags +SPSVCINST_TAGTOFRONT = 0x1 +SPSVCINST_ASSOCSERVICE = 0x2 \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Main.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Main.cpp new file mode 100644 index 0000000..467e9bf --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Main.cpp @@ -0,0 +1,137 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Main.cpp + Author : + Date : + Purpose : This file contains the Entry Point of the Device Driver. + The File also defines various Dispatch Routine pointers + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ + +//Device Dispatch Table : Lists the dispatch routines for the +//major events in the life of Device +const KSDEVICE_DISPATCH SkyWalker1DispatchTable = { + /* Add */ SkyWalker1AddDevice, + /* Start */ SkyWalker1Start, + /* PostStart */ NULL, + /* QueryStop */ SkyWalker1QueryStop, + /* CancelStop */ NULL, + /* Stop */ SkyWalker1Stop, + /* QueryRemove */ NULL, /*QueryRemoveUsbDevice,*/ + /* CancelRemove */ NULL, + /* Remove */ SkyWalker1Remove, + /* QueryCapabilities */ NULL, + /* SurpriseRemoval */ NULL, + /* QueryPower */ NULL, + /* SetPower */ SkyWalker1SetPower +}; + +//Array of Filter Descriptors supported by the Current Driver +// Hold all the filter descriptors in an array +DEFINE_KSFILTER_DESCRIPTOR_TABLE(FilterDescriptors) +{ + &SkyWalker1CaptureFilterDescriptor //Only Capture filter is a Kernel Streaming Filter +}; + +//Device Descriptor : It Describes the Device with all it's dispatch +//functions and Filters +const KSDEVICE_DESCRIPTOR SkyWalker1DeviceDescriptor = +{ + &SkyWalker1DispatchTable, + SIZEOF_ARRAY(FilterDescriptors), //Filter Descriptor Count + FilterDescriptors, //Filter Descriptor Table + KSDEVICE_DESCRIPTOR_VERSION +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : DriverEntry + Description : This is a Entry Point function of the Windows Device Driver + It defines various dispatch routine Entry Point for the Driver + IN PARAM : Pointer to Driver Object which is called + Pointer to the Registry Entry of the Driver + OUT PARAM : Status of the Driver Entry routine + STATUS_SUCCESS always + PreCondition : Driver is Unloaded + PostCondtion : Driver is Loaded with various Entry Point defined + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, + IN PUNICODE_STRING pRegistryPath) +{ + NTSTATUS ntEntryStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + SkyWalkerDebugPrint(ENTRY_LEVEL, ("SkyWalker1 Driver Compiled on Date = %s, Time = %s\n",__DATE__,__TIME__)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Debug Level = %u\n",nCurrentDebugLevel)); + + //As this is an AVStream Minidriver it should call the KsInitializeDriver() + ntEntryStatus = KsInitializeDriver( + pDriverObject, + pRegistryPath, + &SkyWalker1DeviceDescriptor); + + PrintFunctionExit(__FUNCTION__,ntEntryStatus); + + return ntEntryStatus; +} + +/***************************************************************************** + Function : SkyWalker1DriverUnload + Description : This is a Exit Point function of the Windows Device Driver + It does not usedful job for the PnP Driver but required to + unload the Driver from the Running System. + IN PARAM : Pointer to Driver Object which is to be Unloaded + OUT PARAM : NONE + PreCondition : Driver is Loaded + PostCondtion : Driver is Unloaded + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +VOID SkyWalker1DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + PrintFunctionEntry(__FUNCTION__); + + //No Processing + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + +} + + + diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1PnP.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1PnP.cpp new file mode 100644 index 0000000..dd82709 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1PnP.cpp @@ -0,0 +1,336 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1PnP.cpp + Author : + Date : + Purpose : PnP IRP Message Handler + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +void PrintKSDeviceObject(IN PKSDEVICE pKSDeviceObject); +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : SkyWalker1AddDevice + Description : This Function is called by the PnP Manager for each Device + managed by the Driver.It is called during the System Initialization + and any time a new Device is enumerated while the System is running. + IN PARAM : Pointer to the Enumerated Physical Device + KSDEVICE is a WDM Functional Device which is managed by the AVStream + OUT PARAM : Status of the Device Addition + STATUS_SUCCESS when the Device added to the System + Reason for Failure incase of Error + PreCondition : Driver is Loaded without Functional/ Filter Device Objects + PostCondtion : Functional Device Object [FDO] or Filter Device Object [FiDO] are created + Logic : NONE + Assumption : NONE + Note : AddDevice is Must for the PnP Drivers + This routine runs at PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS SkyWalker1AddDevice(IN PKSDEVICE pKSDeviceObject) +{ + NTSTATUS ntAddDeviceStatus = STATUS_SUCCESS; + PKSFILTERFACTORY pFilterFactory = NULL; + + PrintFunctionEntry(__FUNCTION__); + PrintKSDeviceObject(pKSDeviceObject); + + if(!IS_VALID(pKSDeviceObject)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Invalid KS Device Object Received\n")); + ntAddDeviceStatus = STATUS_UNSUCCESSFUL; + goto FinishAddDevice; + } + + //Allcate Memory for the SkyWalker1 Device + CSkyWalker1Device * pDevice = new(NonPagedPool,TUNER_MEM_TAG)CSkyWalker1Device; + if(!IS_VALID(pDevice)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Can not allocate Memory for the SkyWalker1 Device\n")); + ntAddDeviceStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishAddDevice; + } + + ntAddDeviceStatus = pDevice->Create(pKSDeviceObject); + + PrintKSDeviceObject(pKSDeviceObject); + +FinishAddDevice: + + PrintFunctionExit(__FUNCTION__,ntAddDeviceStatus); + + return ntAddDeviceStatus; +} +/***************************************************************************** + Function : SkyWalker1Remove + Description : This function is called when the IRP_MN_REMOVE_DEVICE is sent + by the PnP Manager during Device Removal + IN PARAM : Pointer to the Enumerated Physical Device + KSDEVICE is a WDM Functional Device which is managed by the AVStream + Remove Device Io Request Packet + OUT PARAM : NONE + PreCondition : Started Device + PostCondtion : Device Removed + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +VOID SkyWalker1Remove( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntDeviceRemoveStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = NULL; + PrintFunctionEntry(__FUNCTION__); + + //Get the SkyWalker1 Device Object from the Context Info. + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + if(!IS_VALID(pDevice)) + { + //Unexpected Remove for the Device + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Connection found with SkyWalker Device\n")); + ntDeviceRemoveStatus = STATUS_UNSUCCESSFUL; + goto ExitRemoveDevice; + } + + ntDeviceRemoveStatus = pDevice->Close(pKSDeviceObject,pIoRequestPacket); + + //Deallocate the SkyWalker1 Device Object Memory + delete pDevice; + //Remove Reference of the SkyWalker1 Device from the KS Object + pKSDeviceObject->Context = NULL; + +ExitRemoveDevice: + + PrintFunctionExit(__FUNCTION__,ntDeviceRemoveStatus); + +} + +/***************************************************************************** + Function : SkyWalker1Start + Description : This function is called when the IRP_MN_START_DEVICE is sent + by the PnP Manager after Allocating Resources to the Device. + IRP_MN_START_DEVICE is called once for each device created from + the Driver using the IoCreateDevice() call. + When BDA Device Starts operating Pnp Dispatches the IRP_MN_START_DEVICE to the ks.sys + AvStream class Driver inturn calls the start routine of the BDA minidriver + associated with the BDA Device. This Start Routine retrives information about the + device from the registry, sets information about the Device and then calls the + BdaCreateFilterFactory() support function to + 1) Create Filter Factory from the Initial Filter Descriptor (KSFILTER_DESCRIPTOR) + for the Device.The Initial Filter Descriptor references Dispatch and Automation + tables for the Filter and Input Pins + 2) Associate Filter Factory with the BDA_FILTER_TEMPLATE structure.This structure + references template filter descriptor for the Device and the list of possible + pairs of the input and output pins.The Descriptor and list inturn reference. + a) Static Template Structure that can be used by Network Provider to determine + BDA Driver topology + b) Static Template Structure that can be used by Network Provider to manipulate + BDA Filter + c) Nodes and Pins for a BDA Filter along with possible ways to connect the Filter + d) Routines that a Netwrok provider can use to Create and Close a Filter instance + 3) Register the Static Template structures that are specified by BDA_FILTER_TEMPLATE + with the BDA support library so that the library can provide default handling + for a BDA MiniDriver's Properties and methods. + IN PARAM : Reference to Device to be Started + IoRequest Packet + OUT PARAM : Status of the Tuner Start + STATUS_SUCCESS in case of successful execution + Failure Code in other cases + PreCondition : Stopped Device or Device Enumerated for the First Time + PostCondtion : Device Initialized with the Newly allocated Resources, + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS SkyWalker1Start(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket, + IN PCM_RESOURCE_LIST pResourceList, + IN PCM_RESOURCE_LIST pResourceListTranslated) +{ + + NTSTATUS ntStartStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = NULL; + PrintFunctionEntry(__FUNCTION__); + + //Get the SkyWalker1 Device Object from the Context Info. + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + if(!IS_VALID(pDevice)) + { + //No Device Found + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Connection with SkyWalker Device\n")); + ntStartStatus = STATUS_UNSUCCESSFUL; + goto ExitStartDevice; + } + + //Call the Start device function of the SkyWalker1 Device class + ntStartStatus = pDevice->Start( pKSDeviceObject, + pIoRequestPacket, + pResourceList, + pResourceListTranslated); + +ExitStartDevice: + + PrintFunctionExit(__FUNCTION__,ntStartStatus); + return STATUS_SUCCESS; +} + +/***************************************************************************** + Function : SkyWalker1Stop + Description : This function is called when the IRP_MN_STOP_DEVICE is sent + by the PnP Manager during Device Removal + IN PARAM : Reference to Device to be Removed + Stop Device Io Request Packet + OUT PARAM : NONE + PreCondition : Started Device + PostCondtion : Device Stopped + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +VOID SkyWalker1Stop(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + + NTSTATUS ntStopStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = NULL; + PrintFunctionEntry(__FUNCTION__); + + //Get the SkyWalker1 Device Object from the Context Info. + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + if(!IS_VALID(pDevice)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Connection with SkyWalker Device\n")); + goto ExitStopDevice; + } + + //Call the Stop device function of the SkyWalker1 Device class + ntStopStatus = pDevice->Stop( pKSDeviceObject, + pIoRequestPacket + ); +ExitStopDevice: + PrintFunctionExit(__FUNCTION__,ntStopStatus); +} + +/***************************************************************************** + Function : SkyWalker1QueryStop + Description : This function is called when the IRP_MN_QUERY_STOP_DEVICE is sent + by the PnP Manager during Device Stop + IN PARAM : Pointer to the Enumerated Physical Device + KSDEVICE is a WDM Functional Device which is managed by the AVStream + Remove Device Io Request Packet + OUT PARAM : NONE + PreCondition : Started Device + PostCondtion : Query for stopping device is returned + Logic : NONE + Assumption : NONE + Note : All the Devices created by the Driver are connected with Each other + with the NextDevice Member of the Device Object + Revision History: + *****************************************************************************/ +NTSTATUS SkyWalker1QueryStop( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + PrintFunctionEntry(__FUNCTION__); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + return STATUS_SUCCESS; + +} + +/***************************************************************************** + Function : SkyWalker1SetPower + Description : This function is called when the IRP_MJ_POWER is sent + by the PnP Manager during Power Management + IN PARAM : Pointer to the Enumerated Physical Device + KSDEVICE is a WDM Functional Device which is managed by the AVStream + Power Device Io Request Packet + OUT PARAM : NONE + PreCondition : Started Device + PostCondtion : Query for stopping device is returned + Logic : NONE + Assumption : NONE + Note : All the Devices created by the Driver are connected with Each other + with the NextDevice Member of the Device Object + Revision History: + *****************************************************************************/ +VOID SkyWalker1SetPower +( + IN PKSDEVICE pKSDeviceObject, //Pointer to the device object + //provided by the system. + IN PIRP pIoRequestPacket,//Pointer to the IRP related to this request. + IN DEVICE_POWER_STATE To, //Requested power state. + IN DEVICE_POWER_STATE From //Current power state. +) +{ + CSkyWalker1Device * pDevice = NULL; + + PrintFunctionEntry(__FUNCTION__); + //Get the SkyWalker1 Device Object from the Context Info. + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + if(!IS_VALID(pDevice)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Connection with SkyWalker Device\n")); + goto ExitSetPower; + } + + //Call the Set Power device function of the SkyWalker1 Device class + pDevice->SetPower( pKSDeviceObject, + pIoRequestPacket, + To, + From + ); +ExitSetPower: + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + +} + + + +void PrintKSDeviceObject(IN PKSDEVICE pKSDeviceObject) +{ + SkyWalkerDebugPrint(ENTRY_LEVEL, (__FUNCTION__"\n")); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->pDeviceDescriptor = 0x%p \n",pKSDeviceObject->Descriptor)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->pDeviceDescriptor->Dispatch = 0x%p \n",pKSDeviceObject->Descriptor->Dispatch)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->pDeviceDescriptor->FilterDescriptorsCount = %lu \n",pKSDeviceObject->Descriptor->FilterDescriptorsCount)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->pDeviceDescriptor->FilterDescriptors = 0x%p \n",pKSDeviceObject->Descriptor->FilterDescriptors)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->pDeviceDescriptor->Version = %lu \n",pKSDeviceObject->Descriptor->Version)); + + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->Bag = 0x%p\n",pKSDeviceObject->Bag)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->Context = 0x%p\n",pKSDeviceObject->Context)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->FunctionalDeviceObject = 0x%p\n",pKSDeviceObject->FunctionalDeviceObject)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->PhysicalDeviceObject = 0x%p\n",pKSDeviceObject->PhysicalDeviceObject)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->NextDeviceObject = 0x%p\n",pKSDeviceObject->NextDeviceObject)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->Started = %d\n",pKSDeviceObject->Started)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->SystemPowerState = %d\n",pKSDeviceObject->SystemPowerState)); + SkyWalkerDebugPrint(ENTRY_LEVEL, ("pKsDeviceObject->DevicePowerState = %d\n",pKSDeviceObject->DevicePowerState)); +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TransportPin.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TransportPin.cpp new file mode 100644 index 0000000..41689f9 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TransportPin.cpp @@ -0,0 +1,414 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1TransportPin.cpp + Author : + Date : + Purpose : This file contains header for the Transport pin on the Tuner + filter. + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +VOID PrintBdaTransport(PKS_DATARANGE_BDA_TRANSPORT pBdaTransport); +VOID PrintBdaTransportInfo(PBDA_TRANSPORT_INFO pBdaTransportInfo); +VOID PrintKsDataFormat(PKSDATAFORMAT pKsDataFormat); +PCHAR GetDemodPropertyString(ULONG ulDemodProperty); +PCHAR GetExtendedPropertyString(ULONG ulTunerExtendedProperty); +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : CTransportPin::IntersectDataFormat + Description : Enables connection of the output pin with a downstream filter. + IN PARAM : + OUT PARAM : Status of the IntersectDataFormat + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CTransportPin::IntersectDataFormat( + IN PVOID pContext, + IN PIRP pIoRequestPacket, + IN PKSP_PIN Pin, + IN PKSDATARANGE pDataRange, + IN PKSDATARANGE pMatchingDataRange, + IN ULONG ulDataBufferSize, + OUT PVOID pData OPTIONAL, + OUT PULONG pulDataSize + ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if ( ulDataBufferSize < sizeof(KS_DATARANGE_BDA_TRANSPORT) ) + { + *pulDataSize = sizeof( KS_DATARANGE_BDA_TRANSPORT ); + ntStatus = STATUS_BUFFER_OVERFLOW; + goto ExitDataFormat; + } + else if (pDataRange->FormatSize < sizeof (KS_DATARANGE_BDA_TRANSPORT)) + { + ntStatus = STATUS_NO_MATCH; + goto ExitDataFormat; + } + else + { + *pulDataSize = sizeof( KS_DATARANGE_BDA_TRANSPORT ); + RtlCopyMemory( pData, (PVOID)pDataRange, sizeof(KS_DATARANGE_BDA_TRANSPORT)); + ntStatus = STATUS_SUCCESS; + PrintBdaTransport((PKS_DATARANGE_BDA_TRANSPORT)pDataRange); + } + +ExitDataFormat: + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; + +} + +/***************************************************************************** + Function : CTransportPin::SetDigitalDemodProperty + Description : Sets the value of the digital demodulator node properties. + IN PARAM : + OUT PARAM : Status SUCCESS in case Valid Property Set request + STATUS_INVALID_PARAMETER in case of Invalid property set request + PreCondition : None + PostCondtion : Demodulator propery Set in case of successful execution + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CTransportPin::SetDigitalDemodProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + CTransportPin* pPin; + CTunerFilter* pFilter; + ModulationType NewModulationType; + BinaryConvolutionCodeRate NewFecRate; + ULONG ulNewSymbolRate; + + + PrintFunctionEntry(__FUNCTION__); + + // Call the BDA support library to + // validate that the node type is associated with this pin. + // + ntSetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntSetStatus)) + { + // Obtain a pointer to the pin object. + // + // Because the property dispatch table calls the CTransportPin::SetDigitalDemodProperty() + // method directly, the method must retrieve a pointer to the underlying pin object. + // + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + // Retrieve the filter context from the pin context. + // + pFilter = pPin->GetFilter(); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set : %s : %lu(%l)",GetDemodPropertyString(pKSProperty->Id),*pulProperty,*((LONG*)(pulProperty)))); + + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_MODULATION_TYPE: + ntSetStatus = pFilter->SetModulatorType((ModulationType)*pulProperty); + break; + case KSPROPERTY_BDA_INNER_FEC_TYPE: + ntSetStatus = pFilter->SetInnerFecType(*pulProperty); + break; + case KSPROPERTY_BDA_INNER_FEC_RATE: + ntSetStatus = pFilter->SetInnerFecRate((BinaryConvolutionCodeRate)*pulProperty); + break; + case KSPROPERTY_BDA_OUTER_FEC_TYPE: + ntSetStatus = pFilter->SetOuterFecType(*pulProperty); + break; + case KSPROPERTY_BDA_OUTER_FEC_RATE: + ntSetStatus = pFilter->SetOuterFecRate((BinaryConvolutionCodeRate)*pulProperty); + break; + case KSPROPERTY_BDA_SYMBOL_RATE: + ntSetStatus = pFilter->SetSymbolRate(*pulProperty); + break; + case KSPROPERTY_BDA_SPECTRAL_INVERSION: + ntSetStatus = pFilter->SetSpectralInversion((SpectralInversion)*pulProperty); + break; + case KSPROPERTY_BDA_GUARD_INTERVAL: + ntSetStatus = pFilter->SetGuardInterval((GuardInterval)*pulProperty); + break; + case KSPROPERTY_BDA_TRANSMISSION_MODE: + ntSetStatus = pFilter->SetTransmissionMode((TransmissionMode)*pulProperty); + break; + default: + ntSetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + + return ntSetStatus; +} + +/***************************************************************************** + Function : CTransportPin::GetDigitalDemodProperty + Description : Gets the value of the digital demodulator node properties. + IN PARAM : + OUT PARAM : Status SUCCESS in case Valid Property Get request + STATUS_INVALID_PARAMETER in case of Invalid property Get request + PreCondition : None + PostCondtion : Demodulator propery returned in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTransportPin::GetDigitalDemodProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + CTransportPin* pPin; + CTunerFilter* pFilter; + BDATUNER_DEVICE_PARAMETER DemodProperty; + + PrintFunctionEntry(__FUNCTION__); + + // Call the BDA support library to + // validate that the node type is associated with this pin. + // + ntGetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntGetStatus)) + { + // Obtain a pointer to the pin object. + // + // Because the property dispatch table calls the CTransportPin::GetDigitalDemodProperty() + // method directly, the method must retrieve a pointer to the underlying pin object. + // + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + // Retrieve the filter context from the pin context. + // + pFilter = pPin->GetFilter(); + + ntGetStatus = pFilter->GetDemodProperty(&DemodProperty); + + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_MODULATION_TYPE: + *pulProperty = (ModulationType)DemodProperty.CurrentModulationType; + break; + case KSPROPERTY_BDA_INNER_FEC_TYPE: + *pulProperty = BDA_FEC_VITERBI; + break; + case KSPROPERTY_BDA_INNER_FEC_RATE: + *pulProperty = (BinaryConvolutionCodeRate)DemodProperty.InnerFecRate; + break; + case KSPROPERTY_BDA_OUTER_FEC_TYPE: + *pulProperty = BDA_FEC_VITERBI; + break; + case KSPROPERTY_BDA_OUTER_FEC_RATE: + *pulProperty = (BinaryConvolutionCodeRate)DemodProperty.OuterFecRate; + break; + case KSPROPERTY_BDA_SYMBOL_RATE: + *pulProperty = DemodProperty.ulSymbolRate; + break; + case KSPROPERTY_BDA_SPECTRAL_INVERSION: + *pulProperty = (SpectralInversion) DemodProperty.CurrentSpectralInversion; + break; + case KSPROPERTY_BDA_GUARD_INTERVAL: + *pulProperty = (GuardInterval) DemodProperty.CurrentGuardInterval; + break; + case KSPROPERTY_BDA_TRANSMISSION_MODE: + *pulProperty = (TransmissionMode) DemodProperty.CurrentTransmissionMode; + break; + default: + ntGetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Get : %s : %ul",GetDemodPropertyString(pKSProperty->Id),*pulProperty)); + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; +} + +/***************************************************************************** + Function : CTransportPin::SetExtendedProperty + Description : Sets the Extended Property of the Tuner + IN PARAM : IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + OUT PARAM : Status SUCCESS in case Valid Property request + STATUS_INVALID_PARAMETER in case of Invalid property request + Else error from the lower device + PreCondition : None + PostCondtion : Extended Property Set in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTransportPin::SetExtendedProperty( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + IN PULONG pulProperty + ) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + CTransportPin * pPin = NULL; + CTunerFilter* pFilter = NULL; + + PrintFunctionEntry(__FUNCTION__); + //Call the BDA support library to + //validate that the node type is associated with the pin. + + //The BdaValidateNodeProperty function validates that a node property + //request is associated with a specific pin. + ntSetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntSetStatus)) + { + //Obtain a pointer to the pin object. + + //Because the property dispatch table calls the CTransportPin::SetExtendedProperty() + //method directly, the method must retrieve a pointer to the underlying pin object. + + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + //Retrieve the filter context from the pin context. + pFilter = pPin->GetFilter(); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set : %s : %lu(%l)", + GetExtendedPropertyString(pKSProperty->Id), + *pulProperty, + *((LONG*)(pulProperty)))); + + //Retrieve the actual filter parameter. + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_DISEQC: + ntSetStatus = pFilter->SendDiseqcCommand((PDISEQC_COMMAND) pulProperty); + break; + default: + ntSetStatus = STATUS_INVALID_PARAMETER; + break; + } + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +//Debug Functions +VOID PrintBdaTransport(PKS_DATARANGE_BDA_TRANSPORT pBdaTransport) +{ + PrintBdaTransportInfo(&pBdaTransport->BdaTransportInfo); + PrintKsDataFormat(&pBdaTransport->DataRange); + +} + +VOID PrintBdaTransportInfo(PBDA_TRANSPORT_INFO pBdaTransportInfo) +{ + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pBdaTransportInfo->ulcbPhyiscalPacket = %lu Bytes\n", + pBdaTransportInfo->ulcbPhyiscalPacket)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pBdaTransportInfo->ulcbPhyiscalFrame = %lu Bytes\n", + pBdaTransportInfo->ulcbPhyiscalFrame)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pBdaTransportInfo->ulcbPhyiscalFrameAlignment = %lu\n", + pBdaTransportInfo->ulcbPhyiscalFrameAlignment)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pBdaTransportInfo->ulcbPhyiscalPacket = %ll (Normal Active Movie units)\n", + pBdaTransportInfo->ulcbPhyiscalPacket)); + +} + +VOID PrintKsDataFormat(PKSDATAFORMAT pKsDataFormat) +{ + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pKsDataFormat->FormatSize = %lu\n", + pKsDataFormat->FormatSize)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pKsDataFormat->Flags = %lu\n", + pKsDataFormat->Flags)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pKsDataFormat->SampleSize = %lu\n", + pKsDataFormat->SampleSize)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pKsDataFormat->Reserved = %lu\n", + pKsDataFormat->Reserved)); + +} + +PCHAR GetDemodPropertyString(ULONG ulDemodProperty) +{ + switch(ulDemodProperty) + { + case KSPROPERTY_BDA_MODULATION_TYPE: + return "KSPROPERTY_BDA_MODULATION_TYPE"; + + case KSPROPERTY_BDA_INNER_FEC_TYPE: + return "KSPROPERTY_BDA_INNER_FEC_TYPE"; + + case KSPROPERTY_BDA_INNER_FEC_RATE: + return "KSPROPERTY_BDA_INNER_FEC_RATE"; + + case KSPROPERTY_BDA_OUTER_FEC_TYPE: + return "KSPROPERTY_BDA_OUTER_FEC_TYPE"; + + case KSPROPERTY_BDA_OUTER_FEC_RATE: + return "KSPROPERTY_BDA_OUTER_FEC_RATE"; + + case KSPROPERTY_BDA_SYMBOL_RATE: + return "KSPROPERTY_BDA_SYMBOL_RATE"; + + case KSPROPERTY_BDA_SPECTRAL_INVERSION: + return "KSPROPERTY_BDA_SPECTRAL_INVERSION"; + + case KSPROPERTY_BDA_GUARD_INTERVAL: + return "KSPROPERTY_BDA_GUARD_INTERVAL"; + + case KSPROPERTY_BDA_TRANSMISSION_MODE: + return "KSPROPERTY_BDA_TRANSMISSION_MODE"; + + default: + return "KSPROPERTY_BDA_INVALID_PROPERTY"; + } +} + +PCHAR GetExtendedPropertyString(ULONG ulTunerExtendedProperty) +{ + switch(ulTunerExtendedProperty) + { + case KSPROPERTY_BDA_DISEQC: + return "KSPROPERTY_BDA_DISEQC"; + default: + return "KSPROPERTY_BDA_INVALID_PROPERTY"; + } +} diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilter.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilter.cpp new file mode 100644 index 0000000..e6de863 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilter.cpp @@ -0,0 +1,1402 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1TunerFilter.cpp + Author : + Date : + Purpose : Tuner Filter Class Definition + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Main Header file +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : CTunerFilter + Description : Constructor of the CTunerFilter Class + Creates the filter object,associates it with the device + object, and initializes member variables for it. + IN PARAM : NONE + OUT PARAM : NONE + PreCondition : Filter Object is not created + PostCondtion : Filter Object is created and Initialzed on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +CTunerFilter::CTunerFilter() +{ + PrintFunctionEntry(__FUNCTION__); + + //Setting the Tuner Parameters Default + m_CurResource.ulCarrierFrequency = TUNER_FREQ_MIN; + m_CurResource.ulFrequencyMultiplier = 1000; + m_CurResource.ulBandWidth = 0; + m_CurResource.Polarity = BDA_POLARISATION_LINEAR_H; + m_CurResource.ulInnerFecType = BDA_FEC_VITERBI; + m_CurResource.InnerFecRate = BDA_BCC_RATE_1_2; + m_CurResource.ulOuterFecType = BDA_FEC_VITERBI; + m_CurResource.OuterFecRate = BDA_BCC_RATE_1_2; + m_CurResource.CurrentModulationType = BDA_MOD_QPSK; + m_CurResource.CurrentTransmissionMode = BDA_XMIT_MODE_2K; + m_CurResource.CurrentGuardInterval = BDA_GUARD_NOT_DEFINED; + m_CurResource.CurrentSpectralInversion = BDA_SPECTRAL_INVERSION_NOT_DEFINED; + m_CurResource.ulSymbolRate = 20000; + m_NewResource = m_CurResource; + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); +} + +/***************************************************************************** + Function : CTunerFilter + Description : Destructor of the CTunerFilter Class + Destroys the filter object + IN PARAM : NONE + OUT PARAM : NONE + PreCondition : Filter Object is created + PostCondtion : Filter Object is Removed and Memory freed + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +CTunerFilter::~CTunerFilter() +{ + PrintFunctionEntry(__FUNCTION__); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); +} + +/***************************************************************************** + Function : CTunerFilter::Create() + Description : This function is called when a Filter is Created.MiniDriver + uses this function to Initialize the Context and resources + associted with the Filter. + Creates the filter object,associates it with the device object, and + initializes member variables for it. + IN PARAM : Pointer to KSFILTER that just created + Pointer to IRP_MJ_CREATE for Filter + OUT PARAM : Status of the Filter Create routine + STATUS_SUCCESS on Routine success + Else Error code from the attempt to create the Filter + PreCondition : Filter is not created + PostCondtion : Filter is created and Initialzed on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::Create( IN OUT PKSFILTER pKSFilter, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntFilterCreationStatus = STATUS_SUCCESS; + PKSDEVICE pKSDeviceObject = NULL; + CSkyWalker1Device * pDevice = NULL; + + PrintFunctionEntry(__FUNCTION__); + + //Create a filter object for the filter instance. + CTunerFilter* pFilter = new(PagedPool,TUNER_MEM_TAG) CTunerFilter; // Tags the allocated memory + if (!IS_VALID(pFilter)) + { + //Exit if the Filter Memory could not be allocated + SkyWalkerDebugPrint(ENTRY_LEVEL,("Low on Memory Resource to Create the Filter\n")); + ntFilterCreationStatus = STATUS_INSUFFICIENT_RESOURCES; + goto ErrorFilterCreate; + } + + //Link the filter context to the passed in pointer to the KSFILTER structure. + pKSFilter->Context = pFilter; + + //Set the Back reference to the Streaming Device + //The KsFilterGetDevice function returns the AVStream device to which Filter belongs. + pKSDeviceObject = KsFilterGetDevice(pKSFilter); + + if( (!(IS_VALID(pKSDeviceObject))) || + (!(IS_VALID(pKSDeviceObject->Context)))) + { + //if the Filter does not belong to any Streaming Device or + //Streaming Device Extension is NULL then the Device is not connected + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Device for the Filter\n")); + ntFilterCreationStatus = STATUS_DEVICE_NOT_CONNECTED; + goto ErrorFilterCreate; + } + // Get the device object from the retrieved pointer to the KSDevice for this filter. + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + // Link the filter context to the device context. + // That is, set the filter's device pointer data member to the obtained device pointer. + pFilter->m_pDevice = pDevice; + + // Initialize member variables. + pFilter->m_KsState = KSSTATE_STOP; + pFilter->m_BdaChangeState = BDA_CHANGES_COMPLETE; + pFilter->m_ulResourceID = 0; + + // Configure the initial resource for DVBS . + pFilter->m_CurResource.ulCarrierFrequency = TUNER_FREQ_MIN; + pFilter->m_CurResource.ulFrequencyMultiplier = 1000; + pFilter->m_CurResource.Polarity = BDA_POLARISATION_LINEAR_H; + pFilter->m_CurResource.ulSymbolRate = 20000; + pFilter->m_fResourceAcquired = FALSE; + + //Initialize the Filter Context i.e. Extension + + //The BdaInitFilter() function initializes the BDA filter context + //associated with a filter instance. + ntFilterCreationStatus = BdaInitFilter( pKSFilter, //Pointer to Filter inwhich Context to be initialize + &TunerFilterTemplate); //Filter Template Description for the BDA Device + if(NT_ERROR(ntFilterCreationStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Failed to Initialize the Printer\n")); + goto ErrorFilterCreate; + } + else + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Successfully Created the Filter\n")); + ntFilterCreationStatus = STATUS_SUCCESS; + } + +CompleteFilterCreate : + + PrintFunctionExit(__FUNCTION__,ntFilterCreationStatus); + return ntFilterCreationStatus; + +ErrorFilterCreate: + if (IS_VALID(pFilter)) + { + delete pFilter; + } + pKSFilter->Context = NULL; + + goto CompleteFilterCreate; +} + +/***************************************************************************** + Function : CTunerFilter::FilterClose + Description : This function is called when a Filter is Closed.MiniDriver + uses this function to uninitialize the Context and resources + associted with the Filter + Deletes the previously created filter object. + IN PARAM : Pointer to KSFILTER that just closed + Pointer to IRP_MJ_CLOSE for Filter + OUT PARAM : Status of the Filter Close routine + STATUS_SUCCESS Always + PreCondition : Filter is created + PostCondtion : Filter is Closed on successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::FilterClose( IN OUT PKSFILTER pKSFilter, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntFilterCloseStatus = STATUS_SUCCESS; + PrintFunctionEntry(__FUNCTION__); + + CTunerFilter* pFilter = reinterpret_cast(pKSFilter->Context); + + if(IS_VALID(pFilter)) + { + delete pFilter; + pFilter = NULL; + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Closed the Filter\n")); + PrintFunctionExit(__FUNCTION__,ntFilterCloseStatus); + return ntFilterCloseStatus; +} + +/***************************************************************************** + Function : CTunerFilter::StartChanges + Description : This is called when the BDA Topology Change is requested + by Network Provider + IN PARAM : Pointer to the IRP request + Pointer to PKSMETHOD for Filter + Ignored + OUT PARAM : Status of the BdaStartChanges() routine + STATUS_SUCCESS Always + PreCondition : None + PostCondtion : Puts the filter into change state. All changes to BDA topology + and properties changed after this will be in effect only after + a call to the CTunerFilter::CommitChanges() method. + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::StartChanges( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored + ) +{ + NTSTATUS ntFilterChangeStatus = STATUS_SUCCESS; + CTunerFilter * pFilter; + + PrintFunctionEntry(__FUNCTION__); + + // Obtain a "this" pointer to the filter object. + // + // Because the property dispatch table calls the CTunerFilter::StartChanges() method + // directly, the method must retrieve a pointer to the underlying filter object. + // + pFilter = reinterpret_cast(KsGetFilterFromIrp(pIoRequestPacket)->Context); + + // Call the BDA support library to + // reset any pending BDA topolgoy changes. + ntFilterChangeStatus = BdaStartChanges( pIoRequestPacket); + if(!NT_SUCCESS(ntFilterChangeStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Start Changes Failed\n")); + goto ExitStartChanges; + } + + // Reset any pending resource changes. + pFilter->m_NewResource = pFilter->m_CurResource; + pFilter->m_BdaChangeState = BDA_CHANGES_COMPLETE; + +ExitStartChanges: + PrintFunctionExit(__FUNCTION__,ntFilterChangeStatus); + return ntFilterChangeStatus; +} + +/***************************************************************************** + Function : CTunerFilter::CheckChanges + Description : This is called after completion of the BDA Topology Change + to verify the new topology before committing the change + IN PARAM : Pointer to the IRP request + Pointer to PKSMETHOD for Filter + Ignored + OUT PARAM : Status of the BdaCheckChanges() routine + STATUS_SUCCESS Always + PreCondition : None + PostCondtion : Checks the changes to BDA interfaces that have occured since the + last call to the CTunerFilter::StartChanges() method. Returns the identical + result that the CTunerFilter::CommitChanges() method returns. + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::CheckChanges( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored + ) +{ + NTSTATUS ntFilterChangeStatus = STATUS_SUCCESS; + CTunerFilter * pFilter; + + PrintFunctionEntry(__FUNCTION__); + + // Obtain a "this" pointer to the filter object. + // + // Because the property dispatch table calls the CTunerFilter::StartChanges() method + // directly, the method must retrieve a pointer to the underlying filter object. + // + pFilter = reinterpret_cast(KsGetFilterFromIrp(pIoRequestPacket)->Context); + + // Call the BDA support library to + // verify a new set of BDA topology changes. + ntFilterChangeStatus = BdaCheckChanges(pIoRequestPacket); + if (!NT_SUCCESS(ntFilterChangeStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Check Changes Failed\n")); + goto ExitCheckChanges; + } + + // Validate the new resource list here. + // In this driver the new resource list is always valid. + +ExitCheckChanges: + PrintFunctionExit(__FUNCTION__,ntFilterChangeStatus); + return ntFilterChangeStatus; + +} +/***************************************************************************** + Function : CTunerFilter::CommitChanges + Description : This is called after validation of the New Topology to + commit the changes + IN PARAM : Pointer to the IRP request + Pointer to PKSMETHOD for Filter + Ignored + OUT PARAM : Status of the Commit Changes + STATUS_SUCCESS Always + PreCondition : None + PostCondtion : Checks and commits the changes to BDA interfaces that have + occured since the last call to the CTunerFilter::StartChanges() + method. + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::CommitChanges( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OPTIONAL PVOID pvIgnored + ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + CTunerFilter * pFilter; + + PrintFunctionEntry(__FUNCTION__); + + // Obtain a "this" pointer to the filter object. + // + // Because the property dispatch table calls the CTunerFilter::CommitChanges() method + // directly, the method must retrieve a pointer to the underlying filter object. + // + pFilter = reinterpret_cast(KsGetFilterFromIrp(pIoRequestPacket)->Context); + + // + // Validate the new resource list here. + // In this driver the new resource list is always valid. + // + + // Mark the changes as having been made. + // + pFilter->m_CurResource = pFilter->m_NewResource; + pFilter->m_BdaChangeState = BDA_CHANGES_COMPLETE; + + if (pFilter->m_KsState != KSSTATE_STOP) + { + // Commit the resources on the underlying device + // + ntStatus = pFilter->AcquireResources(); + } + + // Call the BDA support library to + // commit a new set of BDA topology changes. + // + ntStatus = BdaCommitChanges( pIoRequestPacket); + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : CTunerFilter::GetChangeState + Description : This function is called to know the Current state + change of the Topology + IN PARAM : Pointer to the IRP request + Pointer to PKSMETHOD for Filter + Status of the Change State + OUT PARAM : Status of the Change State + PreCondition : None + PostCondtion : Returns the current BDA change state + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::GetChangeState( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + OUT PULONG pulChangeState + ) +{ + NTSTATUS ntFilterChangeStatus = STATUS_SUCCESS; + CTunerFilter * pFilter; + BDA_CHANGE_STATE TopologyChangeState; + + PrintFunctionEntry(__FUNCTION__); + + // pulChangeState needs to be verified because minData is zero + // in the KSMETHOD_ITEM definition in bdamedia.h + if (!IS_VALID(pulChangeState)) + { + pIoRequestPacket->IoStatus.Information = sizeof(ULONG); + ntFilterChangeStatus = STATUS_MORE_ENTRIES; + goto ExitGetChangeState; + } + + // Obtain a "this" pointer to the filter object. + // + // Because the property dispatch table calls the CTunerFilter::GetChangeState() method + // directly, the method must retrieve a pointer to the underlying filter object. + // + pFilter = reinterpret_cast(KsGetFilterFromIrp(pIoRequestPacket)->Context); + + // Call the BDA support library to + // verify for any pending BDA topology changes. + ntFilterChangeStatus = BdaGetChangeState( pIoRequestPacket, &TopologyChangeState); + + if (NT_SUCCESS(ntFilterChangeStatus)) + { + // Figure out if there are changes pending. + // + if ( (TopologyChangeState == BDA_CHANGES_PENDING) + || (pFilter->m_BdaChangeState == BDA_CHANGES_PENDING) + ) + { + *pulChangeState = BDA_CHANGES_PENDING; + } + else + { + *pulChangeState = BDA_CHANGES_COMPLETE; + } + } + +ExitGetChangeState: + + PrintFunctionExit(__FUNCTION__,ntFilterChangeStatus); + return ntFilterChangeStatus; +} + +/***************************************************************************** + Function : CTunerFilter::CreateTopology + Description : Keeps track of the topology association between input and output pins + IN PARAM : Pointer to the IRP request + Pointer to PKSMETHOD for Filter + Pounter to the Medium Object + OUT PARAM : Status of the Create topology + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::CreateTopology( IN PIRP pIoRequestPacket, + IN PKSMETHOD pKSMethod, + PVOID pvIgnored + ) +{ + NTSTATUS ntCreateStatus = STATUS_SUCCESS; + CTunerFilter * pFilter; + ULONG ulPinType; + PKSFILTER pKSFilter; + KSP_PIN * pKSPPin = (KSP_PIN *) pKSMethod; + + PrintFunctionEntry(__FUNCTION__); + + // Obtain a "this" pointer to the filter object. + // + // Because the property dispatch table calls the CTunerFilter::CreateTopology() method + // directly, the method must retrieve a pointer to the underlying filter object. + // + pFilter = reinterpret_cast(KsGetFilterFromIrp(pIoRequestPacket)->Context); + + // + // Configure the hardware to complete its internal connection between + // the input pin and output pin here. + // + + // Call the BDA support library to create the standard topology and + // validate the method, instance count, etc. + // + ntCreateStatus = BdaMethodCreateTopology( pIoRequestPacket, pKSMethod, pvIgnored); + + PrintFunctionExit(__FUNCTION__,ntCreateStatus); + return ntCreateStatus; +} + +/***************************************************************************** + Function : CTunerFilter::GetStatus + Description : Gets the current device status for this filter instance + IN PARAM : Pointer to the GUID of Demodulator + OUT PARAM : Status of the Set Demodulator + STATUS_INVALID_PARAMETER -> In case of NULL GUID + STATUS_NOT_SUPPORTED -> In case of GUID other than QPSK Demod. + STATUS_SUCCESS -> On successful execution + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::GetStatus(OUT PBDATUNER_DEVICE_STATUS pDeviceStatus) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if (m_KsState == KSSTATE_STOP) + { + // If we're in stop state then the device status + // doesn't reflect our resource list. + // + pDeviceStatus->fCarrierPresent = FALSE; + pDeviceStatus->fSignalLocked = FALSE; + ntGetStatus = STATUS_SUCCESS; + } + else + { + ntGetStatus = m_pDevice->GetStatus( pDeviceStatus); + } + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; + +} + + +/***************************************************************************** + Function : CTunerFilter::AcquireResources + Description : Acquires resources for the underlying device. + IN PARAM : None + OUT PARAM : Status of Acquire resources + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::AcquireResources() +{ + NTSTATUS ntAcquireStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if (m_fResourceAcquired) + { + ntAcquireStatus = m_pDevice->Update(&m_CurResource,m_ulResourceID); + } + else + { + + //Commit the resources on the underlying device + ntAcquireStatus = m_pDevice->Acquire(&m_CurResource,&m_ulResourceID); + m_fResourceAcquired = NT_SUCCESS(ntAcquireStatus); + } + + PrintFunctionExit(__FUNCTION__,ntAcquireStatus); + return ntAcquireStatus; +} + +/***************************************************************************** + Function : CTunerFilter::ReleaseResources + Description : Releases resources from the underlying device. + IN PARAM : None + OUT PARAM : Status of Release resources + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::ReleaseResources() +{ + NTSTATUS ntReleaseStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + // Release the resources on the underlying device + if (m_fResourceAcquired) + { + ntReleaseStatus = m_pDevice->Release(m_ulResourceID); + m_ulResourceID = 0; + m_fResourceAcquired = FALSE; + } + + PrintFunctionExit(__FUNCTION__,ntReleaseStatus); + return ntReleaseStatus; +} + +/***************************************************************************** + Function : CTunerFilter::GetTunerProperty + Description : Get the Current Tuner Properties + IN PARAM : Will hold the Tuner Properties + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::GetTunerProperty(OUT PBDATUNER_DEVICE_PARAMETER pTunerParameter) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + *pTunerParameter = m_CurResource; + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetFrequency + Description : Set the New Frequency for the Tuner + IN PARAM : New frequency + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetFrequency(IN ULONG ulBdaParameter) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulBdaParameter == BDA_FREQUENCY_NOT_SET)|| + (ulBdaParameter == BDA_FREQUENCY_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if(m_CurResource.ulCarrierFrequency != ulBdaParameter) + { + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set Frequency = %lu\n", + ulBdaParameter)); + + //Set the Frequency + m_NewResource.ulCarrierFrequency = ulBdaParameter; + m_BdaChangeState = BDA_CHANGES_PENDING; + + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetMultiplier + Description : Set the Frequency Multiplier of the Tuner + IN PARAM : New Frequency Multiplier + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetMultiplier(IN ULONG ulBdaParameter) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulBdaParameter == BDA_FREQUENCY_MULTIPLIER_NOT_SET)|| + (ulBdaParameter == BDA_FREQUENCY_MULTIPLIER_NOT_DEFINED)) + { + m_NewResource.ulFrequencyMultiplier = 1000; //Default Multiplier + } + else if(m_CurResource.ulFrequencyMultiplier != ulBdaParameter) + { + //Set the Frequency Multiplier + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set Frequency Multipler = %lu\n", + ulBdaParameter)); + m_NewResource.ulFrequencyMultiplier = ulBdaParameter; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //Update the device Parameters too + //Send 10 bytes mentioning the Parameters + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetBandwidth + Description : Set the Bandwidth of the Tuner + IN PARAM : New Bandwidth + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetBandwidth(IN ULONG ulBdaParameter) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulBdaParameter == BDA_CHAN_BANDWITH_NOT_SET)|| + (ulBdaParameter == BDA_CHAN_BANDWITH_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if(m_CurResource.ulBandWidth != ulBdaParameter) + { + //Set the Bandwidth + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set BandWidth = %lu\n", + ulBdaParameter)); + m_NewResource.ulBandWidth = ulBdaParameter; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //Not Supported by Device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetPolarity + Description : Set the Polarity of the Tuner + IN PARAM : New Polarity + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetPolarity(IN Polarisation NewPolarity) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (NewPolarity == BDA_POLARISATION_NOT_SET )|| + (NewPolarity == BDA_POLARISATION_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + //Tuner does not have Polarity, it can set LNB voltage which in tern selects LNB Polarity. + //SEC_VOLTAGE_13 is for Verical/Right polarization, SEC_VOLTAGE_18 is for Horizintal/Left + //polarization + else if ((NewPolarity >= BDA_POLARISATION_LINEAR_H) && + (NewPolarity <= BDA_POLARISATION_CIRCULAR_R)) + { + //Change the Polarization only if new setting is requested + if(m_CurResource.Polarity != NewPolarity) + { + //Set the Polarity + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Set Polarity = %lu\n", + NewPolarity)); + + m_NewResource.Polarity = NewPolarity; + + m_BdaChangeState = BDA_CHANGES_PENDING; + + } + } + else + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetRange + Description : Set the Tuner Range + IN PARAM : Tuner Range + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetRange(IN ULONG ulRange) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulRange == BDA_RANGE_NOT_SET )|| + (ulRange == BDA_RANGE_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if(m_CurResource.ulRange != ulRange) + { + m_NewResource.ulRange = ulRange; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetLowLOFrequency + Description : Set the Low LOF + IN PARAM : Low LOF + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetLowLOFrequency(IN ULONG ulLowLOF) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if(m_CurResource.ulLnbLowLOFrequency != ulLowLOF) + { + m_NewResource.ulLnbLowLOFrequency = ulLowLOF; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetHighLOFrequency + Description : Set the High LOF + IN PARAM : High LOF + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetHighLOFrequency(IN ULONG ulHighLOF) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if(m_CurResource.ulLnbHighLOFrequency != ulHighLOF) + { + m_NewResource.ulLnbHighLOFrequency = ulHighLOF; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetSwitchFrequency + Description : Set the Switch Frequency + IN PARAM : Switch Frequency + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetSwitchFrequency(IN ULONG ulSwitchFrequency) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if(m_CurResource.ulLnbSwitchFrequency != ulSwitchFrequency) + { + m_NewResource.ulLnbSwitchFrequency = ulSwitchFrequency; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetTransponder + Description : Set the Transponder + IN PARAM : Transponder + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetTransponder(IN ULONG ulTransponder) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if(m_CurResource.ulTransponder != ulTransponder) + { + m_NewResource.ulRange = ulTransponder; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + + +/***************************************************************************** + Function : CTunerFilter::GetDemodProperties + Description : Get the Current Demodulator Properties + IN PARAM : Will hold the Demodulator Properties + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::GetDemodProperty(OUT PBDATUNER_DEVICE_PARAMETER pDemodParameter) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + *pDemodParameter = m_CurResource; + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetModulatorType + Description : Set the Modulation Type + IN PARAM : New Modulation Type + OUT PARAM : STATUS_SUCCESS in case of QPSK Modulation type + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetModulatorType(IN ModulationType NewModulationType) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (NewModulationType == BDA_MOD_NOT_SET )|| + (NewModulationType == BDA_MOD_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if(NewModulationType == BDA_MOD_QPSK) + { + if(m_CurResource.CurrentModulationType != NewModulationType) + { + //Only supporting QPSK + m_NewResource.CurrentModulationType = NewModulationType; + + m_BdaChangeState = BDA_CHANGES_PENDING; + + //Send the Modulation update request to the Device. + //Send 10 bytes mentioning the Parameters + //Byte 8 of the Tuner Command but fixed thus not needed the below command still + //sending the same + + } + } + else + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetInnerFecType + Description : Set the Inner Fec Type + IN PARAM : New Inner Fec Type + OUT PARAM : STATUS_SUCCESS in case of BDA_FEC_VITERBI + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetInnerFecType(IN ULONG ulNewInnerFecType) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulNewInnerFecType == BDA_FEC_METHOD_NOT_SET )|| + (ulNewInnerFecType == BDA_FEC_METHOD_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + //Only supported FEC VITERBI Type Error Correction + else if(ulNewInnerFecType == BDA_FEC_VITERBI) + { + if(m_CurResource.ulInnerFecType != ulNewInnerFecType) + { + m_NewResource.ulInnerFecType = ulNewInnerFecType; + m_BdaChangeState = BDA_CHANGES_PENDING; + } + } + else + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetInnerFecRate + Description : Set the Inner Fec Rate + IN PARAM : New Inner Fec Rate + OUT PARAM : STATUS_SUCCESS in case of supported Fec Rate + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetInnerFecRate(IN BinaryConvolutionCodeRate NewFecRate) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (NewFecRate == BDA_BCC_RATE_NOT_SET )|| + (NewFecRate == BDA_BCC_RATE_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if((NewFecRate!=BDA_BCC_RATE_1_2)&& + (NewFecRate!=BDA_BCC_RATE_2_3)&& + (NewFecRate!=BDA_BCC_RATE_3_4)&& + (NewFecRate!=BDA_BCC_RATE_5_6)&& + (NewFecRate!=BDA_BCC_RATE_7_8)) + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + else + { + if(m_CurResource.InnerFecRate != NewFecRate) + { + m_NewResource.InnerFecRate = NewFecRate; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //Update the Device Parameters too + //Byte 9 of the Tuner setting command + + } + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetOuterFecType + Description : Set the Outer Fec Type + IN PARAM : New Outer Fec Type + OUT PARAM : STATUS_SUCCESS in case of BDA_FEC_VITERBI + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetOuterFecType(IN ULONG ulNewOuterFecType) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulNewOuterFecType == BDA_FEC_METHOD_NOT_SET )|| + (ulNewOuterFecType == BDA_FEC_METHOD_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + //Only supported FEC VITERBI Type Error Correction + else if(ulNewOuterFecType == BDA_FEC_VITERBI) + { + if(m_CurResource.ulOuterFecType != ulNewOuterFecType) + { + m_NewResource.ulOuterFecType = ulNewOuterFecType; + m_BdaChangeState = BDA_CHANGES_PENDING; + } + } + else + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetOuterFecRate + Description : Set the Outer Fec Rate + IN PARAM : New Outer Fec Rate + OUT PARAM : STATUS_SUCCESS in case of supported Fec Rate + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetOuterFecRate(IN BinaryConvolutionCodeRate NewFecRate) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (NewFecRate == BDA_BCC_RATE_NOT_SET )|| + (NewFecRate == BDA_BCC_RATE_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if((NewFecRate!=BDA_BCC_RATE_1_2)&& + (NewFecRate!=BDA_BCC_RATE_2_3)&& + (NewFecRate!=BDA_BCC_RATE_3_4)&& + (NewFecRate!=BDA_BCC_RATE_5_6)&& + (NewFecRate!=BDA_BCC_RATE_7_8)) + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + else + { + if(m_CurResource.OuterFecRate != NewFecRate) + { + m_NewResource.OuterFecRate = NewFecRate; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //Not supported by SkyWalker1 thus not udpating the Device Parameter + } + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetSymbolRate + Description : Set the Symbol Rate + IN PARAM : New Symbol Rate + OUT PARAM : STATUS_SUCCESS in case of Valid Symbol Rate + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetSymbolRate(IN ULONG ulNewSymbolRate) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (ulNewSymbolRate >= SYMBOL_RATE_MIN) && + (ulNewSymbolRate <= SYMBOL_RATE_MAX)) + { + + if(m_CurResource.ulSymbolRate != ulNewSymbolRate) + { + m_NewResource.ulSymbolRate = ulNewSymbolRate; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //Update the device Parameters too + //Send 10 bytes mentioning the Parameters + } + } + else + { + ntSetStatus = STATUS_INVALID_PARAMETER; + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetSpectralInversion + Description : Set the Spectral Inversion + IN PARAM : Spectral Inversion + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetSpectralInversion(IN SpectralInversion SpecInv) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (SpecInv == BDA_SPECTRAL_INVERSION_NOT_SET )|| + (SpecInv == BDA_SPECTRAL_INVERSION_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if(m_CurResource.CurrentSpectralInversion != SpecInv) + { + m_NewResource.CurrentSpectralInversion = SpecInv; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetGuardInterval + Description : Set the Guard Interval + IN PARAM : Guard Interval + OUT PARAM : STATUS_SUCCESS in case of Valid Symbol Rate + else STATUS_INVALID_PARAMETER + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetGuardInterval(IN GuardInterval GuardInt) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (GuardInt == BDA_GUARD_NOT_SET )|| + (GuardInt == BDA_GUARD_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + else if(m_CurResource.CurrentGuardInterval != GuardInt) + { + m_NewResource.CurrentGuardInterval = GuardInt; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + +/***************************************************************************** + Function : CTunerFilter::SetTransmissionMode + Description : Set the Transmission Mode + IN PARAM : Transmission Mode + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SetTransmissionMode(IN TransmissionMode TransMode) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + if( (TransMode == BDA_XMIT_MODE_NOT_SET )|| + (TransMode == BDA_XMIT_MODE_NOT_DEFINED)) + { + //Do nothing return SUCCESS + } + if(m_CurResource.CurrentTransmissionMode != TransMode) + { + m_NewResource.CurrentTransmissionMode = TransMode; + m_BdaChangeState = BDA_CHANGES_PENDING; + + //not supported by device + } + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} + + +/***************************************************************************** + Function : CTunerFilter::SendDiseqcCommand + Description : Send Diseqc Command to the Tuner + IN PARAM : Diseqc Command to be sent to the Tuner + OUT PARAM : STATUS_SUCCESS always + PreCondition : None + PostCondtion : None + Logic : 1) Validate the Input Parameters + 2) Check which command is been sent by the application + 3) Send the Command to the Tuner Immediately + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerFilter::SendDiseqcCommand(IN PDISEQC_COMMAND pDiseqcCommand) +{ + NTSTATUS ntSetStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + //Validate the Diseqc Parameters here + + //Send the Diseqc Command to the Device + ntSetStatus = m_pDevice->SendDiseqcCommand(pDiseqcCommand,m_ulResourceID); + + PrintFunctionExit(__FUNCTION__,ntSetStatus); + return ntSetStatus; +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilterDefinitions.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilterDefinitions.cpp new file mode 100644 index 0000000..4c250bf --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerFilterDefinitions.cpp @@ -0,0 +1,717 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1TunerFilterDefinitions.cpp + Author : + Date : + Purpose : Tuner Filter Definition + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Main Header file + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ + +//BDA Tuner Frequency Property Set +DEFINE_KSPROPERTY_TABLE(SkyWalker1TunerFrequencyProperties) +{ + DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY( + CAntennaPin::GetTunerProperty, + CAntennaPin::SetTunerProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_FREQUENCY_MULTIPLIER( + CAntennaPin::GetTunerProperty, + CAntennaPin::SetTunerProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_POLARITY( + CAntennaPin::GetTunerProperty, + CAntennaPin::SetTunerProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_RANGE( + CAntennaPin::GetTunerProperty, + CAntennaPin::SetTunerProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_BANDWIDTH( + CAntennaPin::GetTunerProperty, + CAntennaPin::SetTunerProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_RF_TUNER_TRANSPONDER( + CAntennaPin::GetTunerProperty, + CAntennaPin::SetTunerProperty + ), +}; + +//BDA LNB Info Property Set +DEFINE_KSPROPERTY_TABLE(SkyWalker1TunerLnbProperties) +{ + DEFINE_KSPROPERTY_ITEM_BDA_LNB_LOF_HIGH_BAND( + CAntennaPin::GetTunerLnbProperty, + CAntennaPin::SetTunerLnbProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_LNB_LOF_LOW_BAND( + CAntennaPin::GetTunerLnbProperty, + CAntennaPin::SetTunerLnbProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_LNB_SWITCH_FREQUENCY( + CAntennaPin::GetTunerLnbProperty, + CAntennaPin::SetTunerLnbProperty + ), +}; + +//BDA Signal Statistics Properties +// +//Defines the dispatch routines for the Signal Statistics Properties +//on the RF Tuner, Demodulator, and PID Filter Nodes +// +DEFINE_KSPROPERTY_TABLE(SkyWalker1TunerSignalProperties) +{ + + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STRENGTH( + CAntennaPin::GetSignalStatus, + NULL + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_QUALITY( + CAntennaPin::GetSignalStatus, + NULL + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_PRESENT( + CAntennaPin::GetSignalStatus, + NULL + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCKED( + CAntennaPin::GetSignalStatus, + NULL + ), +#ifdef LOCK_CODE + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCK_CAPS( + CAntennaPin::GetSignalStatus + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCK_TYPE( + CAntennaPin::GetSignalStatus + ), + DEFINE_KSPROPERTY_ITEM_BDA_SAMPLE_TIME( + CTransportPin::GetSignalStatus, + NULL + ), +#endif + + +}; + +DEFINE_KSPROPERTY_SET_TABLE(SkyWalker1TunerAutomationProperties) +{ + DEFINE_KSPROPERTY_SET + ( + &KSPROPSETID_BdaFrequencyFilter, //Property Set defined elsewhere + SIZEOF_ARRAY(SkyWalker1TunerFrequencyProperties), //Number of properties in the array + SkyWalker1TunerFrequencyProperties, //Property set array + 0, //FastIoCount + NULL //FastIoTable + ), + DEFINE_KSPROPERTY_SET + ( + &KSPROPSETID_BdaLNBInfo, //Property Set defined elsewhere + SIZEOF_ARRAY(SkyWalker1TunerLnbProperties), //Number of properties in the array + SkyWalker1TunerLnbProperties, //Property set array + 0, //FastIoCount + NULL //FastIoTable + ), + DEFINE_KSPROPERTY_SET + ( + &KSPROPSETID_BdaSignalStats, //Property Set defined elsewhere + SIZEOF_ARRAY(SkyWalker1TunerSignalProperties), //Number of properties in the array + SkyWalker1TunerSignalProperties, //Property set array + 0, //FastIoCount + NULL //FastIoTable + ), +}; + +//Tuner Automation Table.Used to get and tuner related Methods, +//Events and Properties +DEFINE_KSAUTOMATION_TABLE(SkyWalker1TunerAutomation) +{ + DEFINE_KSAUTOMATION_PROPERTIES(SkyWalker1TunerAutomationProperties), + DEFINE_KSAUTOMATION_METHODS_NULL, + DEFINE_KSAUTOMATION_EVENTS_NULL +}; + +//BDA Signal Statistics Properties for Demodulator Node + +//Defines the dispatch routines for the Signal Statistics Properties +//on the Demodulator Node. +DEFINE_KSPROPERTY_TABLE(SkyWalker1DemodulatorSignalStats) +{ + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_QUALITY( + CTransportPin::GetSignalStatus, + NULL + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_LOCKED( + CTransportPin::GetSignalStatus, + NULL + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_PRESENT( + CTransportPin::GetSignalStatus, + NULL + ), + DEFINE_KSPROPERTY_ITEM_BDA_SIGNAL_STRENGTH( + CTransportPin::GetSignalStatus, + NULL + ), +}; + +// +//BDA Digital Demodulator Property Set for Demodulator Node +// +//Defines the dispatch routines for the Digital Demodulator Properties +//on the Demodulator Node. +// +DEFINE_KSPROPERTY_TABLE(SkyWalker1DemodulatorProps) +{ + DEFINE_KSPROPERTY_ITEM_BDA_MODULATION_TYPE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_TYPE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_INNER_FEC_RATE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_TYPE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_OUTER_FEC_RATE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_SYMBOL_RATE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_SPECTRAL_INVERSION( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), + DEFINE_KSPROPERTY_ITEM_BDA_TRANSMISSION_MODE( + CTransportPin::GetDigitalDemodProperty, + CTransportPin::SetDigitalDemodProperty + ), +}; + +//BDA Extended Property Set +DEFINE_KSPROPERTY_TABLE(SkyWalker1ExtendedProperties) +{ + DEFINE_KSPROPERTY_ITEM_BDA_DISEQC( + NULL, + CTransportPin::SetExtendedProperty + ), +}; + + +/*****************************************************************************************/ + +//Demodulator Node Property Sets supported +// +//This table defines all property sets supported by the +//Demodulator Node associated with the transport output pin. +// +DEFINE_KSPROPERTY_SET_TABLE(SkyWalker1DemodulatorProperties) +{ + + DEFINE_KSPROPERTY_SET + ( + &KSPROPSETID_BdaDigitalDemodulator, //Set + SIZEOF_ARRAY(SkyWalker1DemodulatorProps), //PropertiesCount + SkyWalker1DemodulatorProps, //PropertyItems + 0, //FastIoCount + NULL //FastIoTable + ), + DEFINE_KSPROPERTY_SET + ( + &KSPROPSETID_BdaExtendedProperty, //Set + SIZEOF_ARRAY(SkyWalker1ExtendedProperties), //PropertiesCount + SkyWalker1ExtendedProperties, //PropertyItems + 0, //FastIoCount + NULL //FastIoTable + ), + DEFINE_KSPROPERTY_SET + ( + &KSPROPSETID_BdaSignalStats, //Set + SIZEOF_ARRAY(SkyWalker1DemodulatorSignalStats), //PropertiesCount + SkyWalker1DemodulatorSignalStats, //PropertyItems + 0, //FastIoCount + NULL //FastIoTable + ), + + // + //Additional property sets for the node can be added here. + // +}; + + +DEFINE_KSAUTOMATION_TABLE(SkyWalker1DemodulatorAutomation) { + DEFINE_KSAUTOMATION_PROPERTIES(SkyWalker1DemodulatorProperties), + DEFINE_KSAUTOMATION_METHODS_NULL, + DEFINE_KSAUTOMATION_EVENTS_NULL +}; + +/*****************************************************************************************/ +//Template Node Descriptors +// +//Define an array that contains all the node types that are available in the template +//topology of the filter. +//These node types must be supported by BDA and +//defined elsewhere (for example, in Bdamedia.h). +// + +const KSNODE_DESCRIPTOR TunerFilterNodeDescriptors[] = +{ + DEFINE_NODE_DESCRIPTOR( + &SkyWalker1TunerAutomation, //Point to KSAUTOMATION_TABLE structure + //for the node's automation table + &KSNODE_BDA_RF_TUNER, //Point to the guid that defines function + //of the node + NULL //Point to the guid that represents the + //name of the topology node + ), + DEFINE_NODE_DESCRIPTOR( + &SkyWalker1DemodulatorAutomation,//Point to KSAUTOMATION_TABLE structure + //for the node's automation table + &KSNODE_BDA_QPSK_DEMODULATOR,//Point to the guid that defines function + //of the node + NULL //Point to the guid that represents the + //name of the topology node + ), +}; + +/*****************************************************************************************/ +//Define BDA Template Topology Connections +// +//Lists the Connections that are possible between pin types and +//node types. This, together with the Template Filter Descriptor, and +//the Pin Pairings, describe how topologies can be created in the filter. +// +// =========== ============ +//AntennaPin ----| RF Node |--Joint--|Demod Node|----TransportPin +// =========== ============ +// +//The RF Node of this filter is controlled by the Antenna input pin. +//RF properties will be set as NODE properties (with NodeType == 0) +//on the filter's Antenna Pin +// +//The Demodulator Node of this filter is controlled by the Transport output pin. +//Demod properties will be set as NODE properties (with NodeType == 1) +//on the filter's Transport Pin + +const KSTOPOLOGY_CONNECTION TunerFilterConnections[]={ + {KSFILTER_NODE, 0, 0, KSNODEPIN_STANDARD_IN}, //Antenna pin -> Tuner pin 0 + {0, KSNODEPIN_STANDARD_OUT, 1, KSNODEPIN_STANDARD_IN}, //Tuner pin 1 -> Demodulator pin 0 + {1, KSNODEPIN_STANDARD_OUT, KSFILTER_NODE, 1}, //Demodulator pin 1 -> Transport pin +}; + +//Lists the template joints between the Antenna Input Pin Type and +//the Transport Output Pin Type. +// +//In this case the RF Node is considered to belong to the antennea input +//pin and the 8VSB Demodulator Node is considered to belong to the +//tranport stream output pin. +// +const ULONG InterNodeJoints[] = +{ + 1 //joint occurs between the two node types (second element in array) + //indicates that 1st node is controlled by input pin and 2nd node by output pin +}; + + +//Array of BDA_PIN_PAIRING structures that are used to determine +//which nodes get duplicated when more than one output pin type is +//connected to a single input pin type or when more that one input pin +//type is connected to a single output pin type. +// +const BDA_PIN_PAIRING TunerFilterPinPairings[] = +{ + //Input pin to Output pin Topology Joints + { + 0, //ulInputPin; 0 element in the TemplatePinDescriptors array. + 1, //ulOutputPin; 1 element in the TemplatePinDescriptors array. + 1, //ulcMaxInputsPerOutput + 1, //ulcMinInputsPerOutput + 1, //ulcMaxOutputsPerInput + 1, //ulcMinOutputsPerInput + SIZEOF_ARRAY(InterNodeJoints), //ulcTopologyJoints + InterNodeJoints //pTopologyJoints; array of joints + } + //If applicable, list topology of joints between other pins. +}; + +/*****************************************************************************************/ + +const KSCOMPONENTID TunerFilterComponentId={ + NULL, + NULL, + NULL, + NULL, + 1, //Version + 0 //Revision +}; +/**********************************************************************************/ + +// +//Dispatch Table for the antenna pin. +// + +const KSPIN_DISPATCH AntennaPinDispatch={ + /* Create */ CAntennaPin::PinCreate, + /* Close */ CAntennaPin::PinClose, + /* Process */ NULL, + /* Reset */ NULL, + /* SetDataFormat */ NULL, + /* SetDeviceState */ CAntennaPin::PinSetDeviceState, + /* Connect */ NULL, + /* Disconnect */ NULL, + /* Allocator */ NULL +}; + +DEFINE_KSAUTOMATION_TABLE(NullAutomation) +{ + DEFINE_KSAUTOMATION_PROPERTIES_NULL, + DEFINE_KSAUTOMATION_METHODS_NULL, + DEFINE_KSAUTOMATION_EVENTS_NULL +}; + +const KS_DATARANGE_BDA_ANTENNA AntennaPinRange = +{ + //insert the KSDATARANGE and KSDATAFORMAT here + { + sizeof( KS_DATARANGE_BDA_ANTENNA), //FormatSize + 0, //Flags - (N/A) + 0, //SampleSize - (N/A) + 0, //Reserved + { STATIC_KSDATAFORMAT_TYPE_BDA_ANTENNA }, //MajorFormat + { STATIC_KSDATAFORMAT_SUBTYPE_NONE }, //SubFormat + { STATIC_KSDATAFORMAT_SPECIFIER_NONE } //Specifier + } +}; + +const PKSDATARANGE AntennaPinRanges[]={ + (PKSDATARANGE)&AntennaPinRange, +}; + +// +//Dispatch Table for the transport Output pin. +// +//Since data on the transport is actually delivered to the +//PCI bridge in hardware, this pin does not process data. +// +//Connection of, and state transitions on, this pin help the +//driver to determine when to allocate hardware resources for +//each node. +// +const KSPIN_DISPATCH TransportPinDispatch = +{ + CTransportPin::PinCreate, //Create + CTransportPin::PinClose, //Close + NULL, //Process + NULL, //Reset + NULL, //SetDataFormat + /*AntennaPinSetDeviceState*/ NULL, //SetDeviceState + NULL, //Connect + NULL, //Disconnect + NULL, //Clock + NULL //Allocator +}; + + +const KSPIN_INTERFACE StreamInterface[]={ + { + STATICGUIDOF(KSINTERFACESETID_Standard), + KSINTERFACE_STANDARD_STREAMING, + 0 + }, +}; + +//Medium GUIDs for the Transport Output Pin. +// +//Pin Medium descriptor containing all medium accepted to be connected to +//the tuner output pin.This insures contection to the correct Capture Filter pin. +// +//{2AEB4A94-FBB7-4FB1-8D74-243B91886EAB} + +const KSPIN_MEDIUM TransportPinMediums[] = +{ + { + GUID_SKYWALKER_TUNER_OUT_MEDIUM, + 0, + 0 + } +}; + +const KS_DATARANGE_BDA_TRANSPORT TransportPinRange = +{ + //insert the KSDATARANGE and KSDATAFORMAT here + { + sizeof( KS_DATARANGE_BDA_TRANSPORT), //FormatSize + 0, //Flags - (N/A) + 0, //SampleSize - (N/A) + 0, //Reserved + { STATIC_KSDATAFORMAT_TYPE_STREAM }, //MajorFormat + { STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT }, //SubFormat + { STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT } //Specifier + }, + //BDA_TRANSPORT_INFO + { + TRANSPORT_PACKET_SIZE, //Bytes in Line + TRANSPORT_PACKET_SIZE * TRANSPORT_PACKET_COUNT, //Frame Size + 0, //ulcbPhysicalFrameAlignment (no requirement) + 0 //AvgTimePerFrame, Time / Sample (not known) + } +}; + +//Format Ranges of Transport Output Pin. +// +static PKSDATAFORMAT TransportPinRanges[] = +{ + (PKSDATAFORMAT) &TransportPinRange, + + //Add more formats here if additional transport formats are supported. + // +}; + +DECLARE_SIMPLE_FRAMING_EX(TransportAllocator, + STATICGUIDOF(KSMEMORY_TYPE_KERNEL_NONPAGED), + KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY/*|KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY*/, + 8, + 0, + TRANSPORT_PACKET_COUNT*TRANSPORT_PACKET_SIZE, + TRANSPORT_PACKET_COUNT*TRANSPORT_PACKET_SIZE); + + +//Template Pin Descriptors + +//This data structure defines the pin types available in the filters +//template topology. These structures will be used to create a +//KDPinFactory for a pin type when BdaCreatePin or BdaMethodCreatePin +//are called. +// +//This structure defines ALL pins the filter is capable of supporting, +//including those pins which may only be created dynamically by a ring +//3 component such as a Network Provider. + +const KSPIN_DESCRIPTOR_EX TunerFilterPinDescriptors[]={ + { //Antenna input pin + &AntennaPinDispatch, //Dispatch Table + &NullAutomation, //Automation Table + { + 0, //Interfaces + NULL, + 0, //Mediums + NULL, + SIZEOF_ARRAY(AntennaPinRanges), + AntennaPinRanges, + KSPIN_DATAFLOW_IN, //Specifies that data flow is into the pin + KSPIN_COMMUNICATION_BOTH, //Specifies that the pin factory instantiates pins + //that are both IRP sinks and IRP sources + NULL, //Category + NULL, //Name + 0 + }, + KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT| + KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING| + KSPIN_FLAG_FIXED_FORMAT, + 1, //Maximum Possible Instances of the Pin + 1, //Mandatory Instances of this for the Filter function + NULL, + CAntennaPin::IntersectDataFormat //Data Interaction Handler + }, + //Tranport Output Pin + { + &TransportPinDispatch, //Point to the dispatch table for the output pin + &NullAutomation, //Point to the automation table for the output pin + { //Specify members of a KSPIN_DESCRIPTOR structure for the output pin + 0, //Interface Count + NULL, //Interfaces + SIZEOF_ARRAY(TransportPinMediums), //Medium Count + TransportPinMediums, //Medium + SIZEOF_ARRAY(TransportPinRanges), //Range Count + TransportPinRanges, //Ranges + KSPIN_DATAFLOW_OUT, //specifies that data flow is out of the pin + KSPIN_COMMUNICATION_BOTH, //specifies that the pin factory instantiates pins + (GUID *) &PINNAME_BDA_TRANSPORT, //Category GUID + (GUID *) &PINNAME_BDA_TRANSPORT, //GUID of the localized Unicode string //name for the pin type + 0 + }, //Specify flags + KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT | + KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING | + KSPIN_FLAG_FIXED_FORMAT, + 1, //Specify the maximum number of possible instances of the output pin + 1, //Specify the number of instances of this pin type that are necessary for proper functioning of this filter + NULL, //Allocator Framing + CTransportPin::IntersectDataFormat //Point to the data intersection handler function + } +}; + +/**********************************************************************************/ + +//BDA Device Topology Property Set + +//The BDA Support Library supplies a default implementation of the +//BDA Device Topology Property Set. If the driver needs to override +//this default implemenation, the definitions for the override properties +//will be defined here. + + +//BDA Device Configuration Method Set + +//The BDA Support Library provides a default implementation of +//the BDA Device Configuration Method Set. In this , the +//driver overrides the CreateTopology method. Note that the +//support libraries CreateTopology method is called before the +//driver's implementation returns. +// +DEFINE_KSMETHOD_TABLE(TunerFilterConfiguration) +{ + DEFINE_KSMETHOD_ITEM_BDA_CREATE_TOPOLOGY( + CTunerFilter::CreateTopology, //Calls BdaMethodCreateTopology + NULL + ) +}; + + +//BDA Change Sync Method Set + +//The Change Sync Method Set is required on BDA filters. Setting a +//node property should not become effective on the underlying device +//until CommitChanges is called. +//The BDA Support Library provides routines that handle committing +//changes to topology. The BDA Support Library routines should be +//called from the driver's implementation before the driver implementation +//returns. + +DEFINE_KSMETHOD_TABLE(TunerFilterChangeSync) +{ + DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES( + CTunerFilter::StartChanges, //Calls BdaStartChanges + NULL + ), + DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES( + CTunerFilter::CheckChanges, //Calls BdaCheckChanges + NULL + ), + DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES( + CTunerFilter::CommitChanges, //Calls BdaCommitChanges + NULL + ), + DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE( + CTunerFilter::GetChangeState, //Calls BdaGetChangeState + NULL + ) +}; + + +//Array of Method sets supported by filter +DEFINE_KSMETHOD_SET_TABLE(TunerFilterMethods) +{ + DEFINE_KSMETHOD_SET + ( + &KSMETHODSETID_BdaChangeSync, //Method set GUID + SIZEOF_ARRAY(TunerFilterChangeSync), //Number of methods + TunerFilterChangeSync, //Array of KSMETHOD_ITEM structures + 0, //FastIoCount + NULL //FastIoTable + ), + + DEFINE_KSMETHOD_SET + ( + &KSMETHODSETID_BdaDeviceConfiguration, //Method set GUID + SIZEOF_ARRAY(TunerFilterConfiguration), //Number of methods + TunerFilterConfiguration, //Array of KSMETHOD_ITEM structures + 0, //FastIoCount + NULL //FastIoTable + ) + +}; + +//Supporting only Filter Methods;Properties and Events are not supported +DEFINE_KSAUTOMATION_TABLE(TunerFilterAutomationTable) +{ + DEFINE_KSAUTOMATION_PROPERTIES_NULL, + DEFINE_KSAUTOMATION_METHODS(TunerFilterMethods), + DEFINE_KSAUTOMATION_EVENTS_NULL +}; +/**********************************************************************************/ +//Dispatch table for the Filter Processing +const KSFILTER_DISPATCH TunerFilterDispatchTable = +{ + /* Create */ CTunerFilter::Create, //Routine called when the Filter is created + /* Close */ CTunerFilter::FilterClose, //Routine called when the Filter is closed + /* Process */ NULL, + /* Reset */ NULL +}; + +/*****************************************************************************************/ + +//Define the Filter Factory Descriptor for the filter +//This structure brings together all of the structures that define +//the tuner filter as it appears when it is first instantiated. +//Note that not all of the template pin and node types may be exposed as +//pin and node factories when the filter is first instanciated. + +//The KSFILTER_DESCRIPTOR structure describes the characteristics of a filter created by a given filter factory. +DEFINE_KSFILTER_DESCRIPTOR(SkyWalker1TunerFilterDescriptor) +{ + &TunerFilterDispatchTable, //Dispatch (Filter Specific Driver) + &TunerFilterAutomationTable, //AutomationTable + KSFILTER_DESCRIPTOR_VERSION, //Version + 0, //Flags + &SKYWALKER_TUNER_FILTER, //ReferenceGuid + DEFINE_KSFILTER_PIN_DESCRIPTORS(TunerFilterPinDescriptors), + //PinDescriptorsCount; must expose at least one pin + //PinDescriptorSize; size of each item + //PinDescriptors; table of pin descriptors + DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_NETWORK_TUNER), + //CategoriesCount; number of categories in the table + //Categories; table of categories + DEFINE_KSFILTER_NODE_DESCRIPTORS(TunerFilterNodeDescriptors), + //NodeDescriptorsCount; + //NodeDescriptorSize; + //NodeDescriptors; + DEFINE_KSFILTER_CONNECTIONS(TunerFilterConnections), + //Automatically fills in the connections table for a filter which defines no explicit connections + //ConnectionsCount; number of connections in the table + //Connections; table of connections + &TunerFilterComponentId //ComponentId; +}; + +//BDA_FILTER_TEMPLATE structure describes the template topology for BDA Driver +const BDA_FILTER_TEMPLATE TunerFilterTemplate = +{ + &SkyWalker1TunerFilterDescriptor,//Pointer to KS_FILTER_DESCRIPTOR which describes the Filter for BDA Device + SIZEOF_ARRAY(TunerFilterPinPairings), //Number of PAIRS of pins in BDA_PIN_PAIRING Array + TunerFilterPinPairings //Array of Pin Pairing describes topology between a pair of Filter's Input and Output Pins +}; + +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerPin.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerPin.cpp new file mode 100644 index 0000000..d81001e --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1TunerPin.cpp @@ -0,0 +1,212 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1CPin.cpp + Author : + Date : + Purpose : This File Holds the General Pin related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + + +/***************************************************************************** + Function : CTunerPin::PinCreate + Description : An AVStream minidriver's AVStrMiniPinCreate routine is + called when a pin is created. Typically, this routine is + used by minidrivers that want to initialize the context + and resources associated with the pin. + IN PARAM : Pointer to the KSPIN that was just created. + Pointer to the IRP_MJ_CREATE for Pin + OUT PARAM : STATUS_SUCCESS in case of successful pin creation + Failure Code in other cases + PreCondition : None + PostCondtion : Creates the Tuner pin object and associates it + with the filter object. + Logic : NONE + Assumption : NONE + Note : None + Revision History: + *****************************************************************************/ +NTSTATUS CTunerPin::PinCreate( IN OUT PKSPIN pKSPin, + IN PIRP pIoRequestPacket + ) +{ + NTSTATUS ntCreateStatus = STATUS_SUCCESS; + CTunerPin* pPin = NULL; //Pointer to the Current Pin Instance + CTunerFilter* pFilter = NULL; //Pointer to the Filter associted with the Pin + + PrintFunctionEntry(__FUNCTION__); + SkyWalkerDebugPrint(ENTRY_LEVEL,("Sizeof DISEQC_COMMAND = %d\n",sizeof(DISEQC_COMMAND))); + //Obtain a pointer to the filter object for which the input pin is created. + + //The KsGetFilterFromIrp function returns the AVStream filter object + //associated with a given IRP. + pFilter = reinterpret_cast(KsGetFilterFromIrp(pIoRequestPacket)->Context); + + //Create the Tuner pin object. + pPin = new(PagedPool,TUNER_MEM_TAG) CTunerPin; // Tags the allocated memory + + if (pPin) + { + //Link the pin context to the filter context. + //That is, set the input pin's filter pointer data member to the obtained filter pointer. + pPin->SetFilter( pFilter); + + //Link the pin context to the passed in pointer to the KSPIN structure. + pKSPin->Context = pPin; + + } + else + { + ntCreateStatus = STATUS_INSUFFICIENT_RESOURCES; + } + + PrintFunctionExit(__FUNCTION__,ntCreateStatus); + return ntCreateStatus; +} + +/***************************************************************************** + Function : CTunerPin::PinClose + Description : An AVStream minidriver's AVStrMiniPinClose routine is + called when a pin is closed.It usually is provided by + minidrivers that want to free the context and resources + associated with the pin. + IN PARAM : Pointer to the KSPIN that was just closed. + Pointer to the IRP_MJ_CLOSE for Pin. + OUT PARAM : STATUS_SUCCESS in case of successful pin Close + Failure Code in other cases + PreCondition : None + PostCondtion : Deletes the previously created Tuner pin object. + Logic : NONE + Assumption : NONE + Note : This is called from the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS CTunerPin::PinClose( IN OUT PKSPIN pKSPin, + IN PIRP pIoRequestPacket + ) +{ + NTSTATUS ntCloseStatus = STATUS_SUCCESS; + CTunerPin* pPin = NULL; //Pointer to the Current Pin Instance + CTunerFilter* pFilter = NULL; //Pointer to the Filter associted with the Pin + + PrintFunctionEntry(__FUNCTION__); + + // Retrieve the Tuner pin object from the passed in + // KSPIN structure's context member. + // + pPin = reinterpret_cast(pKSPin->Context); + + if(IS_VALID(pPin)) + { + delete pPin; + pPin = NULL; + } + + PrintFunctionExit(__FUNCTION__,ntCloseStatus); + return ntCloseStatus; +} + +/***************************************************************************** + Function : CTunerPin::GetSignalStatus + Description : Retrieves the value of the signal statistics properties. + IN PARAM : IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + OUT PARAM : Status SUCCESS in case Valid Property request + STATUS_INVALID_PARAMETER in case of Invalid property request + Else error from the lower device + PreCondition : None + PostCondtion : Signal Status read in case of successful execution + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CTunerPin::GetSignalStatus( + IN PIRP pIoRequestPacket, + IN PKSPROPERTY pKSProperty, + OUT PULONG pulProperty + ) +{ + NTSTATUS ntGetStatus = STATUS_SUCCESS; + CTunerPin* pPin = NULL; //Pointer to the Current Pin Instance + CTunerFilter* pFilter = NULL; //Pointer to the Filter associted with the Pin + BDATUNER_DEVICE_STATUS TunerStatus; + + PrintFunctionEntry(__FUNCTION__); + + + // Call the BDA support library to + // validate that the node type is associated with this pin. + ntGetStatus = BdaValidateNodeProperty( pIoRequestPacket, pKSProperty); + if (NT_SUCCESS( ntGetStatus)) + { + // Obtain a pointer to the pin object. + // + // Because the property dispatch table calls the CTunerPin::GetSignalStatus() + // method directly, the method must retrieve a pointer to the underlying pin object. + // + pPin = reinterpret_cast(KsGetPinFromIrp(pIoRequestPacket)->Context); + + // Retrieve the filter context from the pin context. + // + pFilter = pPin->GetFilter(); + + ntGetStatus = pFilter->GetStatus( &TunerStatus); + if (ntGetStatus == STATUS_SUCCESS) + { + switch (pKSProperty->Id) + { + case KSPROPERTY_BDA_SIGNAL_LOCKED: + *pulProperty = TunerStatus.fSignalLocked; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Lock = 0x%02X\n",*pulProperty)); + break; + case KSPROPERTY_BDA_SIGNAL_QUALITY: + *pulProperty = TunerStatus.dwSignalQuality; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Quality = %lu\n",*pulProperty)); + break; + case KSPROPERTY_BDA_SIGNAL_PRESENT: + *pulProperty = TunerStatus.fCarrierPresent; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Present = 0x%02X\n",*pulProperty)); + break; + case KSPROPERTY_BDA_SIGNAL_STRENGTH: + *pulProperty = TunerStatus.dwSignalStrength; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Signal Strength = %lu\n", *pulProperty)); + break; + default: + ntGetStatus = STATUS_INVALID_PARAMETER; + } + } + } + + PrintFunctionExit(__FUNCTION__,ntGetStatus); + return ntGetStatus; +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1USB.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1USB.cpp new file mode 100644 index 0000000..e83ef37 --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1USB.cpp @@ -0,0 +1,2101 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Usb.cpp + Author : + Date : + Purpose : This File Holds all the USB Device access related declarations + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ +/* Include the Library and Other header file */ +//#include +#include "SkyWalker1Main.h" //Header for the Tuner related definitions + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +#define USB_MEMORY_TAG 'MBSU' +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +NTSTATUS ReadandSelectDescriptors( IN PKSDEVICE pKSDeviceObject ); +NTSTATUS ConfigureDevice(IN PKSDEVICE pKSDeviceObject); +NTSTATUS SelectInterfaces( IN PKSDEVICE pKSDeviceObject, + IN PUSB_CONFIGURATION_DESCRIPTOR pConfigurationDescriptor); + +NTSTATUS UsbReadWriteCompletion( + IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket, + IN PVOID pContext + ); +NTSTATUS ResetUsbPipe( IN PKSDEVICE pKSDeviceObject, + IN PUSBD_PIPE_INFORMATION pPipeInformation); +NTSTATUS ResetUsbDevice(IN PKSDEVICE pKSDeviceObject); +NTSTATUS GetUsbPortStatus( IN PKSDEVICE pKSDeviceObject, + IN OUT PULONG pulPortStatus); +NTSTATUS ResetUsbParentPort( IN PKSDEVICE pKSDeviceObject ); +NTSTATUS SendURBToBusDriver(IN PKSDEVICE pKSDeviceObject, + IN PURB pUSBRequestBlock ); +NTSTATUS AbortUsbPipes(IN PKSDEVICE pKSDeviceObject); +LONG IncrementPendingIoCount(IN OUT CSkyWalker1Device * pDevice); +LONG DecrementPendingIoCount(IN OUT CSkyWalker1Device * pDevice); + +//Debugging related Functions +VOID PrintDeviceDescriptor( PUSB_DEVICE_DESCRIPTOR pDeviceDescriptor); +VOID PrintConfigurationDescriptor(IN PUSB_CONFIGURATION_DESCRIPTOR pConfigurationDescriptor); +VOID PrintInterfaceDescriptor(IN PUSB_INTERFACE_DESCRIPTOR pInterfaceDescriptor); +VOID PrintPipeInformation(PUSBD_PIPE_INFORMATION pPipeInformation); +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : InitializeUsbDevice + Description : Function to used to Initialize the USB Interface of the Tuner + IN PARAM : Pointer to Device Object which needs to be Initialized + Irp to start the device IRP_MN_START + OUT PARAM : Status of the Device Initialization + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Device initialized + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS InitializeUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntInitStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = NULL; + KIRQL kOldIrql; + + PrintFunctionEntry(__FUNCTION__); + + pDevice = reinterpret_cast(pKSDeviceObject->Context); + + //We cannot touch the device (send it any non pnp irps) until a + //start device has been passed down to the lower drivers. + //first pass the Irp down + + ntInitStatus = PassDownIRPAndWaitForCompletion( pKSDeviceObject->NextDeviceObject, + pIoRequestPacket, + TRUE); + if(!NT_SUCCESS(ntInitStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Lower Driver did not start !!!,Stopping Device Start\n")); + goto FinishStartDevice; + } + + //Lower Device Initialized , Start the Device Now + // + //Read the device descriptor, configuration descriptor + //and select the interface descriptors + // + + ntInitStatus = ReadandSelectDescriptors(pKSDeviceObject); + + if(!NT_SUCCESS(ntInitStatus)) + { + + SkyWalkerDebugPrint(ENTRY_LEVEL,("ReadandSelectDescriptors failed\n")); + goto FinishStartDevice; + } + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + SET_NEW_PNP_STATE(pDevice, Working); + pDevice->QueueState = AllowRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + +/* + //initialize wait wake outstanding flag to false. + //and issue a wait wake. + + deviceExtension->FlagWWOutstanding = 0; + deviceExtension->FlagWWCancel = 0; + deviceExtension->WaitWakeIrp = NULL; + + if(deviceExtension->WaitWakeEnable) + { + + IssueWaitWake(deviceExtension); + } + + ProcessQueuedRequests(deviceExtension); + +*/ +FinishStartDevice: + PrintFunctionExit(__FUNCTION__,ntInitStatus); + + return ntInitStatus; +} + +/***************************************************************************** + Function : ReadandSelectDescriptors + Description : Function to used to Read Device Descriptor + IN PARAM : Pointer to KS Device Object + OUT PARAM : Status of the Device Descriptor Read + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : Device Descriptor Read + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ReadandSelectDescriptors( IN PKSDEVICE pKSDeviceObject ) +{ + URB USBRequestBlock; + NTSTATUS ntStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + //1. Read the device descriptor + + UsbBuildGetDescriptorRequest( + &USBRequestBlock, + (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), + USB_DEVICE_DESCRIPTOR_TYPE, + 0, + 0, + &pDevice->USBDeviceDescriptor, + NULL, + sizeof(pDevice->USBDeviceDescriptor), + NULL); + + ntStatus = SendURBToBusDriver( pKSDeviceObject, + &USBRequestBlock); + if (!NT_SUCCESS(ntStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Error Trying to Read Device Descriptor\n")); + goto CompleteReadAndSetup; + } + + PrintDeviceDescriptor(&pDevice->USBDeviceDescriptor); + + //Device Descriptor read successfully thus, Read and select configuration + ntStatus = ConfigureDevice(pKSDeviceObject); + +CompleteReadAndSetup: + + PrintFunctionExit(__FUNCTION__,ntStatus); + return ntStatus; +} + +/***************************************************************************** + Function : ConfigureDevice + Description : This helper routine reads the configuration descriptor + for the device in couple of steps. + IN PARAM : Pointer to KS Device Object + OUT PARAM : Status of the Configuration Descriptor Read + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : Configuration Descriptor Read + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ConfigureDevice(IN PKSDEVICE pKSDeviceObject) +{ + URB USBRequestBlock; + NTSTATUS ntConfigureStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + PUSB_CONFIGURATION_DESCRIPTOR pConfigurationDescriptor = NULL; + + PrintFunctionEntry(__FUNCTION__); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Total Number of Configurations = %d\n", pDevice->USBDeviceDescriptor.bNumConfigurations)); + + //Read the first configuration descriptor + //This requires two steps: + //1. Read the fixed sized configuration desciptor (CD) + //2. Read the CD with all embedded interface and endpoint descriptors + + UsbBuildGetDescriptorRequest( &USBRequestBlock, + sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), + USB_CONFIGURATION_DESCRIPTOR_TYPE, + 0, + 0, + &ConfigurationDescriptor, + NULL, + sizeof(ConfigurationDescriptor), + NULL); + + ntConfigureStatus = SendURBToBusDriver( pKSDeviceObject, + &USBRequestBlock); + if (!NT_SUCCESS(ntConfigureStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Error Trying to Read Fixed Size Configuration Descriptor\n")); + goto CompleteDeviceConfigure; + } + + ULONG ulConfigurationDesciptorSize = ConfigurationDescriptor.wTotalLength; + SkyWalkerDebugPrint(EXTREME_LEVEL, ("Configuration Descriptor Size = %lu \n",ulConfigurationDesciptorSize)); + + pConfigurationDescriptor = (PUSB_CONFIGURATION_DESCRIPTOR) ExAllocatePoolWithTag( NonPagedPool, + ulConfigurationDesciptorSize, + USB_MEMORY_TAG); + if (!pConfigurationDescriptor) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to allocate %lu bytes for Configuration Descriptor\n", ulConfigurationDesciptorSize)); + ntConfigureStatus = STATUS_INSUFFICIENT_RESOURCES; + goto CompleteDeviceConfigure; + } + + UsbBuildGetDescriptorRequest( &USBRequestBlock, + sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), + USB_CONFIGURATION_DESCRIPTOR_TYPE, + 0, + 0, + pConfigurationDescriptor, + NULL, + ulConfigurationDesciptorSize, + NULL); + + ntConfigureStatus = SendURBToBusDriver( pKSDeviceObject, + &USBRequestBlock); + if (!NT_SUCCESS(ntConfigureStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Error Trying to Read Actual Configuration Descriptor\n")); + goto CompleteDeviceConfigure; + } + + PrintConfigurationDescriptor(&ConfigurationDescriptor); + + ntConfigureStatus = SelectInterfaces(pKSDeviceObject, pConfigurationDescriptor); + +CompleteDeviceConfigure: + if(pConfigurationDescriptor) + { + ExFreePoolWithTag(pConfigurationDescriptor,USB_MEMORY_TAG); + } + PrintFunctionExit(__FUNCTION__,ntConfigureStatus); + return ntConfigureStatus; +} + +/***************************************************************************** + Function : SelectInterfaces + Description : This helper routine selects the configuration + IN PARAM : Pointer to KS Device Object + Configuration Descriptor + OUT PARAM : Status of the Configuration Descriptor Selection + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : Configuration Descriptor Selection + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS SelectInterfaces( IN PKSDEVICE pKSDeviceObject, + IN PUSB_CONFIGURATION_DESCRIPTOR pConfigurationDescriptor) +{ + NTSTATUS ntSelectStatus = STATUS_SUCCESS; + URB USBRequestBlock; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + PUSB_INTERFACE_DESCRIPTOR pInterfaceDescriptor = NULL; + PUSBD_INTERFACE_INFORMATION pInterfaceInformation = NULL; + LONG lNumberOfInterfaces = pConfigurationDescriptor->bNumInterfaces; + LONG lInterfaceNumber = 0L; + LONG lInterfaceIndex = 0L; + ULONG ulPipeIndex = 0L; + + //The Device needs to be configured by sending a URB that specifies the configuration to use + //if device driver fails to configure the device then the I/O manager subsequently unloads + //the Driver from memory + //Search for the Configuration descriptor in the list of all configuration and obtain a pointer + //to the interface + pInterfaceDescriptor = USBD_ParseConfigurationDescriptorEx( + pConfigurationDescriptor, //Address of the Configuration Descriptor Structure + pConfigurationDescriptor, //Adress within the First Structure from where search should begin + -1, + -1, + -1, + -1, + -1); + if (!pInterfaceDescriptor) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("No Interface available for the Device\n")); + ntSelectStatus = STATUS_DEVICE_CONFIGURATION_ERROR; + goto FinishSelectInterface; + } + + //Create a URB that can be sent to the host controller driver (HCD) to set the Device + //in the configured state + USBD_INTERFACE_LIST_ENTRY Interfaces[2] = + { + {pInterfaceDescriptor, NULL}, + {NULL, NULL}, + }; + + PURB pConfigSelectURB = USBD_CreateConfigurationRequestEx(pConfigurationDescriptor, Interfaces); + if (!pConfigSelectURB) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Unable to Create Configuration Request\n")); + ntSelectStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishSelectInterface; + } + + //Get the Interface supported by selected configuration + + pInterfaceInformation = &pConfigSelectURB->UrbSelectConfiguration.Interface; + + for(ulPipeIndex=0; ulPipeIndexNumberOfPipes; ulPipeIndex++) + { + //Perform pipe initialization here set the transfer size and any pipe flags we use + //USBD sets the rest of the Interface struct members + + //pInterfaceInformation->Pipes[ulPipeIndex].MaximumTransferSize = USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE; + } + + ntSelectStatus = SendURBToBusDriver(pKSDeviceObject,pConfigSelectURB); + + if (!NT_SUCCESS(ntSelectStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Error Trying to Select Configuration\n")); + goto FinishSelectInterface; + } + + PrintInterfaceDescriptor(pInterfaceDescriptor); + + for(ulPipeIndex=0; ulPipeIndexNumberOfPipes; ulPipeIndex++) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("--------------------------\n")); + PrintPipeInformation(&pInterfaceInformation->Pipes[ulPipeIndex]); + SkyWalkerDebugPrint(EXTREME_LEVEL,("--------------------------\n")); + + //Setting the Pipes + if(pInterfaceInformation->Pipes[ulPipeIndex].EndpointAddress == 0x82) + { + RtlCopyMemory( &pDevice->ReadPipe, + &pInterfaceInformation->Pipes[ulPipeIndex], + sizeof(pDevice->ReadPipe)); + } + else + { + RtlCopyMemory( &pDevice->WritePipe, + &pInterfaceInformation->Pipes[ulPipeIndex], + sizeof(pDevice->WritePipe)); + } + + } +FinishSelectInterface: + + if(pConfigSelectURB) + { + ExFreePool(pConfigSelectURB); + } + + PrintFunctionExit(__FUNCTION__,ntSelectStatus); + return ntSelectStatus; +} + +/***************************************************************************** + Function : QueryStopUsbDevice + Description : Function to used to Service PnP IRPs of Minor Type + IRP_MN_QUERY_STOP_DEVICE + IN PARAM : Pointer to Device Object whose stop query has come + Device Stop Query Irp with Minor Code IRP_MN_QUERY_STOP_DEVICE + OUT PARAM : Status of the Stop Query Processing + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Device can be stopped or not is returned + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS QueryStopUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + NTSTATUS ntQueryStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + //If we can stop the device, we need to set the QueueState to + //HoldRequests so further requests will be queued. + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + SET_NEW_PNP_STATE(pDevice, PendingStop); + pDevice->QueueState = HoldRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + //wait for the existing ones to be finished. + //first, decrement this operation + DecrementPendingIoCount(pDevice); + + KeWaitForSingleObject(&pDevice->EvDeviceStopOk, + Executive, + KernelMode, + FALSE, + NULL); + + PrintFunctionExit(__FUNCTION__,ntQueryStatus); + + return ntQueryStatus; +} + +/***************************************************************************** + Function : DecrementPendingIoCount + Description : This routine decrements the outstanding I/O count + This is typically invoked after the dispatch routine + has finished processing the irp. + IN PARAM : Device Pointer + OUT PARAM : Io Pending Count + PreCondition : NONE + PostCondtion : Pending IO Count is Decremented and same is returned to + the caller + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +LONG DecrementPendingIoCount(IN OUT CSkyWalker1Device * pDevice) +{ + LONG ulResult = 0; + KIRQL kOldIrql; + + PrintFunctionEntry(__FUNCTION__); + + KeAcquireSpinLock(&pDevice->kIoCountLock, &kOldIrql); + + ulResult = InterlockedDecrement((PLONG)&pDevice->ulOutStandingIoCount); + + if(ulResult == 1) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Device can be Stopped\n")); + KeSetEvent(&pDevice->EvDeviceStopOk, IO_NO_INCREMENT, FALSE); + } + + if(ulResult == 0) + { + SkyWalkerDebugPrint(EXTREME_LEVEL,("Device can be Removed\n")); + KeSetEvent(&pDevice->EvDeviceRemoveOk,IO_NO_INCREMENT, FALSE); + } + + KeReleaseSpinLock(&pDevice->kIoCountLock, kOldIrql); + + SkyWalkerDebugPrint(EXTREME_LEVEL, ("%s::%d\n",__FUNCTION__,ulResult)); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + + return ulResult; +} +/***************************************************************************** + Function : IncrementPendingIoCount + Description : This routine increments the outstanding I/O count + This is typically invoked before the dispatch routine + to process new Irp is called + IN PARAM : Device Pointer + OUT PARAM : Io Pending Count + PreCondition : NONE + PostCondtion : Pending IO Count is Incremented and same is returned to + the caller + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +LONG IncrementPendingIoCount(IN OUT CSkyWalker1Device * pDevice) +{ + LONG ulResult = 0; + KIRQL kOldIrql; + + PrintFunctionEntry(__FUNCTION__); + KeAcquireSpinLock(&pDevice->kIoCountLock, &kOldIrql); + + ulResult = InterlockedIncrement((PLONG)&pDevice->ulOutStandingIoCount); + + //when OutStandingIO bumps from 1 to 2, clear the StopEvent + if(ulResult == 2) + { + + KeClearEvent(&pDevice->EvDeviceStopOk); + } + + KeReleaseSpinLock(&pDevice->kIoCountLock, kOldIrql); + + SkyWalkerDebugPrint(EXTREME_LEVEL, ("%s::%d\n",__FUNCTION__,ulResult)); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); + + return ulResult; +} + +/***************************************************************************** + Function : CancelStopUsbDevice + Description : Function to used to Service PnP IRPs of Minor Type + IRP_MN_CANCEL_STOP_DEVICE + IN PARAM : Pointer to Device Object whose Cancel stop request has come + Device Stop Cancel Irp with Minor Code IRP_MN_CANCEL_STOP_DEVICE + OUT PARAM : Status of the Device Stop Cancel Processing + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Device Stop is cancelled + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CancelStopUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + KEVENT Evevent; + NTSTATUS ntStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + //First check to see whether you have received cancel-stop + //without first receiving a query-stop. This could happen if someone + //above us fails a query-stop and passes down the subsequent + //cancel-stop. + if(pDevice->UsbDeviceState == PendingStop ) + { + if(NT_SUCCESS(ntStatus)) + { + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + RESTORE_PREVIOUS_PNP_STATE(pDevice); + pDevice->QueueState = AllowRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + //ProcessQueuedRequests(deviceExtension); + } + + } + else + { + + //spurious Irp + // + //If the device is already in an active state when the driver + //receives this IRP, a function driver simply sets status to + //success and passes the IRP to the next driver. For such a + //cancel-stop IRP, a function driver need not set a completion + //routine. + + } + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; +} + +/***************************************************************************** + Function : DeconfigureUsbDevice + Description : This routine is invoked when the device is removed or stopped. + This routine de-configures the usb device. + IN PARAM : Pointer to KS Device Object + OUT PARAM : Status of the Device Deinitialization + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : USB Device Uninitialized + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS DeconfigureUsbDevice(IN PKSDEVICE pKSDeviceObject) +{ + NTSTATUS ntUnInitStatus = STATUS_SUCCESS; + URB USBRequestBlock; + + PrintFunctionEntry(__FUNCTION__); + + UsbBuildSelectConfigurationRequest(&USBRequestBlock, sizeof(_URB_SELECT_CONFIGURATION), NULL); + + ntUnInitStatus = SendURBToBusDriver(pKSDeviceObject,&USBRequestBlock); + + if (!NT_SUCCESS(ntUnInitStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Error Trying to Deconfigure the Device\n")); + } + + PrintFunctionExit(__FUNCTION__,ntUnInitStatus); + return ntUnInitStatus; + +} + +/***************************************************************************** + Function : StopUsbDevice + Description : This routine is invoked when the device is stopped. + This routine services Irp of minor type IRP_MN_STOP_DEVICE + IN PARAM : Pointer to KS Device Object + STOP DEVICE Irp + OUT PARAM : Status of the Device Stop + STATUS_SUCCESS on Successful execution + else Error + PreCondition : NONE + PostCondtion : USB Device Stopped + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS StopUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + NTSTATUS ntDeviceStopStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = NULL; + + PrintFunctionEntry(__FUNCTION__); + + //initialize variables + pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + + + //if(WinXpOrBetter == deviceExtension->WdmVersion) { + + // if(deviceExtension->SSEnable) { + + // // + // //Cancel the timer so that the DPCs are no longer fired. + // //Thus, we are making judicious usage of our resources. + // //we do not need DPCs because the device is stopping. + // //The timers are re-initialized while handling the start + // //device irp. + // // + + // KeCancelTimer(&deviceExtension->Timer); + + // // + // //after the device is stopped, it can be surprise removed. + // //we set this to 0, so that we do not attempt to cancel + // //the timer while handling surprise remove or remove irps. + // //when we get the start device request, this flag will be + // //reinitialized. + // // + // deviceExtension->SSEnable = 0; + + // // + // //make sure that if a DPC was fired before we called cancel timer, + // //then the DPC and work-time have run to their completion + // // + // KeWaitForSingleObject(&deviceExtension->NoDpcWorkItemPendingEvent, + // Executive, + // KernelMode, + // FALSE, + // NULL); + + // // + // //make sure that the selective suspend request has been completed. + // // + // KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, + // Executive, + // KernelMode, + // FALSE, + // NULL); + // } + //} + + // + //after the stop Irp is sent to the lower driver object, + //the driver must not send any more Irps down that touch + //the device until another Start has occurred. + // + + /* if(deviceExtension->WaitWakeEnable) { + + CancelWaitWake(deviceExtension); + }*/ + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + SET_NEW_PNP_STATE(pDevice, Stopped); + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + ntDeviceStopStatus = DeconfigureUsbDevice(pKSDeviceObject); + + PrintFunctionExit(__FUNCTION__,ntDeviceStopStatus); + + return ntDeviceStopStatus; +} + +/***************************************************************************** + Function : ReadWriteUsbDevice + Description : Dispatch routine for read and write. + This routine creates a BULKUSB_RW_CONTEXT for a read/write. + This read/write is performed in stages of MAX_BULK_PACKET_SIZE. + once a stage of transfer is complete, then the irp is circulated again, + until the requested length of tranfer is performed. + IN PARAM : Pointer to Device Object + Device Register to/From which Write/ Read is to be performed + Transfer Buffer + Length of the Transfer Buffer + True if Read from else False for Write to device + OUT PARAM : Status of Read / Write request sending to Device + STATUS_PENDING on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Read/ Write Request submitted to Device + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ReadWriteUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN ULONG ulStreamIndex, + IN ULONG ulPacketIndex, + IN PUCHAR pucTransferBuffer, + IN ULONG ulTransferLength, + IN BOOLEAN bRead) +{ + NTSTATUS ntReadWriteStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + ULONG ulURBFlags = 0; + ULONG ulStageTransferLength = 0; + PURB pUSBRequestBlock = NULL; + PUSBD_PIPE_INFORMATION pPipeInformation = NULL; + PIO_STACK_LOCATION pNextStackLocation = NULL; + PBULKUSB_RW_CONTEXT pReadWriteContext = NULL; + PIRP pUsbIoRequestPacket = NULL; + + PrintFunctionEntry(__FUNCTION__); + + //Acquire device Remove lock here + if(pDevice->UsbDeviceState != Working) + { + + SkyWalkerDebugPrint(ENTRY_LEVEL,("Invalid device state\n")); + ntReadWriteStatus = STATUS_INVALID_DEVICE_STATE; + goto FinishDeviceReadWrite; + } + + if(!IS_VALID(pucTransferBuffer)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Invalid Transfer Buffer Passed\n")); + ntReadWriteStatus = STATUS_INVALID_PARAMETER; + goto FinishDeviceReadWrite; + } + + if(ulTransferLength > MAX_BULK_TRANSFER_SIZE) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, + ("Tansfer Length (%lu) > MAX_BULK_TRANSFER_SIZE (%lu)\n", + ulTransferLength, + MAX_BULK_TRANSFER_SIZE)); + ntReadWriteStatus = STATUS_INVALID_PARAMETER; + goto FinishDeviceReadWrite; + } + + if(ulTransferLength == 0) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Transfer data length = 0\n")); + ntReadWriteStatus = STATUS_SUCCESS; + goto FinishDeviceReadWrite; + } + + ulURBFlags = USBD_SHORT_TRANSFER_OK; + if(bRead) + { + ulURBFlags |= USBD_TRANSFER_DIRECTION_IN; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Read Operation\n")); + pPipeInformation = &pDevice->ReadPipe; + } + else + { + + ulURBFlags |= USBD_TRANSFER_DIRECTION_OUT; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Write Operation\n")); + pPipeInformation = &pDevice->WritePipe; + } + + DbgPrint("Pipe Information = %p\n",pPipeInformation); + + //the transfer request is for TransferLength. + //we can perform a max of Packet Size + //in each stage. + if(ulTransferLength > MAX_BULK_PACKET_SIZE) + { + ulStageTransferLength = MAX_BULK_PACKET_SIZE; + } + else + { + ulStageTransferLength = ulTransferLength; + } + + //Allocate IRP for the USB Transfer + pUsbIoRequestPacket = IoAllocateIrp(pKSDeviceObject->NextDeviceObject->StackSize, + FALSE); + if(!IS_VALID(pUsbIoRequestPacket)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to Allocate Memory for the USB Irp\n")); + ntReadWriteStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishDeviceReadWrite; + } + + ULONG ulStreamOffset = PACKET_PER_FRAME * ulStreamIndex; + pDevice->pUsbStreamIrp[ulPacketIndex + ulStreamOffset] = pUsbIoRequestPacket; + + + pUSBRequestBlock = (PURB)ExAllocatePoolWithTag( NonPagedPool, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + USB_MEMORY_TAG); + + if(!IS_VALID(pUSBRequestBlock)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to Allocate Memory for the Bulk / Interrupt URB\n")); + ntReadWriteStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishDeviceReadWrite; + } + + RtlZeroMemory(pUSBRequestBlock, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER)); + + UsbBuildInterruptOrBulkTransferRequest( + pUSBRequestBlock, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + pPipeInformation->PipeHandle, + pucTransferBuffer, + NULL, + ulStageTransferLength, + ulURBFlags, + NULL); + + pReadWriteContext = (PBULKUSB_RW_CONTEXT)ExAllocatePoolWithTag( NonPagedPool, + sizeof(BULKUSB_RW_CONTEXT), + USB_MEMORY_TAG); + + if(!IS_VALID(pReadWriteContext)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to Allocate Memory for the Read Write Context\n")); + ntReadWriteStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishDeviceReadWrite; + } + + //set BULKUSB_RW_CONTEXT parameters. + pReadWriteContext->pUSBRequestBlock = pUSBRequestBlock; + pReadWriteContext->pTransferBuffer = pucTransferBuffer + ulStageTransferLength; + pReadWriteContext->ulRemainingByteTransfer = ulTransferLength - ulStageTransferLength ; + pReadWriteContext->ulCompletedByteTransfer = 0L; + pReadWriteContext->pDevice = pDevice; + pReadWriteContext->ulStreamIndex = ulStreamIndex; + + //use the original read/write irp as an internal device control irp + pNextStackLocation = IoGetNextIrpStackLocation(pUsbIoRequestPacket); + pNextStackLocation->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + pNextStackLocation->Parameters.Others.Argument1 = (PVOID)pUSBRequestBlock ; + pNextStackLocation->Parameters.DeviceIoControl.IoControlCode = + IOCTL_INTERNAL_USB_SUBMIT_URB; + + IoSetCompletionRoutine(pUsbIoRequestPacket, + (PIO_COMPLETION_ROUTINE)UsbReadWriteCompletion, + pReadWriteContext, + TRUE, + TRUE, + TRUE); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("USB Transfer Details for Stream %lu Packet %lu\n", + ulStreamIndex, + ulPacketIndex)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("ulStageTransferLength = %lu\n",ulStageTransferLength)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->ulCompletedByteTransfer = %lu\n",pReadWriteContext->ulCompletedByteTransfer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->ulRemainingByteTransfer = %lu\n",pReadWriteContext->ulRemainingByteTransfer)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("bRead = %02d\n",bRead)); + + //since we return STATUS_PENDING call IoMarkIrpPending. + //This is the boiler plate code. + //This may cause extra overhead of an APC for the Irp completion + //but this is the correct thing to do. + + IoMarkIrpPending(pUsbIoRequestPacket); + IncrementPendingIoCount(pDevice); + + ntReadWriteStatus = IoCallDriver( pKSDeviceObject->NextDeviceObject, + pUsbIoRequestPacket); + + if(!NT_SUCCESS(ntReadWriteStatus)) + { + + SkyWalkerDebugPrint(ENTRY_LEVEL, ("IoCallDriver Failed with status %X\n", ntReadWriteStatus)); + + //if the device was yanked out, then the pipeInformation + //field is invalid. + //similarly if the request was cancelled, then we need not + //invoked reset pipe/device. + KIRQL CurrentIrql = KeGetCurrentIrql(); + + if((ntReadWriteStatus != STATUS_CANCELLED) && + (ntReadWriteStatus != STATUS_DEVICE_NOT_CONNECTED)) + { + + if(CurrentIrql < DISPATCH_LEVEL) + { + ntReadWriteStatus = ResetUsbPipe(pKSDeviceObject,pPipeInformation); + if(!NT_SUCCESS(ntReadWriteStatus)) + { + + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Reset USB Pipe Failed\n")); + + ntReadWriteStatus = ResetUsbDevice(pKSDeviceObject); + } + } + } + else + { + + SkyWalkerDebugPrint(ENTRY_LEVEL, ("ntReadWriteStatus is STATUS_CANCELLED or " + "STATUS_DEVICE_NOT_CONNECTED\n")); + } + //Freeing up the resources allocated in this routine + goto FinishDeviceReadWrite; + } + + PrintFunctionExit(__FUNCTION__,STATUS_PENDING); + + return STATUS_PENDING; + +FinishDeviceReadWrite: + + if(IS_VALID(pUSBRequestBlock)) + { + ExFreePoolWithTag(pUSBRequestBlock,USB_MEMORY_TAG); + pUSBRequestBlock = NULL; + } + if(IS_VALID(pReadWriteContext)) + { + ExFreePoolWithTag(pReadWriteContext,USB_MEMORY_TAG); + pReadWriteContext = NULL; + } + if(IS_VALID(pUsbIoRequestPacket)) + { + IoFreeIrp(pUsbIoRequestPacket); + pUsbIoRequestPacket = NULL; + } + + PrintFunctionExit(__FUNCTION__,ntReadWriteStatus); + + return ntReadWriteStatus; +} + +/***************************************************************************** + Function : UsbReadWriteCompletion + Description : This is the completion routine for reads/writes + If the irp completes with success, we check if we + need to recirculate this irp for another stage of + transfer. In this case return STATUS_MORE_PROCESSING_REQUIRED. + if the irp completes in error, free all memory allocs and + return the status. + IN PARAM : Pointer to Device Object + Io Request Packet + Context + OUT PARAM : Status of Read / Write request Completion + STATUS_MORE_PROCESSING_REQUIRED always + PreCondition : NONE + PostCondtion : On Success Read/ Write Request Completed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS UsbReadWriteCompletion( + IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket, + IN PVOID pContext + ) +{ + ULONG ulStageTransferLength = 0; + NTSTATUS ntReadWriteCompleteStatus = pIoRequestPacket->IoStatus.Status; + PIO_STACK_LOCATION pNextStackLocation; + PBULKUSB_RW_CONTEXT pReadWriteContext = (PBULKUSB_RW_CONTEXT)pContext; + CSkyWalker1Device * pDevice = pReadWriteContext->pDevice; + ULONG ulStreamIndex = 0L; + PrintFunctionEntry(__FUNCTION__); + + //successfully performed a stageLength of transfer. + //check if we need to recirculate the irp. + if(NT_SUCCESS(ntReadWriteCompleteStatus)) + { + if(pReadWriteContext) + { + pReadWriteContext->ulCompletedByteTransfer += + pReadWriteContext->pUSBRequestBlock->UrbBulkOrInterruptTransfer.TransferBufferLength; + + if((pReadWriteContext->ulRemainingByteTransfer)&& (!pIoRequestPacket->Cancel)) + { + //another stage transfer + SkyWalkerDebugPrint(EXTREME_LEVEL, ("Another stage transfer...\n")); + + //the transfer request is for TransferLength. + //we can perform a max of MAX_BULK_PACKET_SIZE + //in each stage. + if(pReadWriteContext->ulRemainingByteTransfer > MAX_BULK_PACKET_SIZE) + { + ulStageTransferLength = MAX_BULK_PACKET_SIZE; + } + else + { + ulStageTransferLength = pReadWriteContext->ulRemainingByteTransfer; + } + + //Reinitialize the urb + pReadWriteContext->pUSBRequestBlock->UrbBulkOrInterruptTransfer.TransferBufferLength + = ulStageTransferLength; + + pReadWriteContext->pUSBRequestBlock->UrbBulkOrInterruptTransfer.TransferBuffer + = pReadWriteContext->pTransferBuffer; + + pReadWriteContext->pTransferBuffer += ulStageTransferLength; + pReadWriteContext->ulRemainingByteTransfer -= ulStageTransferLength ; + + //use the original read/write irp as an internal device control irp + pNextStackLocation = IoGetNextIrpStackLocation(pIoRequestPacket); + pNextStackLocation->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + pNextStackLocation->Parameters.Others.Argument1 = (PVOID)pReadWriteContext->pUSBRequestBlock ; + pNextStackLocation->Parameters.DeviceIoControl.IoControlCode = + IOCTL_INTERNAL_USB_SUBMIT_URB; + + IoSetCompletionRoutine(pIoRequestPacket, + (PIO_COMPLETION_ROUTINE)UsbReadWriteCompletion, + pReadWriteContext, + TRUE, + TRUE, + TRUE); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("USB Transfer Details for Stream %lu\n", + pReadWriteContext->ulStreamIndex)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("ulStageTransferLength = %lu\n",ulStageTransferLength)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->ulCompletedByteTransfer = %lu\n",pReadWriteContext->ulCompletedByteTransfer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->ulRemainingByteTransfer = %lu\n",pReadWriteContext->ulRemainingByteTransfer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pIoRequestPacket = 0x%p\n",pIoRequestPacket)); + ntReadWriteCompleteStatus = IoCallDriver( pDevice->m_pKSDevice->NextDeviceObject, + pIoRequestPacket); + + return STATUS_MORE_PROCESSING_REQUIRED; + } + else + { + + InterlockedExchangeAdd((LONG*)&pDevice->m_NumberOfBytesRead[pReadWriteContext->ulStreamIndex], + pReadWriteContext->ulCompletedByteTransfer); + + ulStreamIndex = pReadWriteContext->ulStreamIndex; + + //This is the last transfer + //SkyWalkerDebugPrint(ENTRY_LEVEL,("Valid Synthesis Buffer\n")); + // //This is not needed as anyways the IRP is going to Free soon + //pIoRequestPacket->IoStatus.Information = pReadWriteContext->ulCompletedByteTransfer; + ////Set the Frame Read Event here + // + //if(pReadWriteContext->ulCompletedByteTransfer == pDevice->m_SampleSize) + //{ + // pDevice->m_SynthesisDataValid = 1; + //} + + } + } + } + else + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("ReadWriteCompletion Failed \n")); + } + + if(pReadWriteContext) + { + //Dump pReadWriteContext + SkyWalkerDebugPrint(EXTREME_LEVEL,("Completed Stream = %lu",pReadWriteContext->ulStreamIndex)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->pUSBRequestBlock = 0x%p\n", + pReadWriteContext->pUSBRequestBlock)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->ulRemainingByteTransfer = %lu\n", + pReadWriteContext->ulRemainingByteTransfer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->ulCompletedByteTransfer = %lu\n", + pReadWriteContext->ulCompletedByteTransfer)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pReadWriteContext->pDevice = 0x%p\n", + pReadWriteContext->pDevice)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Actual Byte Transfer = %lu", + pReadWriteContext->pUSBRequestBlock-> + UrbBulkOrInterruptTransfer.TransferBufferLength)); + + + DecrementPendingIoCount(pDevice); + + if(IS_VALID(pReadWriteContext->pUSBRequestBlock)) + { + ExFreePoolWithTag(pReadWriteContext->pUSBRequestBlock,USB_MEMORY_TAG); + pReadWriteContext->pUSBRequestBlock = NULL; + } + + if(IS_VALID(pReadWriteContext)) + { + ExFreePoolWithTag(pReadWriteContext,USB_MEMORY_TAG); + pReadWriteContext = NULL; + } + + if(IS_VALID(pIoRequestPacket)) + { + IoFreeIrp(pIoRequestPacket); + pIoRequestPacket = NULL; + } + + } + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Calling ProcessStream \n")); + //TS is read, Process the stream + pDevice->ProcessStream(ulStreamIndex); + + PrintFunctionExit(__FUNCTION__,STATUS_MORE_PROCESSING_REQUIRED); + + //This is the only status that can be returned from the Asynchronous + //IRP created by Driver + return STATUS_MORE_PROCESSING_REQUIRED; +} +/***************************************************************************** + Function : ControlUsbDevice + Description : This Function is used to send the Vendor requests to the Device + IN PARAM : Pointer to Device Object + Vendor Request + Value corresponding to Request + Index for the Request (Used with Request) + Transfer Buffer for Read/Write + size of the Transfer Buffer + True if Read from else False for Write to device + OUT PARAM : Status of Vendor Request Execution + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Vendor Request Command Executed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ControlUsbDevice( IN PKSDEVICE pKSDeviceObject, + IN UCHAR ucRequest, + IN USHORT usValue, + IN USHORT usIndex, + IN PUCHAR pucTransferBuffer, + IN ULONG ulTransferLength, + IN BOOLEAN bRead) +{ + NTSTATUS ntControlStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + PURB pUSBRequestBlock = NULL; + ULONG ulURBFlags = 0L; + PrintFunctionEntry(__FUNCTION__); + + if(pDevice->UsbDeviceState != Working) + { + + SkyWalkerDebugPrint(ENTRY_LEVEL,("Invalid device state\n")); + ntControlStatus = STATUS_INVALID_DEVICE_STATE; + goto ExitControlDevice; + } + ulURBFlags = USBD_SHORT_TRANSFER_OK; + if(bRead) + { + ulURBFlags |= USBD_TRANSFER_DIRECTION_IN; //Requst data from Device + SkyWalkerDebugPrint(EXTREME_LEVEL,("Read Operation\n")); + } + else + { + ulURBFlags |= USBD_TRANSFER_DIRECTION_OUT; + SkyWalkerDebugPrint(EXTREME_LEVEL,("Write Operation\n")); + } + + pUSBRequestBlock = (PURB)ExAllocatePoolWithTag( NonPagedPool, + sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), + USB_MEMORY_TAG); + + if(!IS_VALID(pUSBRequestBlock)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to Allocate Memory for the Vendor URB\n")); + ntControlStatus = STATUS_INSUFFICIENT_RESOURCES; + goto ExitControlDevice; + } + + UsbBuildVendorRequest( + pUSBRequestBlock,//Pointer to an URB that + //is to be formatted as a vendor or class + //request. + URB_FUNCTION_VENDOR_DEVICE, //Function + sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), //Length of URB in Bytes + ulURBFlags, //Zero, One or Combination of + //USBD_TRANSFER_DIRECTION_IN & USBD_SHORT_TRANSFER_OK + 0, //Reserved + ucRequest, //USB/Vendor Specific Request Code + usValue, //Value Specific to Request + usIndex, //Device Defined identifier else Zero + pucTransferBuffer,//Pointer to Resident Buffer for Transfer or NULL + NULL, //Pointer to MDL for Transfer or NULL + ulTransferLength,//Length in Bytes of Buffer specified + NULL //NULL Always + ); + + + ntControlStatus = SendURBToBusDriver(pKSDeviceObject,pUSBRequestBlock); + + if(!NT_SUCCESS(ntControlStatus)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Sending Vendor Request Failed\n")); + } + + ExFreePool(pUSBRequestBlock); + +ExitControlDevice: + + PrintFunctionExit(__FUNCTION__,ntControlStatus); + return ntControlStatus; +} + +/***************************************************************************** + Function : SendURBToBusDriver + Description : Function to used to Send the URB to the USB Bus Driver (USBD.sys) + IN PARAM : Pointer to Device Object to which URB is to be sent + Pointer to the URB to be sent + OUT PARAM : Status of the URB Send operation + STATUS_SUCCESS on Successful execution + STATUS_INVALID_PARAMETER in case of Error + STATUS_INSUFFICIENT_RESOURCES in case IRP could not be created + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success URB sent to the Bus Driver + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS SendURBToBusDriver(IN PKSDEVICE pKSDeviceObject, + IN PURB pUSBRequestBlock ) +{ + NTSTATUS ntIrpProcessingStatus = STATUS_SUCCESS; + USBD_STATUS UsbStatus; + PIRP pIoRequestPacket = NULL; + KEVENT kIrpCompleted; + IO_STATUS_BLOCK IoStatusBlock; + PIO_STACK_LOCATION pNextIoStackLocation = NULL; + PDEVICE_OBJECT pRootDeviceObject = pKSDeviceObject->NextDeviceObject; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + if((!IS_VALID(pRootDeviceObject)) || (!(IS_VALID(pUSBRequestBlock)))) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("pRootDeviceObject = 0x%p, pUSBRequestBlock = 0x%p\n",pRootDeviceObject,pUSBRequestBlock)); + ntIrpProcessingStatus = STATUS_INVALID_PARAMETER; + goto CompleteURBSend; + } + //Initialize Kernel Event which should be trigerred after completion + //of the Device IO Control request + KeInitializeEvent(&kIrpCompleted, //PKEVENT + NotificationEvent, //Type + FALSE); //State + + //Create Internal Device Io Control Request + pIoRequestPacket = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB , + pRootDeviceObject, //Device to which the request to be sent + NULL, + 0, + NULL, + 0, + TRUE, //TRUE for IRM_MJ_INTERNAL_DEVICE_CONTROL, IRP_MJ_SCSI + &kIrpCompleted, //Event should be trigerred when the IRP completes + &IoStatusBlock); //The Status Block should be set when the Io request Completes + + + //If could not create the IRP return with the INSUFFICIENT RESOURCES + if(pIoRequestPacket == NULL) + { + ntIrpProcessingStatus = STATUS_INSUFFICIENT_RESOURCES; + goto CompleteURBSend; + } + + pNextIoStackLocation = IoGetNextIrpStackLocation(pIoRequestPacket); + pNextIoStackLocation->Parameters.Others.Argument1 = pUSBRequestBlock; + + IncrementPendingIoCount(pDevice); + + //Call the Next Driver + ntIrpProcessingStatus = IoCallDriver(pRootDeviceObject,pIoRequestPacket); + if(ntIrpProcessingStatus == STATUS_PENDING) + { + LARGE_INTEGER Timeout; + Timeout.QuadPart = (LONGLONG) 2 /*sec*/* 1000 /*msec*/ * 1000 /*usec*/ * (-10)/*Conv. Factor*/; + //for(int nRetry = 0; ((nRetry < 3) && (ntIrpProcessingStatus != STATUS_SUCCESS)) ; nRetry++) + { + //IRP is yet to be processed thus STATUS_PENDING is returned from the Lower Device Driver (USBD.sys) + ntIrpProcessingStatus = KeWaitForSingleObject(&kIrpCompleted, //PKEVENT + Executive, //Wait Reason has to be Executive + KernelMode, //Must be kernel mode so + //that Stack will not Paged out + FALSE, //No Alert + NULL//&Timeout //Wait for 2 sec max + ); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("KeWaitForSingleObject returned with status = %s(0x%X)\n", + NTStatusToString(ntIrpProcessingStatus),ntIrpProcessingStatus)); + //SkyWalkerDebugPrint(EXTREME_LEVEL,("nRetry = %d\n",nRetry)); + } + + ntIrpProcessingStatus = IoStatusBlock.Status; + UsbStatus = URB_STATUS(pUSBRequestBlock); + SkyWalkerDebugPrint(EXTREME_LEVEL,("URB STATUS = 0x%X\n",UsbStatus)); + } + + DecrementPendingIoCount(pDevice); + +CompleteURBSend: + + PrintFunctionExit(__FUNCTION__,ntIrpProcessingStatus); + + return ntIrpProcessingStatus; + +} + +/***************************************************************************** + Function : QueryRemoveUsbDevice + Description : Function to used to Service PnP IRPs of Minor Type + IRP_MN_QUERY_REMOVE_DEVICE + IN PARAM : Pointer to Device Object whose Remove Query has come + Device Remove Query Irp with Minor Code IRP_MN_QUERY_REMOVE_DEVICE + OUT PARAM : Status of the Device Remove Query Processing + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Device can be removed is conveyed to the caller + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS QueryRemoveUsbDevice( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + NTSTATUS ntQueryStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + // + //If we can allow removal of the device, we should set the QueueState + //to HoldRequests so further requests will be queued. This is required + //so that we can process queued up requests in cancel-remove just in + //case somebody else in the stack fails the query-remove. + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + SET_NEW_PNP_STATE(pDevice, PendingRemove); + pDevice->QueueState = HoldRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + //wait for the existing ones to be finished. + //first, decrement this operation + DecrementPendingIoCount(pDevice); + + KeWaitForSingleObject(&pDevice->EvDeviceStopOk, + Executive, + KernelMode, + FALSE, + NULL); + + PrintFunctionExit(__FUNCTION__,ntQueryStatus); + + return ntQueryStatus; + +} + +/***************************************************************************** + Function : CancelRemoveUsbDevice + Description : Function to used to Service PnP IRPs of Minor Type + IRP_MN_CANCEL_REMOVE_DEVICE + IN PARAM : Pointer to Device Object whose Remove request has + been cancelled + Device Remove Cancel Irp with Minor Code + IRP_MN_CANCEL_REMOVE_DEVICE + OUT PARAM : Status of the Device Remove Cancel Irp Processing + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Device Remove cancel request is processed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS CancelRemoveUsbDevice(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + KEVENT Evevent; + NTSTATUS ntStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + //We need to reset the QueueState flag to ProcessRequest, + //since the device resume its normal activities. + // + //First check to see whether you have received cancel-stop + //without first receiving a query-stop. This could happen if someone + //above us fails a query-stop and passes down the subsequent + //cancel-stop. + if(pDevice->UsbDeviceState == PendingRemove ) + { + ntStatus = PassDownIRPAndWaitForCompletion(pKSDeviceObject->NextDeviceObject, + pIoRequestPacket, + true); + if(NT_SUCCESS(ntStatus)) + { + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + RESTORE_PREVIOUS_PNP_STATE(pDevice); + pDevice->QueueState = AllowRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + //ProcessQueuedRequests(deviceExtension); + } + + } + else + { + + /* spurious cancel Remove + + If the device is already started when the driver receives + this IRP, the driver simply sets status to success and passes + the IRP to the next driver. For such a cancel-remove IRP, a + function driver need not set a completion routine. The device + may not be in the remove-pending state, because, for example, + the driver failed the previous IRP_MN_QUERY_REMOVE_DEVICE.*/ + + } + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; + +} + +/***************************************************************************** + Function : SurpriseUsbDeviceRemoval + Description : Function to used to Service PnP IRPs of Minor Type + IRP_MN_SURPRISE_REMOVAL + IN PARAM : Pointer to Device Object which is removed + surprisingly + Device Remove Cancel Irp with Minor Code + IRP_MN_SURPRISE_REMOVAL + OUT PARAM : Status of the Spurious Device Removal Processing + STATUS_SUCCESS Always + PreCondition : NONE + PostCondtion : On Success Surprised Device Remove is processed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS SurpriseUsbDeviceRemoval(IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + KEVENT Evevent; + NTSTATUS ntStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + // + //1. fail pending requests + //2. return device and memory resources + //3. disable interfaces + // + + //if(deviceExtension->WaitWakeEnable) { + // + // CancelWaitWake(deviceExtension); + //} + + + //if(WinXpOrBetter == deviceExtension->WdmVersion) { + + // if(deviceExtension->SSEnable) { + + // // + // //Cancel the timer so that the DPCs are no longer fired. + // //we do not need DPCs because the device has been surprise + // //removed + // // + // + // KeCancelTimer(&deviceExtension->Timer); + + // deviceExtension->SSEnable = 0; + + // // + // //make sure that if a DPC was fired before we called cancel timer, + // //then the DPC and work-time have run to their completion + // // + // KeWaitForSingleObject(&deviceExtension->NoDpcWorkItemPendingEvent, + // Executive, + // KernelMode, + // FALSE, + // NULL); + + // // + // //make sure that the selective suspend request has been completed. + // // + // KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, + // Executive, + // KernelMode, + // FALSE, + // NULL); + // } + //} + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + SET_NEW_PNP_STATE(pDevice, SurpriseRemoved); + pDevice->QueueState = FailRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + //ProcessQueuedRequests(deviceExtension); + + AbortUsbPipes(pKSDeviceObject); + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; +} + +/***************************************************************************** + Function : AbortUsbPipes + Description : This function sends an abort pipe request for pipes. + IN PARAM : Pointer to Device Object + OUT PARAM : Status of the Pipe Abort + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Pipe are aborted + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS AbortUsbPipes(IN PKSDEVICE pKSDeviceObject) +{ + PURB pUsbRequestBlock = NULL; + ULONG ulPipeIndex = 0; + NTSTATUS ntStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + PUSBD_PIPE_INFORMATION pPipeInformation = &pDevice->ReadPipe; + + PrintFunctionEntry(__FUNCTION__); + + for(ulPipeIndex = 0; ulPipeIndex < 2; ulPipeIndex++) + { + //if(pPipeInformation->PipeOpen) + { + + SkyWalkerDebugPrint(EXTREME_LEVEL, ("Aborting Pipe 0x%X\n",pPipeInformation->EndpointAddress)); + + pUsbRequestBlock = (PURB) ExAllocatePoolWithTag( NonPagedPool, + sizeof(struct _URB_PIPE_REQUEST), + USB_MEMORY_TAG); + + if(pUsbRequestBlock) + { + + pUsbRequestBlock->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST); + pUsbRequestBlock->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE; + pUsbRequestBlock->UrbPipeRequest.PipeHandle = pPipeInformation->PipeHandle; + + ntStatus = SendURBToBusDriver(pKSDeviceObject,pUsbRequestBlock); + + ExFreePool(pUsbRequestBlock); + } + else + { + + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to Allocate memory for URB during Pipe Abort\n")); + ntStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishAbortPipe; + } + + if(NT_SUCCESS(ntStatus)) + { + //pPipeInformation->PipeOpen = FALSE; + } + pPipeInformation = &pDevice->WritePipe; + } + } + +FinishAbortPipe: + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; +} + +/***************************************************************************** + Function : RemoveUsbDevice + Description : Function to used to Service PnP IRPs of Minor Type + IRP_MN_REMOVE_DEVICE + IN PARAM : Pointer to Device Object whose remove + request has come + Device Remove Cancel Irp with Minor Code + IRP_MN_REMOVE_DEVICE + OUT PARAM : Status of the Device Removal + STATUS_SUCCESS Always + PreCondition : NONE + PostCondtion : On Success Device Remove request is processed + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS RemoveUsbDevice( IN PKSDEVICE pKSDeviceObject, + IN PIRP pIoRequestPacket) +{ + KIRQL kOldIrql; + KEVENT Evevent; + NTSTATUS ntStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + ULONG ulRequestCount = 0L; + PrintFunctionEntry(__FUNCTION__); + + // + //The Plug & Play system has dictated the removal of this device. We + //have no choice but to detach and delete the device object. + //(If we wanted to express an interest in preventing this removal, + //we should have failed the query remove IRP). + // + + if(pDevice->UsbDeviceState != SurpriseRemoved ) + { + + // + //we are here after QUERY_REMOVE + // + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + pDevice->QueueState = FailRequests; + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + //if(deviceExtension->WaitWakeEnable) { + // + // CancelWaitWake(deviceExtension); + //} + + //if(WinXpOrBetter == deviceExtension->WdmVersion) { + + // if(deviceExtension->SSEnable) { + + // // + // //Cancel the timer so that the DPCs are no longer fired. + // //we do not need DPCs because the device has been removed + // // + // KeCancelTimer(&deviceExtension->Timer); + + // deviceExtension->SSEnable = 0; + + // // + // //make sure that if a DPC was fired before we called cancel timer, + // //then the DPC and work-time have run to their completion + // // + // KeWaitForSingleObject(&deviceExtension->NoDpcWorkItemPendingEvent, + // Executive, + // KernelMode, + // FALSE, + // NULL); + + // // + // //make sure that the selective suspend request has been completed. + // // + // KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, + // Executive, + // KernelMode, + // FALSE, + // NULL); + // } + //} + + //ProcessQueuedRequests(deviceExtension); + + AbortUsbPipes(pKSDeviceObject); + } + + KeAcquireSpinLock(&pDevice->DeviceStateLock, &kOldIrql); + + SET_NEW_PNP_STATE(pDevice, Removed); + + KeReleaseSpinLock(&pDevice->DeviceStateLock, kOldIrql); + + // + //need 2 decrements + // + + ulRequestCount = DecrementPendingIoCount(pDevice); + ulRequestCount = DecrementPendingIoCount(pDevice); + + KeWaitForSingleObject(&pDevice->EvDeviceRemoveOk, + Executive, + KernelMode, + FALSE, + NULL); + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; +} + +/***************************************************************************** + Function : ResetUsbPipe + Description : This routine synchronously submits a URB_FUNCTION_RESET_PIPE + request down the stack. + IN PARAM : Pointer to Device Object + Pipe to be reseted + OUT PARAM : Status of the Reset Usb Pipe Request + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Usb Pipe is reseted + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ResetUsbPipe( IN PKSDEVICE pKSDeviceObject, + IN PUSBD_PIPE_INFORMATION pPipeInformation) +{ + PURB pUsbRequestBlock = NULL; + NTSTATUS ntResetStatus = STATUS_SUCCESS; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *)pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Pipe to Reset = 0x%X",pPipeInformation->EndpointAddress)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("Pipe Handle = 0x%p",pPipeInformation->PipeHandle)); + + pUsbRequestBlock = (PURB) ExAllocatePoolWithTag( NonPagedPool, + sizeof(struct _URB_PIPE_REQUEST), + USB_MEMORY_TAG); + + if(pUsbRequestBlock) + { + + pUsbRequestBlock->UrbHeader.Length = (USHORT) sizeof(struct _URB_PIPE_REQUEST); + pUsbRequestBlock->UrbHeader.Function = URB_FUNCTION_RESET_PIPE; + pUsbRequestBlock->UrbPipeRequest.PipeHandle = pPipeInformation->PipeHandle; + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Sending the Pipe Reset Command\n")); + ntResetStatus = SendURBToBusDriver(pKSDeviceObject, pUsbRequestBlock); + + ExFreePool(pUsbRequestBlock); + } + else + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Failed to allocate URB Memory during Pipe Reset\n")); + ntResetStatus = STATUS_INSUFFICIENT_RESOURCES; + } + + if(NT_SUCCESS(ntResetStatus)) + { + SkyWalkerDebugPrint(EXTREME_LEVEL, ("Successfully Reseted the Usb Pipe\n")); + ntResetStatus = STATUS_SUCCESS; + } + else + { + SkyWalkerDebugPrint(ENTRY_LEVEL, ("Failed to reset the Usb Pipe\n")); + } + + PrintFunctionExit(__FUNCTION__,ntResetStatus); + + return ntResetStatus; +} + +/***************************************************************************** + Function : ResetUsbDevice + Description : This routine checks the current status of the Usb Port + If Device is connected but not enabled then it resets + the Usb Port + IN PARAM : Pointer to Device Object + OUT PARAM : Status of the Reset Usb Device Request + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Usb Device is reseted + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ResetUsbDevice(IN PKSDEVICE pKSDeviceObject) +{ + NTSTATUS ntResetStatus = STATUS_SUCCESS; + ULONG ulPortStatus = 0; + + PrintFunctionEntry(__FUNCTION__); + + ntResetStatus = GetUsbPortStatus(pKSDeviceObject, &ulPortStatus); + + if((NT_SUCCESS(ntResetStatus)) + && (!(ulPortStatus & USBD_PORT_ENABLED)) + && (ulPortStatus & USBD_PORT_CONNECTED)) + { + + SkyWalkerDebugPrint(ENTRY_LEVEL,("Resetting the Parent Port\n")); + ntResetStatus = ResetUsbParentPort(pKSDeviceObject); + } + + PrintFunctionExit(__FUNCTION__,ntResetStatus); + + return ntResetStatus; +} + +/***************************************************************************** + Function : GetUsbPortStatus + Description : This routine retrives the Usb Port Status as Enabled / Disabled + and Connected / Not Connected + IN PARAM : Pointer to Device Object + Port Status + OUT PARAM : Status of the USB Port Status Request + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Usb Port status is retrived + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS GetUsbPortStatus( IN PKSDEVICE pKSDeviceObject, + IN OUT PULONG pulPortStatus) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + KEVENT EvRequestComplete; + PIRP pIoRequestPacket = NULL; + IO_STATUS_BLOCK IoStatus; + PIO_STACK_LOCATION pNextStackLocation = NULL; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + *pulPortStatus = 0; + + //Initialize the Event to be triggerred after completion of Device Io Control request + KeInitializeEvent(&EvRequestComplete, NotificationEvent, FALSE); + + pIoRequestPacket = IoBuildDeviceIoControlRequest( + IOCTL_INTERNAL_USB_GET_PORT_STATUS, + pKSDeviceObject->NextDeviceObject, + NULL, + 0, + NULL, + 0, + TRUE, + &EvRequestComplete, + &IoStatus); + + if(!IS_VALID(pIoRequestPacket)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Memory Allocation during Get Port Status Failed\n")); + goto FinishGetPortStatus; + return STATUS_INSUFFICIENT_RESOURCES; + } + + pNextStackLocation = IoGetNextIrpStackLocation(pIoRequestPacket); + + pNextStackLocation->Parameters.Others.Argument1 = pulPortStatus; + + ntStatus = IoCallDriver(pKSDeviceObject->NextDeviceObject, pIoRequestPacket); + + if(ntStatus == STATUS_PENDING) + { + KeWaitForSingleObject(&EvRequestComplete, Executive, KernelMode, FALSE, NULL); + } + else + { + IoStatus.Status = ntStatus; + } + + ntStatus = IoStatus.Status; + + SkyWalkerDebugPrint(EXTREME_LEVEL,("Port Status = %lu (",*pulPortStatus)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("%s, ",(((*pulPortStatus) & USBD_PORT_ENABLED)? "Enabled" : "Disabled"))); + SkyWalkerDebugPrint(EXTREME_LEVEL,("%s)\n",(((*pulPortStatus) & USBD_PORT_CONNECTED)? "Connected" : "Not Connected"))); + +FinishGetPortStatus: + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; +} + +/***************************************************************************** + Function : ResetUsbParentPort + Description : This routine sends an IOCTL_INTERNAL_USB_RESET_PORT + synchronously down the stack. + IN PARAM : Pointer to Device Object + OUT PARAM : Status of the Reset USB Port Request + STATUS_SUCCESS on Successful execution + else Error from the Bus Driver + PreCondition : NONE + PostCondtion : On Success Usb Port is reseted + Logic : NONE + Assumption : NONE + Revision History: + *****************************************************************************/ +NTSTATUS ResetUsbParentPort( IN PKSDEVICE pKSDeviceObject ) +{ + NTSTATUS ntStatus = STATUS_SUCCESS; + KEVENT EvRequestComplete; + PIRP pIoRequestPacket = NULL; + IO_STATUS_BLOCK IoStatus; + PIO_STACK_LOCATION pNextStackLocation = NULL; + CSkyWalker1Device * pDevice = (CSkyWalker1Device *) pKSDeviceObject->Context; + + PrintFunctionEntry(__FUNCTION__); + + //Initialize the Event to be triggerred after completion of Device Io Control request + KeInitializeEvent(&EvRequestComplete, NotificationEvent, FALSE); + + pIoRequestPacket = IoBuildDeviceIoControlRequest( + IOCTL_INTERNAL_USB_RESET_PORT, + pKSDeviceObject->NextDeviceObject, + NULL, + 0, + NULL, + 0, + TRUE, + &EvRequestComplete, + &IoStatus); + + if(!IS_VALID(pIoRequestPacket)) + { + SkyWalkerDebugPrint(ENTRY_LEVEL,("Memory Allocation during Reset Parent Device Failed\n")); + ntStatus = STATUS_INSUFFICIENT_RESOURCES; + goto FinishResetDevice; + + } + + pNextStackLocation = IoGetNextIrpStackLocation(pIoRequestPacket); + + ntStatus = IoCallDriver(pKSDeviceObject->NextDeviceObject, pIoRequestPacket); + + if(ntStatus == STATUS_PENDING) + { + KeWaitForSingleObject(&EvRequestComplete, Executive, KernelMode, FALSE, NULL); + } + else + { + IoStatus.Status = ntStatus; + } + + ntStatus = IoStatus.Status; + +FinishResetDevice: + + PrintFunctionExit(__FUNCTION__,ntStatus); + + return ntStatus; +} + +//Print Device Descriptor +VOID PrintDeviceDescriptor(IN PUSB_DEVICE_DESCRIPTOR pDeviceDescriptor) +{ + SkyWalkerDebugPrint(INTERMEDIATE_LEVEL, (__FUNCTION__"\n")); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bLength= %02d\n", + pDeviceDescriptor->bLength)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bDescriptorType= %02d\n", + pDeviceDescriptor->bDescriptorType)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bcdUSB= 0x%X\n", + pDeviceDescriptor->bcdUSB)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bDeviceClass= 0x%02X\n", + pDeviceDescriptor->bDeviceClass)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bDeviceSubClass= 0x%02X\n", + pDeviceDescriptor->bDeviceSubClass)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bDeviceProtocol= 0x%02X\n", + pDeviceDescriptor->bDeviceProtocol)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bMaxPacketSize0= %02d\n", + pDeviceDescriptor->bMaxPacketSize0)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->idVendor= 0x%X\n", + pDeviceDescriptor->idVendor)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->idProduct= 0x%X\n", + pDeviceDescriptor->idProduct)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bcdDevice= 0x%X\n", + pDeviceDescriptor->bcdDevice)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->iManufacturer= %02d\n", + pDeviceDescriptor->iManufacturer)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->iProduct= %02d\n", + pDeviceDescriptor->iProduct)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->iSerialNumber= %02d\n", + pDeviceDescriptor->iSerialNumber)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pDeviceDescriptor->bNumConfigurations= %02d\n", + pDeviceDescriptor->bNumConfigurations)); +} + +//Print Configuration Descriptor +VOID PrintConfigurationDescriptor(IN PUSB_CONFIGURATION_DESCRIPTOR pConfigurationDescriptor) +{ + SkyWalkerDebugPrint(INTERMEDIATE_LEVEL, (__FUNCTION__"\n")); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->bLength= %02d\n", + pConfigurationDescriptor->bLength)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->bDescriptorType= %02d\n", + pConfigurationDescriptor->bDescriptorType)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->wTotalLength= %d\n", + pConfigurationDescriptor->wTotalLength)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->bNumInterfaces= %02d\n", + pConfigurationDescriptor->bNumInterfaces)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->bConfigurationValue= %02d\n", + pConfigurationDescriptor->bConfigurationValue)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->iConfiguration= %02d\n", + pConfigurationDescriptor->iConfiguration)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->bmAttributes= 0x%02X\n", + pConfigurationDescriptor->bmAttributes)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pConfigurationDescriptor->MaxPower= %02d\n", + pConfigurationDescriptor->MaxPower)); + +} +//Print Interface Descriptor +VOID PrintInterfaceDescriptor(IN PUSB_INTERFACE_DESCRIPTOR pInterfaceDescriptor) +{ + SkyWalkerDebugPrint(INTERMEDIATE_LEVEL, (__FUNCTION__"\n")); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bLength= %02d\n", + pInterfaceDescriptor->bLength)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bDescriptorType= %02d\n", + pInterfaceDescriptor->bDescriptorType)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bInterfaceNumber= %02d\n", + pInterfaceDescriptor->bInterfaceNumber)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bAlternateSetting= %02d\n", + pInterfaceDescriptor->bAlternateSetting)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bNumEndpoints= %02d\n", + pInterfaceDescriptor->bNumEndpoints)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bInterfaceClass= 0x%02X\n", + pInterfaceDescriptor->bInterfaceClass)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bInterfaceSubClass= 0x%02X\n", + pInterfaceDescriptor->bInterfaceSubClass)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->bInterfaceProtocol= 0x%02X\n", + pInterfaceDescriptor->bInterfaceProtocol)); + SkyWalkerDebugPrint(EXTREME_LEVEL, ("pInterfaceDescriptor->iInterface= %02d\n", + pInterfaceDescriptor->iInterface)); + +} + +//Print Pipe Information +VOID PrintPipeInformation(PUSBD_PIPE_INFORMATION pPipeInformation) +{ + SkyWalkerDebugPrint(EXTREME_LEVEL,("pPipeInformation->PipeType = 0x%X\n", + pPipeInformation->PipeType)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pPipeInformation->EndpointAddress = 0x%X\n", + pPipeInformation->EndpointAddress)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pPipeInformation->MaximumPacketSize = 0x%X\n", + pPipeInformation->MaximumPacketSize)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pPipeInformation->Interval = 0x%X\n", + pPipeInformation->Interval)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pPipeInformation->PipeHandle = 0x%p\n", + pPipeInformation->PipeHandle)); + SkyWalkerDebugPrint(EXTREME_LEVEL,("pPipeInformation->MaximumTransferSize = 0x%X\n", + pPipeInformation->MaximumTransferSize)); + +} \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Utility.cpp b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Utility.cpp new file mode 100644 index 0000000..bba4deb --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker1Utility.cpp @@ -0,0 +1,2620 @@ +/***************************************************************************** + Company : Shree Ganesha Inc. + File Name : SkyWalker1Utility.cpp + Author : + Date : + Purpose : This file contains the Utility / Commanly Used Functions for the + SkyWalker1 Tuner Device Driver + + Revision History: +=============================================================================== + DATE VERSION AUTHOR REMARK +=============================================================================== + + XXth April,2009 01 Initial Version + +*****************************************************************************/ + +/* Include the Library and Other header file */ + +#include "SkyWalker1Main.h" //Common For all the Definitions, + //Declarations and Library Routines + +/* End of Inclusion the Library and Other header file */ + +/* Macro Definitions */ +/* End of Macro Definitions */ + +/* Global & Static variables Declaration */ +int nCurrentDebugLevel = EXTREME_LEVEL; +/* End of Global & Static variables Declaration */ + +/* External Variable Declaration */ +/* End of External Variable Declaration */ + +/* Declare Enumerations here */ +/* End of Enumeration declaration */ + +/* Function Prototypes */ +/* End of Function prototype definitions */ + +/***************************************************************************** + Function : PrintFunctionEntry + Description : Function to print Message while Entering the Function + IN PARAM : Function Name + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : Function Entry Printed on Screen + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +void PrintFunctionEntry(IN char * pcFunctionName) +{ + + SkyWalkerDebugPrint(INTERMEDIATE_LEVEL, ("Entered into Function : %s() @ IRQ Level = %s\n", + pcFunctionName, + GetCurrentIrqlString())); + +} + +/***************************************************************************** + Function : PrintFunctionExit + Description : Function to print message while exiting the Function + IN PARAM : Function Name + Function Response + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : Function Exit Printed on Screen + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +void PrintFunctionExit(IN char * pcFunctionName, IN NTSTATUS ntReturnCode) +{ + SkyWalkerDebugPrint(INTERMEDIATE_LEVEL, ("Exiting from Function : %s() @ IRQ Level = %s, with Status = %s(0x%08X)\n", + pcFunctionName, + GetCurrentIrqlString(), + NTStatusToString(ntReturnCode), + ntReturnCode)); +} + +/***************************************************************************** + Function : LowerDeviceCompletedIrp + Description : This function is a Completion Routine set when the IRP + is sent to the Lower Driver.It is called when the Lower Device + completes the IRP using the IoCompleteRequest() + IN PARAM : Reference of the Device Object whose lower device + was called + IRP Reference which sent Down + Context (In our case it is PKEVENT always) + OUT PARAM : STATUS_MORE_PROCESSING_REQUIRED always as Caller + will complete the IRP + PreCondition : IRP Passed Down to the Lower Device + PostCondtion : Event Set when the Response Received from the Lower Device + Logic : 1) Set the event is Pending Return from Lower Device + 2) return STATUS_MORE_PROCESSING_REQUIRED + Assumption : NONE + Note : This is usually called at the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS LowerDeviceCompletedIrp(IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIoRequestPacket, + IN PVOID pContext) +{ + + PrintFunctionEntry(__FUNCTION__); + + if (pIoRequestPacket->PendingReturned == TRUE) + { + // + // Set the event only if the lower driver has returned + // STATUS_PENDING earlier. This optimization removes the need to + // call KeSetEvent unnecessarily and improves performance because the + // system does not have to acquire an internal lock. + // (REFERENCE : Microsoft MSDN)http://support.microsoft.com/kb/320275 + + KeSetEvent ((PKEVENT) pContext, IO_NO_INCREMENT, FALSE); + } + + PrintFunctionExit(__FUNCTION__,STATUS_MORE_PROCESSING_REQUIRED); + // This is the only status that can be returned. + return STATUS_MORE_PROCESSING_REQUIRED; +} + +/***************************************************************************** + Function : PassDownIRPAndWaitForCompletion + Description : This function Passes the IRP to the Lower Device attached + and after passing waits for and Event which is triggerred after + the completion of the IRP (i.e. When IoCompleteRequest()is called by the + Lower Device) + IN PARAM : Reference of the Lower Device Object to be called + IRP Reference which needs to be pass Down + OUT PARAM : the Passing Down Status,Based on Status returned from + Lower Device + PreCondition : NONE + PostCondtion : IRP Passed Down to the Lower Device on successful Execution + Logic : 1) Initialize the Completion routine + 2) Copy Current IRP Stack location to Next (IoCopyCurrentIrpStackLocationToNext()) + 3) Set the IRP Completion Routine (IoSetCompeltionRoutine()) + 4) Call the Lower Device (IoCallDriver) + 5) Wait for the Irp Completion (KeWaitForSingleObject()) + Assumption : Device Extension has a Valid Lower Device Reference + Note : This is usually called at the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS PassDownIRPAndWaitForCompletion(IN PDEVICE_OBJECT pLowerDeviceObject, + IN PIRP pIoRequestPacket, + IN BOOLEAN bCopyStackLocation) +{ + NTSTATUS ntIrpProcessingStatus = STATUS_SUCCESS; + KEVENT kIrpCompleted; + PrintFunctionEntry(__FUNCTION__); + + //Initialize Kernel Event + KeInitializeEvent(&kIrpCompleted, //PKEVENT + NotificationEvent, //Type + FALSE); //State + + if(bCopyStackLocation) + { + //Copy Current IRP Stack to Next + IoCopyCurrentIrpStackLocationToNext(pIoRequestPacket); + } + + //Set Completion Routine + IoSetCompletionRoutine(pIoRequestPacket,//PIRP + LowerDeviceCompletedIrp,//Completion Routine + &kIrpCompleted, //PKEVENT (Context) + TRUE, //Flag on Success + TRUE, //Flag on Error + TRUE //Falg on Cancel + ); + //Call the Next Driver + ntIrpProcessingStatus = IoCallDriver(pLowerDeviceObject,pIoRequestPacket); + if(ntIrpProcessingStatus == STATUS_PENDING) + { + //IRP is to be processed + ntIrpProcessingStatus = KeWaitForSingleObject(&kIrpCompleted, //PKEVENT + Executive, //Wait Reason has to be Executive + KernelMode, //Must be kernel mode so + //that Stack will not Paged out + FALSE, //No Alert + NULL //Infinite Wait + ); + if(NT_SUCCESS(ntIrpProcessingStatus)) + { + //Lower Driver Completed the IRP (IoCompleteIrp()) + KeClearEvent(&kIrpCompleted); + ntIrpProcessingStatus = pIoRequestPacket->IoStatus.Status; + } + } + + PrintFunctionExit(__FUNCTION__,ntIrpProcessingStatus); + + return ntIrpProcessingStatus; + +} + + +/***************************************************************************** + Function : PassDownIRPAndForget + Description : This function Skips the IRP to the Lower Device attached + IN PARAM : Reference of the Lower Device Object to be called + IRP Reference which needs to be pass Down + OUT PARAM : the Passing Down Status,Based on Status returned from + IoCallDriver() Function + PreCondition : NONE + PostCondtion : IRP Passed Down to the Lower Device on successful Execution + Logic : 1) Skip the Current IRP + 2) Call the Lower Device Driver + Assumption : Device Extension has a Valid Lower Device Reference + Note : This is usually called at the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +NTSTATUS PassDownIRPAndForget(IN PDEVICE_OBJECT pLowerDeviceObject, + IN PIRP pIoRequestPacket) +{ + NTSTATUS ntIrpProcessingStatus = STATUS_SUCCESS; + + PrintFunctionEntry(__FUNCTION__); + + // + // As not setting a completion routine, skipping the stack + // location because it provides better performance. + // (REFERENCE : Microsoft MSDN) http://support.microsoft.com/kb/320275 + + //Skip Current IRP Stack + IoSkipCurrentIrpStackLocation(pIoRequestPacket); + + //Call the Lower Device + ntIrpProcessingStatus = IoCallDriver(pLowerDeviceObject,pIoRequestPacket); + + PrintFunctionExit(__FUNCTION__,ntIrpProcessingStatus); + + return ntIrpProcessingStatus; +} + +/***************************************************************************** + Function : CompleteIrpInDispatch + Description : This function Completes the IRP + IN PARAM : Reference of the Device Object + IRP Reference which needs to be Completed + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : IRP Completed + Logic : NONE + Assumption : NONE + Note : This is usually called at the PASSIVE_LEVEL_IRQL + Revision History: + *****************************************************************************/ +VOID CompleteIrpInDispatch(IN PDEVICE_OBJECT pDeviceObject, + IN PIRP pIoRequestPacket) +{ + PrintFunctionEntry(__FUNCTION__); + + IoCompleteRequest(pIoRequestPacket,IO_NO_INCREMENT); + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); +} + +/***************************************************************************** + Function : Delay + Description : This function Delays Execution thread by the Microseconds passed + IN PARAM : Delay in MicroSeconds + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : Delayed Execution Thread + Logic : NONE + Assumption : NONE + NOTE : This Function should always be called the the passive level + Revision History: + *****************************************************************************/ +VOID Delay(IN ULONG ulDelayInMicroSeconds) +{ + LARGE_INTEGER DelayIn100NanoSeconds; + PrintFunctionEntry(__FUNCTION__); + + //we need to Convert MicroSeconds to 100 nano Second Unit + //for the KeDelayExecutionThread() Call + //1000 nano Second = 1 MicroSecond + //100 nano Second = 0.1 MicroSecond + //Thus to Convert X Microseconds to Y 100 Nano Second Unit + // 1 (100 nano Second Unit) = 0.1 Micro Second Unit + // Y (100 nano Second Unit) = X Micro Second Unit + //Thus X (100 Nano Second Unit) = 0.1 Y MicroSecond Unit + //Thus Y (100 Nano Second Unit) = 10 * X (Micro Second) + //Thus Conversion Factor is 10 + + //Converting the Micro Seconds to 100 Nano Second Unit + //Negative Timeout Value is to Indicate the Relative Time from Current Time + DelayIn100NanoSeconds.QuadPart = (LONGLONG)ulDelayInMicroSeconds * (-10L); + + KeDelayExecutionThread(KernelMode, //Processor Wait Mode - Kernel + FALSE, //Lower Level Drivers are Not Alertable + &DelayIn100NanoSeconds); //Interval + + PrintFunctionExit(__FUNCTION__,STATUS_SUCCESS); +} +/***************************************************************************** + Function : GetCurrentIrqlString + Description : This function converts the IRQ Level to the String + IN PARAM : Status to be converted + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : String value of the IRQ Level returned + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +char * GetCurrentIrqlString(void) +{ + ULONG ulCurrentIrql = KeGetCurrentIrql(); + + switch(ulCurrentIrql) + { + case PASSIVE_LEVEL: + return "PASSIVE_LEVEL"; + case APC_LEVEL: + return "APC_LEVEL"; + case DISPATCH_LEVEL: + return "DISPATCH_LEVEL"; + default: + return "DEVICE IRQL"; + } +} +/***************************************************************************** + Function : PrintDeviceChangeState + Description : This function Prints the Tuner State change + IN PARAM : State to which transition occurred + State From which transition occurred + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : State Transition Printed + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +VOID PrintDeviceChangeState(IN KSSTATE ToState,IN KSSTATE FromState) +{ + PCHAR pFromState = NULL; + PCHAR pToState = NULL; + KSSTATE State = ToState; + PCHAR pState = NULL; + + for(INT nStateIndex = 0;nStateIndex < 2;nStateIndex++) + { + switch(State) + { + case KSSTATE_STOP: + pState = "Stop"; + break; + case KSSTATE_ACQUIRE: + pState = "Acquire"; + break; + case KSSTATE_PAUSE: + pState = "Pause"; + break; + case KSSTATE_RUN: + pState = "Run"; + break; + default : + pState = "Unknown"; + break; + + } + if(nStateIndex == 0) + { + pToState = pState; + State = FromState; + } + else + { + pFromState = pState; + } + } + + SkyWalkerDebugPrint(EXTREME_LEVEL, ("Change State From %s to %s\n",pFromState,pToState)); + +} + +/***************************************************************************** + Function : NTStatusToString + Description : This function converts the NTSTATUS value to String + IN PARAM : Status to be converted + OUT PARAM : NONE + PreCondition : NONE + PostCondtion : String value of the Status returned + Logic : NONE + Assumption : NONE + Note : NONE + Revision History: + *****************************************************************************/ +PUCHAR NTStatusToString(NTSTATUS Status) +{ + + switch (Status) { + case STATUS_SUCCESS: + return (PUCHAR)"STATUS_SUCCESS"; + case STATUS_WAIT_1: + return (PUCHAR)"STATUS_WAIT_1"; + case STATUS_WAIT_2: + return (PUCHAR)"STATUS_WAIT_2"; + case STATUS_WAIT_3: + return (PUCHAR)"STATUS_WAIT_3"; + case STATUS_WAIT_63: + return (PUCHAR)"STATUS_WAIT_63"; + case STATUS_ABANDONED: + return (PUCHAR)"STATUS_ABANDONED"; + case STATUS_ABANDONED_WAIT_63: + return (PUCHAR)"STATUS_ABANDONED_WAIT_63"; + case STATUS_USER_APC: + return (PUCHAR)"STATUS_USER_APC"; + case STATUS_KERNEL_APC: + return (PUCHAR)"STATUS_KERNEL_APC"; + case STATUS_ALERTED: + return (PUCHAR)"STATUS_ALERTED"; + case STATUS_TIMEOUT: + return (PUCHAR)"STATUS_TIMEOUT"; + case STATUS_PENDING: + return (PUCHAR)"STATUS_PENDING"; + case STATUS_REPARSE: + return (PUCHAR)"STATUS_REPARSE"; + case STATUS_MORE_ENTRIES: + return (PUCHAR)"STATUS_MORE_ENTRIES"; + case STATUS_NOT_ALL_ASSIGNED: + return (PUCHAR)"STATUS_NOT_ALL_ASSIGNED"; + case STATUS_SOME_NOT_MAPPED: + return (PUCHAR)"STATUS_SOME_NOT_MAPPED"; + case STATUS_OPLOCK_BREAK_IN_PROGRESS: + return (PUCHAR)"STATUS_OPLOCK_BREAK_IN_PROGRESS"; + case STATUS_VOLUME_MOUNTED: + return (PUCHAR)"STATUS_VOLUME_MOUNTED"; + case STATUS_RXACT_COMMITTED: + return (PUCHAR)"STATUS_RXACT_COMMITTED"; + case STATUS_NOTIFY_CLEANUP: + return (PUCHAR)"STATUS_NOTIFY_CLEANUP"; + case STATUS_NOTIFY_ENUM_DIR: + return (PUCHAR)"STATUS_NOTIFY_ENUM_DIR"; + case STATUS_NO_QUOTAS_FOR_ACCOUNT: + return (PUCHAR)"STATUS_NO_QUOTAS_FOR_ACCOUNT"; + case STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED: + return (PUCHAR)"STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED"; + case STATUS_PAGE_FAULT_TRANSITION: + return (PUCHAR)"STATUS_PAGE_FAULT_TRANSITION"; + case STATUS_PAGE_FAULT_DEMAND_ZERO: + return (PUCHAR)"STATUS_PAGE_FAULT_DEMAND_ZERO"; + case STATUS_PAGE_FAULT_COPY_ON_WRITE: + return (PUCHAR)"STATUS_PAGE_FAULT_COPY_ON_WRITE"; + case STATUS_PAGE_FAULT_GUARD_PAGE: + return (PUCHAR)"STATUS_PAGE_FAULT_GUARD_PAGE"; + case STATUS_PAGE_FAULT_PAGING_FILE: + return (PUCHAR)"STATUS_PAGE_FAULT_PAGING_FILE"; + case STATUS_CACHE_PAGE_LOCKED: + return (PUCHAR)"STATUS_CACHE_PAGE_LOCKED"; + case STATUS_CRASH_DUMP: + return (PUCHAR)"STATUS_CRASH_DUMP"; + case STATUS_BUFFER_ALL_ZEROS: + return (PUCHAR)"STATUS_BUFFER_ALL_ZEROS"; + case STATUS_REPARSE_OBJECT: + return (PUCHAR)"STATUS_REPARSE_OBJECT"; + case STATUS_RESOURCE_REQUIREMENTS_CHANGED: + return (PUCHAR)"STATUS_RESOURCE_REQUIREMENTS_CHANGED"; + case STATUS_TRANSLATION_COMPLETE: + return (PUCHAR)"STATUS_TRANSLATION_COMPLETE"; + case STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY: + return (PUCHAR)"STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_NOTHING_TO_TERMINATE: + return (PUCHAR)"STATUS_NOTHING_TO_TERMINATE"; + case STATUS_PROCESS_NOT_IN_JOB: + return (PUCHAR)"STATUS_PROCESS_NOT_IN_JOB"; + case STATUS_PROCESS_IN_JOB: + return (PUCHAR)"STATUS_PROCESS_IN_JOB"; +#endif +#if (VER_PRODUCT_BUILD > 2600) + case STATUS_VOLSNAP_HIBERNATE_READY: + return (PUCHAR)"STATUS_VOLSNAP_HIBERNATE_READY"; + case STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY: + return (PUCHAR)"STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY"; +#endif +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_WAIT_FOR_OPLOCK: + return (PUCHAR)"STATUS_WAIT_FOR_OPLOCK"; +#endif + case DBG_EXCEPTION_HANDLED: + return (PUCHAR)"DBG_EXCEPTION_HANDLED"; + case DBG_CONTINUE: + return (PUCHAR)"DBG_CONTINUE"; + case STATUS_OBJECT_NAME_EXISTS: + return (PUCHAR)"STATUS_OBJECT_NAME_EXISTS"; + case STATUS_THREAD_WAS_SUSPENDED: + return (PUCHAR)"STATUS_THREAD_WAS_SUSPENDED"; + case STATUS_WORKING_SET_LIMIT_RANGE: + return (PUCHAR)"STATUS_WORKING_SET_LIMIT_RANGE"; + case STATUS_IMAGE_NOT_AT_BASE: + return (PUCHAR)"STATUS_IMAGE_NOT_AT_BASE"; + case STATUS_RXACT_STATE_CREATED: + return (PUCHAR)"STATUS_RXACT_STATE_CREATED"; + case STATUS_SEGMENT_NOTIFICATION: + return (PUCHAR)"STATUS_SEGMENT_NOTIFICATION"; + case STATUS_LOCAL_USER_SESSION_KEY: + return (PUCHAR)"STATUS_LOCAL_USER_SESSION_KEY"; + case STATUS_BAD_CURRENT_DIRECTORY: + return (PUCHAR)"STATUS_BAD_CURRENT_DIRECTORY"; + case STATUS_SERIAL_MORE_WRITES: + return (PUCHAR)"STATUS_SERIAL_MORE_WRITES"; + case STATUS_REGISTRY_RECOVERED: + return (PUCHAR)"STATUS_REGISTRY_RECOVERED"; + case STATUS_FT_READ_RECOVERY_FROM_BACKUP: + return (PUCHAR)"STATUS_FT_READ_RECOVERY_FROM_BACKUP"; + case STATUS_FT_WRITE_RECOVERY: + return (PUCHAR)"STATUS_FT_WRITE_RECOVERY"; + case STATUS_SERIAL_COUNTER_TIMEOUT: + return (PUCHAR)"STATUS_SERIAL_COUNTER_TIMEOUT"; + case STATUS_NULL_LM_PASSWORD: + return (PUCHAR)"STATUS_NULL_LM_PASSWORD"; + case STATUS_IMAGE_MACHINE_TYPE_MISMATCH: + return (PUCHAR)"STATUS_IMAGE_MACHINE_TYPE_MISMATCH"; + case STATUS_RECEIVE_PARTIAL: + return (PUCHAR)"STATUS_RECEIVE_PARTIAL"; + case STATUS_RECEIVE_EXPEDITED: + return (PUCHAR)"STATUS_RECEIVE_EXPEDITED"; + case STATUS_RECEIVE_PARTIAL_EXPEDITED: + return (PUCHAR)"STATUS_RECEIVE_PARTIAL_EXPEDITED"; + case STATUS_EVENT_DONE: + return (PUCHAR)"STATUS_EVENT_DONE"; + case STATUS_EVENT_PENDING: + return (PUCHAR)"STATUS_EVENT_PENDING"; + case STATUS_CHECKING_FILE_SYSTEM: + return (PUCHAR)"STATUS_CHECKING_FILE_SYSTEM"; + case STATUS_FATAL_APP_EXIT: + return (PUCHAR)"STATUS_FATAL_APP_EXIT"; + case STATUS_PREDEFINED_HANDLE: + return (PUCHAR)"STATUS_PREDEFINED_HANDLE"; + case STATUS_WAS_UNLOCKED: + return (PUCHAR)"STATUS_WAS_UNLOCKED"; + case STATUS_SERVICE_NOTIFICATION: + return (PUCHAR)"STATUS_SERVICE_NOTIFICATION"; + case STATUS_WAS_LOCKED: + return (PUCHAR)"STATUS_WAS_LOCKED"; + case STATUS_LOG_HARD_ERROR: + return (PUCHAR)"STATUS_LOG_HARD_ERROR"; + case STATUS_ALREADY_WIN32: + return (PUCHAR)"STATUS_ALREADY_WIN32"; + case STATUS_WX86_UNSIMULATE: + return (PUCHAR)"STATUS_WX86_UNSIMULATE"; + case STATUS_WX86_CONTINUE: + return (PUCHAR)"STATUS_WX86_CONTINUE"; + case STATUS_WX86_SINGLE_STEP: + return (PUCHAR)"STATUS_WX86_SINGLE_STEP"; + case STATUS_WX86_BREAKPOINT: + return (PUCHAR)"STATUS_WX86_BREAKPOINT"; + case STATUS_WX86_EXCEPTION_CONTINUE: + return (PUCHAR)"STATUS_WX86_EXCEPTION_CONTINUE"; + case STATUS_WX86_EXCEPTION_LASTCHANCE: + return (PUCHAR)"STATUS_WX86_EXCEPTION_LASTCHANCE"; + case STATUS_WX86_EXCEPTION_CHAIN: + return (PUCHAR)"STATUS_WX86_EXCEPTION_CHAIN"; + case STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE: + return (PUCHAR)"STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE"; + case STATUS_NO_YIELD_PERFORMED: + return (PUCHAR)"STATUS_NO_YIELD_PERFORMED"; + case STATUS_TIMER_RESUME_IGNORED: + return (PUCHAR)"STATUS_TIMER_RESUME_IGNORED"; + case STATUS_ARBITRATION_UNHANDLED: + return (PUCHAR)"STATUS_ARBITRATION_UNHANDLED"; + case STATUS_CARDBUS_NOT_SUPPORTED: + return (PUCHAR)"STATUS_CARDBUS_NOT_SUPPORTED"; + case STATUS_WX86_CREATEWX86TIB: + return (PUCHAR)"STATUS_WX86_CREATEWX86TIB"; + case STATUS_MP_PROCESSOR_MISMATCH: + return (PUCHAR)"STATUS_MP_PROCESSOR_MISMATCH"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_HIBERNATED: + return (PUCHAR)"STATUS_HIBERNATED"; + case STATUS_RESUME_HIBERNATION: + return (PUCHAR)"STATUS_RESUME_HIBERNATION"; +#endif +#if (VER_PRODUCT_BUILD > 2600) + case STATUS_FIRMWARE_UPDATED: + return (PUCHAR)"STATUS_FIRMWARE_UPDATED"; + case STATUS_DRIVERS_LEAKING_LOCKED_PAGES: + return (PUCHAR)"STATUS_DRIVERS_LEAKING_LOCKED_PAGES"; +#endif + case STATUS_WAKE_SYSTEM: + return (PUCHAR)"STATUS_WAKE_SYSTEM"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_DS_SHUTTING_DOWN: + return (PUCHAR)"STATUS_DS_SHUTTING_DOWN"; +#endif + case DBG_REPLY_LATER: + return (PUCHAR)"DBG_REPLY_LATER"; + case DBG_UNABLE_TO_PROVIDE_HANDLE: + return (PUCHAR)"DBG_UNABLE_TO_PROVIDE_HANDLE"; + case DBG_TERMINATE_THREAD: + return (PUCHAR)"DBG_TERMINATE_THREAD"; + case DBG_TERMINATE_PROCESS: + return (PUCHAR)"DBG_TERMINATE_PROCESS"; + case DBG_CONTROL_C: + return (PUCHAR)"DBG_CONTROL_C"; + case DBG_PRINTEXCEPTION_C: + return (PUCHAR)"DBG_PRINTEXCEPTION_C"; + case DBG_RIPEXCEPTION: + return (PUCHAR)"DBG_RIPEXCEPTION"; + case DBG_CONTROL_BREAK: + return (PUCHAR)"DBG_CONTROL_BREAK"; +#if (VER_PRODUCT_BUILD > 2600) + case DBG_COMMAND_EXCEPTION: + return (PUCHAR)"DBG_COMMAND_EXCEPTION"; +#endif + case RPC_NT_UUID_LOCAL_ONLY: + return (PUCHAR)"RPC_NT_UUID_LOCAL_ONLY"; + case RPC_NT_SEND_INCOMPLETE: + return (PUCHAR)"RPC_NT_SEND_INCOMPLETE"; + case STATUS_CTX_CDM_CONNECT: + return (PUCHAR)"STATUS_CTX_CDM_CONNECT"; + case STATUS_CTX_CDM_DISCONNECT: + return (PUCHAR)"STATUS_CTX_CDM_DISCONNECT"; + case STATUS_GUARD_PAGE_VIOLATION: + return (PUCHAR)"STATUS_GUARD_PAGE_VIOLATION"; + case STATUS_DATATYPE_MISALIGNMENT: + return (PUCHAR)"STATUS_DATATYPE_MISALIGNMENT"; + case STATUS_BREAKPOINT: + return (PUCHAR)"STATUS_BREAKPOINT"; + case STATUS_SINGLE_STEP: + return (PUCHAR)"STATUS_SINGLE_STEP"; + case STATUS_BUFFER_OVERFLOW: + return (PUCHAR)"STATUS_BUFFER_OVERFLOW"; + case STATUS_NO_MORE_FILES: + return (PUCHAR)"STATUS_NO_MORE_FILES"; + case STATUS_WAKE_SYSTEM_DEBUGGER: + return (PUCHAR)"STATUS_WAKE_SYSTEM_DEBUGGER"; + case STATUS_HANDLES_CLOSED: + return (PUCHAR)"STATUS_HANDLES_CLOSED"; + case STATUS_NO_INHERITANCE: + return (PUCHAR)"STATUS_NO_INHERITANCE"; + case STATUS_GUID_SUBSTITUTION_MADE: + return (PUCHAR)"STATUS_GUID_SUBSTITUTION_MADE"; + case STATUS_PARTIAL_COPY: + return (PUCHAR)"STATUS_PARTIAL_COPY"; + case STATUS_DEVICE_PAPER_EMPTY: + return (PUCHAR)"STATUS_DEVICE_PAPER_EMPTY"; + case STATUS_DEVICE_POWERED_OFF: + return (PUCHAR)"STATUS_DEVICE_POWERED_OFF"; + case STATUS_DEVICE_OFF_LINE: + return (PUCHAR)"STATUS_DEVICE_OFF_LINE"; + case STATUS_DEVICE_BUSY: + return (PUCHAR)"STATUS_DEVICE_BUSY"; + case STATUS_NO_MORE_EAS: + return (PUCHAR)"STATUS_NO_MORE_EAS"; + case STATUS_INVALID_EA_NAME: + return (PUCHAR)"STATUS_INVALID_EA_NAME"; + case STATUS_EA_LIST_INCONSISTENT: + return (PUCHAR)"STATUS_EA_LIST_INCONSISTENT"; + case STATUS_INVALID_EA_FLAG: + return (PUCHAR)"STATUS_INVALID_EA_FLAG"; + case STATUS_VERIFY_REQUIRED: + return (PUCHAR)"STATUS_VERIFY_REQUIRED"; + case STATUS_EXTRANEOUS_INFORMATION: + return (PUCHAR)"STATUS_EXTRANEOUS_INFORMATION"; + case STATUS_RXACT_COMMIT_NECESSARY: + return (PUCHAR)"STATUS_RXACT_COMMIT_NECESSARY"; + case STATUS_NO_MORE_ENTRIES: + return (PUCHAR)"STATUS_NO_MORE_ENTRIES"; + case STATUS_FILEMARK_DETECTED: + return (PUCHAR)"STATUS_FILEMARK_DETECTED"; + case STATUS_MEDIA_CHANGED: + return (PUCHAR)"STATUS_MEDIA_CHANGED"; + case STATUS_BUS_RESET: + return (PUCHAR)"STATUS_BUS_RESET"; + case STATUS_END_OF_MEDIA: + return (PUCHAR)"STATUS_END_OF_MEDIA"; + case STATUS_BEGINNING_OF_MEDIA: + return (PUCHAR)"STATUS_BEGINNING_OF_MEDIA"; + case STATUS_MEDIA_CHECK: + return (PUCHAR)"STATUS_MEDIA_CHECK"; + case STATUS_SETMARK_DETECTED: + return (PUCHAR)"STATUS_SETMARK_DETECTED"; + case STATUS_NO_DATA_DETECTED: + return (PUCHAR)"STATUS_NO_DATA_DETECTED"; + case STATUS_REDIRECTOR_HAS_OPEN_HANDLES: + return (PUCHAR)"STATUS_REDIRECTOR_HAS_OPEN_HANDLES"; + case STATUS_SERVER_HAS_OPEN_HANDLES: + return (PUCHAR)"STATUS_SERVER_HAS_OPEN_HANDLES"; + case STATUS_ALREADY_DISCONNECTED: + return (PUCHAR)"STATUS_ALREADY_DISCONNECTED"; + case STATUS_LONGJUMP: + return (PUCHAR)"STATUS_LONGJUMP"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_CLEANER_CARTRIDGE_INSTALLED: + return (PUCHAR)"STATUS_CLEANER_CARTRIDGE_INSTALLED"; + case STATUS_PLUGPLAY_QUERY_VETOED: + return (PUCHAR)"STATUS_PLUGPLAY_QUERY_VETOED"; + case STATUS_UNWIND_CONSOLIDATE: + return (PUCHAR)"STATUS_UNWIND_CONSOLIDATE"; +#endif +#if (VER_PRODUCT_BUILD > 2600) + case STATUS_REGISTRY_HIVE_RECOVERED: + return (PUCHAR)"STATUS_REGISTRY_HIVE_RECOVERED"; + case STATUS_DLL_MIGHT_BE_INSECURE: + return (PUCHAR)"STATUS_DLL_MIGHT_BE_INSECURE"; + case STATUS_DLL_MIGHT_BE_INCOMPATIBLE: + return (PUCHAR)"STATUS_DLL_MIGHT_BE_INCOMPATIBLE"; +#endif + case STATUS_DEVICE_REQUIRES_CLEANING: + return (PUCHAR)"STATUS_DEVICE_REQUIRES_CLEANING"; + case STATUS_DEVICE_DOOR_OPEN: + return (PUCHAR)"STATUS_DEVICE_DOOR_OPEN"; + case DBG_EXCEPTION_NOT_HANDLED: + return (PUCHAR)"DBG_EXCEPTION_NOT_HANDLED"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_CLUSTER_NODE_ALREADY_UP: + return (PUCHAR)"STATUS_CLUSTER_NODE_ALREADY_UP"; + case STATUS_CLUSTER_NODE_ALREADY_DOWN: + return (PUCHAR)"STATUS_CLUSTER_NODE_ALREADY_DOWN"; + case STATUS_CLUSTER_NETWORK_ALREADY_ONLINE: + return (PUCHAR)"STATUS_CLUSTER_NETWORK_ALREADY_ONLINE"; + case STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE: + return (PUCHAR)"STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE"; + case STATUS_CLUSTER_NODE_ALREADY_MEMBER: + return (PUCHAR)"STATUS_CLUSTER_NODE_ALREADY_MEMBER"; +#endif + case STATUS_UNSUCCESSFUL: + return (PUCHAR)"STATUS_UNSUCCESSFUL"; + case STATUS_NOT_IMPLEMENTED: + return (PUCHAR)"STATUS_NOT_IMPLEMENTED"; + case STATUS_INVALID_INFO_CLASS: + return (PUCHAR)"STATUS_INVALID_INFO_CLASS"; + case STATUS_INFO_LENGTH_MISMATCH: + return (PUCHAR)"STATUS_INFO_LENGTH_MISMATCH"; + case STATUS_ACCESS_VIOLATION: + return (PUCHAR)"STATUS_ACCESS_VIOLATION"; + case STATUS_IN_PAGE_ERROR: + return (PUCHAR)"STATUS_IN_PAGE_ERROR"; + case STATUS_PAGEFILE_QUOTA: + return (PUCHAR)"STATUS_PAGEFILE_QUOTA"; + case STATUS_INVALID_HANDLE: + return (PUCHAR)"STATUS_INVALID_HANDLE"; + case STATUS_BAD_INITIAL_STACK: + return (PUCHAR)"STATUS_BAD_INITIAL_STACK"; + case STATUS_BAD_INITIAL_PC: + return (PUCHAR)"STATUS_BAD_INITIAL_PC"; + case STATUS_INVALID_CID: + return (PUCHAR)"STATUS_INVALID_CID"; + case STATUS_TIMER_NOT_CANCELED: + return (PUCHAR)"STATUS_TIMER_NOT_CANCELED"; + case STATUS_INVALID_PARAMETER: + return (PUCHAR)"STATUS_INVALID_PARAMETER"; + case STATUS_NO_SUCH_DEVICE: + return (PUCHAR)"STATUS_NO_SUCH_DEVICE"; + case STATUS_NO_SUCH_FILE: + return (PUCHAR)"STATUS_NO_SUCH_FILE"; + case STATUS_INVALID_DEVICE_REQUEST: + return (PUCHAR)"STATUS_INVALID_DEVICE_REQUEST"; + case STATUS_END_OF_FILE: + return (PUCHAR)"STATUS_END_OF_FILE"; + case STATUS_WRONG_VOLUME: + return (PUCHAR)"STATUS_WRONG_VOLUME"; + case STATUS_NO_MEDIA_IN_DEVICE: + return (PUCHAR)"STATUS_NO_MEDIA_IN_DEVICE"; + case STATUS_UNRECOGNIZED_MEDIA: + return (PUCHAR)"STATUS_UNRECOGNIZED_MEDIA"; + case STATUS_NONEXISTENT_SECTOR: + return (PUCHAR)"STATUS_NONEXISTENT_SECTOR"; + case STATUS_MORE_PROCESSING_REQUIRED: + return (PUCHAR)"STATUS_MORE_PROCESSING_REQUIRED"; + case STATUS_NO_MEMORY: + return (PUCHAR)"STATUS_NO_MEMORY"; + case STATUS_CONFLICTING_ADDRESSES: + return (PUCHAR)"STATUS_CONFLICTING_ADDRESSES"; + case STATUS_NOT_MAPPED_VIEW: + return (PUCHAR)"STATUS_NOT_MAPPED_VIEW"; + case STATUS_UNABLE_TO_FREE_VM: + return (PUCHAR)"STATUS_UNABLE_TO_FREE_VM"; + case STATUS_UNABLE_TO_DELETE_SECTION: + return (PUCHAR)"STATUS_UNABLE_TO_DELETE_SECTION"; + case STATUS_INVALID_SYSTEM_SERVICE: + return (PUCHAR)"STATUS_INVALID_SYSTEM_SERVICE"; + case STATUS_ILLEGAL_INSTRUCTION: + return (PUCHAR)"STATUS_ILLEGAL_INSTRUCTION"; + case STATUS_INVALID_LOCK_SEQUENCE: + return (PUCHAR)"STATUS_INVALID_LOCK_SEQUENCE"; + case STATUS_INVALID_VIEW_SIZE: + return (PUCHAR)"STATUS_INVALID_VIEW_SIZE"; + case STATUS_INVALID_FILE_FOR_SECTION: + return (PUCHAR)"STATUS_INVALID_FILE_FOR_SECTION"; + case STATUS_ALREADY_COMMITTED: + return (PUCHAR)"STATUS_ALREADY_COMMITTED"; + case STATUS_ACCESS_DENIED: + return (PUCHAR)"STATUS_ACCESS_DENIED"; + case STATUS_BUFFER_TOO_SMALL: + return (PUCHAR)"STATUS_BUFFER_TOO_SMALL"; + case STATUS_OBJECT_TYPE_MISMATCH: + return (PUCHAR)"STATUS_OBJECT_TYPE_MISMATCH"; + case STATUS_NONCONTINUABLE_EXCEPTION: + return (PUCHAR)"STATUS_NONCONTINUABLE_EXCEPTION"; + case STATUS_INVALID_DISPOSITION: + return (PUCHAR)"STATUS_INVALID_DISPOSITION"; + case STATUS_UNWIND: + return (PUCHAR)"STATUS_UNWIND"; + case STATUS_BAD_STACK: + return (PUCHAR)"STATUS_BAD_STACK"; + case STATUS_INVALID_UNWIND_TARGET: + return (PUCHAR)"STATUS_INVALID_UNWIND_TARGET"; + case STATUS_NOT_LOCKED: + return (PUCHAR)"STATUS_NOT_LOCKED"; + case STATUS_PARITY_ERROR: + return (PUCHAR)"STATUS_PARITY_ERROR"; + case STATUS_UNABLE_TO_DECOMMIT_VM: + return (PUCHAR)"STATUS_UNABLE_TO_DECOMMIT_VM"; + case STATUS_NOT_COMMITTED: + return (PUCHAR)"STATUS_NOT_COMMITTED"; + case STATUS_INVALID_PORT_ATTRIBUTES: + return (PUCHAR)"STATUS_INVALID_PORT_ATTRIBUTES"; + case STATUS_PORT_MESSAGE_TOO_LONG: + return (PUCHAR)"STATUS_PORT_MESSAGE_TOO_LONG"; + case STATUS_INVALID_PARAMETER_MIX: + return (PUCHAR)"STATUS_INVALID_PARAMETER_MIX"; + case STATUS_INVALID_QUOTA_LOWER: + return (PUCHAR)"STATUS_INVALID_QUOTA_LOWER"; + case STATUS_DISK_CORRUPT_ERROR: + return (PUCHAR)"STATUS_DISK_CORRUPT_ERROR"; + case STATUS_OBJECT_NAME_INVALID: + return (PUCHAR)"STATUS_OBJECT_NAME_INVALID"; + case STATUS_OBJECT_NAME_NOT_FOUND: + return (PUCHAR)"STATUS_OBJECT_NAME_NOT_FOUND"; + case STATUS_OBJECT_NAME_COLLISION: + return (PUCHAR)"STATUS_OBJECT_NAME_COLLISION"; + case STATUS_PORT_DISCONNECTED: + return (PUCHAR)"STATUS_PORT_DISCONNECTED"; + case STATUS_DEVICE_ALREADY_ATTACHED: + return (PUCHAR)"STATUS_DEVICE_ALREADY_ATTACHED"; + case STATUS_OBJECT_PATH_INVALID: + return (PUCHAR)"STATUS_OBJECT_PATH_INVALID"; + case STATUS_OBJECT_PATH_NOT_FOUND: + return (PUCHAR)"STATUS_OBJECT_PATH_NOT_FOUND"; + case STATUS_OBJECT_PATH_SYNTAX_BAD: + return (PUCHAR)"STATUS_OBJECT_PATH_SYNTAX_BAD"; + case STATUS_DATA_OVERRUN: + return (PUCHAR)"STATUS_DATA_OVERRUN"; + case STATUS_DATA_LATE_ERROR: + return (PUCHAR)"STATUS_DATA_LATE_ERROR"; + case STATUS_DATA_ERROR: + return (PUCHAR)"STATUS_DATA_ERROR"; + case STATUS_CRC_ERROR: + return (PUCHAR)"STATUS_CRC_ERROR"; + case STATUS_SECTION_TOO_BIG: + return (PUCHAR)"STATUS_SECTION_TOO_BIG"; + case STATUS_PORT_CONNECTION_REFUSED: + return (PUCHAR)"STATUS_PORT_CONNECTION_REFUSED"; + case STATUS_INVALID_PORT_HANDLE: + return (PUCHAR)"STATUS_INVALID_PORT_HANDLE"; + case STATUS_SHARING_VIOLATION: + return (PUCHAR)"STATUS_SHARING_VIOLATION"; + case STATUS_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_QUOTA_EXCEEDED"; + case STATUS_INVALID_PAGE_PROTECTION: + return (PUCHAR)"STATUS_INVALID_PAGE_PROTECTION"; + case STATUS_MUTANT_NOT_OWNED: + return (PUCHAR)"STATUS_MUTANT_NOT_OWNED"; + case STATUS_SEMAPHORE_LIMIT_EXCEEDED: + return (PUCHAR)"STATUS_SEMAPHORE_LIMIT_EXCEEDED"; + case STATUS_PORT_ALREADY_SET: + return (PUCHAR)"STATUS_PORT_ALREADY_SET"; + case STATUS_SECTION_NOT_IMAGE: + return (PUCHAR)"STATUS_SECTION_NOT_IMAGE"; + case STATUS_SUSPEND_COUNT_EXCEEDED: + return (PUCHAR)"STATUS_SUSPEND_COUNT_EXCEEDED"; + case STATUS_THREAD_IS_TERMINATING: + return (PUCHAR)"STATUS_THREAD_IS_TERMINATING"; + case STATUS_BAD_WORKING_SET_LIMIT: + return (PUCHAR)"STATUS_BAD_WORKING_SET_LIMIT"; + case STATUS_INCOMPATIBLE_FILE_MAP: + return (PUCHAR)"STATUS_INCOMPATIBLE_FILE_MAP"; + case STATUS_SECTION_PROTECTION: + return (PUCHAR)"STATUS_SECTION_PROTECTION"; + case STATUS_EAS_NOT_SUPPORTED: + return (PUCHAR)"STATUS_EAS_NOT_SUPPORTED"; + case STATUS_EA_TOO_LARGE: + return (PUCHAR)"STATUS_EA_TOO_LARGE"; + case STATUS_NONEXISTENT_EA_ENTRY: + return (PUCHAR)"STATUS_NONEXISTENT_EA_ENTRY"; + case STATUS_NO_EAS_ON_FILE: + return (PUCHAR)"STATUS_NO_EAS_ON_FILE"; + case STATUS_EA_CORRUPT_ERROR: + return (PUCHAR)"STATUS_EA_CORRUPT_ERROR"; + case STATUS_FILE_LOCK_CONFLICT: + return (PUCHAR)"STATUS_FILE_LOCK_CONFLICT"; + case STATUS_LOCK_NOT_GRANTED: + return (PUCHAR)"STATUS_LOCK_NOT_GRANTED"; + case STATUS_DELETE_PENDING: + return (PUCHAR)"STATUS_DELETE_PENDING"; + case STATUS_CTL_FILE_NOT_SUPPORTED: + return (PUCHAR)"STATUS_CTL_FILE_NOT_SUPPORTED"; + case STATUS_UNKNOWN_REVISION: + return (PUCHAR)"STATUS_UNKNOWN_REVISION"; + case STATUS_REVISION_MISMATCH: + return (PUCHAR)"STATUS_REVISION_MISMATCH"; + case STATUS_INVALID_OWNER: + return (PUCHAR)"STATUS_INVALID_OWNER"; + case STATUS_INVALID_PRIMARY_GROUP: + return (PUCHAR)"STATUS_INVALID_PRIMARY_GROUP"; + case STATUS_NO_IMPERSONATION_TOKEN: + return (PUCHAR)"STATUS_NO_IMPERSONATION_TOKEN"; + case STATUS_CANT_DISABLE_MANDATORY: + return (PUCHAR)"STATUS_CANT_DISABLE_MANDATORY"; + case STATUS_NO_LOGON_SERVERS: + return (PUCHAR)"STATUS_NO_LOGON_SERVERS"; + case STATUS_NO_SUCH_LOGON_SESSION: + return (PUCHAR)"STATUS_NO_SUCH_LOGON_SESSION"; + case STATUS_NO_SUCH_PRIVILEGE: + return (PUCHAR)"STATUS_NO_SUCH_PRIVILEGE"; + case STATUS_PRIVILEGE_NOT_HELD: + return (PUCHAR)"STATUS_PRIVILEGE_NOT_HELD"; + case STATUS_INVALID_ACCOUNT_NAME: + return (PUCHAR)"STATUS_INVALID_ACCOUNT_NAME"; + case STATUS_USER_EXISTS: + return (PUCHAR)"STATUS_USER_EXISTS"; + case STATUS_NO_SUCH_USER: + return (PUCHAR)"STATUS_NO_SUCH_USER"; + case STATUS_GROUP_EXISTS: + return (PUCHAR)"STATUS_GROUP_EXISTS"; + case STATUS_NO_SUCH_GROUP: + return (PUCHAR)"STATUS_NO_SUCH_GROUP"; + case STATUS_MEMBER_IN_GROUP: + return (PUCHAR)"STATUS_MEMBER_IN_GROUP"; + case STATUS_MEMBER_NOT_IN_GROUP: + return (PUCHAR)"STATUS_MEMBER_NOT_IN_GROUP"; + case STATUS_LAST_ADMIN: + return (PUCHAR)"STATUS_LAST_ADMIN"; + case STATUS_WRONG_PASSWORD: + return (PUCHAR)"STATUS_WRONG_PASSWORD"; + case STATUS_ILL_FORMED_PASSWORD: + return (PUCHAR)"STATUS_ILL_FORMED_PASSWORD"; + case STATUS_PASSWORD_RESTRICTION: + return (PUCHAR)"STATUS_PASSWORD_RESTRICTION"; + case STATUS_LOGON_FAILURE: + return (PUCHAR)"STATUS_LOGON_FAILURE"; + case STATUS_ACCOUNT_RESTRICTION: + return (PUCHAR)"STATUS_ACCOUNT_RESTRICTION"; + case STATUS_INVALID_LOGON_HOURS: + return (PUCHAR)"STATUS_INVALID_LOGON_HOURS"; + case STATUS_INVALID_WORKSTATION: + return (PUCHAR)"STATUS_INVALID_WORKSTATION"; + case STATUS_PASSWORD_EXPIRED: + return (PUCHAR)"STATUS_PASSWORD_EXPIRED"; + case STATUS_ACCOUNT_DISABLED: + return (PUCHAR)"STATUS_ACCOUNT_DISABLED"; + case STATUS_NONE_MAPPED: + return (PUCHAR)"STATUS_NONE_MAPPED"; + case STATUS_TOO_MANY_LUIDS_REQUESTED: + return (PUCHAR)"STATUS_TOO_MANY_LUIDS_REQUESTED"; + case STATUS_LUIDS_EXHAUSTED: + return (PUCHAR)"STATUS_LUIDS_EXHAUSTED"; + case STATUS_INVALID_SUB_AUTHORITY: + return (PUCHAR)"STATUS_INVALID_SUB_AUTHORITY"; + case STATUS_INVALID_ACL: + return (PUCHAR)"STATUS_INVALID_ACL"; + case STATUS_INVALID_SID: + return (PUCHAR)"STATUS_INVALID_SID"; + case STATUS_INVALID_SECURITY_DESCR: + return (PUCHAR)"STATUS_INVALID_SECURITY_DESCR"; + case STATUS_PROCEDURE_NOT_FOUND: + return (PUCHAR)"STATUS_PROCEDURE_NOT_FOUND"; + case STATUS_INVALID_IMAGE_FORMAT: + return (PUCHAR)"STATUS_INVALID_IMAGE_FORMAT"; + case STATUS_NO_TOKEN: + return (PUCHAR)"STATUS_NO_TOKEN"; + case STATUS_BAD_INHERITANCE_ACL: + return (PUCHAR)"STATUS_BAD_INHERITANCE_ACL"; + case STATUS_RANGE_NOT_LOCKED: + return (PUCHAR)"STATUS_RANGE_NOT_LOCKED"; + case STATUS_DISK_FULL: + return (PUCHAR)"STATUS_DISK_FULL"; + case STATUS_SERVER_DISABLED: + return (PUCHAR)"STATUS_SERVER_DISABLED"; + case STATUS_SERVER_NOT_DISABLED: + return (PUCHAR)"STATUS_SERVER_NOT_DISABLED"; + case STATUS_TOO_MANY_GUIDS_REQUESTED: + return (PUCHAR)"STATUS_TOO_MANY_GUIDS_REQUESTED"; + case STATUS_GUIDS_EXHAUSTED: + return (PUCHAR)"STATUS_GUIDS_EXHAUSTED"; + case STATUS_INVALID_ID_AUTHORITY: + return (PUCHAR)"STATUS_INVALID_ID_AUTHORITY"; + case STATUS_AGENTS_EXHAUSTED: + return (PUCHAR)"STATUS_AGENTS_EXHAUSTED"; + case STATUS_INVALID_VOLUME_LABEL: + return (PUCHAR)"STATUS_INVALID_VOLUME_LABEL"; + case STATUS_SECTION_NOT_EXTENDED: + return (PUCHAR)"STATUS_SECTION_NOT_EXTENDED"; + case STATUS_NOT_MAPPED_DATA: + return (PUCHAR)"STATUS_NOT_MAPPED_DATA"; + case STATUS_RESOURCE_DATA_NOT_FOUND: + return (PUCHAR)"STATUS_RESOURCE_DATA_NOT_FOUND"; + case STATUS_RESOURCE_TYPE_NOT_FOUND: + return (PUCHAR)"STATUS_RESOURCE_TYPE_NOT_FOUND"; + case STATUS_RESOURCE_NAME_NOT_FOUND: + return (PUCHAR)"STATUS_RESOURCE_NAME_NOT_FOUND"; + case STATUS_ARRAY_BOUNDS_EXCEEDED: + return (PUCHAR)"STATUS_ARRAY_BOUNDS_EXCEEDED"; + case STATUS_FLOAT_DENORMAL_OPERAND: + return (PUCHAR)"STATUS_FLOAT_DENORMAL_OPERAND"; + case STATUS_FLOAT_DIVIDE_BY_ZERO: + return (PUCHAR)"STATUS_FLOAT_DIVIDE_BY_ZERO"; + case STATUS_FLOAT_INEXACT_RESULT: + return (PUCHAR)"STATUS_FLOAT_INEXACT_RESULT"; + case STATUS_FLOAT_INVALID_OPERATION: + return (PUCHAR)"STATUS_FLOAT_INVALID_OPERATION"; + case STATUS_FLOAT_OVERFLOW: + return (PUCHAR)"STATUS_FLOAT_OVERFLOW"; + case STATUS_FLOAT_STACK_CHECK: + return (PUCHAR)"STATUS_FLOAT_STACK_CHECK"; + case STATUS_FLOAT_UNDERFLOW: + return (PUCHAR)"STATUS_FLOAT_UNDERFLOW"; + case STATUS_INTEGER_DIVIDE_BY_ZERO: + return (PUCHAR)"STATUS_INTEGER_DIVIDE_BY_ZERO"; + case STATUS_INTEGER_OVERFLOW: + return (PUCHAR)"STATUS_INTEGER_OVERFLOW"; + case STATUS_PRIVILEGED_INSTRUCTION: + return (PUCHAR)"STATUS_PRIVILEGED_INSTRUCTION"; + case STATUS_TOO_MANY_PAGING_FILES: + return (PUCHAR)"STATUS_TOO_MANY_PAGING_FILES"; + case STATUS_FILE_INVALID: + return (PUCHAR)"STATUS_FILE_INVALID"; + case STATUS_ALLOTTED_SPACE_EXCEEDED: + return (PUCHAR)"STATUS_ALLOTTED_SPACE_EXCEEDED"; + case STATUS_INSUFFICIENT_RESOURCES: + return (PUCHAR)"STATUS_INSUFFICIENT_RESOURCES"; + case STATUS_DFS_EXIT_PATH_FOUND: + return (PUCHAR)"STATUS_DFS_EXIT_PATH_FOUND"; + case STATUS_DEVICE_DATA_ERROR: + return (PUCHAR)"STATUS_DEVICE_DATA_ERROR"; + case STATUS_DEVICE_NOT_CONNECTED: + return (PUCHAR)"STATUS_DEVICE_NOT_CONNECTED"; + case STATUS_DEVICE_POWER_FAILURE: + return (PUCHAR)"STATUS_DEVICE_POWER_FAILURE"; + case STATUS_FREE_VM_NOT_AT_BASE: + return (PUCHAR)"STATUS_FREE_VM_NOT_AT_BASE"; + case STATUS_MEMORY_NOT_ALLOCATED: + return (PUCHAR)"STATUS_MEMORY_NOT_ALLOCATED"; + case STATUS_WORKING_SET_QUOTA: + return (PUCHAR)"STATUS_WORKING_SET_QUOTA"; + case STATUS_MEDIA_WRITE_PROTECTED: + return (PUCHAR)"STATUS_MEDIA_WRITE_PROTECTED"; + case STATUS_DEVICE_NOT_READY: + return (PUCHAR)"STATUS_DEVICE_NOT_READY"; + case STATUS_INVALID_GROUP_ATTRIBUTES: + return (PUCHAR)"STATUS_INVALID_GROUP_ATTRIBUTES"; + case STATUS_BAD_IMPERSONATION_LEVEL: + return (PUCHAR)"STATUS_BAD_IMPERSONATION_LEVEL"; + case STATUS_CANT_OPEN_ANONYMOUS: + return (PUCHAR)"STATUS_CANT_OPEN_ANONYMOUS"; + case STATUS_BAD_VALIDATION_CLASS: + return (PUCHAR)"STATUS_BAD_VALIDATION_CLASS"; + case STATUS_BAD_TOKEN_TYPE: + return (PUCHAR)"STATUS_BAD_TOKEN_TYPE"; + case STATUS_BAD_MASTER_BOOT_RECORD: + return (PUCHAR)"STATUS_BAD_MASTER_BOOT_RECORD"; + case STATUS_INSTRUCTION_MISALIGNMENT: + return (PUCHAR)"STATUS_INSTRUCTION_MISALIGNMENT"; + case STATUS_INSTANCE_NOT_AVAILABLE: + return (PUCHAR)"STATUS_INSTANCE_NOT_AVAILABLE"; + case STATUS_PIPE_NOT_AVAILABLE: + return (PUCHAR)"STATUS_PIPE_NOT_AVAILABLE"; + case STATUS_INVALID_PIPE_STATE: + return (PUCHAR)"STATUS_INVALID_PIPE_STATE"; + case STATUS_PIPE_BUSY: + return (PUCHAR)"STATUS_PIPE_BUSY"; + case STATUS_ILLEGAL_FUNCTION: + return (PUCHAR)"STATUS_ILLEGAL_FUNCTION"; + case STATUS_PIPE_DISCONNECTED: + return (PUCHAR)"STATUS_PIPE_DISCONNECTED"; + case STATUS_PIPE_CLOSING: + return (PUCHAR)"STATUS_PIPE_CLOSING"; + case STATUS_PIPE_CONNECTED: + return (PUCHAR)"STATUS_PIPE_CONNECTED"; + case STATUS_PIPE_LISTENING: + return (PUCHAR)"STATUS_PIPE_LISTENING"; + case STATUS_INVALID_READ_MODE: + return (PUCHAR)"STATUS_INVALID_READ_MODE"; + case STATUS_IO_TIMEOUT: + return (PUCHAR)"STATUS_IO_TIMEOUT"; + case STATUS_FILE_FORCED_CLOSED: + return (PUCHAR)"STATUS_FILE_FORCED_CLOSED"; + case STATUS_PROFILING_NOT_STARTED: + return (PUCHAR)"STATUS_PROFILING_NOT_STARTED"; + case STATUS_PROFILING_NOT_STOPPED: + return (PUCHAR)"STATUS_PROFILING_NOT_STOPPED"; + case STATUS_COULD_NOT_INTERPRET: + return (PUCHAR)"STATUS_COULD_NOT_INTERPRET"; + case STATUS_FILE_IS_A_DIRECTORY: + return (PUCHAR)"STATUS_FILE_IS_A_DIRECTORY"; + case STATUS_NOT_SUPPORTED: + return (PUCHAR)"STATUS_NOT_SUPPORTED"; + case STATUS_REMOTE_NOT_LISTENING: + return (PUCHAR)"STATUS_REMOTE_NOT_LISTENING"; + case STATUS_DUPLICATE_NAME: + return (PUCHAR)"STATUS_DUPLICATE_NAME"; + case STATUS_BAD_NETWORK_PATH: + return (PUCHAR)"STATUS_BAD_NETWORK_PATH"; + case STATUS_NETWORK_BUSY: + return (PUCHAR)"STATUS_NETWORK_BUSY"; + case STATUS_DEVICE_DOES_NOT_EXIST: + return (PUCHAR)"STATUS_DEVICE_DOES_NOT_EXIST"; + case STATUS_TOO_MANY_COMMANDS: + return (PUCHAR)"STATUS_TOO_MANY_COMMANDS"; + case STATUS_ADAPTER_HARDWARE_ERROR: + return (PUCHAR)"STATUS_ADAPTER_HARDWARE_ERROR"; + case STATUS_INVALID_NETWORK_RESPONSE: + return (PUCHAR)"STATUS_INVALID_NETWORK_RESPONSE"; + case STATUS_UNEXPECTED_NETWORK_ERROR: + return (PUCHAR)"STATUS_UNEXPECTED_NETWORK_ERROR"; + case STATUS_BAD_REMOTE_ADAPTER: + return (PUCHAR)"STATUS_BAD_REMOTE_ADAPTER"; + case STATUS_PRINT_QUEUE_FULL: + return (PUCHAR)"STATUS_PRINT_QUEUE_FULL"; + case STATUS_NO_SPOOL_SPACE: + return (PUCHAR)"STATUS_NO_SPOOL_SPACE"; + case STATUS_PRINT_CANCELLED: + return (PUCHAR)"STATUS_PRINT_CANCELLED"; + case STATUS_NETWORK_NAME_DELETED: + return (PUCHAR)"STATUS_NETWORK_NAME_DELETED"; + case STATUS_NETWORK_ACCESS_DENIED: + return (PUCHAR)"STATUS_NETWORK_ACCESS_DENIED"; + case STATUS_BAD_DEVICE_TYPE: + return (PUCHAR)"STATUS_BAD_DEVICE_TYPE"; + case STATUS_BAD_NETWORK_NAME: + return (PUCHAR)"STATUS_BAD_NETWORK_NAME"; + case STATUS_TOO_MANY_NAMES: + return (PUCHAR)"STATUS_TOO_MANY_NAMES"; + case STATUS_TOO_MANY_SESSIONS: + return (PUCHAR)"STATUS_TOO_MANY_SESSIONS"; + case STATUS_SHARING_PAUSED: + return (PUCHAR)"STATUS_SHARING_PAUSED"; + case STATUS_REQUEST_NOT_ACCEPTED: + return (PUCHAR)"STATUS_REQUEST_NOT_ACCEPTED"; + case STATUS_REDIRECTOR_PAUSED: + return (PUCHAR)"STATUS_REDIRECTOR_PAUSED"; + case STATUS_NET_WRITE_FAULT: + return (PUCHAR)"STATUS_NET_WRITE_FAULT"; + case STATUS_PROFILING_AT_LIMIT: + return (PUCHAR)"STATUS_PROFILING_AT_LIMIT"; + case STATUS_NOT_SAME_DEVICE: + return (PUCHAR)"STATUS_NOT_SAME_DEVICE"; + case STATUS_FILE_RENAMED: + return (PUCHAR)"STATUS_FILE_RENAMED"; + case STATUS_VIRTUAL_CIRCUIT_CLOSED: + return (PUCHAR)"STATUS_VIRTUAL_CIRCUIT_CLOSED"; + case STATUS_NO_SECURITY_ON_OBJECT: + return (PUCHAR)"STATUS_NO_SECURITY_ON_OBJECT"; + case STATUS_CANT_WAIT: + return (PUCHAR)"STATUS_CANT_WAIT"; + case STATUS_PIPE_EMPTY: + return (PUCHAR)"STATUS_PIPE_EMPTY"; + case STATUS_CANT_ACCESS_DOMAIN_INFO: + return (PUCHAR)"STATUS_CANT_ACCESS_DOMAIN_INFO"; + case STATUS_CANT_TERMINATE_SELF: + return (PUCHAR)"STATUS_CANT_TERMINATE_SELF"; + case STATUS_INVALID_SERVER_STATE: + return (PUCHAR)"STATUS_INVALID_SERVER_STATE"; + case STATUS_INVALID_DOMAIN_STATE: + return (PUCHAR)"STATUS_INVALID_DOMAIN_STATE"; + case STATUS_INVALID_DOMAIN_ROLE: + return (PUCHAR)"STATUS_INVALID_DOMAIN_ROLE"; + case STATUS_NO_SUCH_DOMAIN: + return (PUCHAR)"STATUS_NO_SUCH_DOMAIN"; + case STATUS_DOMAIN_EXISTS: + return (PUCHAR)"STATUS_DOMAIN_EXISTS"; + case STATUS_DOMAIN_LIMIT_EXCEEDED: + return (PUCHAR)"STATUS_DOMAIN_LIMIT_EXCEEDED"; + case STATUS_OPLOCK_NOT_GRANTED: + return (PUCHAR)"STATUS_OPLOCK_NOT_GRANTED"; + case STATUS_INVALID_OPLOCK_PROTOCOL: + return (PUCHAR)"STATUS_INVALID_OPLOCK_PROTOCOL"; + case STATUS_INTERNAL_DB_CORRUPTION: + return (PUCHAR)"STATUS_INTERNAL_DB_CORRUPTION"; + case STATUS_INTERNAL_ERROR: + return (PUCHAR)"STATUS_INTERNAL_ERROR"; + case STATUS_GENERIC_NOT_MAPPED: + return (PUCHAR)"STATUS_GENERIC_NOT_MAPPED"; + case STATUS_BAD_DESCRIPTOR_FORMAT: + return (PUCHAR)"STATUS_BAD_DESCRIPTOR_FORMAT"; + case STATUS_INVALID_USER_BUFFER: + return (PUCHAR)"STATUS_INVALID_USER_BUFFER"; + case STATUS_UNEXPECTED_IO_ERROR: + return (PUCHAR)"STATUS_UNEXPECTED_IO_ERROR"; + case STATUS_UNEXPECTED_MM_CREATE_ERR: + return (PUCHAR)"STATUS_UNEXPECTED_MM_CREATE_ERR"; + case STATUS_UNEXPECTED_MM_MAP_ERROR: + return (PUCHAR)"STATUS_UNEXPECTED_MM_MAP_ERROR"; + case STATUS_UNEXPECTED_MM_EXTEND_ERR: + return (PUCHAR)"STATUS_UNEXPECTED_MM_EXTEND_ERR"; + case STATUS_NOT_LOGON_PROCESS: + return (PUCHAR)"STATUS_NOT_LOGON_PROCESS"; + case STATUS_LOGON_SESSION_EXISTS: + return (PUCHAR)"STATUS_LOGON_SESSION_EXISTS"; + case STATUS_INVALID_PARAMETER_1: + return (PUCHAR)"STATUS_INVALID_PARAMETER_1"; + case STATUS_INVALID_PARAMETER_2: + return (PUCHAR)"STATUS_INVALID_PARAMETER_2"; + case STATUS_INVALID_PARAMETER_3: + return (PUCHAR)"STATUS_INVALID_PARAMETER_3"; + case STATUS_INVALID_PARAMETER_4: + return (PUCHAR)"STATUS_INVALID_PARAMETER_4"; + case STATUS_INVALID_PARAMETER_5: + return (PUCHAR)"STATUS_INVALID_PARAMETER_5"; + case STATUS_INVALID_PARAMETER_6: + return (PUCHAR)"STATUS_INVALID_PARAMETER_6"; + case STATUS_INVALID_PARAMETER_7: + return (PUCHAR)"STATUS_INVALID_PARAMETER_7"; + case STATUS_INVALID_PARAMETER_8: + return (PUCHAR)"STATUS_INVALID_PARAMETER_8"; + case STATUS_INVALID_PARAMETER_9: + return (PUCHAR)"STATUS_INVALID_PARAMETER_9"; + case STATUS_INVALID_PARAMETER_10: + return (PUCHAR)"STATUS_INVALID_PARAMETER_10"; + case STATUS_INVALID_PARAMETER_11: + return (PUCHAR)"STATUS_INVALID_PARAMETER_11"; + case STATUS_INVALID_PARAMETER_12: + return (PUCHAR)"STATUS_INVALID_PARAMETER_12"; + case STATUS_REDIRECTOR_NOT_STARTED: + return (PUCHAR)"STATUS_REDIRECTOR_NOT_STARTED"; + case STATUS_REDIRECTOR_STARTED: + return (PUCHAR)"STATUS_REDIRECTOR_STARTED"; + case STATUS_STACK_OVERFLOW: + return (PUCHAR)"STATUS_STACK_OVERFLOW"; + case STATUS_NO_SUCH_PACKAGE: + return (PUCHAR)"STATUS_NO_SUCH_PACKAGE"; + case STATUS_BAD_FUNCTION_TABLE: + return (PUCHAR)"STATUS_BAD_FUNCTION_TABLE"; + case STATUS_VARIABLE_NOT_FOUND: + return (PUCHAR)"STATUS_VARIABLE_NOT_FOUND"; + case STATUS_DIRECTORY_NOT_EMPTY: + return (PUCHAR)"STATUS_DIRECTORY_NOT_EMPTY"; + case STATUS_FILE_CORRUPT_ERROR: + return (PUCHAR)"STATUS_FILE_CORRUPT_ERROR"; + case STATUS_NOT_A_DIRECTORY: + return (PUCHAR)"STATUS_NOT_A_DIRECTORY"; + case STATUS_BAD_LOGON_SESSION_STATE: + return (PUCHAR)"STATUS_BAD_LOGON_SESSION_STATE"; + case STATUS_LOGON_SESSION_COLLISION: + return (PUCHAR)"STATUS_LOGON_SESSION_COLLISION"; + case STATUS_NAME_TOO_LONG: + return (PUCHAR)"STATUS_NAME_TOO_LONG"; + case STATUS_FILES_OPEN: + return (PUCHAR)"STATUS_FILES_OPEN"; + case STATUS_CONNECTION_IN_USE: + return (PUCHAR)"STATUS_CONNECTION_IN_USE"; + case STATUS_MESSAGE_NOT_FOUND: + return (PUCHAR)"STATUS_MESSAGE_NOT_FOUND"; + case STATUS_PROCESS_IS_TERMINATING: + return (PUCHAR)"STATUS_PROCESS_IS_TERMINATING"; + case STATUS_INVALID_LOGON_TYPE: + return (PUCHAR)"STATUS_INVALID_LOGON_TYPE"; + case STATUS_NO_GUID_TRANSLATION: + return (PUCHAR)"STATUS_NO_GUID_TRANSLATION"; + case STATUS_CANNOT_IMPERSONATE: + return (PUCHAR)"STATUS_CANNOT_IMPERSONATE"; + case STATUS_IMAGE_ALREADY_LOADED: + return (PUCHAR)"STATUS_IMAGE_ALREADY_LOADED"; + case STATUS_ABIOS_NOT_PRESENT: + return (PUCHAR)"STATUS_ABIOS_NOT_PRESENT"; + case STATUS_ABIOS_LID_NOT_EXIST: + return (PUCHAR)"STATUS_ABIOS_LID_NOT_EXIST"; + case STATUS_ABIOS_LID_ALREADY_OWNED: + return (PUCHAR)"STATUS_ABIOS_LID_ALREADY_OWNED"; + case STATUS_ABIOS_NOT_LID_OWNER: + return (PUCHAR)"STATUS_ABIOS_NOT_LID_OWNER"; + case STATUS_ABIOS_INVALID_COMMAND: + return (PUCHAR)"STATUS_ABIOS_INVALID_COMMAND"; + case STATUS_ABIOS_INVALID_LID: + return (PUCHAR)"STATUS_ABIOS_INVALID_LID"; + case STATUS_ABIOS_SELECTOR_NOT_AVAILABLE: + return (PUCHAR)"STATUS_ABIOS_SELECTOR_NOT_AVAILABLE"; + case STATUS_ABIOS_INVALID_SELECTOR: + return (PUCHAR)"STATUS_ABIOS_INVALID_SELECTOR"; + case STATUS_NO_LDT: + return (PUCHAR)"STATUS_NO_LDT"; + case STATUS_INVALID_LDT_SIZE: + return (PUCHAR)"STATUS_INVALID_LDT_SIZE"; + case STATUS_INVALID_LDT_OFFSET: + return (PUCHAR)"STATUS_INVALID_LDT_OFFSET"; + case STATUS_INVALID_LDT_DESCRIPTOR: + return (PUCHAR)"STATUS_INVALID_LDT_DESCRIPTOR"; + case STATUS_INVALID_IMAGE_NE_FORMAT: + return (PUCHAR)"STATUS_INVALID_IMAGE_NE_FORMAT"; + case STATUS_RXACT_INVALID_STATE: + return (PUCHAR)"STATUS_RXACT_INVALID_STATE"; + case STATUS_RXACT_COMMIT_FAILURE: + return (PUCHAR)"STATUS_RXACT_COMMIT_FAILURE"; + case STATUS_MAPPED_FILE_SIZE_ZERO: + return (PUCHAR)"STATUS_MAPPED_FILE_SIZE_ZERO"; + case STATUS_TOO_MANY_OPENED_FILES: + return (PUCHAR)"STATUS_TOO_MANY_OPENED_FILES"; + case STATUS_CANCELLED: + return (PUCHAR)"STATUS_CANCELLED"; + case STATUS_CANNOT_DELETE: + return (PUCHAR)"STATUS_CANNOT_DELETE"; + case STATUS_INVALID_COMPUTER_NAME: + return (PUCHAR)"STATUS_INVALID_COMPUTER_NAME"; + case STATUS_FILE_DELETED: + return (PUCHAR)"STATUS_FILE_DELETED"; + case STATUS_SPECIAL_ACCOUNT: + return (PUCHAR)"STATUS_SPECIAL_ACCOUNT"; + case STATUS_SPECIAL_GROUP: + return (PUCHAR)"STATUS_SPECIAL_GROUP"; + case STATUS_SPECIAL_USER: + return (PUCHAR)"STATUS_SPECIAL_USER"; + case STATUS_MEMBERS_PRIMARY_GROUP: + return (PUCHAR)"STATUS_MEMBERS_PRIMARY_GROUP"; + case STATUS_FILE_CLOSED: + return (PUCHAR)"STATUS_FILE_CLOSED"; + case STATUS_TOO_MANY_THREADS: + return (PUCHAR)"STATUS_TOO_MANY_THREADS"; + case STATUS_THREAD_NOT_IN_PROCESS: + return (PUCHAR)"STATUS_THREAD_NOT_IN_PROCESS"; + case STATUS_TOKEN_ALREADY_IN_USE: + return (PUCHAR)"STATUS_TOKEN_ALREADY_IN_USE"; + case STATUS_PAGEFILE_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_PAGEFILE_QUOTA_EXCEEDED"; + case STATUS_COMMITMENT_LIMIT: + return (PUCHAR)"STATUS_COMMITMENT_LIMIT"; + case STATUS_INVALID_IMAGE_LE_FORMAT: + return (PUCHAR)"STATUS_INVALID_IMAGE_LE_FORMAT"; + case STATUS_INVALID_IMAGE_NOT_MZ: + return (PUCHAR)"STATUS_INVALID_IMAGE_NOT_MZ"; + case STATUS_INVALID_IMAGE_PROTECT: + return (PUCHAR)"STATUS_INVALID_IMAGE_PROTECT"; + case STATUS_INVALID_IMAGE_WIN_16: + return (PUCHAR)"STATUS_INVALID_IMAGE_WIN_16"; + case STATUS_LOGON_SERVER_CONFLICT: + return (PUCHAR)"STATUS_LOGON_SERVER_CONFLICT"; + case STATUS_TIME_DIFFERENCE_AT_DC: + return (PUCHAR)"STATUS_TIME_DIFFERENCE_AT_DC"; + case STATUS_SYNCHRONIZATION_REQUIRED: + return (PUCHAR)"STATUS_SYNCHRONIZATION_REQUIRED"; + case STATUS_DLL_NOT_FOUND: + return (PUCHAR)"STATUS_DLL_NOT_FOUND"; + case STATUS_OPEN_FAILED: + return (PUCHAR)"STATUS_OPEN_FAILED"; + case STATUS_IO_PRIVILEGE_FAILED: + return (PUCHAR)"STATUS_IO_PRIVILEGE_FAILED"; + case STATUS_ORDINAL_NOT_FOUND: + return (PUCHAR)"STATUS_ORDINAL_NOT_FOUND"; + case STATUS_ENTRYPOINT_NOT_FOUND: + return (PUCHAR)"STATUS_ENTRYPOINT_NOT_FOUND"; + case STATUS_CONTROL_C_EXIT: + return (PUCHAR)"STATUS_CONTROL_C_EXIT"; + case STATUS_LOCAL_DISCONNECT: + return (PUCHAR)"STATUS_LOCAL_DISCONNECT"; + case STATUS_REMOTE_DISCONNECT: + return (PUCHAR)"STATUS_REMOTE_DISCONNECT"; + case STATUS_REMOTE_RESOURCES: + return (PUCHAR)"STATUS_REMOTE_RESOURCES"; + case STATUS_LINK_FAILED: + return (PUCHAR)"STATUS_LINK_FAILED"; + case STATUS_LINK_TIMEOUT: + return (PUCHAR)"STATUS_LINK_TIMEOUT"; + case STATUS_INVALID_CONNECTION: + return (PUCHAR)"STATUS_INVALID_CONNECTION"; + case STATUS_INVALID_ADDRESS: + return (PUCHAR)"STATUS_INVALID_ADDRESS"; + case STATUS_DLL_INIT_FAILED: + return (PUCHAR)"STATUS_DLL_INIT_FAILED"; + case STATUS_MISSING_SYSTEMFILE: + return (PUCHAR)"STATUS_MISSING_SYSTEMFILE"; + case STATUS_UNHANDLED_EXCEPTION: + return (PUCHAR)"STATUS_UNHANDLED_EXCEPTION"; + case STATUS_APP_INIT_FAILURE: + return (PUCHAR)"STATUS_APP_INIT_FAILURE"; + case STATUS_PAGEFILE_CREATE_FAILED: + return (PUCHAR)"STATUS_PAGEFILE_CREATE_FAILED"; + case STATUS_NO_PAGEFILE: + return (PUCHAR)"STATUS_NO_PAGEFILE"; + case STATUS_INVALID_LEVEL: + return (PUCHAR)"STATUS_INVALID_LEVEL"; + case STATUS_WRONG_PASSWORD_CORE: + return (PUCHAR)"STATUS_WRONG_PASSWORD_CORE"; + case STATUS_ILLEGAL_FLOAT_CONTEXT: + return (PUCHAR)"STATUS_ILLEGAL_FLOAT_CONTEXT"; + case STATUS_PIPE_BROKEN: + return (PUCHAR)"STATUS_PIPE_BROKEN"; + case STATUS_REGISTRY_CORRUPT: + return (PUCHAR)"STATUS_REGISTRY_CORRUPT"; + case STATUS_REGISTRY_IO_FAILED: + return (PUCHAR)"STATUS_REGISTRY_IO_FAILED"; + case STATUS_NO_EVENT_PAIR: + return (PUCHAR)"STATUS_NO_EVENT_PAIR"; + case STATUS_UNRECOGNIZED_VOLUME: + return (PUCHAR)"STATUS_UNRECOGNIZED_VOLUME"; + case STATUS_SERIAL_NO_DEVICE_INITED: + return (PUCHAR)"STATUS_SERIAL_NO_DEVICE_INITED"; + case STATUS_NO_SUCH_ALIAS: + return (PUCHAR)"STATUS_NO_SUCH_ALIAS"; + case STATUS_MEMBER_NOT_IN_ALIAS: + return (PUCHAR)"STATUS_MEMBER_NOT_IN_ALIAS"; + case STATUS_MEMBER_IN_ALIAS: + return (PUCHAR)"STATUS_MEMBER_IN_ALIAS"; + case STATUS_ALIAS_EXISTS: + return (PUCHAR)"STATUS_ALIAS_EXISTS"; + case STATUS_LOGON_NOT_GRANTED: + return (PUCHAR)"STATUS_LOGON_NOT_GRANTED"; + case STATUS_TOO_MANY_SECRETS: + return (PUCHAR)"STATUS_TOO_MANY_SECRETS"; + case STATUS_SECRET_TOO_LONG: + return (PUCHAR)"STATUS_SECRET_TOO_LONG"; + case STATUS_INTERNAL_DB_ERROR: + return (PUCHAR)"STATUS_INTERNAL_DB_ERROR"; + case STATUS_FULLSCREEN_MODE: + return (PUCHAR)"STATUS_FULLSCREEN_MODE"; + case STATUS_TOO_MANY_CONTEXT_IDS: + return (PUCHAR)"STATUS_TOO_MANY_CONTEXT_IDS"; + case STATUS_LOGON_TYPE_NOT_GRANTED: + return (PUCHAR)"STATUS_LOGON_TYPE_NOT_GRANTED"; + case STATUS_NOT_REGISTRY_FILE: + return (PUCHAR)"STATUS_NOT_REGISTRY_FILE"; + case STATUS_NT_CROSS_ENCRYPTION_REQUIRED: + return (PUCHAR)"STATUS_NT_CROSS_ENCRYPTION_REQUIRED"; + case STATUS_DOMAIN_CTRLR_CONFIG_ERROR: + return (PUCHAR)"STATUS_DOMAIN_CTRLR_CONFIG_ERROR"; + case STATUS_FT_MISSING_MEMBER: + return (PUCHAR)"STATUS_FT_MISSING_MEMBER"; + case STATUS_ILL_FORMED_SERVICE_ENTRY: + return (PUCHAR)"STATUS_ILL_FORMED_SERVICE_ENTRY"; + case STATUS_ILLEGAL_CHARACTER: + return (PUCHAR)"STATUS_ILLEGAL_CHARACTER"; + case STATUS_UNMAPPABLE_CHARACTER: + return (PUCHAR)"STATUS_UNMAPPABLE_CHARACTER"; + case STATUS_UNDEFINED_CHARACTER: + return (PUCHAR)"STATUS_UNDEFINED_CHARACTER"; + case STATUS_FLOPPY_VOLUME: + return (PUCHAR)"STATUS_FLOPPY_VOLUME"; + case STATUS_FLOPPY_ID_MARK_NOT_FOUND: + return (PUCHAR)"STATUS_FLOPPY_ID_MARK_NOT_FOUND"; + case STATUS_FLOPPY_WRONG_CYLINDER: + return (PUCHAR)"STATUS_FLOPPY_WRONG_CYLINDER"; + case STATUS_FLOPPY_UNKNOWN_ERROR: + return (PUCHAR)"STATUS_FLOPPY_UNKNOWN_ERROR"; + case STATUS_FLOPPY_BAD_REGISTERS: + return (PUCHAR)"STATUS_FLOPPY_BAD_REGISTERS"; + case STATUS_DISK_RECALIBRATE_FAILED: + return (PUCHAR)"STATUS_DISK_RECALIBRATE_FAILED"; + case STATUS_DISK_OPERATION_FAILED: + return (PUCHAR)"STATUS_DISK_OPERATION_FAILED"; + case STATUS_DISK_RESET_FAILED: + return (PUCHAR)"STATUS_DISK_RESET_FAILED"; + case STATUS_SHARED_IRQ_BUSY: + return (PUCHAR)"STATUS_SHARED_IRQ_BUSY"; + case STATUS_FT_ORPHANING: + return (PUCHAR)"STATUS_FT_ORPHANING"; + case STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT: + return (PUCHAR)"STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT"; + case STATUS_PARTITION_FAILURE: + return (PUCHAR)"STATUS_PARTITION_FAILURE"; + case STATUS_INVALID_BLOCK_LENGTH: + return (PUCHAR)"STATUS_INVALID_BLOCK_LENGTH"; + case STATUS_DEVICE_NOT_PARTITIONED: + return (PUCHAR)"STATUS_DEVICE_NOT_PARTITIONED"; + case STATUS_UNABLE_TO_LOCK_MEDIA: + return (PUCHAR)"STATUS_UNABLE_TO_LOCK_MEDIA"; + case STATUS_UNABLE_TO_UNLOAD_MEDIA: + return (PUCHAR)"STATUS_UNABLE_TO_UNLOAD_MEDIA"; + case STATUS_EOM_OVERFLOW: + return (PUCHAR)"STATUS_EOM_OVERFLOW"; + case STATUS_NO_MEDIA: + return (PUCHAR)"STATUS_NO_MEDIA"; + case STATUS_NO_SUCH_MEMBER: + return (PUCHAR)"STATUS_NO_SUCH_MEMBER"; + case STATUS_INVALID_MEMBER: + return (PUCHAR)"STATUS_INVALID_MEMBER"; + case STATUS_KEY_DELETED: + return (PUCHAR)"STATUS_KEY_DELETED"; + case STATUS_NO_LOG_SPACE: + return (PUCHAR)"STATUS_NO_LOG_SPACE"; + case STATUS_TOO_MANY_SIDS: + return (PUCHAR)"STATUS_TOO_MANY_SIDS"; + case STATUS_LM_CROSS_ENCRYPTION_REQUIRED: + return (PUCHAR)"STATUS_LM_CROSS_ENCRYPTION_REQUIRED"; + case STATUS_KEY_HAS_CHILDREN: + return (PUCHAR)"STATUS_KEY_HAS_CHILDREN"; + case STATUS_CHILD_MUST_BE_VOLATILE: + return (PUCHAR)"STATUS_CHILD_MUST_BE_VOLATILE"; + case STATUS_DEVICE_CONFIGURATION_ERROR: + return (PUCHAR)"STATUS_DEVICE_CONFIGURATION_ERROR"; + case STATUS_DRIVER_INTERNAL_ERROR: + return (PUCHAR)"STATUS_DRIVER_INTERNAL_ERROR"; + case STATUS_INVALID_DEVICE_STATE: + return (PUCHAR)"STATUS_INVALID_DEVICE_STATE"; + case STATUS_IO_DEVICE_ERROR: + return (PUCHAR)"STATUS_IO_DEVICE_ERROR"; + case STATUS_DEVICE_PROTOCOL_ERROR: + return (PUCHAR)"STATUS_DEVICE_PROTOCOL_ERROR"; + case STATUS_BACKUP_CONTROLLER: + return (PUCHAR)"STATUS_BACKUP_CONTROLLER"; + case STATUS_LOG_FILE_FULL: + return (PUCHAR)"STATUS_LOG_FILE_FULL"; + case STATUS_TOO_LATE: + return (PUCHAR)"STATUS_TOO_LATE"; + case STATUS_NO_TRUST_LSA_SECRET: + return (PUCHAR)"STATUS_NO_TRUST_LSA_SECRET"; + case STATUS_NO_TRUST_SAM_ACCOUNT: + return (PUCHAR)"STATUS_NO_TRUST_SAM_ACCOUNT"; + case STATUS_TRUSTED_DOMAIN_FAILURE: + return (PUCHAR)"STATUS_TRUSTED_DOMAIN_FAILURE"; + case STATUS_TRUSTED_RELATIONSHIP_FAILURE: + return (PUCHAR)"STATUS_TRUSTED_RELATIONSHIP_FAILURE"; + case STATUS_EVENTLOG_FILE_CORRUPT: + return (PUCHAR)"STATUS_EVENTLOG_FILE_CORRUPT"; + case STATUS_EVENTLOG_CANT_START: + return (PUCHAR)"STATUS_EVENTLOG_CANT_START"; + case STATUS_TRUST_FAILURE: + return (PUCHAR)"STATUS_TRUST_FAILURE"; + case STATUS_MUTANT_LIMIT_EXCEEDED: + return (PUCHAR)"STATUS_MUTANT_LIMIT_EXCEEDED"; + case STATUS_NETLOGON_NOT_STARTED: + return (PUCHAR)"STATUS_NETLOGON_NOT_STARTED"; + case STATUS_ACCOUNT_EXPIRED: + return (PUCHAR)"STATUS_ACCOUNT_EXPIRED"; + case STATUS_POSSIBLE_DEADLOCK: + return (PUCHAR)"STATUS_POSSIBLE_DEADLOCK"; + case STATUS_NETWORK_CREDENTIAL_CONFLICT: + return (PUCHAR)"STATUS_NETWORK_CREDENTIAL_CONFLICT"; + case STATUS_REMOTE_SESSION_LIMIT: + return (PUCHAR)"STATUS_REMOTE_SESSION_LIMIT"; + case STATUS_EVENTLOG_FILE_CHANGED: + return (PUCHAR)"STATUS_EVENTLOG_FILE_CHANGED"; + case STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT: + return (PUCHAR)"STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT"; + case STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT: + return (PUCHAR)"STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT"; + case STATUS_NOLOGON_SERVER_TRUST_ACCOUNT: + return (PUCHAR)"STATUS_NOLOGON_SERVER_TRUST_ACCOUNT"; + case STATUS_DOMAIN_TRUST_INCONSISTENT: + return (PUCHAR)"STATUS_DOMAIN_TRUST_INCONSISTENT"; + case STATUS_FS_DRIVER_REQUIRED: + return (PUCHAR)"STATUS_FS_DRIVER_REQUIRED"; + case STATUS_NO_USER_SESSION_KEY: + return (PUCHAR)"STATUS_NO_USER_SESSION_KEY"; + case STATUS_USER_SESSION_DELETED: + return (PUCHAR)"STATUS_USER_SESSION_DELETED"; + case STATUS_RESOURCE_LANG_NOT_FOUND: + return (PUCHAR)"STATUS_RESOURCE_LANG_NOT_FOUND"; + case STATUS_INSUFF_SERVER_RESOURCES: + return (PUCHAR)"STATUS_INSUFF_SERVER_RESOURCES"; + case STATUS_INVALID_BUFFER_SIZE: + return (PUCHAR)"STATUS_INVALID_BUFFER_SIZE"; + case STATUS_INVALID_ADDRESS_COMPONENT: + return (PUCHAR)"STATUS_INVALID_ADDRESS_COMPONENT"; + case STATUS_INVALID_ADDRESS_WILDCARD: + return (PUCHAR)"STATUS_INVALID_ADDRESS_WILDCARD"; + case STATUS_TOO_MANY_ADDRESSES: + return (PUCHAR)"STATUS_TOO_MANY_ADDRESSES"; + case STATUS_ADDRESS_ALREADY_EXISTS: + return (PUCHAR)"STATUS_ADDRESS_ALREADY_EXISTS"; + case STATUS_ADDRESS_CLOSED: + return (PUCHAR)"STATUS_ADDRESS_CLOSED"; + case STATUS_CONNECTION_DISCONNECTED: + return (PUCHAR)"STATUS_CONNECTION_DISCONNECTED"; + case STATUS_CONNECTION_RESET: + return (PUCHAR)"STATUS_CONNECTION_RESET"; + case STATUS_TOO_MANY_NODES: + return (PUCHAR)"STATUS_TOO_MANY_NODES"; + case STATUS_TRANSACTION_ABORTED: + return (PUCHAR)"STATUS_TRANSACTION_ABORTED"; + case STATUS_TRANSACTION_TIMED_OUT: + return (PUCHAR)"STATUS_TRANSACTION_TIMED_OUT"; + case STATUS_TRANSACTION_NO_RELEASE: + return (PUCHAR)"STATUS_TRANSACTION_NO_RELEASE"; + case STATUS_TRANSACTION_NO_MATCH: + return (PUCHAR)"STATUS_TRANSACTION_NO_MATCH"; + case STATUS_TRANSACTION_RESPONDED: + return (PUCHAR)"STATUS_TRANSACTION_RESPONDED"; + case STATUS_TRANSACTION_INVALID_ID: + return (PUCHAR)"STATUS_TRANSACTION_INVALID_ID"; + case STATUS_TRANSACTION_INVALID_TYPE: + return (PUCHAR)"STATUS_TRANSACTION_INVALID_TYPE"; + case STATUS_NOT_SERVER_SESSION: + return (PUCHAR)"STATUS_NOT_SERVER_SESSION"; + case STATUS_NOT_CLIENT_SESSION: + return (PUCHAR)"STATUS_NOT_CLIENT_SESSION"; + case STATUS_CANNOT_LOAD_REGISTRY_FILE: + return (PUCHAR)"STATUS_CANNOT_LOAD_REGISTRY_FILE"; + case STATUS_DEBUG_ATTACH_FAILED: + return (PUCHAR)"STATUS_DEBUG_ATTACH_FAILED"; + case STATUS_SYSTEM_PROCESS_TERMINATED: + return (PUCHAR)"STATUS_SYSTEM_PROCESS_TERMINATED"; + case STATUS_DATA_NOT_ACCEPTED: + return (PUCHAR)"STATUS_DATA_NOT_ACCEPTED"; + case STATUS_NO_BROWSER_SERVERS_FOUND: + return (PUCHAR)"STATUS_NO_BROWSER_SERVERS_FOUND"; + case STATUS_VDM_HARD_ERROR: + return (PUCHAR)"STATUS_VDM_HARD_ERROR"; + case STATUS_DRIVER_CANCEL_TIMEOUT: + return (PUCHAR)"STATUS_DRIVER_CANCEL_TIMEOUT"; + case STATUS_REPLY_MESSAGE_MISMATCH: + return (PUCHAR)"STATUS_REPLY_MESSAGE_MISMATCH"; + case STATUS_MAPPED_ALIGNMENT: + return (PUCHAR)"STATUS_MAPPED_ALIGNMENT"; + case STATUS_IMAGE_CHECKSUM_MISMATCH: + return (PUCHAR)"STATUS_IMAGE_CHECKSUM_MISMATCH"; + case STATUS_LOST_WRITEBEHIND_DATA: + return (PUCHAR)"STATUS_LOST_WRITEBEHIND_DATA"; + case STATUS_CLIENT_SERVER_PARAMETERS_INVALID: + return (PUCHAR)"STATUS_CLIENT_SERVER_PARAMETERS_INVALID"; + case STATUS_PASSWORD_MUST_CHANGE: + return (PUCHAR)"STATUS_PASSWORD_MUST_CHANGE"; + case STATUS_NOT_FOUND: + return (PUCHAR)"STATUS_NOT_FOUND"; + case STATUS_NOT_TINY_STREAM: + return (PUCHAR)"STATUS_NOT_TINY_STREAM"; + case STATUS_RECOVERY_FAILURE: + return (PUCHAR)"STATUS_RECOVERY_FAILURE"; + case STATUS_STACK_OVERFLOW_READ: + return (PUCHAR)"STATUS_STACK_OVERFLOW_READ"; + case STATUS_FAIL_CHECK: + return (PUCHAR)"STATUS_FAIL_CHECK"; + case STATUS_DUPLICATE_OBJECTID: + return (PUCHAR)"STATUS_DUPLICATE_OBJECTID"; + case STATUS_OBJECTID_EXISTS: + return (PUCHAR)"STATUS_OBJECTID_EXISTS"; + case STATUS_CONVERT_TO_LARGE: + return (PUCHAR)"STATUS_CONVERT_TO_LARGE"; + case STATUS_RETRY: + return (PUCHAR)"STATUS_RETRY"; + case STATUS_FOUND_OUT_OF_SCOPE: + return (PUCHAR)"STATUS_FOUND_OUT_OF_SCOPE"; + case STATUS_ALLOCATE_BUCKET: + return (PUCHAR)"STATUS_ALLOCATE_BUCKET"; + case STATUS_PROPSET_NOT_FOUND: + return (PUCHAR)"STATUS_PROPSET_NOT_FOUND"; + case STATUS_MARSHALL_OVERFLOW: + return (PUCHAR)"STATUS_MARSHALL_OVERFLOW"; + case STATUS_INVALID_VARIANT: + return (PUCHAR)"STATUS_INVALID_VARIANT"; + case STATUS_DOMAIN_CONTROLLER_NOT_FOUND: + return (PUCHAR)"STATUS_DOMAIN_CONTROLLER_NOT_FOUND"; + case STATUS_ACCOUNT_LOCKED_OUT: + return (PUCHAR)"STATUS_ACCOUNT_LOCKED_OUT"; + case STATUS_HANDLE_NOT_CLOSABLE: + return (PUCHAR)"STATUS_HANDLE_NOT_CLOSABLE"; + case STATUS_CONNECTION_REFUSED: + return (PUCHAR)"STATUS_CONNECTION_REFUSED"; + case STATUS_GRACEFUL_DISCONNECT: + return (PUCHAR)"STATUS_GRACEFUL_DISCONNECT"; + case STATUS_ADDRESS_ALREADY_ASSOCIATED: + return (PUCHAR)"STATUS_ADDRESS_ALREADY_ASSOCIATED"; + case STATUS_ADDRESS_NOT_ASSOCIATED: + return (PUCHAR)"STATUS_ADDRESS_NOT_ASSOCIATED"; + case STATUS_CONNECTION_INVALID: + return (PUCHAR)"STATUS_CONNECTION_INVALID"; + case STATUS_CONNECTION_ACTIVE: + return (PUCHAR)"STATUS_CONNECTION_ACTIVE"; + case STATUS_NETWORK_UNREACHABLE: + return (PUCHAR)"STATUS_NETWORK_UNREACHABLE"; + case STATUS_HOST_UNREACHABLE: + return (PUCHAR)"STATUS_HOST_UNREACHABLE"; + case STATUS_PROTOCOL_UNREACHABLE: + return (PUCHAR)"STATUS_PROTOCOL_UNREACHABLE"; + case STATUS_PORT_UNREACHABLE: + return (PUCHAR)"STATUS_PORT_UNREACHABLE"; + case STATUS_REQUEST_ABORTED: + return (PUCHAR)"STATUS_REQUEST_ABORTED"; + case STATUS_CONNECTION_ABORTED: + return (PUCHAR)"STATUS_CONNECTION_ABORTED"; + case STATUS_BAD_COMPRESSION_BUFFER: + return (PUCHAR)"STATUS_BAD_COMPRESSION_BUFFER"; + case STATUS_USER_MAPPED_FILE: + return (PUCHAR)"STATUS_USER_MAPPED_FILE"; + case STATUS_AUDIT_FAILED: + return (PUCHAR)"STATUS_AUDIT_FAILED"; + case STATUS_TIMER_RESOLUTION_NOT_SET: + return (PUCHAR)"STATUS_TIMER_RESOLUTION_NOT_SET"; + case STATUS_CONNECTION_COUNT_LIMIT: + return (PUCHAR)"STATUS_CONNECTION_COUNT_LIMIT"; + case STATUS_LOGIN_TIME_RESTRICTION: + return (PUCHAR)"STATUS_LOGIN_TIME_RESTRICTION"; + case STATUS_LOGIN_WKSTA_RESTRICTION: + return (PUCHAR)"STATUS_LOGIN_WKSTA_RESTRICTION"; + case STATUS_IMAGE_MP_UP_MISMATCH: + return (PUCHAR)"STATUS_IMAGE_MP_UP_MISMATCH"; + case STATUS_INSUFFICIENT_LOGON_INFO: + return (PUCHAR)"STATUS_INSUFFICIENT_LOGON_INFO"; + case STATUS_BAD_DLL_ENTRYPOINT: + return (PUCHAR)"STATUS_BAD_DLL_ENTRYPOINT"; + case STATUS_BAD_SERVICE_ENTRYPOINT: + return (PUCHAR)"STATUS_BAD_SERVICE_ENTRYPOINT"; + case STATUS_LPC_REPLY_LOST: + return (PUCHAR)"STATUS_LPC_REPLY_LOST"; + case STATUS_IP_ADDRESS_CONFLICT1: + return (PUCHAR)"STATUS_IP_ADDRESS_CONFLICT1"; + case STATUS_IP_ADDRESS_CONFLICT2: + return (PUCHAR)"STATUS_IP_ADDRESS_CONFLICT2"; + case STATUS_REGISTRY_QUOTA_LIMIT: + return (PUCHAR)"STATUS_REGISTRY_QUOTA_LIMIT"; + case STATUS_PATH_NOT_COVERED: + return (PUCHAR)"STATUS_PATH_NOT_COVERED"; + case STATUS_NO_CALLBACK_ACTIVE: + return (PUCHAR)"STATUS_NO_CALLBACK_ACTIVE"; + case STATUS_LICENSE_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_LICENSE_QUOTA_EXCEEDED"; + case STATUS_PWD_TOO_SHORT: + return (PUCHAR)"STATUS_PWD_TOO_SHORT"; + case STATUS_PWD_TOO_RECENT: + return (PUCHAR)"STATUS_PWD_TOO_RECENT"; + case STATUS_PWD_HISTORY_CONFLICT: + return (PUCHAR)"STATUS_PWD_HISTORY_CONFLICT"; + case STATUS_PLUGPLAY_NO_DEVICE: + return (PUCHAR)"STATUS_PLUGPLAY_NO_DEVICE"; + case STATUS_UNSUPPORTED_COMPRESSION: + return (PUCHAR)"STATUS_UNSUPPORTED_COMPRESSION"; + case STATUS_INVALID_HW_PROFILE: + return (PUCHAR)"STATUS_INVALID_HW_PROFILE"; + case STATUS_INVALID_PLUGPLAY_DEVICE_PATH: + return (PUCHAR)"STATUS_INVALID_PLUGPLAY_DEVICE_PATH"; + case STATUS_DRIVER_ORDINAL_NOT_FOUND: + return (PUCHAR)"STATUS_DRIVER_ORDINAL_NOT_FOUND"; + case STATUS_DRIVER_ENTRYPOINT_NOT_FOUND: + return (PUCHAR)"STATUS_DRIVER_ENTRYPOINT_NOT_FOUND"; + case STATUS_RESOURCE_NOT_OWNED: + return (PUCHAR)"STATUS_RESOURCE_NOT_OWNED"; + case STATUS_TOO_MANY_LINKS: + return (PUCHAR)"STATUS_TOO_MANY_LINKS"; + case STATUS_QUOTA_LIST_INCONSISTENT: + return (PUCHAR)"STATUS_QUOTA_LIST_INCONSISTENT"; + case STATUS_FILE_IS_OFFLINE: + return (PUCHAR)"STATUS_FILE_IS_OFFLINE"; + case STATUS_EVALUATION_EXPIRATION: + return (PUCHAR)"STATUS_EVALUATION_EXPIRATION"; + case STATUS_ILLEGAL_DLL_RELOCATION: + return (PUCHAR)"STATUS_ILLEGAL_DLL_RELOCATION"; + case STATUS_LICENSE_VIOLATION: + return (PUCHAR)"STATUS_LICENSE_VIOLATION"; + case STATUS_DLL_INIT_FAILED_LOGOFF: + return (PUCHAR)"STATUS_DLL_INIT_FAILED_LOGOFF"; + case STATUS_DRIVER_UNABLE_TO_LOAD: + return (PUCHAR)"STATUS_DRIVER_UNABLE_TO_LOAD"; + case STATUS_DFS_UNAVAILABLE: + return (PUCHAR)"STATUS_DFS_UNAVAILABLE"; + case STATUS_VOLUME_DISMOUNTED: + return (PUCHAR)"STATUS_VOLUME_DISMOUNTED"; + case STATUS_WX86_INTERNAL_ERROR: + return (PUCHAR)"STATUS_WX86_INTERNAL_ERROR"; + case STATUS_WX86_FLOAT_STACK_CHECK: + return (PUCHAR)"STATUS_WX86_FLOAT_STACK_CHECK"; + case STATUS_VALIDATE_CONTINUE: + return (PUCHAR)"STATUS_VALIDATE_CONTINUE"; + case STATUS_NO_MATCH: + return (PUCHAR)"STATUS_NO_MATCH"; + case STATUS_NO_MORE_MATCHES: + return (PUCHAR)"STATUS_NO_MORE_MATCHES"; + case STATUS_NOT_A_REPARSE_POINT: + return (PUCHAR)"STATUS_NOT_A_REPARSE_POINT"; + case STATUS_IO_REPARSE_TAG_INVALID: + return (PUCHAR)"STATUS_IO_REPARSE_TAG_INVALID"; + case STATUS_IO_REPARSE_TAG_MISMATCH: + return (PUCHAR)"STATUS_IO_REPARSE_TAG_MISMATCH"; + case STATUS_IO_REPARSE_DATA_INVALID: + return (PUCHAR)"STATUS_IO_REPARSE_DATA_INVALID"; + case STATUS_IO_REPARSE_TAG_NOT_HANDLED: + return (PUCHAR)"STATUS_IO_REPARSE_TAG_NOT_HANDLED"; + case STATUS_REPARSE_POINT_NOT_RESOLVED: + return (PUCHAR)"STATUS_REPARSE_POINT_NOT_RESOLVED"; + case STATUS_DIRECTORY_IS_A_REPARSE_POINT: + return (PUCHAR)"STATUS_DIRECTORY_IS_A_REPARSE_POINT"; + case STATUS_RANGE_LIST_CONFLICT: + return (PUCHAR)"STATUS_RANGE_LIST_CONFLICT"; + case STATUS_SOURCE_ELEMENT_EMPTY: + return (PUCHAR)"STATUS_SOURCE_ELEMENT_EMPTY"; + case STATUS_DESTINATION_ELEMENT_FULL: + return (PUCHAR)"STATUS_DESTINATION_ELEMENT_FULL"; + case STATUS_ILLEGAL_ELEMENT_ADDRESS: + return (PUCHAR)"STATUS_ILLEGAL_ELEMENT_ADDRESS"; + case STATUS_MAGAZINE_NOT_PRESENT: + return (PUCHAR)"STATUS_MAGAZINE_NOT_PRESENT"; + case STATUS_REINITIALIZATION_NEEDED: + return (PUCHAR)"STATUS_REINITIALIZATION_NEEDED"; + case STATUS_ENCRYPTION_FAILED: + return (PUCHAR)"STATUS_ENCRYPTION_FAILED"; + case STATUS_DECRYPTION_FAILED: + return (PUCHAR)"STATUS_DECRYPTION_FAILED"; + case STATUS_RANGE_NOT_FOUND: + return (PUCHAR)"STATUS_RANGE_NOT_FOUND"; + case STATUS_NO_RECOVERY_POLICY: + return (PUCHAR)"STATUS_NO_RECOVERY_POLICY"; + case STATUS_NO_EFS: + return (PUCHAR)"STATUS_NO_EFS"; + case STATUS_WRONG_EFS: + return (PUCHAR)"STATUS_WRONG_EFS"; + case STATUS_NO_USER_KEYS: + return (PUCHAR)"STATUS_NO_USER_KEYS"; + case STATUS_FILE_NOT_ENCRYPTED: + return (PUCHAR)"STATUS_FILE_NOT_ENCRYPTED"; + case STATUS_NOT_EXPORT_FORMAT: + return (PUCHAR)"STATUS_NOT_EXPORT_FORMAT"; + case STATUS_FILE_ENCRYPTED: + return (PUCHAR)"STATUS_FILE_ENCRYPTED"; + case STATUS_WMI_GUID_NOT_FOUND: + return (PUCHAR)"STATUS_WMI_GUID_NOT_FOUND"; + case STATUS_WMI_INSTANCE_NOT_FOUND: + return (PUCHAR)"STATUS_WMI_INSTANCE_NOT_FOUND"; + case STATUS_WMI_ITEMID_NOT_FOUND: + return (PUCHAR)"STATUS_WMI_ITEMID_NOT_FOUND"; + case STATUS_WMI_TRY_AGAIN: + return (PUCHAR)"STATUS_WMI_TRY_AGAIN"; + case STATUS_SHARED_POLICY: + return (PUCHAR)"STATUS_SHARED_POLICY"; + case STATUS_POLICY_OBJECT_NOT_FOUND: + return (PUCHAR)"STATUS_POLICY_OBJECT_NOT_FOUND"; + case STATUS_POLICY_ONLY_IN_DS: + return (PUCHAR)"STATUS_POLICY_ONLY_IN_DS"; + case STATUS_VOLUME_NOT_UPGRADED: + return (PUCHAR)"STATUS_VOLUME_NOT_UPGRADED"; + case STATUS_REMOTE_STORAGE_NOT_ACTIVE: + return (PUCHAR)"STATUS_REMOTE_STORAGE_NOT_ACTIVE"; + case STATUS_REMOTE_STORAGE_MEDIA_ERROR: + return (PUCHAR)"STATUS_REMOTE_STORAGE_MEDIA_ERROR"; + case STATUS_NO_TRACKING_SERVICE: + return (PUCHAR)"STATUS_NO_TRACKING_SERVICE"; + case STATUS_SERVER_SID_MISMATCH: + return (PUCHAR)"STATUS_SERVER_SID_MISMATCH"; + case STATUS_DS_NO_ATTRIBUTE_OR_VALUE: + return (PUCHAR)"STATUS_DS_NO_ATTRIBUTE_OR_VALUE"; + case STATUS_DS_INVALID_ATTRIBUTE_SYNTAX: + return (PUCHAR)"STATUS_DS_INVALID_ATTRIBUTE_SYNTAX"; + case STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED: + return (PUCHAR)"STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED"; + case STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS: + return (PUCHAR)"STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS"; + case STATUS_DS_BUSY: + return (PUCHAR)"STATUS_DS_BUSY"; + case STATUS_DS_UNAVAILABLE: + return (PUCHAR)"STATUS_DS_UNAVAILABLE"; + case STATUS_DS_NO_RIDS_ALLOCATED: + return (PUCHAR)"STATUS_DS_NO_RIDS_ALLOCATED"; + case STATUS_DS_NO_MORE_RIDS: + return (PUCHAR)"STATUS_DS_NO_MORE_RIDS"; + case STATUS_DS_INCORRECT_ROLE_OWNER: + return (PUCHAR)"STATUS_DS_INCORRECT_ROLE_OWNER"; + case STATUS_DS_RIDMGR_INIT_ERROR: + return (PUCHAR)"STATUS_DS_RIDMGR_INIT_ERROR"; + case STATUS_DS_OBJ_CLASS_VIOLATION: + return (PUCHAR)"STATUS_DS_OBJ_CLASS_VIOLATION"; + case STATUS_DS_CANT_ON_NON_LEAF: + return (PUCHAR)"STATUS_DS_CANT_ON_NON_LEAF"; + case STATUS_DS_CANT_ON_RDN: + return (PUCHAR)"STATUS_DS_CANT_ON_RDN"; + case STATUS_DS_CANT_MOD_OBJ_CLASS: + return (PUCHAR)"STATUS_DS_CANT_MOD_OBJ_CLASS"; + case STATUS_DS_CROSS_DOM_MOVE_FAILED: + return (PUCHAR)"STATUS_DS_CROSS_DOM_MOVE_FAILED"; + case STATUS_DS_GC_NOT_AVAILABLE: + return (PUCHAR)"STATUS_DS_GC_NOT_AVAILABLE"; + case STATUS_DIRECTORY_SERVICE_REQUIRED: + return (PUCHAR)"STATUS_DIRECTORY_SERVICE_REQUIRED"; + case STATUS_REPARSE_ATTRIBUTE_CONFLICT: + return (PUCHAR)"STATUS_REPARSE_ATTRIBUTE_CONFLICT"; + case STATUS_CANT_ENABLE_DENY_ONLY: + return (PUCHAR)"STATUS_CANT_ENABLE_DENY_ONLY"; + case STATUS_FLOAT_MULTIPLE_FAULTS: + return (PUCHAR)"STATUS_FLOAT_MULTIPLE_FAULTS"; + case STATUS_FLOAT_MULTIPLE_TRAPS: + return (PUCHAR)"STATUS_FLOAT_MULTIPLE_TRAPS"; + case STATUS_DEVICE_REMOVED: + return (PUCHAR)"STATUS_DEVICE_REMOVED"; + case STATUS_JOURNAL_DELETE_IN_PROGRESS: + return (PUCHAR)"STATUS_JOURNAL_DELETE_IN_PROGRESS"; + case STATUS_JOURNAL_NOT_ACTIVE: + return (PUCHAR)"STATUS_JOURNAL_NOT_ACTIVE"; + case STATUS_NOINTERFACE: + return (PUCHAR)"STATUS_NOINTERFACE"; + case STATUS_DS_ADMIN_LIMIT_EXCEEDED: + return (PUCHAR)"STATUS_DS_ADMIN_LIMIT_EXCEEDED"; + case STATUS_DRIVER_FAILED_SLEEP: + return (PUCHAR)"STATUS_DRIVER_FAILED_SLEEP"; + case STATUS_MUTUAL_AUTHENTICATION_FAILED: + return (PUCHAR)"STATUS_MUTUAL_AUTHENTICATION_FAILED"; + case STATUS_CORRUPT_SYSTEM_FILE: + return (PUCHAR)"STATUS_CORRUPT_SYSTEM_FILE"; + case STATUS_DATATYPE_MISALIGNMENT_ERROR: + return (PUCHAR)"STATUS_DATATYPE_MISALIGNMENT_ERROR"; + case STATUS_WMI_READ_ONLY: + return (PUCHAR)"STATUS_WMI_READ_ONLY"; + case STATUS_WMI_SET_FAILURE: + return (PUCHAR)"STATUS_WMI_SET_FAILURE"; + case STATUS_COMMITMENT_MINIMUM: + return (PUCHAR)"STATUS_COMMITMENT_MINIMUM"; + case STATUS_REG_NAT_CONSUMPTION: + return (PUCHAR)"STATUS_REG_NAT_CONSUMPTION"; + case STATUS_TRANSPORT_FULL: + return (PUCHAR)"STATUS_TRANSPORT_FULL"; + case STATUS_DS_SAM_INIT_FAILURE: + return (PUCHAR)"STATUS_DS_SAM_INIT_FAILURE"; + case STATUS_ONLY_IF_CONNECTED: + return (PUCHAR)"STATUS_ONLY_IF_CONNECTED"; + case STATUS_DS_SENSITIVE_GROUP_VIOLATION: + return (PUCHAR)"STATUS_DS_SENSITIVE_GROUP_VIOLATION"; + case STATUS_PNP_RESTART_ENUMERATION: + return (PUCHAR)"STATUS_PNP_RESTART_ENUMERATION"; + case STATUS_JOURNAL_ENTRY_DELETED: + return (PUCHAR)"STATUS_JOURNAL_ENTRY_DELETED"; + case STATUS_DS_CANT_MOD_PRIMARYGROUPID: + return (PUCHAR)"STATUS_DS_CANT_MOD_PRIMARYGROUPID"; + case STATUS_SYSTEM_IMAGE_BAD_SIGNATURE: + return (PUCHAR)"STATUS_SYSTEM_IMAGE_BAD_SIGNATURE"; + case STATUS_PNP_REBOOT_REQUIRED: + return (PUCHAR)"STATUS_PNP_REBOOT_REQUIRED"; + case STATUS_POWER_STATE_INVALID: + return (PUCHAR)"STATUS_POWER_STATE_INVALID"; + case STATUS_DS_INVALID_GROUP_TYPE: + return (PUCHAR)"STATUS_DS_INVALID_GROUP_TYPE"; + case STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN: + return (PUCHAR)"STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN"; + case STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN: + return (PUCHAR)"STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN"; + case STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER: + return (PUCHAR)"STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER"; + case STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER: + return (PUCHAR)"STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER"; + case STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER: + return (PUCHAR)"STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER"; + case STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER: + return (PUCHAR)"STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER"; + case STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER: + return (PUCHAR)"STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER"; + case STATUS_DS_HAVE_PRIMARY_MEMBERS: + return (PUCHAR)"STATUS_DS_HAVE_PRIMARY_MEMBERS"; + case STATUS_WMI_NOT_SUPPORTED: + return (PUCHAR)"STATUS_WMI_NOT_SUPPORTED"; + case STATUS_INSUFFICIENT_POWER: + return (PUCHAR)"STATUS_INSUFFICIENT_POWER"; + case STATUS_SAM_NEED_BOOTKEY_PASSWORD: + return (PUCHAR)"STATUS_SAM_NEED_BOOTKEY_PASSWORD"; + case STATUS_SAM_NEED_BOOTKEY_FLOPPY: + return (PUCHAR)"STATUS_SAM_NEED_BOOTKEY_FLOPPY"; + case STATUS_DS_CANT_START: + return (PUCHAR)"STATUS_DS_CANT_START"; + case STATUS_DS_INIT_FAILURE: + return (PUCHAR)"STATUS_DS_INIT_FAILURE"; + case STATUS_SAM_INIT_FAILURE: + return (PUCHAR)"STATUS_SAM_INIT_FAILURE"; + case STATUS_DS_GC_REQUIRED: + return (PUCHAR)"STATUS_DS_GC_REQUIRED"; + case STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY: + return (PUCHAR)"STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY"; + case STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS: + return (PUCHAR)"STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS"; + case STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED"; + case STATUS_MULTIPLE_FAULT_VIOLATION: + return (PUCHAR)"STATUS_MULTIPLE_FAULT_VIOLATION"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_CURRENT_DOMAIN_NOT_ALLOWED: + return (PUCHAR)"STATUS_CURRENT_DOMAIN_NOT_ALLOWED"; + case STATUS_CANNOT_MAKE: + return (PUCHAR)"STATUS_CANNOT_MAKE"; + case STATUS_SYSTEM_SHUTDOWN: + return (PUCHAR)"STATUS_SYSTEM_SHUTDOWN"; + case STATUS_DS_INIT_FAILURE_CONSOLE: + return (PUCHAR)"STATUS_DS_INIT_FAILURE_CONSOLE"; + case STATUS_DS_SAM_INIT_FAILURE_CONSOLE: + return (PUCHAR)"STATUS_DS_SAM_INIT_FAILURE_CONSOLE"; + case STATUS_UNFINISHED_CONTEXT_DELETED: + return (PUCHAR)"STATUS_UNFINISHED_CONTEXT_DELETED"; + case STATUS_NO_TGT_REPLY: + return (PUCHAR)"STATUS_NO_TGT_REPLY"; + case STATUS_OBJECTID_NOT_FOUND: + return (PUCHAR)"STATUS_OBJECTID_NOT_FOUND"; + case STATUS_NO_IP_ADDRESSES: + return (PUCHAR)"STATUS_NO_IP_ADDRESSES"; + case STATUS_WRONG_CREDENTIAL_HANDLE: + return (PUCHAR)"STATUS_WRONG_CREDENTIAL_HANDLE"; + case STATUS_CRYPTO_SYSTEM_INVALID: + return (PUCHAR)"STATUS_CRYPTO_SYSTEM_INVALID"; + case STATUS_MAX_REFERRALS_EXCEEDED: + return (PUCHAR)"STATUS_MAX_REFERRALS_EXCEEDED"; + case STATUS_MUST_BE_KDC: + return (PUCHAR)"STATUS_MUST_BE_KDC"; + case STATUS_STRONG_CRYPTO_NOT_SUPPORTED: + return (PUCHAR)"STATUS_STRONG_CRYPTO_NOT_SUPPORTED"; + case STATUS_TOO_MANY_PRINCIPALS: + return (PUCHAR)"STATUS_TOO_MANY_PRINCIPALS"; + case STATUS_NO_PA_DATA: + return (PUCHAR)"STATUS_NO_PA_DATA"; + case STATUS_PKINIT_NAME_MISMATCH: + return (PUCHAR)"STATUS_PKINIT_NAME_MISMATCH"; + case STATUS_SMARTCARD_LOGON_REQUIRED: + return (PUCHAR)"STATUS_SMARTCARD_LOGON_REQUIRED"; + case STATUS_KDC_INVALID_REQUEST: + return (PUCHAR)"STATUS_KDC_INVALID_REQUEST"; + case STATUS_KDC_UNABLE_TO_REFER: + return (PUCHAR)"STATUS_KDC_UNABLE_TO_REFER"; + case STATUS_KDC_UNKNOWN_ETYPE: + return (PUCHAR)"STATUS_KDC_UNKNOWN_ETYPE"; + case STATUS_SHUTDOWN_IN_PROGRESS: + return (PUCHAR)"STATUS_SHUTDOWN_IN_PROGRESS"; + case STATUS_SERVER_SHUTDOWN_IN_PROGRESS: + return (PUCHAR)"STATUS_SERVER_SHUTDOWN_IN_PROGRESS"; +#endif + case STATUS_NOT_SUPPORTED_ON_SBS: + return (PUCHAR)"STATUS_NOT_SUPPORTED_ON_SBS"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_WMI_GUID_DISCONNECTED: + return (PUCHAR)"STATUS_WMI_GUID_DISCONNECTED"; + case STATUS_WMI_ALREADY_DISABLED: + return (PUCHAR)"STATUS_WMI_ALREADY_DISABLED"; + case STATUS_WMI_ALREADY_ENABLED: + return (PUCHAR)"STATUS_WMI_ALREADY_ENABLED"; + case STATUS_MFT_TOO_FRAGMENTED: + return (PUCHAR)"STATUS_MFT_TOO_FRAGMENTED"; + case STATUS_COPY_PROTECTION_FAILURE: + return (PUCHAR)"STATUS_COPY_PROTECTION_FAILURE"; + case STATUS_CSS_AUTHENTICATION_FAILURE: + return (PUCHAR)"STATUS_CSS_AUTHENTICATION_FAILURE"; + case STATUS_CSS_KEY_NOT_PRESENT: + return (PUCHAR)"STATUS_CSS_KEY_NOT_PRESENT"; + case STATUS_CSS_KEY_NOT_ESTABLISHED: + return (PUCHAR)"STATUS_CSS_KEY_NOT_ESTABLISHED"; + case STATUS_CSS_SCRAMBLED_SECTOR: + return (PUCHAR)"STATUS_CSS_SCRAMBLED_SECTOR"; + case STATUS_CSS_REGION_MISMATCH: + return (PUCHAR)"STATUS_CSS_REGION_MISMATCH"; + case STATUS_CSS_RESETS_EXHAUSTED: + return (PUCHAR)"STATUS_CSS_RESETS_EXHAUSTED"; + case STATUS_PKINIT_FAILURE: + return (PUCHAR)"STATUS_PKINIT_FAILURE"; + case STATUS_SMARTCARD_SUBSYSTEM_FAILURE: + return (PUCHAR)"STATUS_SMARTCARD_SUBSYSTEM_FAILURE"; + case STATUS_NO_KERB_KEY: + return (PUCHAR)"STATUS_NO_KERB_KEY"; + case STATUS_HOST_DOWN: + return (PUCHAR)"STATUS_HOST_DOWN"; + case STATUS_UNSUPPORTED_PREAUTH: + return (PUCHAR)"STATUS_UNSUPPORTED_PREAUTH"; + case STATUS_EFS_ALG_BLOB_TOO_BIG: + return (PUCHAR)"STATUS_EFS_ALG_BLOB_TOO_BIG"; + case STATUS_PORT_NOT_SET: + return (PUCHAR)"STATUS_PORT_NOT_SET"; + case STATUS_DEBUGGER_INACTIVE: + return (PUCHAR)"STATUS_DEBUGGER_INACTIVE"; + case STATUS_DS_VERSION_CHECK_FAILURE: + return (PUCHAR)"STATUS_DS_VERSION_CHECK_FAILURE"; + case STATUS_AUDITING_DISABLED: + return (PUCHAR)"STATUS_AUDITING_DISABLED"; + case STATUS_PRENT4_MACHINE_ACCOUNT: + return (PUCHAR)"STATUS_PRENT4_MACHINE_ACCOUNT"; + case STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER: + return (PUCHAR)"STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER"; + case STATUS_INVALID_IMAGE_WIN_32: + return (PUCHAR)"STATUS_INVALID_IMAGE_WIN_32"; + case STATUS_INVALID_IMAGE_WIN_64: + return (PUCHAR)"STATUS_INVALID_IMAGE_WIN_64"; + case STATUS_BAD_BINDINGS: + return (PUCHAR)"STATUS_BAD_BINDINGS"; + case STATUS_NETWORK_SESSION_EXPIRED: + return (PUCHAR)"STATUS_NETWORK_SESSION_EXPIRED"; + case STATUS_APPHELP_BLOCK: + return (PUCHAR)"STATUS_APPHELP_BLOCK"; + case STATUS_ALL_SIDS_FILTERED: + return (PUCHAR)"STATUS_ALL_SIDS_FILTERED"; + case STATUS_NOT_SAFE_MODE_DRIVER: + return (PUCHAR)"STATUS_NOT_SAFE_MODE_DRIVER"; + case STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT: + return (PUCHAR)"STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT"; + case STATUS_ACCESS_DISABLED_BY_POLICY_PATH: + return (PUCHAR)"STATUS_ACCESS_DISABLED_BY_POLICY_PATH"; + case STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER: + return (PUCHAR)"STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER"; + case STATUS_ACCESS_DISABLED_BY_POLICY_OTHER: + return (PUCHAR)"STATUS_ACCESS_DISABLED_BY_POLICY_OTHER"; + case STATUS_FAILED_DRIVER_ENTRY: + return (PUCHAR)"STATUS_FAILED_DRIVER_ENTRY"; + case STATUS_DEVICE_ENUMERATION_ERROR: + return (PUCHAR)"STATUS_DEVICE_ENUMERATION_ERROR"; + case STATUS_MOUNT_POINT_NOT_RESOLVED: + return (PUCHAR)"STATUS_MOUNT_POINT_NOT_RESOLVED"; + case STATUS_INVALID_DEVICE_OBJECT_PARAMETER: + return (PUCHAR)"STATUS_INVALID_DEVICE_OBJECT_PARAMETER"; + case STATUS_MCA_OCCURED: + return (PUCHAR)"STATUS_MCA_OCCURED"; + case STATUS_DRIVER_BLOCKED_CRITICAL: + return (PUCHAR)"STATUS_DRIVER_BLOCKED_CRITICAL"; + case STATUS_DRIVER_BLOCKED: + return (PUCHAR)"STATUS_DRIVER_BLOCKED"; + case STATUS_DRIVER_DATABASE_ERROR: + return (PUCHAR)"STATUS_DRIVER_DATABASE_ERROR"; + case STATUS_SYSTEM_HIVE_TOO_LARGE: + return (PUCHAR)"STATUS_SYSTEM_HIVE_TOO_LARGE"; + case STATUS_INVALID_IMPORT_OF_NON_DLL: + return (PUCHAR)"STATUS_INVALID_IMPORT_OF_NON_DLL"; + case STATUS_SMARTCARD_WRONG_PIN: + return (PUCHAR)"STATUS_SMARTCARD_WRONG_PIN"; + case STATUS_SMARTCARD_CARD_BLOCKED: + return (PUCHAR)"STATUS_SMARTCARD_CARD_BLOCKED"; + case STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED: + return (PUCHAR)"STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED"; + case STATUS_SMARTCARD_NO_CARD: + return (PUCHAR)"STATUS_SMARTCARD_NO_CARD"; + case STATUS_SMARTCARD_NO_KEY_CONTAINER: + return (PUCHAR)"STATUS_SMARTCARD_NO_KEY_CONTAINER"; + case STATUS_SMARTCARD_NO_CERTIFICATE: + return (PUCHAR)"STATUS_SMARTCARD_NO_CERTIFICATE"; + case STATUS_SMARTCARD_NO_KEYSET: + return (PUCHAR)"STATUS_SMARTCARD_NO_KEYSET"; + case STATUS_SMARTCARD_IO_ERROR: + return (PUCHAR)"STATUS_SMARTCARD_IO_ERROR"; + case STATUS_DOWNGRADE_DETECTED: + return (PUCHAR)"STATUS_DOWNGRADE_DETECTED"; + case STATUS_SMARTCARD_CERT_REVOKED: + return (PUCHAR)"STATUS_SMARTCARD_CERT_REVOKED"; + case STATUS_ISSUING_CA_UNTRUSTED: + return (PUCHAR)"STATUS_ISSUING_CA_UNTRUSTED"; + case STATUS_REVOCATION_OFFLINE_C: + return (PUCHAR)"STATUS_REVOCATION_OFFLINE_C"; + case STATUS_PKINIT_CLIENT_FAILURE: + return (PUCHAR)"STATUS_PKINIT_CLIENT_FAILURE"; + case STATUS_SMARTCARD_CERT_EXPIRED: + return (PUCHAR)"STATUS_SMARTCARD_CERT_EXPIRED"; + case STATUS_DRIVER_FAILED_PRIOR_UNLOAD: + return (PUCHAR)"STATUS_DRIVER_FAILED_PRIOR_UNLOAD"; +#endif +#if (VER_PRODUCT_BUILD > 2600) + case STATUS_SMARTCARD_SILENT_CONTEXT: + return (PUCHAR)"STATUS_SMARTCARD_SILENT_CONTEXT"; + case STATUS_PER_USER_TRUST_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_PER_USER_TRUST_QUOTA_EXCEEDED"; + case STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED"; + case STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED"; + case STATUS_DS_NAME_NOT_UNIQUE: + return (PUCHAR)"STATUS_DS_NAME_NOT_UNIQUE"; + case STATUS_DS_DUPLICATE_ID_FOUND: + return (PUCHAR)"STATUS_DS_DUPLICATE_ID_FOUND"; + case STATUS_DS_GROUP_CONVERSION_ERROR: + return (PUCHAR)"STATUS_DS_GROUP_CONVERSION_ERROR"; + case STATUS_VOLSNAP_PREPARE_HIBERNATE: + return (PUCHAR)"STATUS_VOLSNAP_PREPARE_HIBERNATE"; + case STATUS_USER2USER_REQUIRED: + return (PUCHAR)"STATUS_USER2USER_REQUIRED"; + case STATUS_STACK_BUFFER_OVERRUN: + return (PUCHAR)"STATUS_STACK_BUFFER_OVERRUN"; + case STATUS_NO_S4U_PROT_SUPPORT: + return (PUCHAR)"STATUS_NO_S4U_PROT_SUPPORT"; + case STATUS_CROSSREALM_DELEGATION_FAILURE: + return (PUCHAR)"STATUS_CROSSREALM_DELEGATION_FAILURE"; + case STATUS_REVOCATION_OFFLINE_KDC: + return (PUCHAR)"STATUS_REVOCATION_OFFLINE_KDC"; + case STATUS_ISSUING_CA_UNTRUSTED_KDC: + return (PUCHAR)"STATUS_ISSUING_CA_UNTRUSTED_KDC"; + case STATUS_KDC_CERT_EXPIRED: + return (PUCHAR)"STATUS_KDC_CERT_EXPIRED"; + case STATUS_KDC_CERT_REVOKED: + return (PUCHAR)"STATUS_KDC_CERT_REVOKED"; + case STATUS_PARAMETER_QUOTA_EXCEEDED: + return (PUCHAR)"STATUS_PARAMETER_QUOTA_EXCEEDED"; + case STATUS_HIBERNATION_FAILURE: + return (PUCHAR)"STATUS_HIBERNATION_FAILURE"; + case STATUS_DELAY_LOAD_FAILED: + return (PUCHAR)"STATUS_DELAY_LOAD_FAILED"; + case STATUS_AUTHENTICATION_FIREWALL_FAILED: + return (PUCHAR)"STATUS_AUTHENTICATION_FIREWALL_FAILED"; + case STATUS_VDM_DISALLOWED: + return (PUCHAR)"STATUS_VDM_DISALLOWED"; + case STATUS_HUNG_DISPLAY_DRIVER_THREAD: + return (PUCHAR)"STATUS_HUNG_DISPLAY_DRIVER_THREAD"; +#endif + case STATUS_WOW_ASSERTION: + return (PUCHAR)"STATUS_WOW_ASSERTION"; + case DBG_NO_STATE_CHANGE: + return (PUCHAR)"DBG_NO_STATE_CHANGE"; + case DBG_APP_NOT_IDLE: + return (PUCHAR)"DBG_APP_NOT_IDLE"; + case RPC_NT_INVALID_STRING_BINDING: + return (PUCHAR)"RPC_NT_INVALID_STRING_BINDING"; + case RPC_NT_WRONG_KIND_OF_BINDING: + return (PUCHAR)"RPC_NT_WRONG_KIND_OF_BINDING"; + case RPC_NT_INVALID_BINDING: + return (PUCHAR)"RPC_NT_INVALID_BINDING"; + case RPC_NT_PROTSEQ_NOT_SUPPORTED: + return (PUCHAR)"RPC_NT_PROTSEQ_NOT_SUPPORTED"; + case RPC_NT_INVALID_RPC_PROTSEQ: + return (PUCHAR)"RPC_NT_INVALID_RPC_PROTSEQ"; + case RPC_NT_INVALID_STRING_UUID: + return (PUCHAR)"RPC_NT_INVALID_STRING_UUID"; + case RPC_NT_INVALID_ENDPOINT_FORMAT: + return (PUCHAR)"RPC_NT_INVALID_ENDPOINT_FORMAT"; + case RPC_NT_INVALID_NET_ADDR: + return (PUCHAR)"RPC_NT_INVALID_NET_ADDR"; + case RPC_NT_NO_ENDPOINT_FOUND: + return (PUCHAR)"RPC_NT_NO_ENDPOINT_FOUND"; + case RPC_NT_INVALID_TIMEOUT: + return (PUCHAR)"RPC_NT_INVALID_TIMEOUT"; + case RPC_NT_OBJECT_NOT_FOUND: + return (PUCHAR)"RPC_NT_OBJECT_NOT_FOUND"; + case RPC_NT_ALREADY_REGISTERED: + return (PUCHAR)"RPC_NT_ALREADY_REGISTERED"; + case RPC_NT_TYPE_ALREADY_REGISTERED: + return (PUCHAR)"RPC_NT_TYPE_ALREADY_REGISTERED"; + case RPC_NT_ALREADY_LISTENING: + return (PUCHAR)"RPC_NT_ALREADY_LISTENING"; + case RPC_NT_NO_PROTSEQS_REGISTERED: + return (PUCHAR)"RPC_NT_NO_PROTSEQS_REGISTERED"; + case RPC_NT_NOT_LISTENING: + return (PUCHAR)"RPC_NT_NOT_LISTENING"; + case RPC_NT_UNKNOWN_MGR_TYPE: + return (PUCHAR)"RPC_NT_UNKNOWN_MGR_TYPE"; + case RPC_NT_UNKNOWN_IF: + return (PUCHAR)"RPC_NT_UNKNOWN_IF"; + case RPC_NT_NO_BINDINGS: + return (PUCHAR)"RPC_NT_NO_BINDINGS"; + case RPC_NT_NO_PROTSEQS: + return (PUCHAR)"RPC_NT_NO_PROTSEQS"; + case RPC_NT_CANT_CREATE_ENDPOINT: + return (PUCHAR)"RPC_NT_CANT_CREATE_ENDPOINT"; + case RPC_NT_OUT_OF_RESOURCES: + return (PUCHAR)"RPC_NT_OUT_OF_RESOURCES"; + case RPC_NT_SERVER_UNAVAILABLE: + return (PUCHAR)"RPC_NT_SERVER_UNAVAILABLE"; + case RPC_NT_SERVER_TOO_BUSY: + return (PUCHAR)"RPC_NT_SERVER_TOO_BUSY"; + case RPC_NT_INVALID_NETWORK_OPTIONS: + return (PUCHAR)"RPC_NT_INVALID_NETWORK_OPTIONS"; + case RPC_NT_NO_CALL_ACTIVE: + return (PUCHAR)"RPC_NT_NO_CALL_ACTIVE"; + case RPC_NT_CALL_FAILED: + return (PUCHAR)"RPC_NT_CALL_FAILED"; + case RPC_NT_CALL_FAILED_DNE: + return (PUCHAR)"RPC_NT_CALL_FAILED_DNE"; + case RPC_NT_PROTOCOL_ERROR: + return (PUCHAR)"RPC_NT_PROTOCOL_ERROR"; + case RPC_NT_UNSUPPORTED_TRANS_SYN: + return (PUCHAR)"RPC_NT_UNSUPPORTED_TRANS_SYN"; + case RPC_NT_UNSUPPORTED_TYPE: + return (PUCHAR)"RPC_NT_UNSUPPORTED_TYPE"; + case RPC_NT_INVALID_TAG: + return (PUCHAR)"RPC_NT_INVALID_TAG"; + case RPC_NT_INVALID_BOUND: + return (PUCHAR)"RPC_NT_INVALID_BOUND"; + case RPC_NT_NO_ENTRY_NAME: + return (PUCHAR)"RPC_NT_NO_ENTRY_NAME"; + case RPC_NT_INVALID_NAME_SYNTAX: + return (PUCHAR)"RPC_NT_INVALID_NAME_SYNTAX"; + case RPC_NT_UNSUPPORTED_NAME_SYNTAX: + return (PUCHAR)"RPC_NT_UNSUPPORTED_NAME_SYNTAX"; + case RPC_NT_UUID_NO_ADDRESS: + return (PUCHAR)"RPC_NT_UUID_NO_ADDRESS"; + case RPC_NT_DUPLICATE_ENDPOINT: + return (PUCHAR)"RPC_NT_DUPLICATE_ENDPOINT"; + case RPC_NT_UNKNOWN_AUTHN_TYPE: + return (PUCHAR)"RPC_NT_UNKNOWN_AUTHN_TYPE"; + case RPC_NT_MAX_CALLS_TOO_SMALL: + return (PUCHAR)"RPC_NT_MAX_CALLS_TOO_SMALL"; + case RPC_NT_STRING_TOO_LONG: + return (PUCHAR)"RPC_NT_STRING_TOO_LONG"; + case RPC_NT_PROTSEQ_NOT_FOUND: + return (PUCHAR)"RPC_NT_PROTSEQ_NOT_FOUND"; + case RPC_NT_PROCNUM_OUT_OF_RANGE: + return (PUCHAR)"RPC_NT_PROCNUM_OUT_OF_RANGE"; + case RPC_NT_BINDING_HAS_NO_AUTH: + return (PUCHAR)"RPC_NT_BINDING_HAS_NO_AUTH"; + case RPC_NT_UNKNOWN_AUTHN_SERVICE: + return (PUCHAR)"RPC_NT_UNKNOWN_AUTHN_SERVICE"; + case RPC_NT_UNKNOWN_AUTHN_LEVEL: + return (PUCHAR)"RPC_NT_UNKNOWN_AUTHN_LEVEL"; + case RPC_NT_INVALID_AUTH_IDENTITY: + return (PUCHAR)"RPC_NT_INVALID_AUTH_IDENTITY"; + case RPC_NT_UNKNOWN_AUTHZ_SERVICE: + return (PUCHAR)"RPC_NT_UNKNOWN_AUTHZ_SERVICE"; + case EPT_NT_INVALID_ENTRY: + return (PUCHAR)"EPT_NT_INVALID_ENTRY"; + case EPT_NT_CANT_PERFORM_OP: + return (PUCHAR)"EPT_NT_CANT_PERFORM_OP"; + case EPT_NT_NOT_REGISTERED: + return (PUCHAR)"EPT_NT_NOT_REGISTERED"; + case RPC_NT_NOTHING_TO_EXPORT: + return (PUCHAR)"RPC_NT_NOTHING_TO_EXPORT"; + case RPC_NT_INCOMPLETE_NAME: + return (PUCHAR)"RPC_NT_INCOMPLETE_NAME"; + case RPC_NT_INVALID_VERS_OPTION: + return (PUCHAR)"RPC_NT_INVALID_VERS_OPTION"; + case RPC_NT_NO_MORE_MEMBERS: + return (PUCHAR)"RPC_NT_NO_MORE_MEMBERS"; + case RPC_NT_NOT_ALL_OBJS_UNEXPORTED: + return (PUCHAR)"RPC_NT_NOT_ALL_OBJS_UNEXPORTED"; + case RPC_NT_INTERFACE_NOT_FOUND: + return (PUCHAR)"RPC_NT_INTERFACE_NOT_FOUND"; + case RPC_NT_ENTRY_ALREADY_EXISTS: + return (PUCHAR)"RPC_NT_ENTRY_ALREADY_EXISTS"; + case RPC_NT_ENTRY_NOT_FOUND: + return (PUCHAR)"RPC_NT_ENTRY_NOT_FOUND"; + case RPC_NT_NAME_SERVICE_UNAVAILABLE: + return (PUCHAR)"RPC_NT_NAME_SERVICE_UNAVAILABLE"; + case RPC_NT_INVALID_NAF_ID: + return (PUCHAR)"RPC_NT_INVALID_NAF_ID"; + case RPC_NT_CANNOT_SUPPORT: + return (PUCHAR)"RPC_NT_CANNOT_SUPPORT"; + case RPC_NT_NO_CONTEXT_AVAILABLE: + return (PUCHAR)"RPC_NT_NO_CONTEXT_AVAILABLE"; + case RPC_NT_INTERNAL_ERROR: + return (PUCHAR)"RPC_NT_INTERNAL_ERROR"; + case RPC_NT_ZERO_DIVIDE: + return (PUCHAR)"RPC_NT_ZERO_DIVIDE"; + case RPC_NT_ADDRESS_ERROR: + return (PUCHAR)"RPC_NT_ADDRESS_ERROR"; + case RPC_NT_FP_DIV_ZERO: + return (PUCHAR)"RPC_NT_FP_DIV_ZERO"; + case RPC_NT_FP_UNDERFLOW: + return (PUCHAR)"RPC_NT_FP_UNDERFLOW"; + case RPC_NT_FP_OVERFLOW: + return (PUCHAR)"RPC_NT_FP_OVERFLOW"; + case RPC_NT_CALL_IN_PROGRESS: + return (PUCHAR)"RPC_NT_CALL_IN_PROGRESS"; + case RPC_NT_NO_MORE_BINDINGS: + return (PUCHAR)"RPC_NT_NO_MORE_BINDINGS"; + case RPC_NT_GROUP_MEMBER_NOT_FOUND: + return (PUCHAR)"RPC_NT_GROUP_MEMBER_NOT_FOUND"; + case EPT_NT_CANT_CREATE: + return (PUCHAR)"EPT_NT_CANT_CREATE"; + case RPC_NT_INVALID_OBJECT: + return (PUCHAR)"RPC_NT_INVALID_OBJECT"; + case RPC_NT_NO_INTERFACES: + return (PUCHAR)"RPC_NT_NO_INTERFACES"; + case RPC_NT_CALL_CANCELLED: + return (PUCHAR)"RPC_NT_CALL_CANCELLED"; + case RPC_NT_BINDING_INCOMPLETE: + return (PUCHAR)"RPC_NT_BINDING_INCOMPLETE"; + case RPC_NT_COMM_FAILURE: + return (PUCHAR)"RPC_NT_COMM_FAILURE"; + case RPC_NT_UNSUPPORTED_AUTHN_LEVEL: + return (PUCHAR)"RPC_NT_UNSUPPORTED_AUTHN_LEVEL"; + case RPC_NT_NO_PRINC_NAME: + return (PUCHAR)"RPC_NT_NO_PRINC_NAME"; + case RPC_NT_NOT_RPC_ERROR: + return (PUCHAR)"RPC_NT_NOT_RPC_ERROR"; + case RPC_NT_SEC_PKG_ERROR: + return (PUCHAR)"RPC_NT_SEC_PKG_ERROR"; + case RPC_NT_NOT_CANCELLED: + return (PUCHAR)"RPC_NT_NOT_CANCELLED"; + case RPC_NT_INVALID_ASYNC_HANDLE: + return (PUCHAR)"RPC_NT_INVALID_ASYNC_HANDLE"; + case RPC_NT_INVALID_ASYNC_CALL: + return (PUCHAR)"RPC_NT_INVALID_ASYNC_CALL"; + case RPC_NT_NO_MORE_ENTRIES: + return (PUCHAR)"RPC_NT_NO_MORE_ENTRIES"; + case RPC_NT_SS_CHAR_TRANS_OPEN_FAIL: + return (PUCHAR)"RPC_NT_SS_CHAR_TRANS_OPEN_FAIL"; + case RPC_NT_SS_CHAR_TRANS_SHORT_FILE: + return (PUCHAR)"RPC_NT_SS_CHAR_TRANS_SHORT_FILE"; + case RPC_NT_SS_IN_NULL_CONTEXT: + return (PUCHAR)"RPC_NT_SS_IN_NULL_CONTEXT"; + case RPC_NT_SS_CONTEXT_MISMATCH: + return (PUCHAR)"RPC_NT_SS_CONTEXT_MISMATCH"; + case RPC_NT_SS_CONTEXT_DAMAGED: + return (PUCHAR)"RPC_NT_SS_CONTEXT_DAMAGED"; + case RPC_NT_SS_HANDLES_MISMATCH: + return (PUCHAR)"RPC_NT_SS_HANDLES_MISMATCH"; + case RPC_NT_SS_CANNOT_GET_CALL_HANDLE: + return (PUCHAR)"RPC_NT_SS_CANNOT_GET_CALL_HANDLE"; + case RPC_NT_NULL_REF_POINTER: + return (PUCHAR)"RPC_NT_NULL_REF_POINTER"; + case RPC_NT_ENUM_VALUE_OUT_OF_RANGE: + return (PUCHAR)"RPC_NT_ENUM_VALUE_OUT_OF_RANGE"; + case RPC_NT_BYTE_COUNT_TOO_SMALL: + return (PUCHAR)"RPC_NT_BYTE_COUNT_TOO_SMALL"; + case RPC_NT_BAD_STUB_DATA: + return (PUCHAR)"RPC_NT_BAD_STUB_DATA"; + case RPC_NT_INVALID_ES_ACTION: + return (PUCHAR)"RPC_NT_INVALID_ES_ACTION"; + case RPC_NT_WRONG_ES_VERSION: + return (PUCHAR)"RPC_NT_WRONG_ES_VERSION"; + case RPC_NT_WRONG_STUB_VERSION: + return (PUCHAR)"RPC_NT_WRONG_STUB_VERSION"; + case RPC_NT_INVALID_PIPE_OBJECT: + return (PUCHAR)"RPC_NT_INVALID_PIPE_OBJECT"; + case RPC_NT_INVALID_PIPE_OPERATION: + return (PUCHAR)"RPC_NT_INVALID_PIPE_OPERATION"; + case RPC_NT_WRONG_PIPE_VERSION: + return (PUCHAR)"RPC_NT_WRONG_PIPE_VERSION"; + case RPC_NT_PIPE_CLOSED: + return (PUCHAR)"RPC_NT_PIPE_CLOSED"; + case RPC_NT_PIPE_DISCIPLINE_ERROR: + return (PUCHAR)"RPC_NT_PIPE_DISCIPLINE_ERROR"; + case RPC_NT_PIPE_EMPTY: + return (PUCHAR)"RPC_NT_PIPE_EMPTY"; + case STATUS_PNP_BAD_MPS_TABLE: + return (PUCHAR)"STATUS_PNP_BAD_MPS_TABLE"; + case STATUS_PNP_TRANSLATION_FAILED: + return (PUCHAR)"STATUS_PNP_TRANSLATION_FAILED"; + case STATUS_PNP_IRQ_TRANSLATION_FAILED: + return (PUCHAR)"STATUS_PNP_IRQ_TRANSLATION_FAILED"; +#if (VER_PRODUCT_BUILD > 2600) + case STATUS_PNP_INVALID_ID: + return (PUCHAR)"STATUS_PNP_INVALID_ID"; +#endif + case STATUS_CTX_WINSTATION_NAME_INVALID: + return (PUCHAR)"STATUS_CTX_WINSTATION_NAME_INVALID"; + case STATUS_CTX_INVALID_PD: + return (PUCHAR)"STATUS_CTX_INVALID_PD"; + case STATUS_CTX_PD_NOT_FOUND: + return (PUCHAR)"STATUS_CTX_PD_NOT_FOUND"; + case STATUS_CTX_CLOSE_PENDING: + return (PUCHAR)"STATUS_CTX_CLOSE_PENDING"; + case STATUS_CTX_NO_OUTBUF: + return (PUCHAR)"STATUS_CTX_NO_OUTBUF"; + case STATUS_CTX_MODEM_INF_NOT_FOUND: + return (PUCHAR)"STATUS_CTX_MODEM_INF_NOT_FOUND"; + case STATUS_CTX_INVALID_MODEMNAME: + return (PUCHAR)"STATUS_CTX_INVALID_MODEMNAME"; + case STATUS_CTX_RESPONSE_ERROR: + return (PUCHAR)"STATUS_CTX_RESPONSE_ERROR"; + case STATUS_CTX_MODEM_RESPONSE_TIMEOUT: + return (PUCHAR)"STATUS_CTX_MODEM_RESPONSE_TIMEOUT"; + case STATUS_CTX_MODEM_RESPONSE_NO_CARRIER: + return (PUCHAR)"STATUS_CTX_MODEM_RESPONSE_NO_CARRIER"; + case STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE: + return (PUCHAR)"STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE"; + case STATUS_CTX_MODEM_RESPONSE_BUSY: + return (PUCHAR)"STATUS_CTX_MODEM_RESPONSE_BUSY"; + case STATUS_CTX_MODEM_RESPONSE_VOICE: + return (PUCHAR)"STATUS_CTX_MODEM_RESPONSE_VOICE"; + case STATUS_CTX_TD_ERROR: + return (PUCHAR)"STATUS_CTX_TD_ERROR"; + case STATUS_CTX_LICENSE_CLIENT_INVALID: + return (PUCHAR)"STATUS_CTX_LICENSE_CLIENT_INVALID"; + case STATUS_CTX_LICENSE_NOT_AVAILABLE: + return (PUCHAR)"STATUS_CTX_LICENSE_NOT_AVAILABLE"; + case STATUS_CTX_LICENSE_EXPIRED: + return (PUCHAR)"STATUS_CTX_LICENSE_EXPIRED"; + case STATUS_CTX_WINSTATION_NOT_FOUND: + return (PUCHAR)"STATUS_CTX_WINSTATION_NOT_FOUND"; + case STATUS_CTX_WINSTATION_NAME_COLLISION: + return (PUCHAR)"STATUS_CTX_WINSTATION_NAME_COLLISION"; + case STATUS_CTX_WINSTATION_BUSY: + return (PUCHAR)"STATUS_CTX_WINSTATION_BUSY"; + case STATUS_CTX_BAD_VIDEO_MODE: + return (PUCHAR)"STATUS_CTX_BAD_VIDEO_MODE"; + case STATUS_CTX_GRAPHICS_INVALID: + return (PUCHAR)"STATUS_CTX_GRAPHICS_INVALID"; + case STATUS_CTX_NOT_CONSOLE: + return (PUCHAR)"STATUS_CTX_NOT_CONSOLE"; + case STATUS_CTX_CLIENT_QUERY_TIMEOUT: + return (PUCHAR)"STATUS_CTX_CLIENT_QUERY_TIMEOUT"; + case STATUS_CTX_CONSOLE_DISCONNECT: + return (PUCHAR)"STATUS_CTX_CONSOLE_DISCONNECT"; + case STATUS_CTX_CONSOLE_CONNECT: + return (PUCHAR)"STATUS_CTX_CONSOLE_CONNECT"; + case STATUS_CTX_SHADOW_DENIED: + return (PUCHAR)"STATUS_CTX_SHADOW_DENIED"; + case STATUS_CTX_WINSTATION_ACCESS_DENIED: + return (PUCHAR)"STATUS_CTX_WINSTATION_ACCESS_DENIED"; + case STATUS_CTX_INVALID_WD: + return (PUCHAR)"STATUS_CTX_INVALID_WD"; + case STATUS_CTX_WD_NOT_FOUND: + return (PUCHAR)"STATUS_CTX_WD_NOT_FOUND"; + case STATUS_CTX_SHADOW_INVALID: + return (PUCHAR)"STATUS_CTX_SHADOW_INVALID"; + case STATUS_CTX_SHADOW_DISABLED: + return (PUCHAR)"STATUS_CTX_SHADOW_DISABLED"; + case STATUS_RDP_PROTOCOL_ERROR: + return (PUCHAR)"STATUS_RDP_PROTOCOL_ERROR"; + case STATUS_CTX_CLIENT_LICENSE_NOT_SET: + return (PUCHAR)"STATUS_CTX_CLIENT_LICENSE_NOT_SET"; + case STATUS_CTX_CLIENT_LICENSE_IN_USE: + return (PUCHAR)"STATUS_CTX_CLIENT_LICENSE_IN_USE"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE: + return (PUCHAR)"STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE"; + case STATUS_CTX_SHADOW_NOT_RUNNING: + return (PUCHAR)"STATUS_CTX_SHADOW_NOT_RUNNING"; + case STATUS_CLUSTER_INVALID_NODE: + return (PUCHAR)"STATUS_CLUSTER_INVALID_NODE"; + case STATUS_CLUSTER_NODE_EXISTS: + return (PUCHAR)"STATUS_CLUSTER_NODE_EXISTS"; + case STATUS_CLUSTER_JOIN_IN_PROGRESS: + return (PUCHAR)"STATUS_CLUSTER_JOIN_IN_PROGRESS"; + case STATUS_CLUSTER_NODE_NOT_FOUND: + return (PUCHAR)"STATUS_CLUSTER_NODE_NOT_FOUND"; + case STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND: + return (PUCHAR)"STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND"; + case STATUS_CLUSTER_NETWORK_EXISTS: + return (PUCHAR)"STATUS_CLUSTER_NETWORK_EXISTS"; + case STATUS_CLUSTER_NETWORK_NOT_FOUND: + return (PUCHAR)"STATUS_CLUSTER_NETWORK_NOT_FOUND"; + case STATUS_CLUSTER_NETINTERFACE_EXISTS: + return (PUCHAR)"STATUS_CLUSTER_NETINTERFACE_EXISTS"; + case STATUS_CLUSTER_NETINTERFACE_NOT_FOUND: + return (PUCHAR)"STATUS_CLUSTER_NETINTERFACE_NOT_FOUND"; + case STATUS_CLUSTER_INVALID_REQUEST: + return (PUCHAR)"STATUS_CLUSTER_INVALID_REQUEST"; + case STATUS_CLUSTER_INVALID_NETWORK_PROVIDER: + return (PUCHAR)"STATUS_CLUSTER_INVALID_NETWORK_PROVIDER"; + case STATUS_CLUSTER_NODE_DOWN: + return (PUCHAR)"STATUS_CLUSTER_NODE_DOWN"; + case STATUS_CLUSTER_NODE_UNREACHABLE: + return (PUCHAR)"STATUS_CLUSTER_NODE_UNREACHABLE"; + case STATUS_CLUSTER_NODE_NOT_MEMBER: + return (PUCHAR)"STATUS_CLUSTER_NODE_NOT_MEMBER"; + case STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS: + return (PUCHAR)"STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS"; + case STATUS_CLUSTER_INVALID_NETWORK: + return (PUCHAR)"STATUS_CLUSTER_INVALID_NETWORK"; + case STATUS_CLUSTER_NO_NET_ADAPTERS: + return (PUCHAR)"STATUS_CLUSTER_NO_NET_ADAPTERS"; + case STATUS_CLUSTER_NODE_UP: + return (PUCHAR)"STATUS_CLUSTER_NODE_UP"; + case STATUS_CLUSTER_NODE_PAUSED: + return (PUCHAR)"STATUS_CLUSTER_NODE_PAUSED"; + case STATUS_CLUSTER_NODE_NOT_PAUSED: + return (PUCHAR)"STATUS_CLUSTER_NODE_NOT_PAUSED"; + case STATUS_CLUSTER_NO_SECURITY_CONTEXT: + return (PUCHAR)"STATUS_CLUSTER_NO_SECURITY_CONTEXT"; + case STATUS_CLUSTER_NETWORK_NOT_INTERNAL: + return (PUCHAR)"STATUS_CLUSTER_NETWORK_NOT_INTERNAL"; + case STATUS_CLUSTER_POISONED: + return (PUCHAR)"STATUS_CLUSTER_POISONED"; +#endif + case STATUS_ACPI_INVALID_OPCODE: + return (PUCHAR)"STATUS_ACPI_INVALID_OPCODE"; + case STATUS_ACPI_STACK_OVERFLOW: + return (PUCHAR)"STATUS_ACPI_STACK_OVERFLOW"; + case STATUS_ACPI_ASSERT_FAILED: + return (PUCHAR)"STATUS_ACPI_ASSERT_FAILED"; + case STATUS_ACPI_INVALID_INDEX: + return (PUCHAR)"STATUS_ACPI_INVALID_INDEX"; + case STATUS_ACPI_INVALID_ARGUMENT: + return (PUCHAR)"STATUS_ACPI_INVALID_ARGUMENT"; + case STATUS_ACPI_FATAL: + return (PUCHAR)"STATUS_ACPI_FATAL"; + case STATUS_ACPI_INVALID_SUPERNAME: + return (PUCHAR)"STATUS_ACPI_INVALID_SUPERNAME"; + case STATUS_ACPI_INVALID_ARGTYPE: + return (PUCHAR)"STATUS_ACPI_INVALID_ARGTYPE"; + case STATUS_ACPI_INVALID_OBJTYPE: + return (PUCHAR)"STATUS_ACPI_INVALID_OBJTYPE"; + case STATUS_ACPI_INVALID_TARGETTYPE: + return (PUCHAR)"STATUS_ACPI_INVALID_TARGETTYPE"; + case STATUS_ACPI_INCORRECT_ARGUMENT_COUNT: + return (PUCHAR)"STATUS_ACPI_INCORRECT_ARGUMENT_COUNT"; + case STATUS_ACPI_ADDRESS_NOT_MAPPED: + return (PUCHAR)"STATUS_ACPI_ADDRESS_NOT_MAPPED"; + case STATUS_ACPI_INVALID_EVENTTYPE: + return (PUCHAR)"STATUS_ACPI_INVALID_EVENTTYPE"; + case STATUS_ACPI_HANDLER_COLLISION: + return (PUCHAR)"STATUS_ACPI_HANDLER_COLLISION"; + case STATUS_ACPI_INVALID_DATA: + return (PUCHAR)"STATUS_ACPI_INVALID_DATA"; + case STATUS_ACPI_INVALID_REGION: + return (PUCHAR)"STATUS_ACPI_INVALID_REGION"; + case STATUS_ACPI_INVALID_ACCESS_SIZE: + return (PUCHAR)"STATUS_ACPI_INVALID_ACCESS_SIZE"; + case STATUS_ACPI_ACQUIRE_GLOBAL_LOCK: + return (PUCHAR)"STATUS_ACPI_ACQUIRE_GLOBAL_LOCK"; + case STATUS_ACPI_ALREADY_INITIALIZED: + return (PUCHAR)"STATUS_ACPI_ALREADY_INITIALIZED"; + case STATUS_ACPI_NOT_INITIALIZED: + return (PUCHAR)"STATUS_ACPI_NOT_INITIALIZED"; + case STATUS_ACPI_INVALID_MUTEX_LEVEL: + return (PUCHAR)"STATUS_ACPI_INVALID_MUTEX_LEVEL"; + case STATUS_ACPI_MUTEX_NOT_OWNED: + return (PUCHAR)"STATUS_ACPI_MUTEX_NOT_OWNED"; + case STATUS_ACPI_MUTEX_NOT_OWNER: + return (PUCHAR)"STATUS_ACPI_MUTEX_NOT_OWNER"; + case STATUS_ACPI_RS_ACCESS: + return (PUCHAR)"STATUS_ACPI_RS_ACCESS"; + case STATUS_ACPI_INVALID_TABLE: + return (PUCHAR)"STATUS_ACPI_INVALID_TABLE"; + case STATUS_ACPI_REG_HANDLER_FAILED: + return (PUCHAR)"STATUS_ACPI_REG_HANDLER_FAILED"; + case STATUS_ACPI_POWER_REQUEST_FAILED: + return (PUCHAR)"STATUS_ACPI_POWER_REQUEST_FAILED"; +#if (VER_PRODUCT_BUILD >= 2600) + case STATUS_SXS_SECTION_NOT_FOUND: + return (PUCHAR)"STATUS_SXS_SECTION_NOT_FOUND"; + case STATUS_SXS_CANT_GEN_ACTCTX: + return (PUCHAR)"STATUS_SXS_CANT_GEN_ACTCTX"; + case STATUS_SXS_INVALID_ACTCTXDATA_FORMAT: + return (PUCHAR)"STATUS_SXS_INVALID_ACTCTXDATA_FORMAT"; + case STATUS_SXS_ASSEMBLY_NOT_FOUND: + return (PUCHAR)"STATUS_SXS_ASSEMBLY_NOT_FOUND"; + case STATUS_SXS_MANIFEST_FORMAT_ERROR: + return (PUCHAR)"STATUS_SXS_MANIFEST_FORMAT_ERROR"; + case STATUS_SXS_MANIFEST_PARSE_ERROR: + return (PUCHAR)"STATUS_SXS_MANIFEST_PARSE_ERROR"; + case STATUS_SXS_ACTIVATION_CONTEXT_DISABLED: + return (PUCHAR)"STATUS_SXS_ACTIVATION_CONTEXT_DISABLED"; + case STATUS_SXS_KEY_NOT_FOUND: + return (PUCHAR)"STATUS_SXS_KEY_NOT_FOUND"; + case STATUS_SXS_VERSION_CONFLICT: + return (PUCHAR)"STATUS_SXS_VERSION_CONFLICT"; + case STATUS_SXS_WRONG_SECTION_TYPE: + return (PUCHAR)"STATUS_SXS_WRONG_SECTION_TYPE"; + case STATUS_SXS_THREAD_QUERIES_DISABLED: + return (PUCHAR)"STATUS_SXS_THREAD_QUERIES_DISABLED"; + case STATUS_SXS_ASSEMBLY_MISSING: + return (PUCHAR)"STATUS_SXS_ASSEMBLY_MISSING"; + case STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET: + return (PUCHAR)"STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET"; + case STATUS_SXS_EARLY_DEACTIVATION: + return (PUCHAR)"STATUS_SXS_EARLY_DEACTIVATION"; + case STATUS_SXS_INVALID_DEACTIVATION: + return (PUCHAR)"STATUS_SXS_INVALID_DEACTIVATION"; + case STATUS_SXS_MULTIPLE_DEACTIVATION: + return (PUCHAR)"STATUS_SXS_MULTIPLE_DEACTIVATION"; + case STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY: + return (PUCHAR)"STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY"; + case STATUS_SXS_PROCESS_TERMINATION_REQUESTED: + return (PUCHAR)"STATUS_SXS_PROCESS_TERMINATION_REQUESTED"; +#endif +#if (VER_PRODUCT_BUILD > 2600) + case STATUS_SXS_CORRUPT_ACTIVATION_STACK: + return (PUCHAR)"STATUS_SXS_CORRUPT_ACTIVATION_STACK"; +#endif + default: + return (PUCHAR)"NTSTATSTR_UNKNOWN_STATUS"; + } +} diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker2Installer.inf b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker2Installer.inf new file mode 100644 index 0000000..959b14d --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/SkyWalker2Installer.inf @@ -0,0 +1,142 @@ +; SkyWalker2Installer.INF -- This file installs SkyWalker2 Driver +; +[Version] +signature="$CHICAGO$" +Class=Media +ClassGUID={4d36e96c-e325-11ce-bfc1-08002be10318} +Provider=%SGI% +CatalogFile=SkyWalker2Installer.cat +DriverVer= 8/17/2009 + +; F i l e c o p y i n g s e c t i o n s (where the files go to). +; +[DestinationDirs] +DefaultDestDir=10,system32\drivers + +[Manufacturer] +%SGI%=SGI + +[ControlFlags] +;ExcludeFromSelect=* +;ExcludeFromSelect.NT=* + +; =================== Generic ================================== + +[SGI] +%SkyWalker2.DeviceDesc%=SkyWalker2.Device,USB\VID_09C0&PID_0206 ;SkyWalker2 + +[SkyWalker2.Device] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration, KSCAPTUR.Registration, BDA.Installation +AddReg = SkyWalker2.AddReg +CopyFiles = SkyWalker2.CopyDrivers + +[SkyWalker2.Device.NT] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration.NT, KSCAPTUR.Registration.NT, BDA.Installation.NT +;AddReg = SkyWalker2.AddReg +CopyFiles = SkyWalker2.CopyDrivers +; KnownFiles = SkyWalker2.KnownFiles + +[SkyWalker2.Device.NT.Services] +Addservice=SkyWalker2TVTuner, 0x00000002, SkyWalker2.AddService + +[SkyWalker2.AddService] +DisplayName=%SkyWalker2.FriendlyName% +ServiceType=1 ; SERVICE_KERNEL_DRIVER +StartType=3 ; SERVICE_DEMAND_START +ErrorControl=1 ; SERVICE_ERROR_NORMAL +ServiceBinary=%10%\System32\Drivers\SkyWalker1TVTuner.sys +LoadOrderGroup=ExtendedBase + +[SkyWalker2.CopyDrivers] +SkyWalker1TVTuner.sys + +[SkyWalker2.AddReg] +HKR,,DevLoader,,*NTKERN +HKR,,NTMPDriver,,SkyWalker1TVTuner.sys +HKR,,PageOutWhenUnopened,3,01 + +[SkyWalker2.Device.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,SkyWalker2.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,SkyWalker2.Tuner.Interfaces + +[SkyWalker2.Device.NT.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,SkyWalker2.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,SkyWalker2.Tuner.Interfaces + +[SkyWalker2.Tuner.Interfaces] +AddReg=SkyWalker2.Tuner.Interfaces.AddReg + +[SkyWalker2.Tuner.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker2.Tuner.FriendlyName% + +[SkyWalker2.Receiver.Interfaces] +AddReg=SkyWalker2.Receiver.Interfaces.AddReg + +[SkyWalker2.Receiver.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker2.Receiver.FriendlyName% + + +[Strings] +;non-localizable +SGI="Plethorasoft" +MfgName="SGI" +SkyWalker2.DeviceDesc="SkyWalker2 BDA TVTuner" +SkyWalker2.Tuner.FriendlyName="SkyWalker2 TV Tuner" +SkyWalker2.Receiver.FriendlyName="SkyWalker2 TV Receiver" +SkyWalker2.Tuner="SkyWalker2.Tuner" +KSProxy.CLSID="{17CCA71B-ECD7-11D0-B908-00A0C9223196}" +KSCATEGORY_BDA_NETWORK_TUNER="{71985F48-1CA1-11d3-9CC8-00C04F7971E0}" +KSCATEGORY_BDA_RECEIVER_COMPONENT="{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}" +SKYWALKER_TUNER="{5C4E764F-AB43-46A9-B21E-8529C70F0A23}" +SKYWALKER_CAPTURE="{0F8F74D9-E524-4D05-BB60-F0C69ACB1756}" + +; +; ServiceType values +SERVICE_KERNEL_DRIVER = 0x00000001 +SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 +SERVICE_ADAPTER = 0x00000004 +SERVICE_RECOGNIZER_DRIVER = 0x00000008 +SERVICE_WIN32_OWN_PROCESS = 0x00000010 +SERVICE_WIN32_SHARE_PROCESS = 0x00000020 +SERVICE_INTERACTIVE_PROCESS = 0x00000100 +SERVICE_INTERACTIVE_SHARE_PROCESS = 0x00000120 + +; StartType values +SERVICE_BOOT_START = 0x00000000 +SERVICE_SYSTEM_START = 0x00000001 +SERVICE_AUTO_START = 0x00000002 +SERVICE_DEMAND_START = 0x00000003 +SERVICE_DISABLED = 0x00000004 + +; ErrorControl values +SERVICE_ERROR_IGNORE = 0x00000000 +SERVICE_ERROR_NORMAL = 0x00000001 +SERVICE_ERROR_SEVERE = 0x00000002 +SERVICE_ERROR_CRITICAL = 0x00000003 + +; Characteristic flags +NCF_VIRTUAL = 0x0001 +NCF_WRAPPER = 0x0002 +NCF_PHYSICAL = 0x0004 +NCF_HIDDEN = 0x0008 +NCF_NO_SERVICE = 0x0010 +NCF_NOT_USER_REMOVABLE = 0x0020 +NCF_HAS_UI = 0x0080 +NCF_MODEM = 0x0100 + +; Registry types +REG_MULTI_SZ = 0x10000 +REG_EXPAND_SZ = 0x20000 +REG_DWORD = 0x10001 + +; Win9x Compatible Types +REG_BINARY = 17 +REG_SZ = 0 + +; Service install flags +SPSVCINST_TAGTOFRONT = 0x1 +SPSVCINST_ASSOCSERVICE = 0x2 \ No newline at end of file diff --git a/firmware-driver/SkyWalker1_Final_Release/Source/Sources b/firmware-driver/SkyWalker1_Final_Release/Source/Sources new file mode 100644 index 0000000..64686ce --- /dev/null +++ b/firmware-driver/SkyWalker1_Final_Release/Source/Sources @@ -0,0 +1,62 @@ +############################################################################# +# Shree Ganesha Inc. +# Sources File for the Skywalker1 TV Tuner +# Date : 29th September, 2009 +# Description : This file is a must for the Compilation of the +# Skywalker Driver. +# +########################################################################## + +TARGETNAME=SkyWalker1TVTuner # Set driver's name +TARGETTYPE=DRIVER # Set type of file built, for example, program, DLL, or driver + # For BDA minidriver, set to DRIVER. +TARGETPATH=obj$(BUILD_ALT_DIR) # Set destination directory for the built file + # Depending on whether your build environment is "free" or "checked", + # the BUILD_ALT_DIR variable appends "fre" or "chk" to the \obj subdirectory. +DRIVERTYPE=WDM # Set type of driver, can be set to either WDM or VXD. + # For BDA, set to WDM. + +# Generate .SYM and .PDB (map) files. These files map names to addresses. +# Required to debug on Win9x. +USE_MAPSYM=1 + +# Point to the header files that the sample source requires. +INCLUDES= \ + $(DDK_INC_PATH); \ + $(DDK_INC_PATH)\wdm; \ + $(SDK_INC_PATH); \ + $(SDK_PATH)\AMovie\Inc; \ + $(INCLUDES) + +# Point to the library files that the sample source requires. +TARGETLIBS= \ + $(DDK_LIB_PATH)\ks.lib \ + $(DDK_LIB_PATH)\ksguid.lib \ + $(DDK_LIB_PATH)\BdaSup.lib \ + $(DDK_LIB_PATH)\usbd.lib + +# The following macros are used with the Soft-ICE debugging tool. +!ifdef BUILD_SOFTICE_SYMBOLS +TARGETPATHEX=$(TARGETPATH)\$(TARGET_DIRECTORY) + +NTTARGETFILES=$(TARGETPATH)\$(TARGETNAME).dbg + +NTTARGETFILES=$(TARGETPATHEX)\$(TARGETNAME).nms $(NTTARGETFILES) +!endif + +# Source files that must be compiled. +SOURCES = SkyWalker1TunerPin.cpp \ + SkyWalker1AntennaPin.cpp \ + SkyWalker1CaptureFilter.cpp \ + SkyWalker1CaptureFilterDefinitions.cpp \ + SkyWalker1CapturePin.cpp \ + SkyWalker1Control.cpp \ + SkyWalker1Device.cpp \ + SkyWalker1Main.cpp \ + SkyWalker1PnP.cpp \ + SkyWalker1TransportPin.cpp \ + SkyWalker1TunerFilter.cpp \ + SkyWalker1TunerFilterDefinitions.cpp \ + SkyWalker1USB.cpp \ + SkyWalker1Utility.cpp + \ No newline at end of file diff --git a/firmware-driver/Skywalker-1 BDA Driver 08172009.zip b/firmware-driver/Skywalker-1 BDA Driver 08172009.zip new file mode 100644 index 0000000000000000000000000000000000000000..056c2c9e867bcfb42cb658e490c090a5f724c7a2 GIT binary patch literal 48970 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 F`#%qO4g&xH literal 0 HcmV?d00001 diff --git a/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1Installer.inf b/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1Installer.inf new file mode 100644 index 0000000..1a42430 --- /dev/null +++ b/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1Installer.inf @@ -0,0 +1,142 @@ +; SkyWalker1Installer.INF -- This file installs SkyWalker1 Driver +; +[Version] +signature="$CHICAGO$" +Class=Media +ClassGUID={4d36e96c-e325-11ce-bfc1-08002be10318} +Provider=%SGI% +CatalogFile=SkyWalker1Installer.cat +DriverVer= 8/17/2009 + +; F i l e c o p y i n g s e c t i o n s (where the files go to). +; +[DestinationDirs] +DefaultDestDir=10,system32\drivers + +[Manufacturer] +%SGI%=SGI + +[ControlFlags] +;ExcludeFromSelect=* +;ExcludeFromSelect.NT=* + +; =================== Generic ================================== + +[SGI] +%SkyWalker1.DeviceDesc%=Skywalker1.Device,USB\VID_09C0&PID_0203 ;SkyWalker1 + +[Skywalker1.Device] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration, KSCAPTUR.Registration, BDA.Installation +AddReg = Skywalker1.AddReg +CopyFiles = Skywalker1.CopyDrivers + +[Skywalker1.Device.NT] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration.NT, KSCAPTUR.Registration.NT, BDA.Installation.NT +;AddReg = Skywalker1.AddReg +CopyFiles = Skywalker1.CopyDrivers +; KnownFiles = Skywalker1.KnownFiles + +[Skywalker1.Device.NT.Services] +Addservice=SkyWalker1TVTuner, 0x00000002, Skywalker1.AddService + +[Skywalker1.AddService] +DisplayName=%SkyWalker1.FriendlyName% +ServiceType=1 ; SERVICE_KERNEL_DRIVER +StartType=3 ; SERVICE_DEMAND_START +ErrorControl=1 ; SERVICE_ERROR_NORMAL +ServiceBinary=%10%\System32\Drivers\SkyWalker1TVTuner.sys +LoadOrderGroup=ExtendedBase + +[Skywalker1.CopyDrivers] +SkyWalker1TVTuner.sys + +[Skywalker1.AddReg] +HKR,,DevLoader,,*NTKERN +HKR,,NTMPDriver,,SkyWalker1TVTuner.sys +HKR,,PageOutWhenUnopened,3,01 + +[Skywalker1.Device.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,Skywalker1.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,Skywalker1.Tuner.Interfaces + +[Skywalker1.Device.NT.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,Skywalker1.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,Skywalker1.Tuner.Interfaces + +[Skywalker1.Tuner.Interfaces] +AddReg=Skywalker1.Tuner.Interfaces.AddReg + +[Skywalker1.Tuner.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker1.Tuner.FriendlyName% + +[Skywalker1.Receiver.Interfaces] +AddReg=Skywalker1.Receiver.Interfaces.AddReg + +[Skywalker1.Receiver.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker1.Receiver.FriendlyName% + + +[Strings] +;non-localizable +SGI="Plethorasoft" +MfgName="SGI" +SkyWalker1.DeviceDesc="SkyWalker1 BDA TVTuner" +SkyWalker1.Tuner.FriendlyName="SkyWalker1 TV Tuner" +SkyWalker1.Receiver.FriendlyName="SkyWalker1 TV Receiver" +SkyWalker1.Tuner="SkyWalker1.Tuner" +KSProxy.CLSID="{17CCA71B-ECD7-11D0-B908-00A0C9223196}" +KSCATEGORY_BDA_NETWORK_TUNER="{71985F48-1CA1-11d3-9CC8-00C04F7971E0}" +KSCATEGORY_BDA_RECEIVER_COMPONENT="{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}" +SKYWALKER_TUNER="{5C4E764F-AB43-46A9-B21E-8529C70F0A23}" +SKYWALKER_CAPTURE="{0F8F74D9-E524-4D05-BB60-F0C69ACB1756}" + +; +; ServiceType values +SERVICE_KERNEL_DRIVER = 0x00000001 +SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 +SERVICE_ADAPTER = 0x00000004 +SERVICE_RECOGNIZER_DRIVER = 0x00000008 +SERVICE_WIN32_OWN_PROCESS = 0x00000010 +SERVICE_WIN32_SHARE_PROCESS = 0x00000020 +SERVICE_INTERACTIVE_PROCESS = 0x00000100 +SERVICE_INTERACTIVE_SHARE_PROCESS = 0x00000120 + +; StartType values +SERVICE_BOOT_START = 0x00000000 +SERVICE_SYSTEM_START = 0x00000001 +SERVICE_AUTO_START = 0x00000002 +SERVICE_DEMAND_START = 0x00000003 +SERVICE_DISABLED = 0x00000004 + +; ErrorControl values +SERVICE_ERROR_IGNORE = 0x00000000 +SERVICE_ERROR_NORMAL = 0x00000001 +SERVICE_ERROR_SEVERE = 0x00000002 +SERVICE_ERROR_CRITICAL = 0x00000003 + +; Characteristic flags +NCF_VIRTUAL = 0x0001 +NCF_WRAPPER = 0x0002 +NCF_PHYSICAL = 0x0004 +NCF_HIDDEN = 0x0008 +NCF_NO_SERVICE = 0x0010 +NCF_NOT_USER_REMOVABLE = 0x0020 +NCF_HAS_UI = 0x0080 +NCF_MODEM = 0x0100 + +; Registry types +REG_MULTI_SZ = 0x10000 +REG_EXPAND_SZ = 0x20000 +REG_DWORD = 0x10001 + +; Win9x Compatible Types +REG_BINARY = 17 +REG_SZ = 0 + +; Service install flags +SPSVCINST_TAGTOFRONT = 0x1 +SPSVCINST_ASSOCSERVICE = 0x2 \ No newline at end of file diff --git a/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1TVTuner.sys b/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker1TVTuner.sys new file mode 100644 index 0000000000000000000000000000000000000000..acf255b87834fc2d3e97c286f044044f14db3543 GIT binary patch literal 105728 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�cx*#)(;B1ke1}7Q9h$_oulYas2 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 Iw@Kjt0nBb>mjD0& literal 0 HcmV?d00001 diff --git a/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker2Installer.inf b/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker2Installer.inf new file mode 100644 index 0000000..959b14d --- /dev/null +++ b/firmware-driver/Skywalker-1 BDA Driver 08172009/SkyWalker2Installer.inf @@ -0,0 +1,142 @@ +; SkyWalker2Installer.INF -- This file installs SkyWalker2 Driver +; +[Version] +signature="$CHICAGO$" +Class=Media +ClassGUID={4d36e96c-e325-11ce-bfc1-08002be10318} +Provider=%SGI% +CatalogFile=SkyWalker2Installer.cat +DriverVer= 8/17/2009 + +; F i l e c o p y i n g s e c t i o n s (where the files go to). +; +[DestinationDirs] +DefaultDestDir=10,system32\drivers + +[Manufacturer] +%SGI%=SGI + +[ControlFlags] +;ExcludeFromSelect=* +;ExcludeFromSelect.NT=* + +; =================== Generic ================================== + +[SGI] +%SkyWalker2.DeviceDesc%=SkyWalker2.Device,USB\VID_09C0&PID_0206 ;SkyWalker2 + +[SkyWalker2.Device] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration, KSCAPTUR.Registration, BDA.Installation +AddReg = SkyWalker2.AddReg +CopyFiles = SkyWalker2.CopyDrivers + +[SkyWalker2.Device.NT] +Include = ks.inf, kscaptur.inf, bda.inf +needs = KS.Registration.NT, KSCAPTUR.Registration.NT, BDA.Installation.NT +;AddReg = SkyWalker2.AddReg +CopyFiles = SkyWalker2.CopyDrivers +; KnownFiles = SkyWalker2.KnownFiles + +[SkyWalker2.Device.NT.Services] +Addservice=SkyWalker2TVTuner, 0x00000002, SkyWalker2.AddService + +[SkyWalker2.AddService] +DisplayName=%SkyWalker2.FriendlyName% +ServiceType=1 ; SERVICE_KERNEL_DRIVER +StartType=3 ; SERVICE_DEMAND_START +ErrorControl=1 ; SERVICE_ERROR_NORMAL +ServiceBinary=%10%\System32\Drivers\SkyWalker1TVTuner.sys +LoadOrderGroup=ExtendedBase + +[SkyWalker2.CopyDrivers] +SkyWalker1TVTuner.sys + +[SkyWalker2.AddReg] +HKR,,DevLoader,,*NTKERN +HKR,,NTMPDriver,,SkyWalker1TVTuner.sys +HKR,,PageOutWhenUnopened,3,01 + +[SkyWalker2.Device.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,SkyWalker2.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,SkyWalker2.Tuner.Interfaces + +[SkyWalker2.Device.NT.Interfaces] +AddInterface=%KSCATEGORY_BDA_RECEIVER_COMPONENT%,%SKYWALKER_CAPTURE%,SkyWalker2.Receiver.Interfaces +AddInterface=%KSCATEGORY_BDA_NETWORK_TUNER%,%SKYWALKER_TUNER%,SkyWalker2.Tuner.Interfaces + +[SkyWalker2.Tuner.Interfaces] +AddReg=SkyWalker2.Tuner.Interfaces.AddReg + +[SkyWalker2.Tuner.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker2.Tuner.FriendlyName% + +[SkyWalker2.Receiver.Interfaces] +AddReg=SkyWalker2.Receiver.Interfaces.AddReg + +[SkyWalker2.Receiver.Interfaces.AddReg] +HKR,,CLSID,,%KSProxy.CLSID% +HKR,,FriendlyName,,%SkyWalker2.Receiver.FriendlyName% + + +[Strings] +;non-localizable +SGI="Plethorasoft" +MfgName="SGI" +SkyWalker2.DeviceDesc="SkyWalker2 BDA TVTuner" +SkyWalker2.Tuner.FriendlyName="SkyWalker2 TV Tuner" +SkyWalker2.Receiver.FriendlyName="SkyWalker2 TV Receiver" +SkyWalker2.Tuner="SkyWalker2.Tuner" +KSProxy.CLSID="{17CCA71B-ECD7-11D0-B908-00A0C9223196}" +KSCATEGORY_BDA_NETWORK_TUNER="{71985F48-1CA1-11d3-9CC8-00C04F7971E0}" +KSCATEGORY_BDA_RECEIVER_COMPONENT="{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}" +SKYWALKER_TUNER="{5C4E764F-AB43-46A9-B21E-8529C70F0A23}" +SKYWALKER_CAPTURE="{0F8F74D9-E524-4D05-BB60-F0C69ACB1756}" + +; +; ServiceType values +SERVICE_KERNEL_DRIVER = 0x00000001 +SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 +SERVICE_ADAPTER = 0x00000004 +SERVICE_RECOGNIZER_DRIVER = 0x00000008 +SERVICE_WIN32_OWN_PROCESS = 0x00000010 +SERVICE_WIN32_SHARE_PROCESS = 0x00000020 +SERVICE_INTERACTIVE_PROCESS = 0x00000100 +SERVICE_INTERACTIVE_SHARE_PROCESS = 0x00000120 + +; StartType values +SERVICE_BOOT_START = 0x00000000 +SERVICE_SYSTEM_START = 0x00000001 +SERVICE_AUTO_START = 0x00000002 +SERVICE_DEMAND_START = 0x00000003 +SERVICE_DISABLED = 0x00000004 + +; ErrorControl values +SERVICE_ERROR_IGNORE = 0x00000000 +SERVICE_ERROR_NORMAL = 0x00000001 +SERVICE_ERROR_SEVERE = 0x00000002 +SERVICE_ERROR_CRITICAL = 0x00000003 + +; Characteristic flags +NCF_VIRTUAL = 0x0001 +NCF_WRAPPER = 0x0002 +NCF_PHYSICAL = 0x0004 +NCF_HIDDEN = 0x0008 +NCF_NO_SERVICE = 0x0010 +NCF_NOT_USER_REMOVABLE = 0x0020 +NCF_HAS_UI = 0x0080 +NCF_MODEM = 0x0100 + +; Registry types +REG_MULTI_SZ = 0x10000 +REG_EXPAND_SZ = 0x20000 +REG_DWORD = 0x10001 + +; Win9x Compatible Types +REG_BINARY = 17 +REG_SZ = 0 + +; Service install flags +SPSVCINST_TAGTOFRONT = 0x1 +SPSVCINST_ASSOCSERVICE = 0x2 \ No newline at end of file diff --git a/firmware-driver/Skywalker-1 BDA Driver 08172009/bdasup.sys b/firmware-driver/Skywalker-1 BDA Driver 08172009/bdasup.sys new file mode 100644 index 0000000000000000000000000000000000000000..8f308e78b3ad994395da2641907b1e6ba900946a GIT binary patch literal 12288 zcmeHN4Rl+@l^)qj{NlVsa*(M2hbWLx7lPNpzshrhomh@dEJu#~0}XaCu@c+yU!?a; z(#BbXtd`fQdVp;UJuO=}l>X6OXqT33*)Ddn8ym#l$ojdp5xpU_}xj%acOJ|IkQ8kUReQ2qa>;KRH@A@>x7B2bu zLiXsqBTM(0YL6^!=;#bM`u%;|{cSytt!=%%eX`?bpTn>8Iy!qDl^eZ|p1yWp-hu_0 z%g#^w|9k&N68Qb${D1uML#;=q>y{(m!TZ;HmLK_<-Yz@xh~5?)`H9}-h_E`W_O$*76qDdA9V;y<^_BOeVv2PQQ){aFPG9Z9a${DN9GtgKm zfgFZxs7)>9j6IpRUFmEO7%~`g74#-U}V2wJnGo>OX`0_M1676yhipoOnvI4Mxu@SX2+UyOtTKQ92wt0z(@ihg9LfY-F z`2&l1mB<@Kr&Sgzf+M1I)PEY)f}ueNOOmqyX~!XvSDMV+ZB_C| z-fQJY)xlVT&&9PE2R?a~**Vv8TL@z2bwb!?lAco=$Ni%8tY5hGgT}_j?16>g_HwM1 zA3ga4Li=EcCU&fCZwoYcG41&fCYn%0;Cu==Cx?LnxF;gofm$U7|3iep7xOwZ)>-e- zlnE`{gQ)@621G5p0ngkup+Z=$aka|K2d#W=lDg^|rwMqAO-+~Y)ye)8vjCG{uwz8z zb)wn;$<>jd)jcKwPoS&X1Z^&N#~@5Ylv_xa5T!L$!}VU0WWkBjR-4)qw+!DyjL#C% zLg{6QC~y(2W5k@$<~q{m%h2Y_{`m<#@}tpBr0x$Pne;JUEfgH9S3PEcHbEzFN7H6at}eOYq0+T~(r ztF4)@CLImr@G5)Qd{3~H$@8^*?IpYhm)*nGNv$^jo7#X~dnvfh&Vt))Ai8;qA)O!a z8o3v263=$x`Ewtghv%GT18Kg&v#sMcVFu59q3WE?H_0_gT#6I%)ZL6-!(BFSQ^BNk zuzAciLA%2;{1dX}YP0l=W%zq|bgr}vlfUL3oAjb(_?rakw_AqqBAC;8OQ||IZW$)? zmR?kq*uWsKw)4gq7w?pwk#FQJqVpo9kvCeM^=8GbDsjG32u%(Y^S>_**IS1^XJ&Fb zZ?W>U(bvtqvQ&^X&o_2ad`BrJK=1o4?x<{i8 z8@-uVS+PTHu*A_{r_&CFi6(Zam$wKQ21p=bFuV?;6xAwgmkG4%v2FFPe9+wtLfmar z#TXvcJu$PiSMZzHt9ylnCrfODVa~u8c%MA^P=TQ zXXH7~L2DAc5n!*rtgiBAV@>?H^cuQ#4kBMZ03sLHRLt9q{8GoEc42yjnkGQZ|M8Lme|N z9W*S)sl@nd+D&ryt%EU|PZparC8qV8u}xg@CNJzI`N9R_+}oAgl^Yy2*8^N|Ldz~q z&{kT)t_i3h9w~qo6JN>|P&Ig3!rh`;t)CJCcgNLgNYw`T3VIQu%P~gF&LuMC*a~r8 zo{LSIT?jzvgq-0u9Bptg#x~1~l3dOsCUpcjh9!{pqTRtkk;$hqwGF6YH@tsjBUVNBCn$BnK`X?K1KG^;<$S(3 z*BkN1u;!zqzfO}z0~!11$cbKAFcQ)RF2Ug#bXm=+sa&ec^`DMr@~T|SGY6_3eLYQG zmjhMlZfC}6Sq~pyFzLiePUn-T+tdfpol_Cz-;q;#7v|;9>^QV+dZ8VN8zu+b;q|tk55Yx7(=kxB@PIiq8QwLnr1AG2MBxEA z6&|Bk$YYrfQex??D-dEVliYFtA&$x6Bt#MogtB9DncAPDLxxS{HbmWRr0NnvGWOrJ zke;W-wTRMd^1H_jK6~SW3h4tao_|8 zWEtjZffd0nmaBu-E~{1y8%ubs-~ns!piOgImA6yHF#5Jx-322#$LeYMI4eW2^`wpb zoS0TbO#UwXi($RA);s@TST9WCZey*w1@Jn%RGk|b<^3z*|1A%nPVdhT9piJkAaCQl zY!ncxjd9g&m23I+bWW))vB>t{Yue~<%+i6RrEe%W;cSTwd>ZR1(KoZcB3B&Y5CVtb zm`!t8*Gbol{#UUXqG|joXcq!et8=0Y&?Z!_Zv2Z^`4D!Yen$K`t8~m?GkBN3GKPK8cbGAu#9l2?=#9CPk09I(Si$pu>ZI5z#-2ZJM4slL$v&X&5eHG+-+B#(JX8P<9Q``Af7h2;&_@7>rCl7LuWGTH#Y3F zSOsj@*Rjb!zR8JT>$u^G*LWkRPHS2)W=?Lr(q@WY2OQc!4smM-xBC4_u@{UutL(}g zUY7%RT<1_N;D*#awl0S*xTyz@egxQ(^GaMx-++FeSk+t~+!w zdJmUDx`!shRRixFbY^NGg-#ae%$_tg_BCQc!^6pChLDQj)vOd5jL26SUi>laQwVA) z--xSJT)IvOWbsW_UUpbr!)p(l)jD&+80bbigV*3G#H)h0;DmIbsab8AP+Jfs)BWDr zVzmq}pi>9|_4AhDdGv^I`zg!tM-ZO#BFpe3InkBQ)?CYQlt8Wdmf<((;d(nc;|cu) zc@6;Sd0w|dbw}VhEngS`AQ5|)-3beJT9mm5U79Jnz`4t1J(@Bk6Vd!9m=z zGx$8!ZHr!kXef-^=t@{EF5MJ0k`I|sif|bX`o@`xpxq^Cu2bB7DtJJYHVXdR5!od} zcgt-xu&b2t-HuRsORI_~Zelu&*R3S%5@?G=E{7RS8Aj5+pt4F{T^Kqfujb{Ycq=YA z7CJPL8ypdug1cgxlFj?$k|HV#f~6qB`^}Pq48&UU7ti^B)ha!A$;g@G(X?w|b2Dw~ zR1TErY!RTucrwyH30czKCU(C19vov#`p^=h=l~l$j$7g!XR8^=x}qK@z2E|m$n<(M zWWh;7ZrrT(xS-nRbc>eYoj`KBt(M^JcrYSNPh<&1Gd!XU8qNVZj5@?#Jcc8=%Ls?9 zO%W*xYQ{-(V&GE5)!ZsI#;`_@S!$fnvn&qjDgQ~-j3>Oy3$D(ue+XjWe&_qHgy1eV_aplLg%!m-U1#bKqgz}0Ibc-4n zqKlE3KvpCDFyA@BYhtjYs`RJ$4Fazb)fPBOfl-i4GWf!MBpkObI4Z!JFpO`ANp4Z; zhtXjL@O~TO%2sZX+}6NOoEV_07G`k^wKry&^@oF%Spp0{2U@z`KClcX;DD5!=5NUJ z!6QNgyFVITz%!6dI9O>FOaNj=EhFfpDQe78wOP*5pcl6gblI$!%5s}OVU#iQR=E6} zeWwIAH}Pk89D}!_yBN1!Biprk+$1le3`}MIgtTAA9E?A!L<;DznBjfA@S(08cm^b+ zh8K|wP;3%B1kw-;2Zw~nIZmQ!u}jA-!>4sA3DT36;kWSUbisxE3J=8V7wLWmd4z3F zejUj={h8oyL9>K@LxXBWX#+O@OZ5ENiEzMl>qlP7T}|bs=*|{imkyrwn`6ptc={^5 z2geW3Qmqgcu3F&@CK7+Ykp3h^<8X`uq!4acHNpR&N8<&P8-gcsdlzJz^I{}LAlG;3 zRXI)njs!o{WXc=T=7=uk)mGkUBeoBdLNYN2Z?sF9GGYillZd@M51yp~Hd!#j-8rE{ zP==hQLXYu7`|Xr6Bqc@P)Gu9zebOPwDSgz`JabiiJT#fS4~Mbxf6b&C-z5-m_O4C)3xYA7{^SR#EaxJ%HK`M6Lb9FW$UK7|xcs|A!!8$3x%(Jr!vM`TEEtp(VFiQzG3rrkh!6HjXkhZc4aHl%hlyz@q15 z=w@K}k0!p;ES<3o-$4rY6iP37k)@P-;REUNF(J2O+u^#>qKknaL_mgsL{E2+A4#Ne zW0W6=mea<>UF))DL?IKJG9Gyt_gnJjF$HT8f@9|30S8ow7!-jRuGjhGIfUqiW3Ct} zGdLJ$GVac}aFez+x6;O$?Kvpcf({a=eLY1>8)i5dlmP2zM_auGzr*nZ?es4VJhQnD!{QH;^vNanj!%h^1gCQtb7pf6^m zy%VRGkx^V4fiWHro!FE4_&Qj^NpeEBeyC>yLmy%}y7VZAf>0>)as5zx6JT9gMjrLG zw+#xGFF%D2D3uPW1S)-8jZVL$d#CMTE50v zmm^=zt8CKPK!(1G=n`zK(SeJ?F3||n=fdD=I%V#9X|K)ycIy^?U{-$FNSw$NL_{8c zYev9)l`bc;GUT6f=nnCW48>S=D|?7G{CITEzw0N;!RgC`w!9J}{QUMW6ph_ zVXPaq3AGS)81=iT7o*+$kMWtSPBVd>K?)!e0weHnEewd(?-7K^ZhOvWz5N8>B-#paQ0 z#u@>WFS=b@?%8>N z&huH{dXkN7+`aSlqDbBSmuKRA%y_4%w&D8?J{_O8kRN@=`ls>IfVVfxz{8gO*piN( zOD!hm_*e|1!;HqU@K58>PeaV$&tVMv*#Go9m=|#?qT_^Ue_Y8x#|NK4E;PRQQe)mE zJ(3m4;jK$%@FtQ zo=6V&Bw(pFkoug&a{!N?sju)HV*oaa9unT4@1U^mU+ILC@fAV2`2On=j&N2)9S_hy zqA=IlW+e@)1Lln%I{tF5Q8||kEg(f0jmV;z7*ICh#f@0&Q<=}G08l( zVcRD7)wY1o+uzw++qZQG&VmiwDz@%aI{nkI#mu#<%J1`e`ue&N37L9)Jw1H`KAa4$ zT@~HU*}t(3K61F7a1)=KCd0l*BLhB}vDbjn(1`=2PwACebwzDn zWo<3%mHPra{Jq_IzFj_82ip*Ui}kem;SX^JZ3tAfx7WzNo`$}SH+R8Xt;JOAr+{zr z5j)gXwY$kJ>p#%?4coFI;A-!b+10={aAq7YY%kz$pMSfr zLXrD=+Q>;ZwB6hd=UPwnQxCY=M-kfr46Gr61mBKOP;oDM<6e-J8&+``cp8I{!=>am!X-M#y-kF2Yenjdo_@6 zx)QN5ImuaNUwR=RP0Y)-;J=G)!cz^~$m;N3ga1`{rt%B(?~wDQ-8z?fs&?YeVzk%l zz2sBO`cKOeuX=MK<}-nw%>1mA^|I}t*2%h=50rb^Hr5BM_u!~Z`0-#Ns#9;*>OUo{ zg=Lx8I^guMe%1#3-QcDTZ!kd=Hz;id-98pT-G(_FI<_C!eSo(C(ut>D;QHBe&`Qo- z2?_yyY$tH1vCd6%EvsY|pk1l2VE|+Oc=JNz{fU`q=32~kvp%aId{U9|xC4$Q>3<*wF6@Co(CE1Mx`WkhCt$!TVUh-(kfs)rs%%zJ;7niOt{fE+hr3Xu&D;+P*TIF0-x2kj1Z&#V6%O$t8 zLz1N*NaK>JOf0*&Yk>dF!i%XW3e5T}@5@!hp I{x2{84K%<|4*&oF literal 0 HcmV?d00001 diff --git a/firmware-driver/Source.zip b/firmware-driver/Source.zip new file mode 100644 index 0000000000000000000000000000000000000000..1edf2fd0ee9fbb94c37ca38d855609c06d0a9466 GIT binary patch literal 305561 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%0AFdWZ*GA8BN(^IDf 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

32N=ZjAgVaFPai^RNLl<-zx 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 =A$^`zX2UQ>)bHLjXb)gJ3Gv#WN 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