extern "C" NSData *UIImagePNGRepresentation(UIImage *image);
+template <typename Type_>
+static void nlset(Type_ &function, struct nlist *nl, size_t index) {
+ struct nlist &name(nl[index]);
+ uintptr_t value(name.n_value);
+ if ((name.n_desc & N_ARM_THUMB_DEF) != 0)
+ value |= 0x00000001;
+ function = reinterpret_cast<Type_>(value);
+}
+
int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- struct nlist nl[3];
+ struct nlist nl[4];
+
memset(nl, 0, sizeof(nl));
nl[0].n_un.n_name = (char *) "___mappedImages";
nl[1].n_un.n_name = (char *) "__UISharedImageInitialize";
+ nl[2].n_un.n_name = (char *) "_LoadMappedImageRef";
nlist("/System/Library/Frameworks/UIKit.framework/UIKit", nl);
- NSMutableDictionary **images = (id *) nl[0].n_value;
- void (*__UISharedImageInitialize)(bool) = (void (*)(bool)) nl[1].n_value;
+
+ NSMutableDictionary **images;
+ nlset(images, nl, 0);
+
+ void (*__UISharedImageInitialize)(bool);
+ nlset(__UISharedImageInitialize, nl, 1);
+
+ CGImageRef (*_LoadMappedImageRef)(CFStringRef);
+ nlset(_LoadMappedImageRef, nl, 2);
__UISharedImageInitialize(false);
for (int i(0), e([keys count]); i != e; ++i) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *key = [keys objectAtIndex:i];
- CGImageRef ref = (CGImageRef) [*images objectForKey:key];
- CFShow(ref);
+ CGImageRef ref;
+ if (_LoadMappedImageRef == NULL)
+ ref = reinterpret_cast<CGImageRef>([*images objectForKey:key]);
+ else
+ ref = _LoadMappedImageRef(reinterpret_cast<CFStringRef>(key));
UIImage *image = [UIImage imageWithCGImage:ref];
NSData *data = UIImagePNGRepresentation(image);
[data writeToFile:[NSString stringWithFormat:@"%@", key] atomically:YES];