рд╕рдмрд╕реЗ рд╕рд░рд▓ WDM рдбреНрд░рд╛рдЗрд╡рд░

рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреЗ рд╕реНрдХреИрди рдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╕реНрдерд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред


рд╕реНрдЯреИрдВрдб рдХреА рддреИрдпрд╛рд░реА


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
  1. рд╡рд┐рдВрдбреЛрдЬ рдбреАрдбреАрдХреЗ (рдЪрд╛рд▓рдХ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдЯ);
  2. VMware рдХрд╛рд░реНрдп рдХреЗрдВрджреНрд░ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЙрдХреНрд╕;
  3. рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА
  4. рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2005;
  5. DDKWizard;
  6. KmdManager
  7. 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 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
рд╡рд┐рдЬрд╝рд╛рд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд░рдг рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП:

рд╕рдм рдХреБрдЫ, рдЬрд┐рд╕ рдорд╢реАрди рдкрд░ рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдПрдВрдЧреЗ, рд╡рд╣ рддреИрдпрд╛рд░ рд╣реИред

рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

рдЕрдм рдЙрд╕ рдорд╢реАрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд▓рд┐рдЦрд┐рдд рдбреНрд░рд╛рдЗрд╡рд░ рдЪрд▓рд╛рдПрдВрдЧреЗред
рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

рд╕рдм рдХреБрдЫ, рдХрд╛рд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдЯрд╛рд╕реНрдХ: рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдкреНрд░реЗрд╕ рдХрд┐рдП рдЧрдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕реНрдХреИрди рдХреЛрдб рдФрд░ рдбрд┐рдмрдЧ рдХреЗ рдЙрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ

рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рд╕реЗ рдХреБрдЫ рдШрдЯрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред
рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:

рдХреНрд▓рд╛рд╕ рдбреНрд░рд╛рдЗрд╡рд░ рд╡реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ 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); 

рдЖрдЗрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:

рдЕрдЧрд▓рд╛, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░реЗрдВред
 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); //   KeWaitForSingleObject(&ktTimer, Executive, KernelMode, FALSE, 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); //DbgPrint("After IoAttachDevice"); RtlFreeUnicodeString(&ustrDeviceName); return status; } VOID DriverUnload(IN PDRIVER_OBJECT theDO) { 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); KeWaitForSingleObject(&ktTimer, Executive, KernelMode, FALSE, NULL); } } } NTSTATUS ReadCompletionRoutine(IN PDEVICE_OBJECT pDeviceObject, IN PIRP theIrp, IN PVOID Context) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension; PKEYBOARD_INPUT_DATA kidData; if (NT_SUCCESS(theIrp->IoStatus.Status)) { 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); } } if(theIrp->PendingReturned) IoMarkIrpPending(theIrp); __asm{ lock dec gnRequests } return theIrp->IoStatus.Status; } NTSTATUS DispatchRead(IN PDEVICE_OBJECT pDeviceObject, IN PIRP theIrp) { __asm{ lock inc gnRequests } IoCopyCurrentIrpStackLocationToNext(theIrp); IoSetCompletionRoutine(theIrp, ReadCompletionRoutine, pDeviceObject, TRUE, TRUE, TRUE); return IoCallDriver(((PDEVICE_EXTENSION) pDeviceObject->DeviceExtension)->pLowerDO ,theIrp); } extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING RegistryPath) { NTSTATUS status = {0}; gnRequests = 0; for (int i = 0; i<IRP_MJ_MAXIMUM_FUNCTION; ++i) { theDriverObject->MajorFunction[i] = DispatchThru; } theDriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead; status = InstallFilter(theDriverObject); theDriverObject->DriverUnload = DriverUnload; return status; } 


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

Source: https://habr.com/ru/post/In146071/


All Articles