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

📄 oledecod.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
          printf (" -\n");          continue;	   }	printf ("%08lx ", pps_list[i].ppsnumber);	printf ("%d ", pps_list[i].type);	printf ("%08lx ", pps_list[i].previous);	printf ("%08lx ", pps_list[i].next);	printf ("%08lx ", pps_list[i].dir);	printf ("%08lx ", pps_list[i].start);	printf ("%04x ", pps_list[i].level);	printf ("%08lx ", pps_list[i].size);	printf ("'%c", !isprint (pps_list[i].name[0]) ? ' ' : pps_list[i].name[0]);	printf ("%s\n", pps_list[i].name+1);	 }  }  /* NEXT IS VERBOSE verbose */  verbosePPSTree (pps_list, *root, 0);#endif  /* generates pps real files */  /* NOTE: by this moment, the pps tree,	wich is made with pps_list entries, is reordered */  verbose ("create pps files");  {    U8 *Depot;    FILE *OLEfile, *infile;    U16 BlockSize, Offset;    size_t bytes_to_read;    U32 pps_size, pps_start;    assert (num_of_pps >= 1);    /* i < 1 --- before i < num_of_pps --- changed so not to generate the	  real files by now --- cole 2.0.0 */    /* may be later we can rewrite this code in order to only extract the	  sbfile, may be using __cole_extract_file call to avoid duplicated	  code --- cole 2.0.0 */    for (i = 0; i < 1; i++)	 {	pps_list[i].filename[0] = 0;	/* storage pps and non-valid-pps (except root) does not need files */	/* because FlashPix file format have a root of type 5 but with no name,	   we must to check if the non-valid-pps is root */	if (pps_list[i].type == 1	    || (!pps_list[i].name[0] && pps_list[i].type != 5))	    continue;	/* pps that have level > max_level will not be extracted */	if (max_level != 0 && pps_list[i].level > max_level)	    continue;	pps_size = pps_list[i].size;	pps_start = pps_list[i].start;/* FIXME MARK 2 */	/* How we get sure pps_start doesn't point to a block bigger than the	   real file (input of sbfile) have? */	/* create the new file */	if (pps_list[i].type == 5)	/* root entry, sbfile must be generated */	{	    if (SDepot == NULL) {		/* if there are not small blocks, not generate sbfile */		*_sbfilename = NULL;		*_sbfile = NULL;		break;	    }	    assert (i == *root);	    assert (i == 0);	    /* tmpnam (sbfile) and next calls --- commented out so not to		  generate the real files by now --- sbfilename is stored in		  *_sbfilename instead --- cole 2.0.0		*/	    /*		 tmpnam (sbfilename);		 test_exitf (sbfilename[0], 7, ends ());		 sbfile = OLEfile = fopen (sbfilename, "wb+");		 test_exitf (OLEfile != NULL, 7, ends ());		 verboseS (sbfilename);		*/#if defined( __WIN32__ ) || defined( __BORLANDC__ )	    *_sbfilename = (U8 *)malloc (TMPNAM_LEN);	    test_exitf (*_sbfilename != NULL, 10, ends ());	    tmpnam (*_sbfilename);	    test_exitf (*_sbfilename[0], 7, ends ());	    sbfile = OLEfile = fopen (*_sbfilename, "w+b");#else	{		int ret;		*_sbfilename = (U8 *)malloc (TMPNAM_LEN);		test_exitf (*_sbfilename != NULL, 10, ends ());		strcpy(*_sbfilename, "/tmp/xlHtmlXXXXXX");		ret = mkstemp(*_sbfilename);		if (ret == -1)	{			free(*_sbfilename);			test_exitf (ret == -1, 7, ends ());		}		sbfile = OLEfile = fdopen(ret, "w+b");		/* unlink() is called so this file deletes when we are done with it */		unlink(*_sbfilename);	}#endif	    *_sbfile = sbfile;	    test_exitf (OLEfile != NULL, 7, ends ());	    verboseS (*_sbfilename);	}	else	/* other entry, save in a file */	{	    /* this branch is never executed now */#if defined( __WIN32__ ) || defined( __BORLANDC__ )		tmpnam (pps_list[i].filename);		test_exitf (pps_list[i].filename[0], 7, ends ());		verbose(pps_list[i].name + (!isprint(pps_list[i].name[0]) ? 1 : 0));		OLEfile = fopen (pps_list[i].filename, "wb");#else		int ret;		strcpy(pps_list[i].filename, "/tmp/xlHtmlXXXXXX");		ret = mkstemp(pps_list[i].filename);		test_exitf (ret == -1, 7, ends ());		OLEfile = fdopen(ret, "wb");#endif		test_exitf (OLEfile != NULL, 7, ends ());		verbose (pps_list[i].filename);	}	if (pps_size >= 0x1000 /*is in bbd */  ||	    OLEfile == sbfile /*is root */ )	{	    /* read from big block depot */	    Offset = 1;	    BlockSize = 0x0200;	    assert (input != NULL);	    assert (BDepot != NULL);	    infile = input;	    Depot = BDepot;	}	else	{	    /* read from small block file */	    Offset = 0;	    BlockSize = 0x40;	    assert (sbfile != NULL);	    assert (SDepot != NULL);	    infile = sbfile;	    Depot = SDepot;	}	/* -2 signed long int == 0xfffffffe unsinged long int */	while (pps_start != 0xfffffffeUL)	{#ifdef VERBOSE	    printf ("reading pps %08lx block %08lx from %s\n",		    pps_list[i].ppsnumber, pps_start,		 Depot == BDepot ? "big block depot" : "small block depot");#endif	    FilePos = (pps_start + Offset) * BlockSize;	    assert (FilePos >= 0);	    bytes_to_read = MIN ((U32)BlockSize, pps_size);	    fseek (infile, FilePos, SEEK_SET);	    fread (Block, bytes_to_read, 1, infile);	    test_exitf (!ferror (infile), 5, ends ());	    fwrite (Block, bytes_to_read, 1, OLEfile);	    test_exitf (!ferror (infile), 5, ends ());	    pps_start = fil_sreadU32 (Depot + (pps_start * 4));	    pps_size -= MIN ((U32)BlockSize, pps_size);	    if (pps_size == 0)		 pps_start = 0xfffffffeUL;	}	if (OLEfile == sbfile)	  /* if small block file generated */	  rewind (OLEfile);	/* rewind because we will read it later */	/*else if (!fclose (OLEfile))*/	/* close the pps file */	  /* don't know what to do here */	  /*;*/	}    /* if (sbfile != NULL) --- commented out so conservate sbfile	  open --- cole 2.0.0 */    /*    if (sbfile != NULL)	 {	fclose (sbfile);	  if (!remove (sbfilename)) ;	sbfile = NULL;	 }	*/  }  ends ();  return 0;}/* reorder pps tree and write levels *//* not sure if it is safe declare last_next_link_visited   inside reorder_pps_tree function */static U32 *last_next_link_visited;static int reorder_pps_tree (pps_entry * node, U16 level){  /* NOTE: in next, previous and dir link,	0xffffffff means point to nowhere (NULL) */  node->level = level;  /* reorder subtrees, if there's any */  if (node->dir != 0xffffffffUL)  {    if (node->dir > num_of_pps || !pps_list[node->dir].name[0])	 return 0;    else if (!reorder_pps_tree (&pps_list[node->dir], (U16)(level + 1)))	 return 0;  }  /* reorder next-link subtree, saving the most next link visited */  if (node->next != 0xffffffffUL)    {	 if (node->next > num_of_pps || !pps_list[node->next].name[0])	return 0;	 else if (!reorder_pps_tree (&pps_list[node->next], level))	return 0;    }  else    last_next_link_visited = &node->next;  /* move the prev child to the next link and reorder it, if there's any */  if (node->previous != 0xffffffffUL)  {    if (node->previous > num_of_pps || !pps_list[node->previous].name[0])	 return 0;    else	 {	*last_next_link_visited = node->previous;	node->previous = 0xffffffffUL;	if (!reorder_pps_tree (&pps_list[*last_next_link_visited], level))	  return 0;	 }  }  return 1;}/* verbose pps tree */static void verbosePPSTree (pps_entry * pps_list, U32 start_entry, int level){  U32 entry;  int i;#if __GNUC__ == 2static char cff[] = "cole235711";#define nextff(var) static void * nextff_var = (&nextff_var); \nextff_var=&var;nextff (cff);#endif  for (entry = start_entry; entry != 0xffffffffUL; entry = pps_list[entry].next)    {	 if (pps_list[entry].type == 2)	{	  for (i = 0; i < level * 3; i++)	    printf (" ");	  printf ("FILE %02lx %8ld '%c%s'\n", pps_list[entry].ppsnumber,		  pps_list[entry].size, !isprint((int)pps_list[entry].name[0]) ? ' ' : pps_list[entry].name[0], pps_list[entry].name+1);	}	 else	{	  for (i = 0; i < level * 3; i++)	    printf (" ");	  printf ("DIR  %02lx '%c%s'\n", pps_list[entry].ppsnumber,		  !isprint((int)pps_list[entry].name[0]) ? ' ' : pps_list[entry].name[0], pps_list[entry].name+1);	  verbosePPSTree (pps_list, pps_list[entry].dir, level + 1);	}    }}/* closeOLEtreefiles --- outdated because not to generate the   real files by now --- cole 2.0.0 *//*#define freeNoNULL(x) { if ((x) != NULL) free (x); }static int errorClosingTreeFiles;voidcloseOLEtreefiles (pps_entry * tree, U32 root){#ifdef VERBOSE  printf ("Visiting entry 0x%08lx to erase file\n",	  tree[root].ppsnumber);#endif  if (tree[root].previous != 0xffffffffUL)    closeOLEtreefiles (tree, tree[root].previous);  if (tree[root].next != 0xffffffffUL)    closeOLEtreefiles (tree, tree[root].next);  if (tree[root].type != 2 && tree[root].dir != 0xffffffffUL)    {#ifdef VERBOSE	 printf ("Going down to directory 0x%08lx to erase files\n",		 tree[root].dir);#endif	 closeOLEtreefiles (tree, tree[root].dir);    }  else if (tree[root].type == 2)    if (!remove (tree[root].filename))    {#ifdef VERBOSE	 printf ("Success removing %s\n", tree[root].filename);#endif    }  else    {#ifdef VERBOSE	 printf ("Failed to remove %s\n", tree[root].filename);#endif	 errorClosingTreeFiles = 1;    }}*//* freeOLEtree is now useless: it only free tree -- cole 2.0.0 *//*   Free all the memory allocated in the tree.   Output: 0 = Sucess.   .       6 = Error removing some temporal stream files. *//*int freeOLEtree (pps_entry * tree);*//*intfreeOLEtree (pps_entry * tree){*/  /* errorCloseingTreeFiles --- doesn't exists because closeOLEtreefiles	was outdated because not to generate the real files by	now --- cole 2.0.0 */  /*    errorClosingTreeFiles = 0;  *//*  if (tree != NULL)    {*/	 /* closeOLEtreefiles --- outdated because not to generate the	    real files by now --- cole 2.0.0 */	 /*	   closeOLEtreefiles (tree, 0);	  *//*	 free (tree);    } */  /* errorCloseingTreeFiles --- doesn't exists because closeOLEtreefiles	was outdated because not to generate the real files by	now --- cole 2.0.0 */  /*return*/ /* errorClosingTreeFiles ? 6 : */ /*0;*//*}*//* free memory used (except the pps tree) */#define freeNoNULL(x) { if ((x) != NULL) free (x); }static void ends (void){  /* if (input != NULL) and next lines --- commented out so conservate input	file open --- cole 2.0.0 */  /*  if (input != NULL)    fclose (input);  */  freeNoNULL (Block);  freeNoNULL (Blockx);  /* freeNoNULL (BDepot) and next line --- commented out so conservate	depots --- cole 2.0.0 */  /*    freeNoNULL (BDepot);    freeNoNULL (SDepot);  */  freeNoNULL (Root);  freeNoNULL (sbd_list);  freeNoNULL (root_list);  /* if (sbfile != NULL) and next lines --- commented out so conservate sbfile	open --- cole 2.0.0 */  /*  if (sbfile != NULL)    {	 fclose (sbfile);	 if (!remove (sbfilename)) ;    }   */}#undef VERBOSE

⌨️ 快捷键说明

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