рдЧрд╛рд░реНрдЬреЗрдВрдЯ рдХреБрдВрдЬреА рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛

рдЬрдм рдЧрд╛рд░реНрдбреЗрдВрдЯ рд╕реБрд░рдХреНрд╖рд╛ рдХреБрдВрдЬреА (рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдореЙрдбрд▓) рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЙрдкрдпреБрдХреНрдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдЙрд╕рд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ, рд╡рд┐рдирд┐рдордп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдкрд░ рдПрдХ рд╡реИрдз рдбрд┐рд╡рд╛рдЗрд╕ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдЧреЗрдЯрд╡реЗ рдкрддреЗ (рддрдерд╛рдХрдерд┐рдд рдЧрд╛рд░реНрдбреЗрдВрдЯрд╣реИрдВрдбрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдХрд╛рдо рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕ рдЧреЗрдЯрд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдореБрд▓реЗрдЯрд░ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрд╛рд░реНрдбреЗрдВрдЯ рдЪреБрдкрдХреЗ II рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ) рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдХреБрдВрдЬреА рдпрд╛ рдЗрд╕рдХреЗ рдЕрдиреБрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдирд┐рдпрдд рд╕рдордп рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛ рдЧрдпрд╛: "рднреМрддрд┐рдХ рдХреБрдВрдЬреА рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?", рдореБрдЭреЗ " USB рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдкреНрд░реИрдХреНрдЯрд┐рд╕ рдСрдлрд╝ рдпреВрдЬрд╝ рдПрдВрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ " рдкреБрд╕реНрддрдХ рдореЗрдВ рдкрд╛рд╡реЗрд▓ рдПрдЧреНрд░реЛрд╡ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝рд╛ рдЙрддреНрдХреГрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рддреАрди-рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА "рдЬрд╛рджреВ" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВред

рдирддреАрдЬрддрди, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдореВрд▓ рд╕рдВрд░рдХреНрд╖рдХ рдПрдкреАрдЖрдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреЗрд╡рд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╣реА рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ рдФрд░ рдХрдВрдкрдиреА рдПрд╕реЗрдЯ рдХрд╛ рддрдХрдиреАрдХреА рд╕рдорд░реНрдерди рднреА рдЧрд╛рд░реНрдбреЗрдВрдЯ рдХреБрдВрдЬреА рдХреЗ рдРрд╕реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдкрдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдФрд░ рд╣рд╛рдВ, рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдпрд╣ рд╕рднреА рдХреЛрдб рдмрд╕ рдЧрд╛рд░реНрдбреЗрдВрдЯ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЕрдм рддрдХ, 27 рдЕрдкреНрд░реИрд▓, 2013 рдХреЛ, рдпрд╣ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдкрд░ рд╕рдВрд╕реНрдХрд░рдг 5.31.78 рд╕реЗ рдЪрд╛рд▓реВ рд╡рд░реНрддрдорд╛рди 6.00.101 рддрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧреА:
  1. Via SetupDiGetClassDevsA () рдореЗрдВ рд╣рдореЗрдВ рдЙрдкрд╕реНрдерд┐рдд рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред
  2. рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ GUID рдХреА рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдЧрд╛рд░реНрдбреЗрдВрдЯ рдХреБрдВрдЬреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред (рд╕рдВрд░рдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ {C29CC2E3-BC48-4B74-9043-2C6413FFA848484) рд╣реИ
  3. рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ SPDRP_PHYSICAL_DEVICE_OBJECT_NAME рдХреЗ тАЛтАЛрд╕рд╛рде SetupDiGetDeviceRegistryPropertyA () рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
  4. рдЖрдЗрдП рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЦреЛрд▓реЗрдВ ZwOpenFile () (CreateFile () рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдЖрдПрдВрдЧреА)ред

рдЕрдм, рдЧрд╛рд░реНрдб рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЫрджреНрдо-рд╕рдВрднрд╛рд▓ (рдЧреЗрдЯрд╡реЗ) рдХреЗ рдмрдЬрд╛рдп, рд╣рд╛рде рдкрд░ рдЕрд╕рд▓реА рдХреБрдВрдЬреА рд╕рдВрднрд╛рд▓рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реА IOCTL рдЕрдиреБрд░реЛрдз рдХреЛ рднреЗрдЬрдХрд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдЪ рд╣реИ, рдПрдХ рдорд╛рдореВрд▓реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИред

рдЧрд╛рд░реНрдЬреЗрдВрдЯ рд╕реНрдЯреАрд▓реНрде III рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдХреЗ рд╕рд╛рде, рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, IOCTL рдЕрдиреБрд░реЛрдз рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрдлрд╝рд░реНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓ рдЧрдИ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдХреБрдВрдЬреА рджреЛрдиреЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдВрддрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, IOCTL рд╕реНрдерд┐рд░рд╛рдВрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

GetDongleQueryRecordIOCTL = $E1B20008; GetDongleQueryRecordExIOCTL = $E1B20018; 

рдЧрд╛рд░реНрдЬреЗрдВрдЯ рдЪреБрдкрдХреЗ I / II рд╕реЗ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛
рд╕рдВрд░рдХреНрд╖рдХ рдЪреБрдкрдХреЗ III рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ (рд╕рд╛рдЗрди / рдЯрд╛рдЗрдо / рдлреНрд▓реИрд╢ / рдХреЛрдб)

рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╕рдордп, рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдлрд░ рдХреЛ рд╣рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ:

  TDongleQueryRecord = packed record dwPublicCode: DWord; // Public code byHrwVersion: Byte; //    byMaxNetRes: Byte; //    wType: WORD; //    dwID: DWord; // ID  byNProg: Byte; //   byVer: Byte; //  wSN: WORD; //   wMask: WORD; //   wGP: WORD; //   GP/  wRealNetRes: WORD; //   , .. <= byMaxNetRes dwIndex: DWord; //     end; 

рдирдИ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдФрд░ рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╕реЗ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдмрдлрд░ рдЦрд╛рд▓реА (рдЪрдордХрддрд╛ рд╣реБрдЖ) рдЖрдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдирдИ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдХреБрдЫ рдЕрд▓рдЧ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдПрдЧрд╛:

  TDongleQueryRecordEx = packed record Unknown0: array [0..341] of Byte; wMask: WORD; //   wSN: WORD; //   byVer: Byte; //  byNProg: Byte; //   dwID: DWORD; // ID  wType: WORD; //    Unknown1: array [354..355] of Byte; dwPublicCode: DWORD; Unknown2: array [360..375] of Byte; dwHrwVersion: DWORD; //   dwProgNumber: DWORD; //   Unknown3: array [384..511] of Byte; end; 

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

рд╕реНрдерд╛рдкрд┐рдд рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 procedure TEnumDonglesEx.Update; var dwRequired: DWord; hAllDevices: H_DEV; dwInfo: DWORD; Data: SP_DEVINFO_DATA; Buff: array [0 .. 99] of AnsiChar; hDeviceHandle: THandle; US: UNICODE_STRING; OA: OBJECT_ATTRIBUTES; IO: IO_STATUS_BLOCK; NTSTAT, dwReturn: DWORD; DongleQueryRecord: TDongleQueryRecord; DongleQueryRecordEx: TDongleQueryRecordEx; begin SetLength(FDongles, 0); DWord(hAllDevices) := INVALID_HANDLE_VALUE; try if not InitSetupAPI then Exit; UpdateUSBDevices; hAllDevices := SetupDiGetClassDevsA(nil, nil, 0, DIGCF_PRESENT or DIGCF_ALLCLASSES); if DWord(hAllDevices) <> INVALID_HANDLE_VALUE then begin FillChar(Data, Sizeof(SP_DEVINFO_DATA), 0); Data.cbSize := Sizeof(SP_DEVINFO_DATA); dwInfo := 0; while SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) do begin dwRequired := 0; FillChar(Buff[0], 100, #0); if SetupDiGetDeviceRegistryPropertyA(hAllDevices, @Data, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, nil, @Buff[0], 100, @dwRequired) then if CompareGuid(Data.ClassGuid, GrdGUID) then begin RtlInitUnicodeString(@US, StringToOleStr(string(Buff))); FillChar(OA, Sizeof(OBJECT_ATTRIBUTES), #0); OA.Length := Sizeof(OBJECT_ATTRIBUTES); OA.ObjectName := @US; OA.Attributes := OBJ_CASE_INSENSITIVE; NTSTAT := ZwOpenFile(@hDeviceHandle, FILE_READ_DATA or SYNCHRONIZE, @OA, @IO, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT); if NTSTAT = STATUS_SUCCESS then try if DeviceIoControl(hDeviceHandle, GetDongleQueryRecordIOCTL, nil, 0, @DongleQueryRecord, SizeOf(TDongleQueryRecord), dwReturn, nil) and (DongleQueryRecord.dwID <> 0) then begin SetLength(FDongles, Count + 1); FDongles[Count - 1].Data := DongleQueryRecord; FDongles[Count - 1].PnPParentPath := GetPnP_ParentPath(Data.DevInst); Inc(dwInfo); Continue; end; Move(FlashBuffer[0], DongleQueryRecordEx.Unknown0[0], 512); if DeviceIoControl(hDeviceHandle, GetDongleQueryRecordExIOCTL, @DongleQueryRecordEx.Unknown0[0], SizeOf(TDongleQueryRecordEx), @DongleQueryRecordEx.Unknown0[0], SizeOf(TDongleQueryRecordEx), dwReturn, nil) then begin DongleQueryRecordEx.wMask := htons(DongleQueryRecordEx.wMask); DongleQueryRecordEx.wSN := htons(DongleQueryRecordEx.wSN); DongleQueryRecordEx.dwID := htonl(DongleQueryRecordEx.dwID); DongleQueryRecordEx.dwPublicCode := htonl(DongleQueryRecordEx.dwPublicCode); DongleQueryRecordEx.wType := htons(DongleQueryRecordEx.wType); SetLength(FDongles, Count + 1); ZeroMemory(@DongleQueryRecord, SizeOf(DongleQueryRecord)); DongleQueryRecord.dwPublicCode := DongleQueryRecordEx.dwPublicCode; DongleQueryRecord.dwID := DongleQueryRecordEx.dwID; DongleQueryRecord.byNProg := DongleQueryRecordEx.byNProg; DongleQueryRecord.byVer := DongleQueryRecordEx.byVer; DongleQueryRecord.wSN := DongleQueryRecordEx.wSN; DongleQueryRecord.wMask := DongleQueryRecordEx.wMask; DongleQueryRecord.wType := DongleQueryRecordEx.wType; FDongles[Count - 1].Data := DongleQueryRecord; FDongles[Count - 1].PnPParentPath := GetPnP_ParentPath(Data.DevInst); end; finally ZwClose(hDeviceHandle); end; end; Inc(dwInfo); end; end; finally if DWord(hAllDevices) <> INVALID_HANDLE_VALUE then SetupDiDestroyDeviceInfoList(hAllDevices); end; end; 

рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ TDongleQueryRecord рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджрд░реНрдЬ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд╛рд░реНрдбреЗрдВрдЯ рдПрдкреАрдЖрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдпрд╣ рдХреЛрдб рдПрдХ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХреНрдб рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рддрд╣рдд рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдпрдорд┐рдд рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЧреБрдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рдХреЙрд▓ рднреА рдкреНрд░реЗрд╖рд┐рдд рдФрд░ рдкреНрд░рд╛рдкреНрдд рдмрдлрд╝рд░реНрд╕ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЧрд╛рд░реНрдбреЗрдВрдЯ рдПрд╕рдбреАрдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдорд╛рдирд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдХреЛрдб рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐) рдирддреАрдЬрддрди, рдХреБрдВрдЬреА рд╡рд┐рдирд┐рдордп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣рд╛рдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)ред

рд▓реЗрдХрд┐рди рдЪрд▓реЛ рд╡рд┐рдЪрд▓рд┐рдд рди рд╣реЛрдВ, рдЖрдкрдиреЗ рд╕рдВрднрд╡рддрдГ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ GetPnP_ParentPath () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд░реВрдЯ рд╕реЗ рдкреВрд░реНрдг рдкрде рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

  function GetPnP_ParentPath(Value: DWORD): string; var hParent: DWORD; Buffer: array [0..1023] of AnsiChar; Len: ULONG; S: string; begin Result := ''; if CM_Get_Parent(hParent, Value, 0) = 0 then begin Len := Length(Buffer); CM_Get_DevNode_Registry_PropertyA(hParent, 15, nil, @Buffer[0], @Len, 0); S := string(PAnsiChar(@Buffer[0])); while CM_Get_Parent(hParent, hParent, 0) = 0 do begin Len := Length(Buffer); CM_Get_DevNode_Registry_PropertyA(hParent, 15, nil, @Buffer[0], @Len, 0); S := string(PAnsiChar(@Buffer[0])); Result := S + '#' + Result; end; end; if Result = '' then Result := ' '; end; 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рдЖрдк рд╣рдБрд╕реЗрдВрдЧреЗ) рдЗрд╕ рд░реЗрдЦрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдорддреМрд░ рдкрд░, рдбрд┐рд╡рд╛рдЗрд╕ рдкрде рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
\ рдбрд┐рд╡рд╛рдЗрд╕ \ 00000004 # \ рдбрд┐рд╡рд╛рдЗрд╕ \ 00000004 # \ рдбрд┐рд╡рд╛рдЗрд╕ \ 00000044 # \ рдбрд┐рд╡рд╛рдЗрд╕ \ 00000049 # \ рдбрд┐рд╡рд╛рдЗрд╕ \ NTPNP_PCI0005 # \ рдбрд┐рд╡рд╛рдЗрд╕ \ USBPDO-3 #

рдХрдо рд╕реЗ рдХрдо рдкрд╛рда NTPNP_PCI рдпрд╛ USBPDO рдЗрд╕рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдЧрд╛ред
рдпрд╛рдиреА рдкреАрд╕реАрдЖрдИ рдмрд╕ рдпрд╛ рдПрдЪрд╕реАрдбреА рд╣рдм рдХрдо рд╕реЗ рдХрдо рдкреВрд░реНрд╡рдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛ред
рдХреНрдпреЛрдВрдХрд┐ рдПрдореБрд▓реЗрдЯрд░ рдЕрднреА рднреА рдПрдХ рдЖрднрд╛рд╕реА рдЙрдкрдХрд░рдг рд╣реИ, рдЗрд╕рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
\ рдбрд┐рд╡рд╛рдЗрд╕ \ 00000040 # \ рдбрд┐рд╡рд╛рдЗрд╕ \ 00000040

рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  function IsDonglePresent(const Value: string): Boolean; begin Result := Pos('NTPNP_PCI', Value) > 0; if not Result then Result := Pos('USBPDO', Value) > 0; end; 

рдЦреИрд░, рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдФрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ рдЖрд▓реЗрдЦ рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЗрдореЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ:
рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдЭреВрдареА / рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧреА рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЗ рдПрдиреАрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: http://www.digi.com/products/usb/anywhereusb#overview

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реАрдЬрд┐рдПред

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


All Articles