Для быстрого ознакомления вы можете найти заголовки на сайте Apple с открытым исходным кодом, но ориентироваться на нем сложно, особенно поскольку заголовки находятся в разных местах в зависимости от версии ОС, которую вы хотите проверить. Во всех случаях я обнаружил, что он определен в SecBase.h
. Например, вот последний macOS.
И там вы получаете это:
typedef struct CF_BRIDGED_TYPE(id) SECTYPE(SecKeychainItem) *SecKeychainItemRef;
Поэтому вам, вероятно, понадобятся другие заголовки для отслеживания точных полей структуры. Лучший способ сделать это — установить XCode с фреймворками для нужной вам ОС, и вы получите заголовки в своей локальной системе. Например:
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/*.platform/Developer/SDKs/*.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator9.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator2.2.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/System/Library/Frameworks/Security.framework/Headers/SecBase.h
Однако у меня нет хорошего решения с онлайн-документами.
Другой способ, из памяти, который был более полезен для задачи воссоздания структуры в Java для JNA, заключался бы в создании минимальной программы C (но я не уверен, как это сделать в macOS, связав с инфраструктурой безопасности, возможно, вы do) и передайте его gdb для печати макета структуры, используя ptype
:
(gdb) whatis v
type = struct complex
(gdb) ptype v
type = struct complex {
double real;
double imag;
}
Но, как отмечено в комментариях, если мы попробуем это здесь, мы получим это:
(gdb) ptype SecKeychainItemRef
type = struct OpaqueSecKeychainItemRef {
<incomplete type>
}
Боюсь, этот символ добровольно сделан непрозрачным... Подтверждено Бренданом в комментариях:
каждый тип macOS, который я могу придумать, который заканчивается на Ref
, является непрозрачным типом (на самом деле указателем), предназначенным только для передачи функциям
Вот сеанс отладки с Xcode:
13.05.2017
gcc -framework Security
. 13.05.2017ptype SecKeychainItemRef
, но все, что я получил, былоtype = struct OpaqueSecKeychainItemRef { <incomplete type>} *
:( Так что да, кажется, что поля являются частным API и даже скрыты или что-то в этом роде. 13.05.2017Ref
, который я могу придумать, является непрозрачным типом (на самом деле указателем), предназначенным только для передачи функциям. 13.05.2017Pointer
. Спасибо, это очень подробный ответ. 14.05.2017