+
+ list<RegisterBase *> &loaders = get_registered_loaders();
+ if(registered_loaders_changed)
+ {
+ registered_loaders_changed = false;
+ loaders.sort(signature_size_compare);
+ }
+
+ if(loaders.empty())
+ throw unsupported_image_format("no loaders");
+
+ vector<char> sig_buf(loaders.back()->get_signature_size());
+ unsigned sig_len = io.read(&sig_buf[0], sig_buf.size());
+ string signature(sig_buf.begin(), sig_buf.end());
+
+ ImageLoader *loader = 0;
+ for(list<RegisterBase *>::const_iterator i=loaders.begin(); (!loader && i!=loaders.end()); ++i)
+ if((*i)->detect(signature))
+ loader = (*i)->create(io);
+
+ io.seek(0, IO::S_BEG);
+
+ if(!loader)