示例#1
0
void readImg3Root(AbstractFile* file, Img3Element* element) {
	Img3Element* children;
	Img3Element* current;
	uint32_t remaining;
	AppleImg3RootHeader* header;

	children = NULL;

	header = (AppleImg3RootHeader*) realloc(element->header, sizeof(AppleImg3RootHeader));
	element->header = (AppleImg3Header*) header;

	file->read(file, &(header->extra), sizeof(AppleImg3RootExtra));
	flipAppleImg3RootExtra(&(header->extra));

	remaining = header->base.dataSize;

	while(remaining > 0) {
		if(children != NULL) {
			current->next = readImg3Element(file);
			current = current->next;
		} else {
			current = readImg3Element(file);
			children = current;
		}
		remaining -= current->header->size;
	}

	element->data = (void*) children;
	element->write = writeImg3Root;
	element->free = freeImg3Root;
}
示例#2
0
文件: img3.c 项目: 0x76/opensn0w
void writeImg3Root(AbstractFile * file, Img3Element * element, Img3Info * info)
{
	AppleImg3RootHeader *header;
	Img3Element *current;
	off_t curPos;

	curPos = file->tell(file);
	curPos -= sizeof(AppleImg3Header);

	file->seek(file, curPos + sizeof(AppleImg3RootHeader));

	header = (AppleImg3RootHeader *) element->header;

	current = (Img3Element *) element->data;
	while (current != NULL) {
		if (current->header->magic == IMG3_SHSH_MAGIC) {
			header->extra.shshOffset =
			    (uint32_t) (file->tell(file) -
					sizeof(AppleImg3RootHeader));
		}

		if (current->header->magic != IMG3_KBAG_MAGIC
		    || info->encrypted) {
			writeImg3Element(file, current, info);
		}

		current = current->next;
	}

	header->base.dataSize =
	    file->tell(file) - (curPos + sizeof(AppleImg3RootHeader));
	header->base.size = sizeof(AppleImg3RootHeader) + header->base.dataSize;

	file->seek(file, curPos);

	flipAppleImg3Header(&(header->base));
	flipAppleImg3RootExtra(&(header->extra));
	file->write(file, header, sizeof(AppleImg3RootHeader));
	flipAppleImg3RootExtra(&(header->extra));
	flipAppleImg3Header(&(header->base));

	file->seek(file, header->base.size);
}