Beispiel #1
0
void		*malloc(size_t size)
{
	void	*ptr;

	size = 0 ? 1 : size;
	if (!g_map.tiny && !g_map.small && !g_map.large)
		init_glob();
	if (size + sizeof(t_header) > g_map.max_size || size > g_map.max_size)
		return (NULL);
	size += sizeof(t_block);
	if (size - sizeof(t_block) <= g_map.size_tiny)
	{
		if (!g_map.tiny && new_map(g_map.size_tiny, &g_map.tiny, NULL) < 0)
			return (NULL);
		ptr = find_free_space(g_map.size_tiny, size, &g_map.tiny);
	}
	else if (size - sizeof(t_block) <= g_map.size_small)
	{
		if (!g_map.small && new_map(g_map.size_small, &g_map.small, NULL) < 0)
			return (NULL);
		ptr = find_free_space(g_map.size_small, size, &g_map.small);
	}
	else
		ptr = large_alloc(size, &g_map.large);
	if (ptr)
		ptr = (void *)ptr + sizeof(t_block);
	return (ptr);
}
int move_file(struct flist * file, off_t wsize)
{
	char *from, *to, *buf;
	off_t size;
	FILE *input, *output;
	int ret, dir_id;
	struct utimbuf ftime = {0};
	struct statvfs svf;
	fsblkcnt_t space;
	struct stat st;

	mhdd_debug(MHDD_MSG, "move_file: %s\n", file->real_name);

	/* TODO: it would be nice to contrive something alter */
	flist_wrlock_locked();
	from=file->real_name;

	/* We need to check if already moved */
	if (statvfs(from, &svf) != 0)
		return -errno;
	space = svf.f_bsize;
	space *= svf.f_bavail;

	/* get file size */
	if (fstat(file->fh, &st) != 0) {
		mhdd_debug(MHDD_MSG, "move_file: error stat %s: %s\n",
			from, strerror(errno));
		return -errno;
	}

        /* Hard link support is limited to a single device, and files with
           >1 hardlinks cannot be moved between devices since this would
           (a) result in partial files on the source device (b) not free
           the space from the source device during unlink. */
	if (st.st_nlink > 1) {
		mhdd_debug(MHDD_MSG, "move_file: cannot move "
			"files with >1 hardlinks\n");
		return -ENOTSUP;
	}

	size = st.st_size;
	if (size < wsize) size=wsize;

	if (space > size) {
		mhdd_debug(MHDD_MSG, "move_file: we have enough space\n");
		return 0;
	}

	if ((dir_id=find_free_space(size)) == -1) {
		mhdd_debug(MHDD_MSG, "move_file: can not find space\n");
		return -1;
	}

	if (!(input = fopen(from, "r")))
		return -errno;

	create_parent_dirs(dir_id, file->name);

	to = create_path(mhdd.dirs[dir_id], file->name);
	if (!(output = fopen(to, "w+"))) {
		ret = -errno;
		mhdd_debug(MHDD_MSG, "move_file: error create %s: %s\n",
				to, strerror(errno));
		free(to);
		fclose(input);
		return(ret);
	}

	mhdd_debug(MHDD_MSG, "move_file: move %s to %s\n", from, to);

	// move data
	buf=(char *)calloc(sizeof(char), MOVE_BLOCK_SIZE);
	while((size = fread(buf, sizeof(char), MOVE_BLOCK_SIZE, input))) {
		if (size != fwrite(buf, sizeof(char), size, output)) {
			mhdd_debug(MHDD_MSG,
				"move_file: error move data to %s: %s\n",
				to, strerror(errno));
			fclose(output);
			fclose(input);
			free(buf);
			unlink(to);
			free(to);
			return -1;
		}
	}
	free(buf);

	mhdd_debug(MHDD_MSG, "move_file: done move data\n");
	fclose(input);

	// owner/group/permissions
	fchmod(fileno(output), st.st_mode);
	fchown(fileno(output), st.st_uid, st.st_gid);
	fclose(output);

	// time
	ftime.actime = st.st_atime;
	ftime.modtime = st.st_mtime;
	utime(to, &ftime);

#ifndef WITHOUT_XATTR
        // extended attributes
        if (copy_xattrs(from, to) == -1)
            mhdd_debug(MHDD_MSG,
                    "copy_xattrs: error copying xattrs from %s to %s\n",
                    from, to);
#endif


	from = strdup(from);
	if ((ret = reopen_files(file, to)) == 0)
		unlink(from);
	else
		unlink(to);

	mhdd_debug(MHDD_MSG, "move_file: %s -> %s: done, code=%d\n",
		from, to, ret);
	free(to);
	free(from);
	return ret;
}
Beispiel #3
0
int main(int argc, char* argv[])
{
    FILE* file;                                                                 /* file pointer to work with input and output file */
    char* inputfile;                                                            /* path to input file*/
    char* outputfile;                                                           /* path to output file */
    unsigned char* buffer;                                                      /* buffer to read input file into */
    size_t filesize;                                                            /* size of opened file */
    size_t read;                                                                /* read bytes counter */
    size_t rest;                                                                /* rest of filesize to search in */
    unsigned char* asusbkp;                                                     /* ASUSBKP header */
    unsigned char* module;                                                      /* FD44 module header */
    unsigned char* me;                                                          /* ME firmware header */
    unsigned char* gbe;                                                         /* GbE firmware header */
    unsigned char* s2lp;                                                        /* */
    unsigned char* keys;                                                        /* */
    unsigned char* freespace;                                                   /* */
    unsigned char* msoa;                                                        /* */
    ptrdiff_t asusbkp_start_address = -1;                                       /* */
    ptrdiff_t asusbkp_s2lp_address = -1;                                        /* */
    ptrdiff_t asusbkp_keys_address = -1;                                        /* */
    ptrdiff_t asusbkp_freespace_address = -1;                                   /* ASUSBKP free space address*/
    ptrdiff_t slic_s2lp_address = -1;                                           /* */
    ptrdiff_t slic_keys_address = -1;                                           /* */
    ptrdiff_t slic_freespace_address = -1;                                      /* */
    ptrdiff_t me_start_address = -1;                                            /* ME start address */
    ptrdiff_t gbe_start_address = -1;                                           /* GbE start address */
    ptrdiff_t bsa_adresses[MAX_FD44_MODULES];                                   /* BSA modules addresses*/
    size_t bsa_count = 0;                                                       /* BSA modules count*/

    if(argc < 3)
    {
        printf("AddrInfo v0.2.1\nThis program finds addresses of different BIOS structures of ASUS BIOS files and stores them to INI-formated file\n\n"
            "Usage: AddrInfo BIOSFILE INIFILE\n\n");
        return ERR_ARGS;
    }

    inputfile = argv[1];
    outputfile = argv[2];

     /* Opening input file */
    file = fopen(inputfile, "rb");
    if (!file)
    {
        fprintf(stderr, "Can't open input file\n");
        return ERR_INPUT_FILE;
    }

    /* Determining file size */
    fseek(file, 0, SEEK_END);
    filesize = ftell(file);
    fseek(file, 0, SEEK_SET);

    /* Allocating memory for buffer */
    buffer = (unsigned char*)malloc(filesize);
    if (!buffer)
    {
        fprintf(stderr, "Can't allocate memory for input buffer\n");
        return ERR_MEMORY;
    }

    /* Reading whole file to buffer */
    read = fread((void*)buffer, sizeof(char), filesize, file);
    if (read != filesize)
    {
        fprintf(stderr, "Can't read input file\n");
        return ERR_INPUT_FILE;
    }

    /* Searching for ASUSBKP */
    asusbkp = memmem(buffer, filesize, ASUSBKP_HEADER, sizeof(ASUSBKP_HEADER));
    if(!asusbkp)
    {
        fprintf(stderr, "ASUSBKP signature not found in BIOS file. Nothing to do\n");
        return ERR_NO_ASUSBKP;
    }

    /* Storing ASUSBKP address */
    asusbkp_start_address = asusbkp - buffer;

    /* Finding free space in ASUSBKP, alligned to 4 */
    freespace = find_free_space(asusbkp, buffer + filesize - 1, ASUSBKP_FREE_SPACE_LENGTH, 4);
    if(!freespace)
    {
        fprintf(stderr, "No space left in ASUSBKP to insert data\n");
        return ERR_NO_ASUSBKP;
    }

    /* Storing free space address */
    asusbkp_freespace_address = freespace - buffer;
    
    /* Searching for S2LP in ASUSBKP */
    rest = freespace - asusbkp;
    s2lp = memmem(asusbkp, rest, ASUSBKP_S2LP_HEADER, sizeof(ASUSBKP_S2LP_HEADER));
    if(s2lp)
        asusbkp_s2lp_address = s2lp - buffer;

    /* Searching for KEYS in ASUSBKP */
    keys = memmem(asusbkp, rest, ASUSBKP_KEYS_HEADER, sizeof(ASUSBKP_KEYS_HEADER));
    if(keys)
        asusbkp_keys_address = keys - buffer;

    /* Searching for ME firmware address*/
    me = memmem(buffer, filesize, ME_HEADER, sizeof(ME_HEADER));
    if(me)
        me_start_address = me - buffer;

    /* Searching for GbE firmware address*/
    gbe = memmem(buffer, filesize, GBE_HEADER, sizeof(GBE_HEADER));
    if(gbe)
        gbe_start_address = gbe + GBE_MAC_OFFSET - buffer;
    
    /* Searching for MSOA module*/
    msoa = memmem(buffer, filesize, MSOA_MODULE_HEADER, sizeof(MSOA_MODULE_HEADER));
    if(msoa)
    {
        rest = filesize - (msoa - buffer);
        
        /* Searching for S2LP module*/
        s2lp = memmem(msoa, rest, SLIC_S2LP_HEADER, sizeof(SLIC_S2LP_HEADER));
        if(s2lp)
            slic_s2lp_address = s2lp - buffer;

        /* Searching for KEYS module*/
        keys = memmem(msoa, rest, SLIC_KEYS_HEADER, sizeof(SLIC_KEYS_HEADER));
        if(keys)
            slic_keys_address = keys - buffer;
        
        /* Finding free space and alligning it to 8*/
        freespace = find_free_space(msoa, buffer + filesize - 1, SLIC_FREE_SPACE_LENGTH, 8);
        if (freespace)
            slic_freespace_address = freespace - buffer;
    }

    /* Searching for module header */
    module = memmem(buffer, filesize, FD44_MODULE_HEADER, sizeof(FD44_MODULE_HEADER));
    if(module)
    {
        /* Looking for BSA_ module */
        rest = filesize - (module - buffer);
        while(module)
        {
            /* If one found, storing the address of it */
            if (!memcmp(module + FD44_MODULE_HEADER_BSA_OFFSET, FD44_MODULE_HEADER_BSA, sizeof(FD44_MODULE_HEADER_BSA)))
            {
                module = module + FD44_MODULE_HEADER_LENGTH;
                bsa_adresses[bsa_count++] = module - buffer;
            }

            module = memmem(module + FD44_MODULE_HEADER_LENGTH, rest, FD44_MODULE_HEADER, sizeof(FD44_MODULE_HEADER));
            rest = filesize - (module - buffer);
        }
    }

    /* Closing input file */
    fclose(file);

    /* Creating output file*/
    file = fopen(outputfile, "w");

    /* Writing data to output file */
    fprintf(file, "[ASUSBKP]\n");
    asusbkp_start_address > 0 ? fprintf(file,"START=0x%08X\n", asusbkp_start_address) : fprintf(file,"START=NOT_FOUND\n");
    asusbkp_keys_address > 0 ? fprintf(file,"KEYS=0x%08X\n", asusbkp_keys_address) : fprintf(file,"KEYS=NOT_FOUND\n");
    asusbkp_s2lp_address > 0 ? fprintf(file,"S2LP=0x%08X\n", asusbkp_s2lp_address) : fprintf(file,"S2LP=NOT_FOUND\n");
    asusbkp_freespace_address > 0 ? fprintf(file,"FREESPACE=0x%08X\n", asusbkp_freespace_address) : fprintf(file,"FREESPACE=NOT_FOUND\n");
    
    fprintf(file, "\n[SLIC]\n");
    slic_keys_address > 0 ? fprintf(file,"KEYS=0x%08X\n", slic_keys_address) : fprintf(file,"KEYS=NOT_FOUND\n");
    slic_s2lp_address > 0 ? fprintf(file,"S2LP=0x%08X\n", slic_s2lp_address) : fprintf(file,"S2LP=NOT_FOUND\n");
    slic_freespace_address > 0 ? fprintf(file,"FREESPACE=0x%08X\n", slic_freespace_address) : fprintf(file,"FREESPACE=NOT_FOUND\n");

    fprintf(file, "\n[ME]\n");
    me_start_address > 0 ? fprintf(file, "START=0x%08X\n", me_start_address) : fprintf(file,"START=NOT_FOUND\n");

    fprintf(file, "\n[GBE]\n");
    gbe_start_address > 0 ? fprintf(file, "START=0x%08X\n", gbe_start_address) : fprintf(file,"START=NOT_FOUND\n");

    if(bsa_count)
    {
        int i;
        fprintf(file, "\n[BSA]\n");
        for(i = 0; i < bsa_count; i++)
        {
            fprintf(file, "START%i=0x%08X\n", i, bsa_adresses[i] - FD44_MODULE_HEADER_LENGTH);
            fprintf(file, "DATA%i=0x%08X\n", i, bsa_adresses[i]);
        }
    }

    /* Closing output file */
    fclose(file);

    /* Freeing buffer */
    free(buffer);
    
    return ERR_OK;
}