⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsmbuild.c

📁 ROM programming of HTC mobile devices
💻 C
字号:
/* * HTCFlasher - http://htc-flasher.googlecode.com * * dsmbuild - Linux ROM Kitchen tool * * Copyright (C) 2007-2008 Pau Oliva Fora - pof @ <eslack.org> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 3 of the License, or (at your * opinion) any later version. See <http://www.gnu.org/licenses/gpl.html> * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <dirent.h>#include "dsm.h"int main(int argc, char **argv) {	DIR *d;	struct dirent *dir;	char dsmfilename[256];	char folder[1024];	char dsmfilepath[1280];	char *fileext;	int filecount=0;	FILE *dsmfile;	struct DeviceManifestHeader header;	unsigned int guid[16];	int i,j;	char whatever[64];	char whatever2[64];	char tmpbuf[1024];	struct FileEntry fileentry;	int offset = 0;	printf("=== dsmbuild v1.0\n");	printf("=== Part of Linux ROM Kitchen\n");	printf("=== Generates a valid DSM file from a package folder\n");	printf("=== (c)2008 Pau Oliva Fora - pof @ XDA-Developers\n\n");	memset(dsmfilename,0,sizeof(dsmfilename));	memset(folder,0,sizeof(folder));	memset(&header,0,sizeof(DeviceManifestHeader));	if (argc < 2) {		fprintf(stderr,"Usage: %s folder\n", argv[0]);		return 0;	}	strcpy(folder, argv[1]);	header.StructSize=sizeof(DeviceManifestHeader);  	header.PackageFlags=2;	header.ProcessorID=450;	header.OSVersion=501;	header.PlatformID=0;	header.NameLength=40;	header.NameOffset=0; // we'll find it later	header.DependentCount=0;	header.DependentOffset=0;	header.ShadowCount=0;	header.ShadowOffset=0;	header.FileCount=0; // we'll find it later	header.FileListOffset=header.StructSize;	header.CERTData=0;	header.CERTDataOffset=0;	header.PackageVersion1=0;	header.PackageVersion2=0;	header.PackageVersion3=0;	header.PackageVersion4=0;	header.PrevPkgVersion1=0;	header.PrevPkgVersion2=0;	header.PrevPkgVersion3=0;	header.PrevPkgVersion4=0;	d = opendir(folder);	if( d == NULL ) {		fprintf(stderr, "Can't open dir '%s'\n", folder);		return 1;	}	/* find dsm file */	while ((dir = readdir(d)) != NULL)	{		if (strcmp(dir->d_name, "." ) == 0 || strcmp( dir->d_name, ".." ) == 0 ) {			continue;		}		fileext = strrchr(dir->d_name, '.');		if ((fileext != NULL) && (!strcmp (fileext, ".dsm"))) {			strcpy(dsmfilename, dir->d_name);			printf ("[] Found DSM: %s\n", dsmfilename);		} else {			filecount++;		}	}	closedir(d);		if (strlen(dsmfilename) == 0) {		fprintf(stderr,"[!!] Can't find dsm file in '%s'\n", folder);		return 1;	}	if (strlen(dsmfilename) != 40) {		fprintf(stderr,"[!!] Invalid dsm file name '%s'\n", dsmfilename);		return 1;	}#if 0	if (filecount == 0) {		fprintf(stderr,"Empty dir '%s'\n", folder);		return 1;	}#endif	header.FileCount = filecount;	header.NameOffset = header.StructSize+filecount*(sizeof(FileEntry));	/* all this crap is an ugly way to put the guid in the header */	j=0;	for (i=0; i < (strlen(dsmfilename)-4); i++) {		if (dsmfilename[i] != '-') {			whatever[j]=dsmfilename[i];			j++;		}	}	j=0;	for (i=0; i < (strlen(whatever)); i++) {		if ((i%2 == 0) && (i!=0)) {			whatever2[j] = '-';			j++;		} 		whatever2[j]=whatever[i];		j++;	}	sscanf(whatever2,"%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x",			&guid[0],&guid[1],&guid[2],&guid[3],&guid[4],&guid[5],&guid[6],&guid[7],			&guid[8],&guid[9],&guid[10],&guid[11],&guid[12],&guid[13],&guid[14],&guid[15]);	memcpy(&header.guidPackage[0], &guid[3], 1);	memcpy(&header.guidPackage[1], &guid[2], 1);	memcpy(&header.guidPackage[2], &guid[1], 1);	memcpy(&header.guidPackage[3], &guid[0], 1);	memcpy(&header.guidPackage[4], &guid[5], 1);	memcpy(&header.guidPackage[5], &guid[4], 1);	memcpy(&header.guidPackage[6], &guid[7], 1);	memcpy(&header.guidPackage[7], &guid[6], 1);	memcpy(&header.guidPackage[8], &guid[8], 1);	memcpy(&header.guidPackage[9], &guid[9], 1);	memcpy(&header.guidPackage[10], &guid[10], 1);	memcpy(&header.guidPackage[11], &guid[11], 1);	memcpy(&header.guidPackage[12], &guid[12], 1);	memcpy(&header.guidPackage[13], &guid[13], 1);	memcpy(&header.guidPackage[14], &guid[14], 1);	memcpy(&header.guidPackage[15], &guid[15], 1);	/* finished */	strcat(folder, "/");	strcat(folder, dsmfilename);	strcpy(dsmfilepath, folder);	strcpy(folder, argv[1]);        dsmfile = fopen(dsmfilepath, "wb");        if (dsmfile == NULL) {                fprintf(stderr, "[!!] Can't open '%s'\n", dsmfilepath);                fclose(dsmfile);                exit(1);        }	fwrite(&header, 1, sizeof(DeviceManifestHeader), dsmfile);	offset = sizeof(DeviceManifestHeader) + (sizeof(FileEntry)*(filecount)) + (header.NameLength * 2);	/* dsm files must contain the rgu file on the first table entry */	d = opendir(folder);	while ((dir = readdir(d)) != NULL)	{		fileext = strrchr(dir->d_name, '.');		if ((fileext != NULL) && (!strcmp (fileext, ".rgu"))) {			printf ("RGU: %s\n", dir->d_name);			fileentry.NameLength = strlen(dir->d_name);			fileentry.Flags = 0;			fileentry.Offset = offset;			fileentry.Base = 0;			fileentry.Size = 0;			offset = offset + fileentry.NameLength*2;			fwrite(&fileentry, 1, sizeof(FileEntry), dsmfile);		}	}	closedir(d);	/* now process the rest of the files */	d = opendir(folder);	while ((dir = readdir(d)) != NULL)	{		if (strcmp(dir->d_name, "." ) == 0 || strcmp( dir->d_name, ".." ) == 0 ) {			continue;		}		fileext = strrchr(dir->d_name, '.');		if ((fileext != NULL) && (!strcmp (fileext, ".dsm"))) {			continue;		}		if ((fileext != NULL) && (!strcmp (fileext, ".rgu"))) {			continue;		}		printf ("[] Adding file table entry for %s\n",dir->d_name);		fileentry.NameLength = strlen(dir->d_name);		fileentry.Flags = 0;		fileentry.Offset = offset;		fileentry.Base = 0;		fileentry.Size = 0;		offset = offset + fileentry.NameLength*2;		fwrite(&fileentry, 1, sizeof(FileEntry), dsmfile);	}	closedir(d);	/* finally write the filenames */	/* first the package name, set to the name of the dsm file */	memset(tmpbuf,0,sizeof(tmpbuf));	j=0;	for (i=0; i< strlen(dsmfilename); i++) {		tmpbuf[j]=dsmfilename[i];		j++;		tmpbuf[j]='\0';		j++;	}	fwrite(tmpbuf, 1, strlen(dsmfilename)*2, dsmfile);	/* second the filename of the rgu file, if it exists */	d = opendir(folder);	while ((dir = readdir(d)) != NULL)	{		fileext = strrchr(dir->d_name, '.');		if ((fileext != NULL) && (!strcmp (fileext, ".rgu"))) {			memset(tmpbuf,0,sizeof(tmpbuf));			j=0;			for (i=0; i< strlen(dir->d_name); i++) {				tmpbuf[j]=dir->d_name[i];				j++;				tmpbuf[j]='\0';				j++;			}			fwrite(tmpbuf, 1, strlen(dir->d_name)*2, dsmfile);		}	}	closedir(d);	/* third all the rest of filenames */	d = opendir(folder);	while ((dir = readdir(d)) != NULL)	{		if (strcmp(dir->d_name, "." ) == 0 || strcmp( dir->d_name, ".." ) == 0 ) {			continue;		}		fileext = strrchr(dir->d_name, '.');		if ((fileext != NULL) && (!strcmp (fileext, ".dsm"))) {			continue;		}		if ((fileext != NULL) && (!strcmp (fileext, ".rgu"))) {			continue;		}		printf ("[] Adding file name for: %s\n",dir->d_name);		memset(tmpbuf,0,sizeof(tmpbuf));		j=0;		for (i=0; i< strlen(dir->d_name); i++) {			tmpbuf[j]=dir->d_name[i];			j++;			tmpbuf[j]='\0';			j++;		}		fwrite(tmpbuf, 1, strlen(dir->d_name)*2, dsmfile);	}	closedir(d);	fclose(dsmfile);	return (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -