decrypt.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: audiotemplate.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. #include "decrypt.h"
  25. #if 0
  26. // header:
  27. // DWORD magic number 'ABCD'
  28. // DWORD length
  29. // DWORD xor start position
  30. typedef struct decrypt
  31. {
  32. stream Stream;
  33. bool_t Silent;
  34. FILE* File;
  35. int XOR;
  36. int StartXOR;
  37. int Length;
  38. int HeadSize;
  39. tchar_t URL[MAXPATH];
  40. } decrypt;
  41. static int Get(decrypt* p, int No, void* Data, int Size)
  42. {
  43. int Result = ERR_INVALID_PARAM;
  44. switch (No)
  45. {
  46. case STREAM_URL: GETSTRING(p->URL); break;
  47. case STREAM_SILENT: GETVALUE(p->Silent,bool_t); break;
  48. case STREAM_LENGTH: GETVALUECOND(p->Length,int,p->Length>=0); break;
  49. }
  50. return Result;
  51. }
  52. static int Open(decrypt* p, stream* Input)
  53. {
  54. if (p->File)
  55. {
  56. fclose(p->File);
  57. p->File = NULL;
  58. }
  59. p->Length = -1;
  60. p->URL[0] = 0;
  61. if (Input)
  62. {
  63. char URL[MAXPATH];
  64. uint32_t Head[3];
  65. if (Input->Get(Input,STREAM_URL,p->URL,sizeof(p->URL)) != ERR_NONE)
  66. return ERR_INVALID_DATA;
  67. TcsToStr(URL,sizeof(URL),p->URL);
  68. p->File = fopen(URL,"rb");
  69. if (!p->File)
  70. {
  71. if (!p->Silent)
  72. ShowError(0,ERR_ID,ERR_FILE_NOT_FOUND,p->URL);
  73. return ERR_FILE_NOT_FOUND;
  74. }
  75. p->HeadSize = fread(&Head,1,sizeof(Head),p->File);
  76. if (p->HeadSize != sizeof(Head))
  77. return ERR_INVALID_DATA;
  78. p->Length = INT32LE(Head[1]);
  79. p->StartXOR = INT32LE(Head[2]);
  80. if (Head[0] != FOURCCLE('A','B','C','D'))
  81. return ERR_INVALID_DATA;
  82. p->XOR = p->StartXOR;
  83. Input->Set(Input,STREAM_URL,NULL,0); // original input can be closed
  84. }
  85. return ERR_NONE;
  86. }
  87. static int Set(decrypt* p, int No, const void* Data, int Size)
  88. {
  89. int Result = ERR_INVALID_PARAM;
  90. switch (No)
  91. {
  92. case STREAM_SILENT: SETVALUE(p->Silent,bool_t,ERR_NONE); break;
  93. case STREAMPROCESS_INPUT:
  94. Result = Open(p,*(stream**)Data);
  95. break;
  96. }
  97. return Result;
  98. }
  99. static int Read(decrypt* p,void* Data,int Size)
  100. {
  101. int Readed = fread(Data,1,Size,p->File);
  102. if (Readed>0)
  103. {
  104. uint8_t* v = (uint8_t*)Data;
  105. int i;
  106. for (i=0;i<Readed;++i,++v)
  107. *v = (uint8_t)(*v ^ p->XOR++);
  108. }
  109. return Readed;
  110. }
  111. static int ReadBlock(decrypt* p,block* Block,int Ofs,int Size)
  112. {
  113. return Read(p,(char*)(Block->Ptr+Ofs),Size);
  114. }
  115. static int Seek(decrypt* p,int Pos,int SeekMode)
  116. {
  117. int FilePos;
  118. if (SeekMode == SEEK_SET)
  119. Pos += p->HeadSize;
  120. if (fseek(p->File,Pos,SeekMode) != 0)
  121. return ERR_NOT_SUPPORTED;
  122. FilePos = ftell(p->File) - p->HeadSize;
  123. p->XOR = p->StartXOR + FilePos;
  124. return FilePos;
  125. }
  126. static int Create(decrypt* p)
  127. {
  128. p->Stream.Get = (nodeget)Get,
  129. p->Stream.Set = (nodeset)Set,
  130. p->Stream.Read = Read;
  131. p->Stream.ReadBlock = ReadBlock;
  132. p->Stream.Seek = Seek;
  133. return ERR_NONE;
  134. }
  135. static void Delete(decrypt* p)
  136. {
  137. if (p->File)
  138. fclose(p->File);
  139. }
  140. static const nodedef Decrypt =
  141. {
  142. sizeof(decrypt),
  143. DECRYPT_ID,
  144. STREAMPROCESS_CLASS,
  145. PRI_DEFAULT,
  146. (nodecreate)Create,
  147. (nodedelete)Delete,
  148. };
  149. void Decrypt_Init()
  150. {
  151. StringAdd(1,DECRYPT_ID,NODE_NAME,T("Decypher"));
  152. StringAdd(1,DECRYPT_ID,NODE_EXTS,T("env:V;ena:A"));
  153. StringAdd(1,DECRYPT_ID,NODE_PROBE,T("eq(le32,'ABCD')"));
  154. NodeRegisterClass(&Decrypt);
  155. }
  156. void Decrypt_Done()
  157. {
  158. NodeUnRegisterClass(DECRYPT_ID);
  159. }
  160. #else
  161. void Decrypt_Init() {}
  162. void Decrypt_Done() {}
  163. #endif