рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреЗ рд╕реНрдХреИрди рдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╕реНрдерд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
рд╕реНрдЯреИрдВрдб рдХреА рддреИрдпрд╛рд░реА
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
- рд╡рд┐рдВрдбреЛрдЬ рдбреАрдбреАрдХреЗ (рдЪрд╛рд▓рдХ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдЯ);
- VMware рдХрд╛рд░реНрдп рдХреЗрдВрджреНрд░ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЙрдХреНрд╕;
- рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА
- рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2005;
- DDKWizard;
- KmdManager
- DebugView;
рдореИрдВ рджреЛ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдПрдХ рдкрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рджреВрд╕рд░реЗ рдкрд░ рдЪрд▓рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЬрд┐рд╕ рдорд╢реАрди рдкрд░ рдЖрдк рдбреНрд░рд╛рдЗрд╡рд░ рдЪрд▓рд╛рдПрдВрдЧреЗ, рдЙрд╕рдХреЗ рд▓рд┐рдП 4 рдЬреАрдмреА рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдФрд░ 256 рдПрдордмреА рд░реИрдо рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред
рдХрд╛рд░реНрдпрд╕реНрдерд▓ рд╕реЗрдЯрдЕрдк
DDK рд╕реНрдерд╛рдкрдирд╛
рд╕реНрдерд╛рдкрдирд╛ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╡рд╣ рд╕рдВрд╡рд╛рдж рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдЙрди рдШрдЯрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдиреЛрдЯ рдХрд┐рдП рдЬрд╛рдПрдВред
Microsoft┬о Visual Studio 2005 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
Microsoft┬о Visual Studio 2005 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ DDK рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЬрдм рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдХреЗрд╡рд▓ рджреГрд╢реНрдп C ++ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рдЕрдЧрд▓рд╛, рдЖрдк рд╡рд┐рдЬреБрдЕрд▓ рдЕрд╕рд┐рд╕реНрдЯ рдПрдХреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдРрдб-рдСрди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓реЗрдЦрди рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд┐рдЬреБрдЕрд▓ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдПрдХреНрд╕ рдХреЛ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2005 рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирдпрд╛ VAssistX рдореЗрдиреВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдореЗрдиреВ рдореЗрдВ рдЖрдЧреЗ:
Visual Assist X Options -> Projects -> C/C++ Directories -> Platform: Custom, Show Directories for: Stable include files
ред
Ins
рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдпрд╛ рдЖрдЗрдХрди рдореЗрдВ рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Windows XP рдЯрд╛рдЗрдк
%WXPBASE%\inc\ddk\wxp
ред
DDKWizard рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Visual Studio рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ DDKWizard рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ
ddkwizard.assarbad.net рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕рд╛рдЗрдЯ рд╕реЗ ddkbuild.cmd рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
рд╡рд┐рдЬрд╝рд╛рд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд░рдг рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП:
- рдирд┐рдореНрди рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо (рдЕрдиреБрд╢рдВрд╕рд┐рдд) рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд░ рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рдорд╛рди рдЬреЛ DDK рдХреЗ рд▓рд┐рдП рдкрде рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ
рдбреАрдбреАрдХреЗ рд╕рдВрд╕реНрдХрд░рдг
| рдЪрд░ рдирд╛рдо
| рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрде
|
---|
рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА рдбреАрдбреАрдХреЗ
| WXPBASE
| C: \ WINDDK \ 2600
|
рд╡рд┐рдВрдбреЛрдЬ 2003 рд╕рд░реНрд╡рд░ рдбреАрдбреАрдХреЗ
| WNETBASE
| C: \ WINDDK \ 3790.1830
|
рд╡рд┐рдВрдбреЛрдЬ рд╡рд┐рд╕реНрдЯрд╛ / рд╡рд┐рдВрдбреЛрдЬ 2008 рд╕рд░реНрд╡рд░ рдбрдмреНрд▓реНрдпреВрдбреАрдХреЗ
| WLHBASE
| |
рд╡рд┐рдВрдбреЛрдЬ 7 / рд╡рд┐рдВрдбреЛрдЬ 2008 рд╕рд░реНрд╡рд░ рдЖрд░ 2 рдбрдмреНрд▓реНрдпреВрдбреАрдХреЗ
| W7BASE
| |
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ Windows XP DDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ WXPBASE рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ DDK рдХреЗ рдкрде рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛред рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рд╕реНрдерд╛рдкрдирд╛ рдкрде рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдореВрд▓реНрдп C: \ WINDDK \ 2600 рд╣реЛрдЧрд╛ред
- рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП ddkbuild.cmd рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, DDK рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ C: \ WINDDK \ рд╣реИред
- рдкрде рд╕рд┐рд╕реНрдЯрдо рдЪрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ ddkbuild.cmd рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрде рдЬреЛрдбрд╝реЗрдВред
рд╕рдм рдХреБрдЫ, рдЬрд┐рд╕ рдорд╢реАрди рдкрд░ рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдПрдВрдЧреЗ, рд╡рд╣ рддреИрдпрд╛рд░ рд╣реИред
рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
рдЕрдм рдЙрд╕ рдорд╢реАрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд▓рд┐рдЦрд┐рдд рдбреНрд░рд╛рдЗрд╡рд░ рдЪрд▓рд╛рдПрдВрдЧреЗред
рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- рдбреАрдмрдЧ рд╡реНрдпреВ ( рд▓рд┐рдВрдХ ) рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдФрд░ рдХрд░реНрдиреЗрд▓ рдореЛрдб рджреЛрдиреЛрдВ рдХреЗ рдбрд┐рдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
- KmdManager ( рд▓рд┐рдВрдХ ) - рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб / рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛
рд╕рдм рдХреБрдЫ, рдХрд╛рд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдЯрд╛рд╕реНрдХ: рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдкреНрд░реЗрд╕ рдХрд┐рдП рдЧрдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕реНрдХреИрди рдХреЛрдб рдФрд░ рдбрд┐рдмрдЧ рдХреЗ рдЙрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рд╕реЗ рдХреБрдЫ рдШрдЯрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред
рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:
- рдХреНрд▓рд╛рд╕ рдбреНрд░рд╛рдЗрд╡рд░
- minidriver;
- рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪрд╛рд▓рдХ;
- рдЫрд╛рдирдиреЗ рд╡рд╛рд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░ред
рдХреНрд▓рд╛рд╕ рдбреНрд░рд╛рдЗрд╡рд░ рд╡реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ Microsoft рд▓рд┐рдЦрддрд╛ рд╣реИред рдпреЗ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ!) рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИрдВред
рдорд┐рдиреАрдбреНрд░рд╛рдЗрд╡рд░ рдРрд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪрд╛рд▓рдХ рд╡реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдм рдХреБрдЫ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░ рд╡реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдпрд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдХрд░ рдХрд░рддрд╛ рд╣реИред
рдЕрдкрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ
DriverEntry
рдФрд░
AddDevice
рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
IRP
рд╡рд╣ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд╛рд▓рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рддреЛ, рд╕реНрдХреИрди рдХреЛрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (
рдпрд╣ рдХреНрдпрд╛ рд╣реИ? ) рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
- рд╢реАрд░реНрд╖ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░;
- рдиреАрдЪреЗ рдлрд┐рд▓реНрдЯрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВред
рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдЯреИрдХ рдореЗрдВ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪрд╛рд▓рдХ рд╕реЗ рдКрдкрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдКрдкрд░реА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдХрдо рд╣реИ, рддреЛ, рдирд┐рдореНрди рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░ред
рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░
рд╕рднреА рдЕрдиреБрд░реЛрдз рдКрдкрд░реА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░, рд╕рдВрднрд╡рддрдГ, рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ред
рд╢реАрд░реНрд╖ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реБрдХ рдбреНрд░рд╛рдЗрд╡рд░, рдЬреЛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IpFilterDirver рд╕рд┐рд╕реНрдЯрдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╣реБрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╛рдпрд░рд╡реЙрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрдо рдЕрдиреБрд░реЛрдз рдХрдо рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрд░реЛрдз рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪрд╛рд▓рдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдФрд░ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдордиреНтАНрд╡рдп рд╕рдорд╕реНтАНрдпрд╛рдПрдБ
рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдЬреЛ рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ, рдХрдИ "рд╕рдорд╕реНрдпрд╛" рдЕрдиреБрднрд╛рдЧ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
__asm { lock dec ┬л, ┬╗ }
рдпрд╛
__asm { lock inc ┬л, ┬╗ }
lock
рдЙрдкрд╕рд░реНрдЧ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рдж рдХрдорд╛рдВрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрдорд╛рдВрдб рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдмрд╛рдХреА рдкреНрд░реЛрд╕реЗрд╕рд░реНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрддрд╛ рд╣реИред
рд╢реВрдЯрд░
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ "ntddk.h", "ntddkbd.h" рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
extern "C" { #include "ntddk.h" } #include "ntddkbd.h"
DEVICE_EXTENSION
рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ
typedef struct _DEVICE_EXTENSION{ PDEVICE_OBJECT pLowerDO; } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
pLowerDO
рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╣рдорд╛рд░реЗ рдиреАрдЪреЗ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ IRP рдкреИрдХреЗрдЯ рдХрд┐рд╕реЗ рднреЗрдЬреЗ рдЬрд╛рдПрдБред
рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдкреВрд░реНрдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреАред
int gnRequests;
рдЖрдЗрдП рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдореБрдЦреНрдп рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING ustrRegistryPath)
theDriverObject
- рдбреНрд░рд╛рдЗрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
ustrRegistryPath
- рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЙрд╕ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдирд╛рдо рдЬрд╣рд╛рдВ рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
gnRequests = 0; NTSTATUS status = {0};
рдЕрдЧрд▓рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
for (int i = 0; i<IRP_MJ_MAXIMUM_FUNCTION; ++i) { theDriverObject->MajorFunction[i] = DispatchThru; } theDriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead; theDriverObject->DriverUnload = DriverUnload;
DispatchRead
рдлрд╝рдВрдХреНрд╢рди рд░реАрдб рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рддрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдХреАрдмреЛрд░реНрдб рдХреБрдВрдЬреА рджрдмрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
DriverUnload
рдлрд╝рдВрдХреНрд╢рди рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рд╕реЗ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ
DriverUnload
рдХрд░рддрд╛
DriverUnload
ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, "рд╕реНрдЯреНрд░рд┐рдкрд┐рдВрдЧ" рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рдЕрдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрджрд┐ред
DispatchThru
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реНрдЯрдм рдлрд╝рдВрдХреНрд╢рди рд╣реИред рд╡рд╣ рдЬреЛ рдХрд░рддреА рд╣реИ рд╡рд╣ IRP рдкреИрдХреЗрдЯ рдЕрдЧрд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рджреЗрддреА рд╣реИ (рд╡рд╣ рдбреНрд░рд╛рдЗрд╡рд░ рдЬреЛ рд╕реНрдЯреИрдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрдзреАрди рд╣реИ, рдпрд╛рдиреА
pLowerDO
рд╕реЗ
DEVICE_EXTENSION
)ред
рдЕрдЧрд▓рд╛, рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдЯреИрдХ рдкрд░ рдЕрдкрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:
status = InstallFilter(theDriverObject);
рдореИрдВ рдиреАрдЪреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рд╣рдо
status
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ, рдпрджрд┐
InstallFilter
рдлрд╝рдВрдХреНрд╢рди
InstallFilter
, рддреЛ
STATUS_SUCCESS
рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо
InstallFilter
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ:
NTSTATUS InstallFilter(IN PDRIVER_OBJECT theDO);
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ
\\Device\\KeyboardClass0
рдкрд░ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рддрд╛ рд╣реИ
рдШреЛрд╖рд┐рдд рдЪрд░:
PDEVICE_OBJECT pKeyboardDevice; NTSTATUS status = {0};
pKeyboardDevice
рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рдирдпрд╛ рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
IoCreateDevice
рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ
status = IoCreateDevice(theDO, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, FALSE, &pKeyboardDevice);
рдЖрдЗрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
- рдкрд╣рд▓рд╛ рддрд░реНрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЗрдВрд╕реНрдЯрд╛рд▓рдлрд┐рд▓реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдФрд░ рдирдП рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IoCreateDevice рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдирд╛рдо рд╣реИ
- рдЪреМрдерд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ
- рдкрд╛рдВрдЪрд╡рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣ рдЭрдВрдбреЗ рд╣реИрдВ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рднрдВрдбрд╛рд░рдг рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
- рдЫрдард╛ рдкреИрд░рд╛рдореАрдЯрд░ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд╛рд╢рд┐ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдореИрдирд┐рдкреБрд▓реЗрдЯрд░реНрд╕ рдХреЛ рдЦреЛрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ FALSE рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред
- рд╕рд╛рддрд╡рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣ рдореЗрдореЛрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдЧрд▓рд╛, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░реЗрдВред
pKeyboardDevice->Flags = pKeyboardDevice->Flags | (DO_BUFFERED_IO | DO_POWER_PAGABLE); pKeyboardDevice->Flags = pKeyboardDevice->Flags & ~DO_DEVICE_INITIALIZING;
рд╣рдо рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЭрдВрдбреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рдКрдкрд░ рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЙрд╕ рдЙрдкрдХрд░рдг рдХреЗ рдирд╛рдо рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦ рд░рд╣реЗ рд╣реИрдВред
CCHAR cName[40] = "\\Device\\KeyboardClass0"; STRING strName; UNICODE_STRING ustrDeviceName; RtlInitAnsiString(&strName, cName); RtlAnsiStringToUnicodeString(&ustrDeviceName, &strName, TRUE);
IoAttachDevice
рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреИрдХ рдкрд░ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ
IoAttachDevice
ред
pdx->pLowerDO
рдЕрдЧрд▓реЗ (рдирд┐рдЪрд▓реЗ) рдбрд┐рд╡рд╛рдЗрд╕
pdx->pLowerDO
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
IoAttachDevice(pKeyboardDevice, &ustrDeviceName, &pdx->pLowerDO);
рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдирд╛:
RtlFreeUnicodeString(&ustrDeviceName);
рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде
DispatchRead
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:
NTSTATUS DispatchRead(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
рдЬрдм рдЖрдк рдХреАрдмреЛрд░реНрдб рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рдпрд╛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рд╣рдо рдЕрдкреВрд░реНрдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ
__asm { lock inc gnRequests }
рдЕрдЧрд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
IoCopyCurrentIrpStackLocationToNext
рд╕реНрдореГрддрд┐ рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЕрдЧрд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
IoCopyCurrentIrpStackLocationToNext(theIrp);
рдЬрдм рдХреЛрдИ рдЕрдиреБрд░реЛрдз рд╕реНрдЯреИрдХ рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдвреЗрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
IoSetCompletionRoutine(theIrp, ReadCompletionRoutine, pDeviceObject, TRUE, TRUE, TRUE)
рдЬрд╣рд╛рдБ
ReadCompletionRoutine
рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╣реИред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреНрд░рд╛рдЗрд╡рд░
IRP
:
return IoCallDriver(((PDEVICE_EXTENSION) pDeviceObject->DeviceExtension)->pLowerDO ,theIrp);
рдЕрдм рд╣рдо рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ
IRP
рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк:
NTSTATUS ReadCompletionRoutine(IN PDEVICE_OBJECT pDeviceObject, IN PIRP theIrp, IN PVOID Context);
DEVICE_EXTENSION
:
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
PKEYBOARD_INPUT_DATA
рд╕рдВрд░рдЪрдирд╛
PKEYBOARD_INPUT_DATA
рдЙрдкрдпреЛрдЧ рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
PKEYBOARD_INPUT_DATA kidData;
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реБрдЖ рдпрд╛ рдирд╣реАрдВ
if (NT_SUCCESS(theIrp->IoStatus.Status))
KEYBOARD_INPUT_DATA
рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
IRP
рдкреИрдХреЗрдЯ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдмрдлрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
kidData = (PKEYBOARD_INPUT_DATA)theIrp->AssociatedIrp.SystemBuffer;
рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
int n = theIrp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);
рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:
for(int i = 0; i<n; ++i) DbgPrint("Code: %x\n", kidData[i].MakeCode);
рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ
__asm { lock dec gnRequests }
рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рдПрдВ
return theIrp->IoStatus.Status;
рдЪрд▓реЛ рд╢рдЯрдбрд╛рдЙрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк:
VOID DriverUnload(IN PDRIVER_OBJECT theDO);
DEVICE_EXTENSION
:
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)theDO->DeviceObject->DeviceExtension;
рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:
IoDetachDevice(pdx->pLowerDO);
рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:
IoDeleteDevice(theDO->DeviceObject);
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд▓рдВрдмрд┐рдд рдЕрдиреБрд░реЛрдз рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рдо рдЗрд╕ рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрддрд╛рд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдВрдЬреА рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░реЗрд╕ рдореЗрдВ рдПрдХ рдмреАрдПрд╕рдУрдбреА рд╣реЛрдЧрд╛ред
if (gnRequests != 0) { KTIMER ktTimer; LARGE_INTEGER liTimeout; liTimeout.QuadPart = 1000000; KeInitializeTimer(&ktTimer); , while(gnRequests > 0) { KeSetTimer(&ktTimer, liTimeout, NULL);
рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛрдб:
extern "C" { #include "ntddk.h" } #include "ntddkbd.h" typedef struct _DEVICE_EXTENSION{ PDEVICE_OBJECT pLowerDO; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; int gnRequests; NTSTATUS DispatchThru(PDEVICE_OBJECT theDeviceObject, PIRP theIrp) { IoSkipCurrentIrpStackLocation(theIrp); return IoCallDriver(((PDEVICE_EXTENSION) theDeviceObject->DeviceExtension)->pLowerDO ,theIrp); } NTSTATUS InstallFilter(IN PDRIVER_OBJECT theDO) { PDEVICE_OBJECT pKeyboardDevice; NTSTATUS status = {0}; status = IoCreateDevice(theDO, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, FALSE, &pKeyboardDevice); if (!NT_SUCCESS(status)) { DbgPrint("IoCreateDevice error.."); return status; } pKeyboardDevice->Flags = pKeyboardDevice->Flags | (DO_BUFFERED_IO | DO_POWER_PAGABLE); pKeyboardDevice->Flags = pKeyboardDevice->Flags & ~DO_DEVICE_INITIALIZING; RtlZeroMemory(pKeyboardDevice->DeviceExtension, sizeof(DEVICE_EXTENSION)); PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pKeyboardDevice->DeviceExtension; CCHAR cName[40] = "\\Device\\KeyboardClass0"; STRING strName; UNICODE_STRING ustrDeviceName; RtlInitAnsiString(&strName, cName); RtlAnsiStringToUnicodeString(&ustrDeviceName, &strName, TRUE); IoAttachDevice(pKeyboardDevice, &ustrDeviceName, &pdx->pLowerDO);
makefile:
# # DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV)\makefile.def
рд╕реНрд░реЛрдд:
TARGETNAME=sysfile TARGETPATH=BIN TARGETTYPE=DRIVER SOURCES = DriverMain.cpp
рдбреНрд░рд╛рдЗрд╡рд░ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦреЗрдВ
рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ KmdManager рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдбрд┐рдмрдЧ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, DbgView рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
PS рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддреАрд╕рд░реЗ рд╡рд░реНрд╖ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЕрдм рдореБрдЭреЗ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдХреЛрдИ рд╕рд╡рд╛рд▓ рд╣реИрдВ, рддреЛ рдореИрдВ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдкреАрдкреАрдПрд╕ рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ
рдЗрд╕ рдкрд░UPD: GitHub рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ:
https://github.com/pbespechnyi/simple-wdm-driver