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

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: setup.c 332 2005-11-06 14:31:57Z picard $
  18.  *
  19.  ****************************************************************************/
  20. #include "../common/common.h"
  21. #include <windows.h>
  22. #include "benchmark.h"
  23. #ifdef UNICODE
  24. #define tcsicmp _wcsicmp
  25. #define tcsupr _wcsupr
  26. #else
  27. #define tcsicmp stricmp;
  28. #define tcsupr _strupr
  29. #endif
  30. DLLEXPORT int WINAPI Install_Init(HWND Parent, BOOL FirstCall, BOOL PrevInstalled, LPCTSTR InstallDir)
  31. {
  32.     return 0;
  33. }
  34. // don't want to use common.dll, but don't want to collide with DLL import function either
  35. #define tcscpy_s _tcscpy_s
  36. #define tcscat_s _tcscat_s
  37. #define IntToString _IntToString
  38. static void IntToString(tchar_t *Out,int OutLen,int p,bool_t Hex)
  39. {
  40. int n=1000000000;
  41. if (p<0)
  42. {
  43. p=-p;
  44. if (OutLen>1)
  45. {
  46. *(Out++) = '-';
  47. --OutLen;
  48. }
  49. }
  50. while (p<n && n>1)
  51. n/=10;
  52. while (n>0)
  53. {
  54. int i = p/n;
  55. p-=n*i;
  56. if (OutLen>1)
  57. {
  58. *(Out++) = (tchar_t)('0'+i);
  59. --OutLen;
  60. }
  61. n/=10;
  62. }
  63. if (OutLen>0)
  64. *Out = 0;
  65. }
  66. static void tcscpy_s(tchar_t* Out,int OutLen,const tchar_t* In)
  67. {
  68. int n = min((int)tcslen(In),OutLen-1);
  69. memcpy(Out,In,n*sizeof(tchar_t));
  70. Out[n] = 0;
  71. }
  72. static void tcscat_s(tchar_t* Out,int OutLen,const tchar_t* In)
  73. {
  74. int n = tcslen(Out);
  75. tcscpy_s(Out+n,OutLen-n,In);
  76. }
  77. static void Remove(const tchar_t* InstallDir,const tchar_t* Name)
  78. {
  79. tchar_t Path[MAXPATH];
  80. tcscpy_s(Path,MAXPATH,InstallDir);
  81. tcscat_s(Path,MAXPATH,T("\"));
  82. tcscat_s(Path,MAXPATH,Name);
  83. DeleteFile(Path);
  84. }
  85. DLLEXPORT int WINAPI Install_Exit(HWND Parent, LPCTSTR InstallDir, WORD FailedDirs,WORD FailedFiles,WORD FailedRegKeys,WORD FailedRegVals,WORD FailedShortcuts)
  86. {
  87. HMODULE GAPI;
  88. HMODULE CoreDLL;
  89. tchar_t LocalPath[MAXPATH];
  90. tchar_t WinPath[MAXPATH];
  91. int32_t Slow = -1;
  92. DWORD Disp;
  93. HKEY Key;
  94. tchar_t* AdvBase = T("SOFTWARE\TCPMP\ADVP");
  95. #ifdef ARM
  96. tchar_t* Base = T("System\GDI\Drivers\ATI");
  97. tchar_t* Name = T("DisableDeviceBitmap");
  98. HANDLE Handle;
  99. #endif
  100. //-------------------------------------
  101. // Remove possible old files
  102. Remove(InstallDir,T("lang_en.plg"));
  103. Remove(InstallDir,T("asf.plg"));
  104. Remove(InstallDir,T("avi.plg"));
  105. Remove(InstallDir,T("a52.plg"));
  106. Remove(InstallDir,T("mjpeg.plg"));
  107. Remove(InstallDir,T("mpeg4aac.plg"));
  108. Remove(InstallDir,T("mpegaudio.plg"));
  109. Remove(InstallDir,T("mpegvideo.plg"));
  110. Remove(InstallDir,T("overlay.plg"));
  111. Remove(InstallDir,T("vorbis.plg"));
  112. //-------------------------------------
  113. // GAPI's gx.dll keep it or not?
  114. WinPath[0] = 0;
  115. CoreDLL = LoadLibrary(T("coredll.dll"));
  116. if (CoreDLL)
  117. {
  118. BOOL (WINAPI* FuncSHGetSpecialFolderPath)(HWND,LPTSTR,int,BOOL);
  119. *(FARPROC*)&FuncSHGetSpecialFolderPath = GetProcAddress(CoreDLL,T("SHGetSpecialFolderPath"));
  120. if (FuncSHGetSpecialFolderPath)
  121. FuncSHGetSpecialFolderPath(NULL,WinPath,0x24/*CSIDL_WINDOWS*/,FALSE);
  122. FreeLibrary(CoreDLL);
  123. }
  124. if (!WinPath[0])
  125. tcscpy_s(WinPath,MAXPATH,T("\Windows"));
  126. tcscat_s(WinPath,MAXPATH,T("\gx.dll"));
  127. tcscpy_s(LocalPath,MAXPATH,InstallDir);
  128. tcscat_s(LocalPath,MAXPATH,T("\gx.dll"));
  129. GAPI = LoadLibrary(WinPath);
  130. if (GAPI)
  131. {
  132. DeleteFile(LocalPath);
  133. }
  134. else
  135. {
  136. GAPI = LoadLibrary(LocalPath); // can we load our gx.dll? aygshell.dll available?
  137. if (GAPI)
  138. {
  139. // check new HPC device with aygshell support, but no GXINFO
  140. OSVERSIONINFO Ver;
  141. Ver.dwOSVersionInfoSize = sizeof(Ver);
  142. GetVersionEx(&Ver);
  143. if (Ver.dwMajorVersion >= 4)
  144. {
  145. HDC DC = GetDC(NULL);
  146. DWORD Code = GETGXINFO;
  147. GXDeviceInfo Info;
  148. memset(&Info,0,sizeof(Info));
  149. Info.Version = 100;
  150. if (ExtEscape(DC, ESC_QUERYESCSUPPORT, sizeof(DWORD), (char*)&Code, 0, NULL) > 0)
  151. ExtEscape(DC, GETGXINFO, 0, NULL, sizeof(Info), (char*)&Info);
  152. if (Info.cxWidth==0 || Info.cyHeight==0)
  153. {
  154. // release and remove our gx.dll
  155. FreeLibrary(GAPI);
  156. GAPI = NULL;
  157. }
  158. ReleaseDC(NULL,DC);
  159. }
  160. }
  161. if (!GAPI)
  162. {
  163. DeleteFile(LocalPath);
  164. GAPI = LoadLibrary(T("gx.dll")); // try load on path
  165. }
  166. }
  167. //-------------------------------------
  168. // Benchmark video memory
  169. SlowVideoRAW(&Slow);
  170. if (GAPI)
  171. {
  172. if (Slow == -1)
  173. SlowVideoGAPI(GAPI,Parent,&Slow);
  174. FreeLibrary(GAPI);
  175. }
  176. // EPSON display drive in NEXIO
  177. if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, T("Drivers\Display\S1D13806"), 0, KEY_READ, &Key) == ERROR_SUCCESS)
  178. {
  179. Slow = 1;
  180. RegCloseKey(Key);
  181. }
  182. if (Slow != -1)
  183. {
  184. if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, AdvBase, 0, NULL, 0, 0, NULL, &Key, &Disp) == ERROR_SUCCESS)
  185. {
  186. tchar_t Name[32];
  187. IntToString(Name,TSIZEOF(Name),ADVANCED_SLOW_VIDEO,0);
  188. RegSetValueEx(Key, Name, 0, REG_DWORD, (LPBYTE)&Slow, sizeof(Slow));
  189. RegCloseKey(Key);
  190. }
  191. }
  192. #ifdef ARM
  193. //-------------------------------------
  194. // ATI Imageon 3200 registry settings
  195. Handle = LoadLibrary(T("ACE_DDI.DLL"));
  196. if (Handle)
  197. {
  198. FreeLibrary(Handle);
  199. if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, Base, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &Key, &Disp) == ERROR_SUCCESS)
  200. {
  201. DWORD Value;
  202. DWORD RegType;
  203. DWORD RegSize;
  204. RegSize=sizeof(Value);
  205. if (RegQueryValueEx(Key, Name, 0, &RegType, (LPBYTE)&Value, &RegSize) != ERROR_SUCCESS || !Value)
  206. {
  207. Value = 1;
  208. RegSetValueEx(Key, Name, 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value));
  209. MessageBox(Parent,
  210. T("TCPMP installer disabled ATI IMAGEON device bitmap caching for better video playback. ") 
  211. T("After install please warm boot the device for changes to take effect! ")
  212. T("You can change this setting later in the player."),T("Setup"),MB_OK|MB_SETFOREGROUND);
  213. }
  214. RegCloseKey(Key);
  215. }
  216. }
  217. else
  218. {
  219. tcscpy_s(LocalPath,MAXPATH,InstallDir);
  220. tcscat_s(LocalPath,MAXPATH,T("\ati3200.plg"));
  221. DeleteFile(LocalPath);
  222. }
  223. //-------------------------------------
  224. // Intel 2700G 
  225. Handle = LoadLibrary(T("PVRVADD.DLL"));
  226. if (Handle)
  227. {
  228. FreeLibrary(Handle);
  229. }
  230. else
  231. {
  232. tcscpy_s(LocalPath,MAXPATH,InstallDir);
  233. tcscat_s(LocalPath,MAXPATH,T("\intel2700g.plg"));
  234. DeleteFile(LocalPath);
  235. }
  236. #endif
  237. return 0;
  238. }
  239. DLLEXPORT int WINAPI Uninstall_Init(HWND Parent, LPCTSTR InstallDir)
  240. {
  241.     return 0;
  242. }
  243. static void RegistryRestore(const tchar_t* Base, const tchar_t* SubString)
  244. {
  245. tchar_t* BackupName = T("TCPMP.bak");
  246. tchar_t Backup[MAXPATH];
  247. HKEY Key;
  248. DWORD RegSize;
  249. DWORD RegType;
  250. if (RegOpenKeyEx(HKEY_CLASSES_ROOT, Base, 0, KEY_READ|KEY_WRITE, &Key) == ERROR_SUCCESS)
  251. {
  252. RegSize=sizeof(Backup);
  253. if (RegQueryValueEx(Key, NULL, 0, &RegType, (LPBYTE)Backup, &RegSize)==ERROR_SUCCESS)
  254. {
  255. tcsupr(Backup);
  256. if (tcsstr(Backup,SubString))
  257. {
  258. RegSize=sizeof(Backup);
  259. if (RegQueryValueEx(Key, BackupName, 0, &RegType, (LPBYTE)Backup, &RegSize)==ERROR_SUCCESS)
  260. {
  261. RegSetValueEx(Key, NULL, 0, REG_SZ, (LPBYTE)Backup, RegSize);
  262. RegDeleteValue(Key, BackupName);
  263. }
  264. }
  265. }
  266. RegCloseKey(Key);
  267. }
  268. }
  269. DLLEXPORT int WINAPI Uninstall_Exit(HWND hwndParent)
  270. {
  271. tchar_t Base[MAXPATH];
  272. tchar_t Base2[MAXPATH];
  273. HKEY Key;
  274. DWORD RegSize;
  275. int n;
  276. if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, T("SOFTWARE"), 0, KEY_READ|KEY_WRITE, &Key) == ERROR_SUCCESS)
  277. {
  278. RegDeleteKey(Key,T("TCPMP"));
  279. RegCloseKey(Key);
  280. }
  281. RegSize = sizeof(Base);
  282. for (n=0;RegEnumKeyEx(HKEY_CLASSES_ROOT,n,Base,&RegSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS;++n)
  283. {
  284. if (Base[0] == '.')
  285. {
  286. tcscpy_s(Base2,TSIZEOF(Base2),Base+1);
  287. tcscat_s(Base2,TSIZEOF(Base2),T("%sFile"));
  288. tcsupr(Base2);
  289. RegistryRestore(Base,Base2);
  290. }
  291. else
  292. {
  293. tcscpy_s(Base2,TSIZEOF(Base2),Base);
  294. tcscat_s(Base2,TSIZEOF(Base2),T("\DefaultIcon"));
  295. RegistryRestore(Base2,T("\PLAYER.EXE"));
  296. tcscpy_s(Base2,TSIZEOF(Base2),Base);
  297. tcscat_s(Base2,TSIZEOF(Base2),T("\shell\open\command"));
  298. RegistryRestore(Base2,T("\PLAYER.EXE"));
  299. }
  300. RegSize = sizeof(Base);
  301. }
  302. return 0;
  303. }