MacOS X рдкрд░ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ USB рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛

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


IOKitред
рдореИрдХрдУрдПрд╕ рдПрдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рдЪреАрдЬ рд╣реИ - рдЖрдИрдУрдХрд┐рдЯ рд░реВрдкрд░реЗрдЦрд╛ред рдпрд╣ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб C ++ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдЪ рд╣реИ, C ++ рд╡рд╣рд╛рдВ рдХреБрдЫ рд╣рдж рддрдХ рдЫреЛрдЯрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ, RTTI, рдЯреЗрдореНрдкрд▓реЗрдЯред рд╢реЗрд╖ рдХрд░реНрдиреЗрд▓ рдореБрдЦреНрдпрддрдГ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
IOKit рдХреЛ рд╕реНрд╡рдпрдВ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдХрд░реНрдиреЗрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ, рдЬрд┐рд╕ рдкрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ IOKit.framework, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ (рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░) рддрдХ рдЖрд╕рд╛рди рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
IOKit рдХреА рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░рдХреГрддрд┐ рдЖрдкрдХреЛ рдЙрдкрдХрд░рдг рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдореЙрдбрд▓ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ: рдПрдХ рдпреВрдПрд╕рдмреА рдбрд┐рд╡рд╛рдЗрд╕ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдПрдХ рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рд╣рдм рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рд╣рдм рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдкреАрд╕реАрдЖрдИ рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорджрд░рдмреЛрд░реНрдб рдЪрд┐рдкрд╕реЗрдЯ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ IOKit рдбреНрд░рд╛рдЗрд╡рд░ рдпрд╛ рддреЛ рдПрдХ рдПрдВрдб рдиреЛрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдпреВрдПрд╕рдмреА рдореЙрдбреЗрдо) рдпрд╛ рдПрдХ рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░) рд╣реИ, рдЬреЛ рдХрд┐ рдРрдкреНрдкрд▓ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдиреВрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
Xcode рдбрд┐рд▓реАрд╡рд░реА рдХрд┐рдЯ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдпреВрдЯрд┐рд▓рд┐рдЯреА IORegExplorer рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ IOKit рдореЙрдбреНрдпреВрд▓ рдХреА рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдирд╛рд▓реЙрдЧ рднреА рд╣реИ - рдЖрдИрдУрдЖрд░рдЬреАред

рдпрд╣ рд▓реЗрдЦ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ IOKit.framework рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдкрд╛рдардХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд░реНрдиреЗрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд▓реЗрдЦ habrahabr.ru/post/36875 , рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХ OS X рдФрд░ iOS рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

USB рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдпреВрдПрд╕рдмреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
#include <IOKit/usb/IOUSBLib.h> 

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо USB рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред IONotificationPortRef рдЬреИрд╕реА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред
IONotificationPortRef рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВ
 IONotificationPortRef notificationPort = IONotificationPortCreate(kIOMasterPortDefault); 

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

рдЕрдм рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдХреМрди рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MacOS X рдмреЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЙрдкрдпреБрдХреНрдд рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрдерд╛рдХрдерд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдВред
 CFMutableDictionaryRef matchDict = (CFMutableDictionaryRef) CFRetain(IOServiceMatching(kIOUSBDeviceClassName)); 

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ IOServiceMatching рд╣реИ, рдЬреЛ USB рдХреНрд▓рд╛рд╕ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ, рдЬреЛ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ)ред рдЕрдЧрд▓рд╛, рд╣рдо CFRetain рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ "рд▓реЗрддреЗ рд╣реИрдВ"ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ IOKit рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдбрдмрд▓ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рди рд╣реЛред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЦреБрдж рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрднреА рднреА рдвреЗрд░ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ (рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рдкреНрдд * рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП CFRelease рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрд╢рд╛ рдЬрд╛рдБрдЪреЗрдВ, рд╣реМрд╕рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП / рд╣реМрд╕рд▓реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП * NULL рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдврд╛рдВрдЪреЗ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦреЗрдВ рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХреЗрдд рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рдЗрд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ "рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреЛрд░реНрдЯ рдкрд░" рдореЗрд▓ рдХрд░реЗрдВ, рдорд┐рд▓рд╛рди рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ IOServiceAddMatchingNotification рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЧреМрд░ рд╕реЗ рджреЗрдЦрд┐рдП

 kern_return_t IOServiceAddMatchingNotification( IONotificationPortRef notifyPort, const io_name_t notificationType, CFDictionaryRef matching, IOServiceMatchingCallback callback, void *refCon, io_iterator_t *notification ); 


рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЛрд░реНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред
рджреВрд╕рд░рд╛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреИрд╕реЗ kIOTerminatedNotification , kIOMatchedNotification , kIOFirstMatchNotification ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рд╛рди рд╢рдмреНрджрдХреЛрд╖ рд╣реА рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реАрдПрдлрдЖрд░рдбрд┐рдпрд░ рд░реАрдл рд╣реИред рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ CFMutableDictionaryRef рдЖрд╕рд╛рдиреА рд╕реЗ CF рдврдВ рдЧ рдХреА рдУрд░ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред
рдЪреМрдерд╛ рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдпрд╣ рдХреЙрд▓рдмреИрдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛ рдЖрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдоред
рдкрд╛рдВрдЪрд╡рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ refCon рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдпрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрддрд┐рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рддрд░реНрдХ рдХреЛ IOServiceAddMatchingNotification рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рднреА рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╕рдлрд▓, IOServiceAddMatchingNotification рд╢реВрдиреНрдп рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдбред

рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
typedef void (*IOServiceMatchingCallback)(void *refcon, io_iterator_t iterator);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди IOServiceAddMatchingNotification рд╕реЗ рдЕрдВрддрд┐рдо рджреЛ рддрд░реНрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд╣рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

 void usb_device_added(void* refcon, io_iterator_t iterator) { } void usb_device_removed(void* refcon, io_iterator_t iterator) { } 


рдФрд░ рдЕрдм, рдЕрдВрдд рдореЗрдВ, рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред

 kern_return_t result; io_iterator_t deviceAddedIter; io_iterator_t deviceRemovedIter; result = IOServiceAddMatchingNotification(notificationPort, kIOMatchedNotification, matchDict, usb_device_added, NULL, &deviceAddedIter); ... result = IOServiceAddMatchingNotification(notificationPort, kIOTerminatedNotification, matchDict, usb_device_removed, NULL, &deviceRemovedIter); 


рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ IOServiceAddMatchingNotification рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдЕрдм рд╣рдореЗрдВ рдПрдХ рд▓реВрдк рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╢реНрд░реЛрддрд╛ рд╕реНрдкрд┐рди рдХрд░реЗрдЧрд╛ред MacOS X рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - CFRunLoopред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддрдерд╛рдХрдерд┐рдд рд╕реНрд░реЛрдд рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдЗрд╕реЗ рдРрд╕реЗ рдХрд░реЗрдВ:
 CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode); 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖ IONotificationPortGetRunLoopSource рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реНрд░реЛрдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд╕реВрдЪрдирд╛ рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреНрд░реАрдо CFRunPopGetCurrent ()

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

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

рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╕рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:
 CFRunLoopRemoveSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode); IONotificationPortDestroy(notificationPort); 


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

 void iterate_usb_devices(io_iterator_t iterator) { io_service_t usbDevice; while ((usbDevice = IOIteratorNext(iterator))) { .... IOObjectRelease(usbDevice); } } 


рдпрд╣рд╛рдВ рд╣рдо рдкрд╛рд░рд┐рдд рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдФрд░ IOIteratorNext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ IOObjectRelease рдореЗрдВ рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ usbDevice рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕реНрд░реЛрдд рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

 io_name_t devicename; if (IORegistryEntryGetName(usbDevice, devicename) != KERN_SUCCESS) == KERN_SUCCESS) { printf("Device name: %s\n", devicename); } 


рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ, рддреЛ рдПрдХ рдкрдардиреАрдп рдбрд┐рд╡рд╛рдЗрд╕ рдирд╛рдо, рдЬреИрд╕реЗ рдХрд┐ "рдиреЛрд╡рдЯреЗрд▓ рд╡рд╛рдпрд░рд▓реЗрд╕ рдореЙрдбреЗрдо," рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред io_name_t рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдЪрд╛рд░ рд╕рд░рдгреА рд╣реИред

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, IOKit рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреВрд░реНрдг рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:

 io_name_t entrypath; if (IORegistryEntryGetPath(usbDevice, kIOServicePlane, entrypath) == KERN_SUCCESS) { printf("\tDevice entry path: %s\n", entrypath); } 


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

 CFNumberRef vendorId = (CFNumberRef) IORegistryEntrySearchCFProperty(usbDevice , kIOServicePlane , CFSTR("idVendor") , NULL , kIORegistryIterateRecursively | kIORegistryIterateParents); 


рдпрд╣ рд╡рд┐рдзрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "idVendor" (CFSTR рдПрдХ MacOS X рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЬрд▓реНрджреА рд╕реЗ C-string рдХреЛ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ CFStringRef рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ)

IORegistryEntrySearchCFProperty рдпрджрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ CFNumberRef рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реИ, рдпрд╛ рдЖрдк рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╕реВрдЪрдХ рдХреЛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред CFNumberRef рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 int result; if (CFNumberGetValue(vendorId, kCFNumberSInt32Type, &result)) { printf("VendorID: %i\n", result); } 


"ProductID" рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдХреБрдВрдЬреА "idProduct" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдмреЗрд╢рдХ, рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдЗрд╕реА рдХреБрдВрдЬреА рдХреА рд╕реВрдЪреА рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рддрдХ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░рд╢реНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдЗрд╕ рдЙрдкрдХрд░рдг рдореЗрдВ рдХреМрди рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдХрд┐рд╕ рдХреБрдВрдЬреА рдХреЛ рджреЗрдЦрдирд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ?
рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 CFMutableDictionaryRef properties; IORegistryEntryCreateCFProperties(usbDevice, &properties, kCFAllocatorDefault, 0); 


рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ / рдореВрд▓реНрдпреЛрдВ рд╕реЗ рднрд░рд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, CFShow рдлреНрд░реЗрдорд╡рд░реНрдХред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА, CFShow MacOS X рдореЗрдВ рдХрд┐рд╕реА рднреА CoreFoundation рдлреНрд░реЗрдорд╡рд░реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡рд┐рдзрд┐ рд╣реИ - CFMutableDictionaryRef, CFStringRef, CFNumberRef, рдЖрджрд┐ред рдЙрддреНрдкрд╛рджрди stderr рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рд╢рдмреНрджрдХреЛрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 CFShow(properties); 


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

рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЖрд╡реЗрджрдиред
рдЕрдм рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЖрд╡реЗрджрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рд╣реИред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ Ctrl-C рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдиреЛрдЯ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХрднреА рднреА рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВ, рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕рдВрджреЗрд╢ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ

 #include <IOKit/usb/IOUSBLib.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> static IONotificationPortRef notificationPort; void usb_device_added(void* refcon, io_iterator_t iterator); void usb_device_removed(void* refcon, io_iterator_t iterator); void init_notifier() { notificationPort = IONotificationPortCreate(kIOMasterPortDefault); CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode); printf("init_notifier ---> Ok\n"); } void configure_and_start_notifier() { printf("Starting notifier...\n\n"); CFMutableDictionaryRef matchDict = (CFMutableDictionaryRef) CFRetain(IOServiceMatching(kIOUSBDeviceClassName)); if (!matchDict) { fprintf(stderr, "Failed to create matching dictionary for kIOUSBDeviceClassName\n"); return; } kern_return_t addResult; io_iterator_t deviceAddedIter; addResult = IOServiceAddMatchingNotification(notificationPort, kIOMatchedNotification, matchDict, usb_device_added, NULL, &deviceAddedIter); if (addResult != KERN_SUCCESS) { fprintf(stderr, "IOServiceAddMatchingNotification failed for kIOMatchedNotification\n"); return; } usb_device_added(NULL, deviceAddedIter); io_iterator_t deviceRemovedIter; addResult = IOServiceAddMatchingNotification(notificationPort, kIOTerminatedNotification, matchDict, usb_device_removed, NULL, &deviceRemovedIter); if (addResult != KERN_SUCCESS) { fprintf(stderr, "IOServiceAddMatchingNotification failed for kIOTerminatedNotification\n"); return; } usb_device_removed(NULL, deviceRemovedIter); CFRunLoopRun(); } void deinit_notifier() { CFRunLoopRemoveSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode); IONotificationPortDestroy(notificationPort); printf("deinit_notifier ---> Ok\n"); } void signal_handler(int signum) { printf("\ngot signal, signnum=%i stopping current RunLoop\n", signum); CFRunLoopStop(CFRunLoopGetCurrent()); } void init_signal_handler() { signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); signal(SIGTERM, signal_handler); } int main() { init_signal_handler(); init_notifier(); configure_and_start_notifier(); deinit_notifier(); return 0; } void print_cfstringref(const char* prefix, CFStringRef cfVal) { char* cVal = malloc(CFStringGetLength(cfVal) * sizeof(char)); if (!cVal) { return; } if (CFStringGetCString(cfVal, cVal, CFStringGetLength(cfVal) + 1, kCFStringEncodingASCII)) { printf("%s %s\n", prefix, cVal); } free(cVal); } void print_cfnumberref(const char* prefix, CFNumberRef cfVal) { int result; if (CFNumberGetValue(cfVal, kCFNumberSInt32Type, &result)) { printf("%s %i\n", prefix, result); } } void get_usb_device_info(io_service_t device, int newdev) { io_name_t devicename; io_name_t entrypath; io_name_t classname; if (IORegistryEntryGetName(device, devicename) != KERN_SUCCESS) { fprintf(stderr, "%s unknown device (unable to get device name)\n", newdev ? "Added " : " Removed"); return; } printf("USB device %s: %s\n", newdev ? "FOUND" : "REMOVED", devicename); if (IORegistryEntryGetPath(device, kIOServicePlane, entrypath) == KERN_SUCCESS) { printf("\tDevice entry path: %s\n", entrypath); } if (IOObjectGetClass(device, classname) == KERN_SUCCESS) { printf("\tDevice class name: %s\n", classname); } CFStringRef vendorname = (CFStringRef) IORegistryEntrySearchCFProperty(device , kIOServicePlane , CFSTR("USB Vendor Name") , NULL , kIORegistryIterateRecursively | kIORegistryIterateParents); if (vendorname) { print_cfstringref("\tDevice vendor name:", vendorname); } CFNumberRef vendorId = (CFNumberRef) IORegistryEntrySearchCFProperty(device , kIOServicePlane , CFSTR("idVendor") , NULL , kIORegistryIterateRecursively | kIORegistryIterateParents); if (vendorId) { print_cfnumberref("\tVendor id:", vendorId); } CFNumberRef productId = (CFNumberRef) IORegistryEntrySearchCFProperty(device , kIOServicePlane , CFSTR("idProduct") , NULL , kIORegistryIterateRecursively | kIORegistryIterateParents); if (productId) { print_cfnumberref("\tProduct id:", productId); } printf("\n"); } void iterate_usb_devices(io_iterator_t iterator, int newdev) { io_service_t usbDevice; while ((usbDevice = IOIteratorNext(iterator))) { get_usb_device_info(usbDevice, newdev); IOObjectRelease(usbDevice); } } void usb_device_added(void* refcon, io_iterator_t iterator) { iterate_usb_devices(iterator, 1); } void usb_device_removed(void* refcon, io_iterator_t iterator) { iterate_usb_devices(iterator, 0); } 


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рдВрдХрд▓рди рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
gcc usbnotify.c -framework IOKit -framework Foundation -o notifier
рдпрд╛
clang usbnotify.c -framework IOKit -framework Foundation -o notifier
рджреЛрдиреЛрдВ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

рдиреАрдЪреЗ рдЖрдк рдХрдиреЗрдХреНрдЯ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ











рд╕рдВрджрд░реНрдн:
goo.gl/LRyIr
goo.gl/O1Oyk
goo.gl/NQUtL
goo.gl/daEiS
goo.gl/7jkUs
goo.gl/yeJre
www.amazon.com/OS-X-iOS-Kernel-Programming/dp/1430235365
habrahabr.ru/post/36875

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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


All Articles