test_crw.c

来自「一个小公司要求给写的很简单的任务管理系统。」· C语言 代码 · 共 192 行

C
192
字号
/* * @(#)test_crw.c	1.9 05/11/17 *  * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: *  * -Redistribution of source code must retain the above copyright notice, this *  list of conditions and the following disclaimer. *  * -Redistribution in binary form must reproduce the above copyright notice,  *  this list of conditions and the following disclaimer in the documentation *  and/or other materials provided with the distribution. *  * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission. *  * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. *  * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "java_crw_demo.h"static int error_code = 0;#define ERROR(message) error(message, __FILE__, __LINE__)static voiderror(const char *message, const char *file, int line){    error_code = 1;    (void)fprintf(stderr, "ERROR: %s\n", message);    exit(error_code);}static voidfile_error(char *filename, char *message){    error_code = 1;    (void)fprintf(stderr, "ERROR: \"%s\": %s\n", filename, message);    exit(error_code);}static void *allocate(int size){    return calloc(1, size);}static voiddeallocate(void *ptr){    free(ptr);}static voidmnums(unsigned cnum, const char **names, const char **descrs, int count){    int i;        (void)printf("Methods in class number 0x%08x:\n", cnum);    for ( i = 0; i < count ; i++ ) {	int j;	(void)printf("\t0x%08x: name=%s, signature=%s\n", i, names[i], descrs[i]);    }}intmain(int argc, char **argv){    int i;    unsigned class_number = 0x0FEED000;    int obj_watch;    int call_sites;    int ret_sites;    obj_watch = 0;    call_sites = 0;    ret_sites = 0;    if ( argc < 3 ) {        char buf[256];        (void)snprintf(buf, sizeof(buf), "Usage: %s input_file output_file", argv[0]);        ERROR(buf);    }        for(i=1; i<argc; i++) {        FILE *fin;        FILE *fout;        const unsigned char *file_image;        int file_len;        unsigned char *new_file_image;        long new_file_len;        	if ( strcmp(argv[i],"-n")==0 ) {	    obj_watch = 1;            continue;        } else if ( strcmp(argv[i], "-c")==0 ) {	    call_sites = 1;            continue;        } else if ( strcmp(argv[i], "-r")==0 ) {	    ret_sites = 1;            continue;        }        fin = fopen(argv[i], "r");        if ( fin == NULL ) {            file_error(argv[i], "Cannot open file");        }        (void)fseek(fin, 0, SEEK_END);        file_len = ftell(fin);        if ( file_len<=0 ) {            file_error(argv[i], "File has 0 size");        }        (void)fseek(fin, 0, SEEK_SET);        file_image = (const unsigned char *)malloc((size_t)file_len);        assert(file_image!=NULL);        if ( fread((void*)file_image, 1, (size_t)file_len, fin)!=(size_t)file_len) {            file_error(argv[i], "File read failed");        }                java_crw_demo(class_number++, 	    NULL, 	    file_image, 	    file_len, 	    0,            "sun/tools/hprof/Tracker",            "Lsun/tools/hprof/Tracker;",            call_sites?"CallSite":NULL,            call_sites?"(II)V":NULL,            ret_sites?"ReturnSite":NULL,            ret_sites?"(II)V":NULL,            obj_watch?"ObjectInit":NULL,            obj_watch?"(Ljava/lang/Object;)V":NULL,            obj_watch?"NewArray":NULL,            obj_watch?"(Ljava/lang/Object;)V":NULL,	    &new_file_image,	    &new_file_len,            &error, 	    &mnums);                fout = fopen(argv[i+1], "w");        if ( fout == NULL ) {            file_error(argv[i+1], "Cannot create file");        }        if ( new_file_len > 0 ) {            if ( fwrite(new_file_image, 1, (size_t)new_file_len, fout)!=(size_t)new_file_len ) {                file_error(argv[i+1], "File write failed");            }            (void)printf("Processed file %s to %s\n", argv[i], argv[i+1]);        } else {            if ( fwrite(file_image, 1, file_len, fout)!=(size_t)file_len ) {                file_error(argv[i+1], "File write failed");            }            (void)printf("Duplicated file %s to %s (no injections)\n", argv[i], argv[i+1]);        }        (void)fclose(fout);        free((void*)file_image);	if ( new_file_image != NULL ) {	    free(new_file_image);	}        i++;    }    return error_code;}

⌨️ 快捷键说明

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