Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3133 lines
87 KiB

  1. /*++
  2. Copyright (c) 1994 Microsoft Corporation
  3. Module Name:
  4. cachetst.c
  5. Abstract:
  6. Test program to test cache apis.
  7. Author:
  8. Madan Appiah (madana) 26-Apr-1995
  9. Environment:
  10. User Mode - Win32
  11. Revision History:
  12. --*/
  13. #define IE5
  14. #include <nt.h>
  15. #include <ntrtl.h>
  16. #include <nturtl.h>
  17. #include <windows.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <time.h>
  22. #include <tchar.h>
  23. #include <wininet.h>
  24. #include <winineti.h>
  25. #include <intlgent.hxx>
  26. #define MAX_STRING_LENGTH 128
  27. HMODULE hModule;
  28. //---------------------------------------------------------------------------
  29. // Call this exported function to enable/disable logging to "intlstr.log"
  30. // -disabled by default
  31. //---------------------------------------------------------------------------
  32. FNStringLogging fnStringLogging;
  33. //typedef void FAR PASCAL (*FNStringLogging)(BOOL bActiveState);
  34. FNGetRandIntlString fnGetRandIntlString;
  35. FNGetIntlString fnGetIntlString;
  36. FNGetProbCharString fnGetProbCharString;
  37. FNGetTop20String fnGetTop20String;
  38. FNGetProbURTCString fnGetProbURTCString;
  39. FNGetUniStrRandAnsi fnGetUniStrRandAnsi;
  40. FNGetUniStrInvalidAnsi fnGetUniStrInvalidAnsi;
  41. FNGetUniStrMappedAnsi fnGetUniStrMappedAnsi;
  42. #pragma optimize("y",off)
  43. #define PRINTF(s) printf s;
  44. HMODULE hModule;
  45. #define GET_PROC_ADDRESS(x) (FN ## x) GetProcAddress(hModule, #x );
  46. /*
  47. int
  48. _CRTAPI1
  49. _tmain( int, TCHAR ** );
  50. */
  51. //#ifdef UNICODE
  52. #define LSTRCMPI _tcsicmp
  53. #define LSTRLEN _tcslen
  54. //=================================================================================
  55. #define MAX_COMMAND_ARGS 32
  56. #define DEFAULT_BUFFER_SIZE 1024 // 1k
  57. #define URL_NAME_SIZE (16 + 1)
  58. #define URL_NAME_LENGTH 2*URL_NAME_SIZE
  59. #define CACHE_ENTRY_BUFFER_SIZE (1024 * 5)
  60. #define CACHE_DATA_BUFFER_SIZE 1024
  61. #define CACHE_HEADER_INFO_SIZE 2048
  62. #define CACHE_HEADER_INFO_SIZE_NORMAL_MAX 256
  63. #define CACHE_HEADER_INFO_SIZE_BIG_MAX 512
  64. #define RESET_TIMER TRUE
  65. #define ACCUM_TIMER FALSE
  66. #define GENERIC_0 0
  67. #define FILE_SHARE_NONE 0
  68. //=================================================================================
  69. typedef struct _PERF_INFO {
  70. DWORD ElapsedTime;
  71. DWORD TotalElapsedTime;
  72. DWORD TickCount;
  73. BOOL PrintResults;
  74. } PERF_INFO, *LPPERF_INFO;
  75. // The order of these must match the order in GlobalCommandInfo[]
  76. typedef enum _COMMAND_CODE {
  77. CmdCreateUrlCacheEntry,
  78. CmdCommitUrlCacheEntry,
  79. CmdUpdateUrlCacheEntry,
  80. CmdRetrieveUrlCacheEntryFile,
  81. CmdRetrieveUrlCacheEntryStream,
  82. #ifdef IE5
  83. CmdUnlockUrlCacheEntryFile,
  84. #endif
  85. CmdGetUrlCacheEntryInfo,
  86. CmdSetUrlCacheEntryInfo,
  87. #ifdef IE5
  88. CmdSetUrlCacheEntryGroup,
  89. #endif
  90. CmdSetExempt,
  91. #ifdef IE5
  92. CmdDeleteUrlCacheEntry,
  93. #endif
  94. CmdEnumUrlCacheEntries,
  95. CmdEnumGroup,
  96. CmdSimulateCache,
  97. CmdCreateFile,
  98. CmdFreeCacheSpace,
  99. CmdUseFile,
  100. CmdShowTime,
  101. CmdLoopCnt,
  102. CmdCmdLoopCnt,
  103. CmdSetFileSize,
  104. CmdSetDiskCache1,
  105. CmdSetDiskCache2,
  106. CmdSetQuietMode,
  107. CmdSetPerfMode,
  108. CmdWriteFile,
  109. CmdCreateGroup,
  110. CmdDeleteGroup,
  111. CmdGetExQ,
  112. CmdHelp,
  113. CmdQuit,
  114. UnknownCommand
  115. } COMMAND_CODE, *LPCOMMAND_CODE;
  116. typedef struct _COMMAND_INFO {
  117. LPTSTR CommandName;
  118. LPTSTR AltCommandName;
  119. LPTSTR CommandParams;
  120. COMMAND_CODE CommandCode;
  121. PERF_INFO PerfInfo;
  122. } COMMAND_INFO, *LPCOMMAND_INFO;
  123. typedef struct _CREATE_FILE_INFO
  124. {
  125. LPTSTR lpszVal;
  126. DWORD dwVal;
  127. DWORD *pdwArg;
  128. BOOL bExclusive; // TRUE = Only one value can be used, FALSE - Any combination of values for given argument
  129. } CREATE_FILE_INFO, *LPCREATE_FILE_INFO;
  130. DWORD
  131. CreateRandomString(
  132. DWORD Size,
  133. LPTSTR szString);
  134. VOID
  135. MakeRandomUrlName(
  136. LPTSTR UrlName
  137. );
  138. //=================================================================================
  139. DWORD g_dwCreate_File_Access_Mode = GENERIC_0;
  140. DWORD g_dwCreate_File_Share_Mode = FILE_SHARE_NONE;
  141. DWORD g_dwCreate_File_Creation = OPEN_EXISTING;
  142. DWORD g_dwCreate_File_Flags = FILE_ATTRIBUTE_NORMAL;
  143. BYTE GlobalCacheEntryInfoBuffer[CACHE_ENTRY_BUFFER_SIZE];
  144. BYTE GlobalCacheDataBuffer[CACHE_DATA_BUFFER_SIZE];
  145. BYTE GlobalCacheHeaderInfo[CACHE_HEADER_INFO_SIZE];
  146. FILE *UrlList = NULL;
  147. TCHAR UrlBuffer[DEFAULT_BUFFER_SIZE];
  148. LPTSTR UrlListKey = _T( "url:" );
  149. LPTSTR g_lpWriteFileBuf = NULL;
  150. FILE *DumpUrlList = NULL;
  151. DWORD cCommands = 0;
  152. DWORD cFails = 0;
  153. DWORD g_dwNumIterations = 1;
  154. DWORD g_dwIteration = 0;
  155. DWORD g_dwNumCmdIterations = 1;
  156. DWORD g_dwCmdIteration = 0;
  157. DWORD g_dwFileSize = 0;
  158. DWORD g_dwDiskCache = 0;
  159. BOOL g_bWriteFile = FALSE;
  160. BOOL g_bQuietMode = FALSE;
  161. BOOL g_bPerfMode = FALSE;
  162. BOOL g_bUseFile = FALSE;
  163. PERF_INFO AppTimer;
  164. COMMAND_INFO GlobalCommandInfo[] = {
  165. {_T( "Create" ), _T( "cr" ), _T( "( UrlName | \"<rand>\" ) <ExpectedSize>\n " ), CmdCreateUrlCacheEntry, {0, 0, 0} },
  166. {_T( "Commit" ), _T( "co" ), _T( "( UrlName | \"<rand>\" ) ( LocalFileName | \"<rand>\" ) <ExpireTime (in hours from now)>" ), CmdCommitUrlCacheEntry, {0, 0, 0} },
  167. {_T( "Update" ), _T( "co" ), _T( "( UrlName | \"<rand>\" )" ), CmdUpdateUrlCacheEntry, {0, 0, 0} },
  168. {_T( "GetFile" ), _T( "gf" ), _T( "( UrlName | \"<rand>\" )" ), CmdRetrieveUrlCacheEntryFile, {0, 0, 0} },
  169. {_T( "GetStream" ), _T( "gs" ), _T( "( UrlName | \"<rand>\" ) [NoRead]"), CmdRetrieveUrlCacheEntryStream, {0, 0, 0} },
  170. #ifdef IE5
  171. {_T( "UnlockFile" ), _T( "uf" ), _T( "( UrlName | \"<rand>\" )" ), CmdUnlockUrlCacheEntryFile, {0, 0, 0} },
  172. #endif
  173. {_T( "GetInfo" ), _T( "gi" ), _T( "( UrlName | \"<rand>\" )" ), CmdGetUrlCacheEntryInfo, {0, 0, 0} },
  174. {_T( "SetInfo" ), _T( "si" ), _T( "( UrlName | \"<rand>\" ) <ExpireTime (in hours from now)>" ), CmdSetUrlCacheEntryInfo, {0, 0, 0} },
  175. #ifdef IE5
  176. {_T( "SetGroup" ), _T( "sg" ), _T( "( UrlName | \"<rand>\" ) Flags GroupId" ), CmdSetUrlCacheEntryGroup, {0, 0, 0} },
  177. #endif
  178. {_T( "SetExempt" ), _T( "se" ), _T( "( UrlName | \"<rand>\" ) Exempt-Seconds"), CmdSetExempt, {0, 0, 0}},
  179. #ifdef IE5
  180. {_T( "Delete" ), _T( "d" ), _T( "( UrlName | \"<rand>\" )" ), CmdDeleteUrlCacheEntry, {0, 0, 0} },
  181. #endif
  182. {_T( "Enum" ), _T( "e" ), _T( "<q (quiet mode)>" ), CmdEnumUrlCacheEntries, {0, 0, 0} },
  183. {_T( "EnumGroup" ), _T( "eg" ), _T( "GroupId" ), CmdEnumGroup, {0, 0, 0} },
  184. {_T( "SimCache" ), _T( "sc" ), _T( "NumUrls <q (quiet mode)>" ), CmdSimulateCache, {0, 0, 0} },
  185. {_T( "CreateFile" ), _T( "cf" ), _T( "FileName AccessMode ShareMode Creation FlagsAttrs" ), CmdCreateFile, {0, 0, 0} },
  186. {_T( "Free" ), _T( "f" ), _T( "CachePercent (0 to 100, history, cookies)"), CmdFreeCacheSpace, {0, 0, 0} },
  187. {_T( "UseFile" ), _T( "use" ),_T( "FilePath (text file with one command per line)" ), CmdUseFile, {0, 0, 0} },
  188. {_T( "ShowTime" ), _T( "st" ), _T( "HHHHHHHH LLLLLLLL (Hex HighDateTime and LowDateTime)" ), CmdShowTime, {0, 0, 0} },
  189. {_T( "SetLoopCnt" ), _T( "slc" ),_T( "NumInterations" ), CmdLoopCnt, {0, 0, 0} },
  190. {_T( "SetCmdLoopCnt" ), _T( "scc" ),_T( "NumInterations" ), CmdCmdLoopCnt, {0, 0, 0} },
  191. {_T( "SetFileSize" ), _T( "sfs" ),_T( "NumBytes (0 = random size)" ), CmdSetFileSize, {0, 0, 0} },
  192. {_T( "SetNoBuffering" ), _T( "snb" ),_T( "On|Off"), CmdSetDiskCache1, {0, 0, 0} },
  193. {_T( "SetWriteThrough" ), _T( "swt" ),_T( "On|Off"), CmdSetDiskCache2, {0, 0, 0} },
  194. {_T( "SetQuietMode" ), _T( "sqm" ),_T( "On|Off"), CmdSetQuietMode, {0, 0, 0} },
  195. {_T( "SetPerfMode" ), _T( "spm" ),_T( "On|Off"), CmdSetPerfMode, {0, 0, 0} },
  196. {_T( "SetWriteFile" ), _T( "swf" ),_T( "On|Off (On=write a FileSize data blk, Off=garbage data)"), CmdWriteFile, {0, 0, 0} },
  197. {_T( "CreateGroup" ), _T( "cg" ),_T( "Flags" ), CmdCreateGroup, {0, 0, 0} },
  198. {_T( "DeleteGroup" ), _T( "dg" ),_T("GroupID, Flags"), CmdDeleteGroup, {0, 0, 0} },
  199. {_T( "GetExemptQuota" ), _T( "eq" ), _T(""), CmdGetExQ, {0, 0, 0} },
  200. {_T( "Help" ), _T("?"), _T(""), CmdHelp, {0, 0, 0} },
  201. {_T( "Quit" ), _T( "q" ), _T(""), CmdQuit, {0, 0, 0} }
  202. };
  203. CREATE_FILE_INFO Create_File_Table[] =
  204. {
  205. {_T( "FILE_FLAG_WRITE_THROUGH" ), FILE_FLAG_WRITE_THROUGH, &g_dwCreate_File_Flags, FALSE},
  206. {_T( "FILE_FLAG_OVERLAPPED" ), FILE_FLAG_OVERLAPPED, &g_dwCreate_File_Flags, FALSE},
  207. {_T( "FILE_FLAG_NO_BUFFERING" ), FILE_FLAG_NO_BUFFERING, &g_dwCreate_File_Flags, FALSE},
  208. {_T( "FILE_FLAG_RANDOM_ACCESS" ), FILE_FLAG_RANDOM_ACCESS, &g_dwCreate_File_Flags, FALSE},
  209. {_T( "FILE_FLAG_SEQUENTIAL_SCAN" ), FILE_FLAG_SEQUENTIAL_SCAN, &g_dwCreate_File_Flags, FALSE},
  210. {_T( "FILE_FLAG_DELETE_ON_CLOSE" ), FILE_FLAG_DELETE_ON_CLOSE, &g_dwCreate_File_Flags, FALSE},
  211. {_T( "FILE_FLAG_BACKUP_SEMANTICS" ), FILE_FLAG_BACKUP_SEMANTICS, &g_dwCreate_File_Flags, FALSE},
  212. {_T( "FILE_FLAG_POSIX_SEMANTICS" ), FILE_FLAG_POSIX_SEMANTICS, &g_dwCreate_File_Flags, FALSE},
  213. {_T( "FILE_ATTRIBUTE_ARCHIVE" ), FILE_ATTRIBUTE_ARCHIVE, &g_dwCreate_File_Flags, FALSE},
  214. {_T( "FILE_ATTRIBUTE_COMPRESSED" ), FILE_ATTRIBUTE_COMPRESSED, &g_dwCreate_File_Flags, FALSE},
  215. {_T( "FILE_ATTRIBUTE_HIDDEN" ), FILE_ATTRIBUTE_HIDDEN, &g_dwCreate_File_Flags, FALSE},
  216. {_T( "FILE_ATTRIBUTE_NORMAL" ), FILE_ATTRIBUTE_NORMAL, &g_dwCreate_File_Flags, FALSE},
  217. {_T( "FILE_ATTRIBUTE_OFFLINE" ), FILE_ATTRIBUTE_OFFLINE, &g_dwCreate_File_Flags, FALSE},
  218. {_T( "FILE_ATTRIBUTE_READONLY" ), FILE_ATTRIBUTE_READONLY, &g_dwCreate_File_Flags, FALSE},
  219. {_T( "FILE_ATTRIBUTE_SYSTEM" ), FILE_ATTRIBUTE_SYSTEM, &g_dwCreate_File_Flags, FALSE},
  220. {_T( "FILE_ATTRIBUTE_TEMPORARY" ), FILE_ATTRIBUTE_TEMPORARY, &g_dwCreate_File_Flags, FALSE},
  221. {_T( "CREATE_NEW" ), CREATE_NEW, &g_dwCreate_File_Creation, TRUE},
  222. {_T( "CREATE_ALWAYS" ), CREATE_ALWAYS, &g_dwCreate_File_Creation, TRUE},
  223. {_T( "OPEN_EXISTING" ), OPEN_EXISTING, &g_dwCreate_File_Creation, TRUE},
  224. {_T( "OPEN_ALWAYS" ), OPEN_ALWAYS, &g_dwCreate_File_Creation, TRUE},
  225. {_T( "TRUNCATE_EXISTING" ), TRUNCATE_EXISTING, &g_dwCreate_File_Creation, TRUE},
  226. {_T( "FILE_SHARE_DELETE" ), FILE_SHARE_DELETE, &g_dwCreate_File_Share_Mode, FALSE},
  227. {_T( "FILE_SHARE_READ" ), FILE_SHARE_READ, &g_dwCreate_File_Share_Mode, FALSE},
  228. {_T( "FILE_SHARE_WRITE" ), FILE_SHARE_WRITE, &g_dwCreate_File_Share_Mode, FALSE},
  229. {_T( "FILE_SHARE_NONE" ), FILE_SHARE_NONE, &g_dwCreate_File_Share_Mode, FALSE},
  230. {_T( "GENERIC_READ" ), GENERIC_READ, &g_dwCreate_File_Access_Mode, FALSE},
  231. {_T( "GENERIC_WRITE" ), GENERIC_WRITE, &g_dwCreate_File_Access_Mode, FALSE},
  232. {_T( "GENERIC_0" ), GENERIC_0, &g_dwCreate_File_Access_Mode, FALSE},
  233. {_T( "" ), 0, NULL, FALSE}
  234. };
  235. DWORD WINAPIV Format_String(LPTSTR *plpsz, LPTSTR lpszFmt, ...);
  236. DWORD WINAPI Format_Error(DWORD dwErr, LPTSTR *plpsz);
  237. DWORD WINAPI Format_StringV(LPTSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs);
  238. DWORD WINAPI Format_MessageV(DWORD dwFlags, DWORD dwErr, LPTSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs);
  239. #define RAND_INTL_STRING _T("<rand>")
  240. DWORD
  241. CreateRandomString(
  242. DWORD Size,
  243. LPTSTR szString)
  244. {
  245. DWORD cbRet = 0;
  246. #ifdef INTERNATIONAL
  247. cbRet = fnGetRandIntlString(
  248. Size, //int iMaxChars,
  249. TRUE, // BOOL bAbs,
  250. TRUE, // BOOL bCheck,
  251. szString); // string to be returned
  252. _tprintf(_T("\n\nGetRandIntlString returns %s\n\n"), szString );
  253. #else
  254. //
  255. // IF this is not an international supported version,
  256. // we go back to MakeRandomUrlName()
  257. //
  258. MakeRandomUrlName( szString );
  259. #endif
  260. return cbRet;
  261. }
  262. //===========================================================================================
  263. // borrowed from MSDN
  264. //===========================================================================================
  265. DWORD WINAPI GetPerfTime(VOID)
  266. {
  267. static DWORD freq; // timer frequency
  268. LARGE_INTEGER curtime;
  269. if (!freq)
  270. { // determine timer frequency
  271. QueryPerformanceFrequency(&curtime);
  272. #if STOPWATCH_DEBUG
  273. if (curtime.HighPart)
  274. { // timer is too fast
  275. if(g_dwStopWatchMode & SPMODE_DEBUGOUT)
  276. OutputDebugString(TEXT("High resolution timer counts too quickly for single-width arithmetic.\r\n"));
  277. freq = 1;
  278. } // timer is too fast
  279. else
  280. #endif
  281. freq = curtime.LowPart / 1000; // i.e., ticks per millisecond
  282. } // determine timer frequency
  283. QueryPerformanceCounter(&curtime);
  284. return (DWORD)(curtime.QuadPart / (LONGLONG)freq);
  285. }
  286. //=================================================================================
  287. void StartPerfTimer(LPPERF_INFO pInfo, BOOL ResetFlag)
  288. {
  289. pInfo->TickCount = GetPerfTime();
  290. if(ResetFlag)
  291. {
  292. pInfo->ElapsedTime = 0;
  293. pInfo->TotalElapsedTime = 0;
  294. }
  295. }
  296. //=================================================================================
  297. void StopPerfTimer(LPPERF_INFO pInfo)
  298. {
  299. DWORD BegCount = pInfo->TickCount;
  300. pInfo->TickCount = GetPerfTime();
  301. pInfo->ElapsedTime += pInfo->TickCount - BegCount;
  302. pInfo->TotalElapsedTime += pInfo->ElapsedTime;
  303. }
  304. //=================================================================================
  305. void DisplayGlobalSettings(void)
  306. {
  307. _tprintf("Interations = %ld, CmdIterations = %ld, FileSize = %ld, CreateFlags = %x (%s%s%s), WriteFile = %s, QuietMode = %s, PerfMode = %s\n",
  308. g_dwNumIterations, g_dwNumCmdIterations,
  309. g_dwFileSize,
  310. g_dwDiskCache,
  311. g_dwDiskCache & (FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH) ?_T( "" ) :_T( "None" ),
  312. g_dwDiskCache & FILE_FLAG_NO_BUFFERING ?_T( "NoBuf " ) :_T( "" ),
  313. g_dwDiskCache & FILE_FLAG_WRITE_THROUGH ?_T( "WriteThru" ) :_T( "" ),
  314. g_bWriteFile ?_T( "On" ): _T( "Off" ),
  315. g_bQuietMode ?_T( "On" ): _T( "Off" ),
  316. g_bPerfMode ?_T( "On" ): _T( "Off" ));
  317. }
  318. //=================================================================================
  319. DWORD WINAPIV DisplayPerfResults(LPPERF_INFO pInfo, LPTSTR lpszFmt, ...)
  320. {
  321. LPTSTR lpsz = NULL;
  322. DWORD dwRet;
  323. DWORD dwCnt = (g_dwIteration <= g_dwNumIterations) ?(g_dwIteration ?g_dwIteration :1) :g_dwNumIterations;
  324. DWORD dwCmdCnt = (g_dwCmdIteration <= g_dwNumCmdIterations) ?(g_dwCmdIteration ?g_dwCmdIteration :1) :g_dwNumCmdIterations;
  325. va_list vArgs;
  326. if(lpszFmt != NULL)
  327. {
  328. va_start (vArgs, lpszFmt);
  329. dwRet = Format_StringV(&lpsz, lpszFmt, &vArgs);
  330. va_end (vArgs);
  331. }
  332. _tprintf(_T( "%s, " ), lpsz ?lpsz :_T( "" ));
  333. _tprintf(_T( "Time(ms) = %ld, MS/Iter = %ld, Iteration = %ld, CmdIteration = %ld, " ),
  334. pInfo->ElapsedTime,
  335. pInfo->ElapsedTime/dwCmdCnt,
  336. dwCnt,
  337. dwCmdCnt);
  338. DisplayGlobalSettings();
  339. if(lpsz)
  340. LocalFree(lpsz);
  341. return(dwRet);
  342. }
  343. //=================================================================================
  344. DWORD
  345. ProcessCommandCode (
  346. DWORD CommandCode,
  347. DWORD CommandArgc,
  348. LPTSTR *CommandArgv
  349. );
  350. DWORD
  351. GetLeafLenFromPath(
  352. LPTSTR lpszPath
  353. );
  354. //=================================================================================
  355. #if DBG
  356. #define TestDbgAssert(Predicate) \
  357. { \
  358. if (!(Predicate)) \
  359. TestDbgAssertFailed( #Predicate, __FILE__, __LINE__, NULL ); \
  360. }
  361. VOID
  362. TestDbgAssertFailed(
  363. LPTSTR FailedAssertion,
  364. LPTSTR FileName,
  365. DWORD LineNumber,
  366. LPTSTR Message
  367. )
  368. /*++
  369. Routine Description:
  370. Assertion failed.
  371. Arguments:
  372. FailedAssertion :
  373. FileName :
  374. LineNumber :
  375. Message :
  376. Return Value:
  377. none.
  378. --*/
  379. {
  380. _tprintf(_T( "Assert @ %s \n" ), FailedAssertion );
  381. _tprintf(_T( "Assert Filename, %s \n" ), FileName );
  382. _tprintf(_T( "Line Num. = %ld.\n" ), LineNumber );
  383. _tprintf(_T( "Message is %s\n" ), Message );
  384. DebugBreak();
  385. }
  386. #else
  387. #define TestDbgAssert(_x_)
  388. #endif // DBG
  389. //=================================================================================
  390. VOID
  391. ParseArguments(
  392. LPTSTR InBuffer,
  393. LPTSTR *CArgv,
  394. LPDWORD CArgc
  395. )
  396. {
  397. LPTSTR CurrentPtr = InBuffer;
  398. DWORD i = 0;
  399. DWORD Cnt = 0;
  400. for ( ;; ) {
  401. //
  402. // skip blanks.
  403. //
  404. while( *CurrentPtr ==_T( ' ' )) {
  405. CurrentPtr++;
  406. }
  407. if( *CurrentPtr ==_T( '\0' )) {
  408. break;
  409. }
  410. CArgv[i++] = CurrentPtr;
  411. //
  412. // go to next space.
  413. //
  414. while( (*CurrentPtr != _T( '\0' )) &&
  415. (*CurrentPtr != _T( '\n' )) ) {
  416. if( *CurrentPtr ==_T( '"' )) { // Deal with simple quoted args
  417. if( Cnt == 0 )
  418. CArgv[i-1] = ++CurrentPtr; // Set arg to after quote
  419. else
  420. *CurrentPtr = _T( '\0' ); // Remove end quote
  421. Cnt = !Cnt;
  422. }
  423. if( (Cnt == 0) && (*CurrentPtr == _T( ' ' )) || // If we hit a space and no quotes yet we are done with this arg
  424. (*CurrentPtr == _T( '\0' )) )
  425. break;
  426. CurrentPtr++;
  427. }
  428. if( *CurrentPtr ==_T( '\0' )) {
  429. break;
  430. }
  431. *CurrentPtr++ = _T( '\0' );
  432. }
  433. *CArgc = i;
  434. return;
  435. }
  436. //=================================================================================
  437. LPTSTR
  438. GetUrlFromFile ()
  439. {
  440. if (!UrlList)
  441. {
  442. UrlList = _tfopen (_T( "urllist" ), _T( "r" ));
  443. if (UrlList == NULL)
  444. return NULL;
  445. }
  446. if (fgets( UrlBuffer, DEFAULT_BUFFER_SIZE, UrlList))
  447. {
  448. UrlBuffer[_tcslen(UrlBuffer) -1] = _T( '\0' ); //kill line feed for no param cmds
  449. return UrlBuffer;
  450. }
  451. else
  452. {
  453. fclose (UrlList);
  454. UrlList = NULL;
  455. return GetUrlFromFile();
  456. }
  457. }
  458. //=================================================================================
  459. VOID
  460. MakeRandomUrlName(
  461. LPTSTR UrlName
  462. )
  463. /*++
  464. Routine Description:
  465. Creates a random url name. The format of the name will be as
  466. below:
  467. url(00000-99999)
  468. Ex ca00123
  469. Arguments:
  470. UrlName : pointer to an URL name buffer
  471. Return Value:
  472. none.
  473. --*/
  474. {
  475. DWORD RandNum;
  476. LPTSTR UrlNamePtr = UrlName;
  477. DWORD i;
  478. DWORD Size;
  479. Size = URL_NAME_SIZE;
  480. *UrlNamePtr++ = _T( 'U' );
  481. *UrlNamePtr++ = _T( 'R' );
  482. *UrlNamePtr++ = _T( 'L' );
  483. Size -=3*sizeof(TCHAR);
  484. //
  485. // generate a_T( "Size" )digits random string;
  486. //
  487. #if 0
  488. #define MAX_STRING_LENGTH URL_NAME_SIZE
  489. i = fnGetRandIntlString(
  490. Size, //int iMaxChars,
  491. TRUE, // BOOL bAbs,
  492. TRUE, // BOOL bCheck,
  493. UrlNamePtr); // string to be returned
  494. _tprintf(_T("\n\n *** GetRandIntlString() returns %s ***\n\n"), UrlNamePtr );
  495. #else
  496. for ( i = 0; i < Size; i++) {
  497. RandNum = rand() % 36;
  498. *UrlNamePtr++ =
  499. ( RandNum < 10 ) ? (CHAR)(_T( '0' ) + RandNum) : (CHAR)(_T( 'A' ) + (RandNum - 10));
  500. }
  501. *UrlNamePtr = _T( '\0' );
  502. #endif
  503. return;
  504. }
  505. //=================================================================================
  506. VOID
  507. TestMakeRandomUrlName(
  508. VOID
  509. )
  510. {
  511. #define MAX_BUFFERS 32
  512. #define MAX_NAMES (10 * 1024)
  513. #define NAME_BUFFER_SIZE (10 * 1024)
  514. CHAR UrlName[URL_NAME_SIZE];
  515. DWORD i;
  516. LPBYTE NameBuffers[MAX_BUFFERS];
  517. DWORD NumNameBuffer;
  518. LPTSTR *Names;
  519. DWORD NumNames;
  520. LPBYTE NextName;
  521. LPBYTE EndOfBuffer;
  522. DWORD NumRepeat;
  523. NumNames = 0;
  524. NumNameBuffer = 0;
  525. NumRepeat = 0;
  526. //
  527. // allocate names array.
  528. //
  529. Names = (LPTSTR *) LocalAlloc(
  530. LMEM_FIXED | LMEM_ZEROINIT,
  531. sizeof(LPTSTR) * MAX_NAMES );
  532. if( Names == NULL ) {
  533. _tprintf(_T( "local alloc failed.\n" ));
  534. return;
  535. }
  536. //
  537. // allocate name buffer.
  538. //
  539. NextName = (LPBYTE) LocalAlloc(
  540. LMEM_FIXED | LMEM_ZEROINIT,
  541. NAME_BUFFER_SIZE );
  542. if( NextName == NULL ) {
  543. _tprintf(_T( "local alloc failed.\n" ));
  544. return;
  545. }
  546. EndOfBuffer = NextName + NAME_BUFFER_SIZE;
  547. NameBuffers[NumNameBuffer++] = NextName;
  548. for( i = 0; i < MAX_NAMES; i++ ) {
  549. DWORD j;
  550. MakeRandomUrlName( UrlName );
  551. // _tprintf( "%d : %s\n", i, UrlName );
  552. // _tprintf(".");
  553. //
  554. // look to see this name is already created.
  555. //
  556. for( j = 0; j < NumNames; j++ ) {
  557. if( _tcscmp( Names[j], UrlName ) == 0 ) {
  558. // _tprintf("%ld :%ld.\n", ++NumRepeat, NumNames );
  559. break;
  560. }
  561. }
  562. if( j < NumNames ) {
  563. //
  564. // repeated name.
  565. //
  566. continue;
  567. }
  568. //
  569. // add this name to the list.
  570. //
  571. if( (NextName + _tcslen(UrlName) + 1) > EndOfBuffer ) {
  572. if( NumNameBuffer >= MAX_BUFFERS ) {
  573. _tprintf(_T( "too many buffers\n" ));
  574. return;
  575. }
  576. //
  577. // allocate another name buffer.
  578. //
  579. NextName = (LPBYTE) LocalAlloc(
  580. LMEM_FIXED | LMEM_ZEROINIT,
  581. NAME_BUFFER_SIZE );
  582. if( NextName == NULL ) {
  583. _tprintf(_T( "local alloc failed.\n" ));
  584. return;
  585. }
  586. EndOfBuffer = NextName + NAME_BUFFER_SIZE;
  587. NameBuffers[NumNameBuffer++] = NextName;
  588. _tprintf(_T( "Another buffer alloted.\n" ));
  589. if( (NextName + _tcslen(UrlName) + 1) > EndOfBuffer ) {
  590. _tprintf(_T( "Fatal error.\n" ));
  591. return;
  592. }
  593. }
  594. _tcscpy( NextName, UrlName );
  595. Names[NumNames++] = NextName;
  596. NextName += _tcslen(UrlName) + 1;
  597. }
  598. //
  599. // free buffers.
  600. //
  601. LocalFree( Names );
  602. for( i = 0; i < NumNameBuffer; i++ ) {
  603. LocalFree( NameBuffers[i] );
  604. }
  605. _tprintf(_T( "%ld unique names generated successfully.\n" ), NumNames );
  606. return;
  607. }
  608. //=================================================================================
  609. DWORD
  610. SetFileSizeByName(
  611. LPCTSTR FileName,
  612. DWORD FileSize
  613. )
  614. /*++
  615. Routine Description:
  616. Set the size of the specified file.
  617. Arguments:
  618. FileName : full path name of the file whose size is asked for.
  619. FileSize : new size of the file.
  620. Return Value:
  621. Windows Error Code.
  622. --*/
  623. {
  624. HANDLE FileHandle;
  625. DWORD FilePointer;
  626. DWORD Error = ERROR_SUCCESS;
  627. DWORD dwFlags = 0;
  628. DWORD dwCreate;
  629. BOOL BoolError;
  630. //
  631. // get the size of the file being cached.
  632. //
  633. dwFlags = g_dwDiskCache;
  634. if(g_bWriteFile)
  635. dwCreate = CREATE_ALWAYS;
  636. else
  637. dwCreate = OPEN_EXISTING;
  638. FileHandle = CreateFile(
  639. FileName,
  640. GENERIC_WRITE,
  641. 0, //FILE_SHARE_READ | FILE_SHARE_WRITE,
  642. NULL,
  643. dwCreate,
  644. FILE_ATTRIBUTE_NORMAL | dwFlags,
  645. NULL );
  646. if( FileHandle == INVALID_HANDLE_VALUE ) {
  647. return( GetLastError() );
  648. }
  649. if(g_bWriteFile)
  650. {
  651. DWORD dwBytesWritten;
  652. if(!WriteFile(FileHandle, g_lpWriteFileBuf, FileSize, &dwBytesWritten, NULL))
  653. Error = GetLastError();
  654. TestDbgAssert(FileSize == dwBytesWritten);
  655. }
  656. else
  657. {
  658. FilePointer = SetFilePointer(FileHandle, FileSize, NULL, FILE_BEGIN );
  659. if( FilePointer != 0xFFFFFFFF )
  660. {
  661. TestDbgAssert( FilePointer == FileSize );
  662. if(!SetEndOfFile( FileHandle ))
  663. Error = GetLastError();
  664. }
  665. else
  666. {
  667. Error = GetLastError();
  668. }
  669. }
  670. CloseHandle( FileHandle );
  671. return( Error );
  672. }
  673. //=================================================================================
  674. COMMAND_CODE
  675. DecodeCommand(
  676. LPTSTR CommandName
  677. )
  678. {
  679. DWORD i;
  680. DWORD NumCommands;
  681. NumCommands = sizeof(GlobalCommandInfo) / sizeof(COMMAND_INFO);
  682. TestDbgAssert( NumCommands <= UnknownCommand );
  683. for( i = 0; i < NumCommands; i++) {
  684. if(( _tcsicmp( CommandName, GlobalCommandInfo[i].CommandName ) == 0 ) ||
  685. ( _tcsicmp( CommandName, GlobalCommandInfo[i].AltCommandName ) == 0 )) {
  686. return( GlobalCommandInfo[i].CommandCode );
  687. }
  688. }
  689. return( UnknownCommand );
  690. }
  691. //=================================================================================
  692. VOID
  693. PrintCommands(
  694. VOID
  695. )
  696. {
  697. DWORD i;
  698. DWORD NumCommands;
  699. NumCommands = sizeof(GlobalCommandInfo) / sizeof(COMMAND_INFO);
  700. TestDbgAssert( NumCommands <= UnknownCommand );
  701. for( i = 0; i < NumCommands; i++) {
  702. _ftprintf(stderr, _T( " %s (%s) %s\n" ),
  703. GlobalCommandInfo[i].CommandName,
  704. GlobalCommandInfo[i].AltCommandName,
  705. GlobalCommandInfo[i].CommandParams );
  706. }
  707. }
  708. //=================================================================================
  709. VOID
  710. DisplayUsage(
  711. VOID
  712. )
  713. {
  714. _ftprintf(stderr,_T( "Usage: command <command parameters>\n" ));
  715. _ftprintf(stderr, _T( "Commands : \n" ));
  716. PrintCommands();
  717. DisplayGlobalSettings();
  718. return;
  719. }
  720. //=================================================================================
  721. VOID
  722. DisplayExemptQuota()
  723. {
  724. _ftprintf(stderr, _T( "Exempt Usage = \n" ));
  725. return;
  726. }
  727. FILETIME
  728. GetGmtTime(
  729. VOID
  730. )
  731. {
  732. SYSTEMTIME SystemTime;
  733. FILETIME Time;
  734. GetSystemTime( &SystemTime );
  735. SystemTimeToFileTime( &SystemTime, &Time );
  736. return( Time );
  737. }
  738. //=================================================================================
  739. LPTSTR
  740. ConvertGmtTimeToString(
  741. FILETIME Time,
  742. LPTSTR OutputBuffer
  743. )
  744. {
  745. SYSTEMTIME SystemTime;
  746. FILETIME LocalTime;
  747. static FILETIME ftNone = {0, 0};
  748. if (!memcmp (&Time, &ftNone, sizeof(FILETIME)))
  749. _stprintf (OutputBuffer, _T( "<none>" ));
  750. else
  751. {
  752. FileTimeToLocalFileTime( &Time , &LocalTime );
  753. FileTimeToSystemTime( &LocalTime, &SystemTime );
  754. _stprintf( OutputBuffer,
  755. _T( "%02u/%02u/%04u %02u:%02u:%02u " ),
  756. SystemTime.wMonth,
  757. SystemTime.wDay,
  758. SystemTime.wYear,
  759. SystemTime.wHour,
  760. SystemTime.wMinute,
  761. SystemTime.wSecond );
  762. }
  763. return( OutputBuffer );
  764. }
  765. //=================================================================================
  766. VOID
  767. PrintUrlInfo(
  768. LPINTERNET_CACHE_ENTRY_INFO CacheEntryInfo,
  769. DWORD Index
  770. )
  771. {
  772. TCHAR TimeBuffer[DEFAULT_BUFFER_SIZE];
  773. LPTSTR Tab = _T( "" );
  774. if( Index != (DWORD)(-1) ) {
  775. _tprintf( _T( "Index = %ld\n" ), Index);
  776. Tab = _T( "\t" );
  777. }
  778. _tprintf( _T( "%sUrlName = %s\n" ), Tab, CacheEntryInfo->lpszSourceUrlName );
  779. #if UNICODE
  780. _tprintf( _T( "%sLocalFileName = %ws\n" ),
  781. Tab, CacheEntryInfo->lpszLocalFileName );
  782. #else
  783. _tprintf( _T( "%sLocalFileName = %s\n" ),
  784. Tab, CacheEntryInfo->lpszLocalFileName );
  785. #endif
  786. _tprintf( _T( "%sdwStructSize = %lx\n" ),
  787. Tab, CacheEntryInfo->dwStructSize );
  788. _tprintf( _T( "%sCacheEntryType = %lx\n" ),
  789. Tab, CacheEntryInfo->CacheEntryType );
  790. _tprintf( _T( "%sUseCount = %ld\n" ),
  791. Tab, CacheEntryInfo->dwUseCount );
  792. _tprintf( _T( "%sHitRate = %ld\n" ),
  793. Tab, CacheEntryInfo->dwHitRate );
  794. _tprintf( _T( "%sSize = %ld:%ld\n" ),
  795. Tab, CacheEntryInfo->dwSizeLow, CacheEntryInfo->dwSizeHigh );
  796. _tprintf( _T( "%sLastModifiedTime = %s\n" ),
  797. Tab, ConvertGmtTimeToString( CacheEntryInfo->LastModifiedTime, TimeBuffer) );
  798. _tprintf( _T( "%sExpireTime = %s\n" ),
  799. Tab, ConvertGmtTimeToString( CacheEntryInfo->ExpireTime, TimeBuffer) );
  800. _tprintf( _T( "%sLastAccessTime = %s\n" ),
  801. Tab, ConvertGmtTimeToString( CacheEntryInfo->LastAccessTime, TimeBuffer) );
  802. _tprintf( _T( "%sLastSyncTime = %s\n" ),
  803. Tab, ConvertGmtTimeToString( CacheEntryInfo->LastSyncTime, TimeBuffer) );
  804. #if 1
  805. _tprintf( _T( "%sHeaderInfo = %s\n" ),
  806. Tab, CacheEntryInfo->lpHeaderInfo );
  807. #endif
  808. _tprintf( _T( "%sHeaderInfoSize = %ld\n" ),
  809. Tab, CacheEntryInfo->dwHeaderInfoSize );
  810. #if UNICODE
  811. _tprintf( _T( "%sFileExtension = %ws\n" ),
  812. Tab, CacheEntryInfo->lpszFileExtension );
  813. #else
  814. _tprintf( _T( "%sFileExtension = %s\n" ),
  815. Tab, CacheEntryInfo->lpszFileExtension );
  816. #endif
  817. _tprintf (_T( "%sExemptDelta = %d\n" ),
  818. Tab, CacheEntryInfo->dwExemptDelta);
  819. }
  820. #ifdef IE5
  821. VOID
  822. PrintGroupInfo(
  823. GROUPID gid
  824. )
  825. {
  826. LPTSTR Tab = _T( "\t" );
  827. HANDLE EnumHandle = NULL;
  828. DWORD BufferSize;
  829. INTERNET_CACHE_GROUP_INFOA pInfo;
  830. DWORD dwInfo = sizeof(INTERNET_CACHE_GROUP_INFOA);
  831. if(GetUrlCacheGroupAttribute(gid, 0, 0xffffffff, &pInfo, &dwInfo, NULL))
  832. {
  833. _tprintf( _T( "%sdwGroupSize = %lx\n" ), Tab, pInfo.dwGroupSize);
  834. _tprintf( _T( "%sdwGroupFlags = %lx\n" ), Tab, pInfo.dwGroupFlags);
  835. _tprintf( _T( "%sdwGroupType = %lx\n" ), Tab, pInfo.dwGroupType);
  836. _tprintf( _T( "%sdwDiskUsage = %lx\n" ), Tab, pInfo.dwDiskUsage);
  837. _tprintf( _T( "%sdwDiskQuota = %lx\n" ), Tab, pInfo.dwDiskQuota);
  838. _tprintf( _T( "%s%s======== URLS ========\n" ), Tab, Tab);
  839. // looking for all url associated with this group
  840. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  841. EnumHandle = FindFirstUrlCacheEntryEx (
  842. NULL, // search pattern
  843. 0, // flags
  844. 0xffffffff, // filter
  845. gid, // groupid
  846. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  847. &BufferSize,
  848. NULL,
  849. NULL,
  850. NULL
  851. );
  852. if (EnumHandle)
  853. {
  854. _tprintf(_T( "\t\t %s\n" ),
  855. ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName);
  856. }
  857. // get more entries.
  858. for ( ;; )
  859. {
  860. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  861. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  862. if( !FindNextUrlCacheEntryEx(
  863. EnumHandle,
  864. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  865. &BufferSize, NULL, NULL, NULL))
  866. {
  867. break;
  868. }
  869. _tprintf(_T( "\t\t %s\n" ),
  870. ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName);
  871. }
  872. FindCloseUrlCache(EnumHandle);
  873. }
  874. else
  875. {
  876. _tprintf(_T( "Failed to retrieve attribute for this group\n" ));
  877. }
  878. }
  879. #endif
  880. //=================================================================================
  881. DWORD
  882. ProcessFreeCacheSpace (
  883. DWORD argc,
  884. LPTSTR *argv
  885. )
  886. {
  887. DWORD Error = ERROR_SUCCESS;
  888. DWORD dwSize = 0;
  889. TCHAR szCachePath[MAX_PATH+1];
  890. TCHAR szWinDir[MAX_PATH+1];
  891. if (argc < 1)
  892. {
  893. _ftprintf(stderr, _T( "Usage: %s %s\n" ),
  894. GlobalCommandInfo[CmdFreeCacheSpace].CommandName,
  895. GlobalCommandInfo[CmdFreeCacheSpace].CommandParams);
  896. return ERROR_INVALID_PARAMETER;
  897. }
  898. if((LSTRCMPI(argv[0], _T( "history" )) == 0) || (LSTRCMPI(argv[0], _T( "cookies" )) == 0))
  899. {
  900. dwSize = 100;
  901. GetWindowsDirectory(szWinDir, MAX_PATH);
  902. _stprintf(szCachePath, _T( "%s\\%s" ), szWinDir, argv[0]);
  903. }
  904. else
  905. {
  906. *szCachePath = _T( '\0' );
  907. dwSize = _tcstoul(argv[0], NULL, 0);
  908. }
  909. StartPerfTimer(&GlobalCommandInfo[CmdFreeCacheSpace].PerfInfo, RESET_TIMER);
  910. if (!FreeUrlCacheSpace (szCachePath, dwSize, 0))
  911. Error = GetLastError();
  912. StopPerfTimer(&GlobalCommandInfo[CmdFreeCacheSpace].PerfInfo);
  913. if(g_bPerfMode)
  914. DisplayPerfResults(&GlobalCommandInfo[CmdFreeCacheSpace].PerfInfo, _T( "Free %1 %2!ld!" ), szCachePath, dwSize);
  915. return Error;
  916. }
  917. //=================================================================================
  918. DWORD
  919. CreateUCEHelper(
  920. DWORD argc,
  921. LPTSTR *argv,
  922. TCHAR* LocalFileName
  923. )
  924. {
  925. DWORD Error;
  926. LPTSTR UrlName;
  927. DWORD ExpectedSize = 0;
  928. TCHAR *lpFileExtension = NULL;
  929. TCHAR szIntlString1[2 * URL_NAME_LENGTH];
  930. TCHAR szIntlString2[2 * URL_NAME_LENGTH];
  931. if( argc < 1 ) {
  932. _ftprintf(stderr, _T( "Usage: CreateUrlCacheEntry UrlName " )
  933. _T( "<ExpectedSize> <filextension (no dot)>\n" ));
  934. return( ERROR_INVALID_PARAMETER );
  935. }
  936. UrlName = argv[0];
  937. if (_tcsicmp (UrlName, UrlListKey) == 0)
  938. UrlName = GetUrlFromFile ();
  939. else
  940. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  941. CreateRandomString( URL_NAME_LENGTH, szIntlString1 );
  942. UrlName = szIntlString1;
  943. }
  944. if (!UrlName)
  945. return ERROR_INTERNET_INVALID_URL;
  946. #if 0
  947. if (_tcsicmp (LocalFileName, RAND_INTL_STRING) == 0) {
  948. CreateRandomString( URL_NAME_LENGTH, szIntlString2 );
  949. LocalFileName = szIntlString2;
  950. }
  951. #endif
  952. if( argc > 1 ) {
  953. ExpectedSize = _tcstoul( argv[1], NULL, 0 );
  954. } else {
  955. ExpectedSize = 2000;
  956. }
  957. if (argc > 2) {
  958. lpFileExtension = argv[2];
  959. }
  960. if( !CreateUrlCacheEntry(
  961. UrlName,
  962. ExpectedSize,
  963. lpFileExtension,
  964. LocalFileName,
  965. 0 ) ) {
  966. return( GetLastError() );
  967. }
  968. //
  969. // set file size.
  970. //
  971. Error = SetFileSizeByName (LocalFileName, ExpectedSize );
  972. if( Error != ERROR_SUCCESS )
  973. {
  974. _tprintf( _T( "SetFileSizeByName call failed, %ld.\n" ), Error );
  975. return( Error );
  976. }
  977. #if UNICODE
  978. _tprintf( _T( "LocalFile Name : %ws \n" ), LocalFileName );
  979. #else
  980. _tprintf( _T( "LocalFile Name : %s \n" ), LocalFileName );
  981. #endif
  982. return( ERROR_SUCCESS );
  983. }
  984. //=================================================================================
  985. DWORD
  986. CommitUCEHelper(
  987. DWORD argc,
  988. LPTSTR *argv,
  989. LPTSTR LocalFileName
  990. )
  991. {
  992. DWORD Error;
  993. BOOL fSetEdited = FALSE;
  994. LPTSTR UrlName;
  995. FILETIME ExpireTime = {0, 0};
  996. FILETIME ZeroFileTime = {0, 0};
  997. TCHAR szIntlString[2 * URL_NAME_LENGTH];
  998. TCHAR szIntlString2[2 * URL_NAME_LENGTH];
  999. UrlName = argv[0];
  1000. if (_tcsicmp (UrlName, UrlListKey) == 0) {
  1001. UrlName = GetUrlFromFile ();
  1002. } else
  1003. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1004. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1005. UrlName = szIntlString;
  1006. }
  1007. if (_tcsicmp (LocalFileName, RAND_INTL_STRING) == 0) {
  1008. CreateRandomString(URL_NAME_LENGTH, szIntlString2);
  1009. LocalFileName = szIntlString2;
  1010. }
  1011. if (!UrlName)
  1012. return ERROR_INTERNET_INVALID_URL;
  1013. if( argc > 2 ) {
  1014. unsigned int edt;
  1015. DWORD UrlLife;
  1016. UrlLife = _tcstoul( argv[2], NULL, 0 );
  1017. if( UrlLife != 0 ) {
  1018. LONGLONG NewTime;
  1019. ExpireTime = GetGmtTime();
  1020. NewTime =
  1021. *(LONGLONG *)(&ExpireTime) +
  1022. (LONGLONG)UrlLife * (LONGLONG)36000000000;
  1023. // in 100 of nano seconds.
  1024. ExpireTime = *((FILETIME *)(&NewTime)) ;
  1025. }
  1026. // See if user wants to set EDITED_CACHE_ENTRY
  1027. for (edt = 2; edt < argc; edt++)
  1028. {
  1029. if (_tcsicmp (argv[edt], _T( "edited" )) == 0)
  1030. {
  1031. fSetEdited = TRUE;
  1032. }
  1033. }
  1034. }
  1035. if( !CommitUrlCacheEntry(
  1036. UrlName,
  1037. LocalFileName,
  1038. ExpireTime,
  1039. ZeroFileTime,
  1040. fSetEdited ? (NORMAL_CACHE_ENTRY | EDITED_CACHE_ENTRY) : NORMAL_CACHE_ENTRY,
  1041. (LPBYTE)GlobalCacheHeaderInfo,
  1042. (rand() % CACHE_HEADER_INFO_SIZE_NORMAL_MAX),
  1043. TEXT("tst"),
  1044. 0
  1045. ) ) {
  1046. return( GetLastError() );
  1047. }
  1048. return( ERROR_SUCCESS );
  1049. }
  1050. //=================================================================================
  1051. DWORD ProcessCreateUrlCacheEntry (DWORD argc, LPTSTR *argv)
  1052. {
  1053. TCHAR szPath[MAX_PATH];
  1054. return CreateUCEHelper (argc, argv, szPath);
  1055. }
  1056. //=================================================================================
  1057. DWORD ProcessCommitUrlCacheEntry (DWORD argc, LPTSTR *argv)
  1058. {
  1059. if( argc < 2 ) {
  1060. _ftprintf(stderr, _T( "Usage: CommitUrlCacheEntry UrlName LocalFileName " )
  1061. _T( "<ExpireTime (in hours from now)>\n" ));
  1062. return( ERROR_INVALID_PARAMETER );
  1063. }
  1064. return CommitUCEHelper (argc, argv, argv[1]);
  1065. }
  1066. //=================================================================================
  1067. DWORD ProcessUpdateUrlCacheEntry (DWORD argc, LPTSTR *argv)
  1068. {
  1069. TCHAR szPath[MAX_PATH];
  1070. DWORD dwRet = CreateUCEHelper (argc, argv, szPath);
  1071. if (dwRet != ERROR_SUCCESS)
  1072. return dwRet;
  1073. return CommitUCEHelper (argc, argv, szPath);
  1074. }
  1075. //=================================================================================
  1076. DWORD
  1077. ProcessRetrieveUrlCacheEntryFile(
  1078. DWORD argc,
  1079. LPTSTR *argv
  1080. )
  1081. {
  1082. LPTSTR UrlName;
  1083. LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer;
  1084. DWORD CacheEntryInfoBufferSize;
  1085. DWORD Error = ERROR_SUCCESS;
  1086. TCHAR szIntlString[2 * URL_NAME_LENGTH ];
  1087. if( argc < 1 ) {
  1088. _ftprintf(stderr,_T( "Usage: RetrieveUrlCacheEntryFile UrlName \n" ));
  1089. return( ERROR_INVALID_PARAMETER );
  1090. }
  1091. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1092. UrlName = argv[0];
  1093. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1094. UrlName = GetUrlFromFile ();
  1095. else
  1096. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1097. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1098. UrlName = szIntlString;
  1099. }
  1100. if (!UrlName)
  1101. return ERROR_INTERNET_INVALID_URL;
  1102. StartPerfTimer(&GlobalCommandInfo[CmdRetrieveUrlCacheEntryFile].PerfInfo, RESET_TIMER);
  1103. g_dwCmdIteration = 0;
  1104. while(g_dwCmdIteration++ < g_dwNumCmdIterations)
  1105. {
  1106. CacheEntryInfoBufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1107. if( !RetrieveUrlCacheEntryFile(
  1108. UrlName,
  1109. lpCacheEntryInfo,
  1110. &CacheEntryInfoBufferSize,
  1111. 0 ) ) {
  1112. if(Error == ERROR_SUCCESS) // GetLastError on the first error to save a little time since we might be timing non existant files
  1113. Error = GetLastError();
  1114. }
  1115. }
  1116. StopPerfTimer(&GlobalCommandInfo[CmdRetrieveUrlCacheEntryFile].PerfInfo);
  1117. if(!g_bQuietMode)
  1118. PrintUrlInfo( lpCacheEntryInfo, (DWORD)(-1) );
  1119. if(g_bPerfMode)
  1120. DisplayPerfResults(&GlobalCommandInfo[CmdRetrieveUrlCacheEntryFile].PerfInfo, _T( "%1 %2" ),
  1121. GlobalCommandInfo[CmdRetrieveUrlCacheEntryFile].CommandName, argv[0]);
  1122. return( Error );
  1123. }
  1124. //=================================================================================
  1125. DWORD
  1126. ProcessRetrieveUrlCacheEntryStream(
  1127. DWORD argc,
  1128. LPTSTR *argv
  1129. )
  1130. {
  1131. DWORD Error = ERROR_SUCCESS;
  1132. LPTSTR UrlName;
  1133. HANDLE StreamHandle;
  1134. LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer;
  1135. DWORD CacheEntryInfoBufferSize;
  1136. DWORD BufferSize;
  1137. DWORD Offset;
  1138. TCHAR TimeBuffer[DEFAULT_BUFFER_SIZE];
  1139. TCHAR szIntlString[2*URL_NAME_LENGTH];
  1140. /// PERF_INFO piRead;
  1141. /// PERF_INFO piUnlock;
  1142. if( argc < 1 ) {
  1143. _ftprintf(stderr,_T( "Usage: RetrieveUrlCacheEntryStream UrlName [NoRead]\n" ));
  1144. return( ERROR_INVALID_PARAMETER );
  1145. }
  1146. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1147. UrlName = argv[0];
  1148. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1149. UrlName = GetUrlFromFile ();
  1150. else
  1151. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1152. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1153. UrlName = szIntlString;
  1154. }
  1155. if (!UrlName)
  1156. return( ERROR_INTERNET_INVALID_URL);
  1157. StartPerfTimer(&GlobalCommandInfo[CmdRetrieveUrlCacheEntryStream].PerfInfo, RESET_TIMER);
  1158. g_dwCmdIteration = 0;
  1159. while(g_dwCmdIteration++ < g_dwNumCmdIterations)
  1160. {
  1161. CacheEntryInfoBufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1162. StreamHandle =
  1163. RetrieveUrlCacheEntryStream(
  1164. UrlName,
  1165. lpCacheEntryInfo,
  1166. &CacheEntryInfoBufferSize,
  1167. FALSE,
  1168. 0 );
  1169. if( StreamHandle != NULL )
  1170. {
  1171. if((argc == 1) || ((argc == 2) && (_tcsicmp(argv[1], _T( "noread" )) != 0)))
  1172. {
  1173. //
  1174. // read file data.
  1175. //
  1176. Offset = 0;
  1177. for(;;) {
  1178. BufferSize = CACHE_DATA_BUFFER_SIZE;
  1179. memset( GlobalCacheDataBuffer, 0x0, CACHE_DATA_BUFFER_SIZE );
  1180. if( !ReadUrlCacheEntryStream(
  1181. StreamHandle,
  1182. Offset,
  1183. GlobalCacheDataBuffer,
  1184. &BufferSize,
  1185. 0
  1186. ) ) {
  1187. Error = GetLastError();
  1188. break;
  1189. }
  1190. Offset += BufferSize;
  1191. if( BufferSize != CACHE_DATA_BUFFER_SIZE ) {
  1192. TestDbgAssert( BufferSize < CACHE_DATA_BUFFER_SIZE );
  1193. Error = ERROR_SUCCESS;
  1194. break;
  1195. }
  1196. }
  1197. }
  1198. //
  1199. // unlock the file.
  1200. //
  1201. if( !UnlockUrlCacheEntryStream( StreamHandle, 0 ) ) {
  1202. TestDbgAssert( FALSE );
  1203. }
  1204. }
  1205. else
  1206. {
  1207. Error = GetLastError();
  1208. }
  1209. }
  1210. StopPerfTimer(&GlobalCommandInfo[CmdRetrieveUrlCacheEntryStream].PerfInfo);
  1211. if(!g_bQuietMode)
  1212. PrintUrlInfo( lpCacheEntryInfo, (DWORD)(-1) );
  1213. if(g_bPerfMode)
  1214. DisplayPerfResults(&GlobalCommandInfo[CmdRetrieveUrlCacheEntryStream].PerfInfo, _T( "%1 %2 %3 = Retrieve" ),
  1215. GlobalCommandInfo[CmdRetrieveUrlCacheEntryStream].CommandName,
  1216. argc >= 1 ?argv[0] :_T( "" ),
  1217. argc >= 2 ?argv[1] :_T( "" ));
  1218. return( Error );
  1219. }
  1220. //=================================================================================
  1221. #ifdef IE5
  1222. DWORD
  1223. ProcessUnlockUrlCacheEntryFile(
  1224. DWORD argc,
  1225. LPTSTR *argv
  1226. )
  1227. {
  1228. LPTSTR UrlName;
  1229. TCHAR szIntlString[2*URL_NAME_LENGTH];
  1230. if( argc < 1 ) {
  1231. _ftprintf(stderr,_T( "Usage: UnlockUrlCacheEntryFile UrlName \n" ));
  1232. return( ERROR_INVALID_PARAMETER );
  1233. }
  1234. UrlName = argv[0];
  1235. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1236. UrlName = GetUrlFromFile ();
  1237. else
  1238. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1239. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1240. UrlName = szIntlString;
  1241. }
  1242. if (!UrlName)
  1243. return ERROR_INTERNET_INVALID_URL;
  1244. if( !UnlockUrlCacheEntryFile( UrlName, 0 ) ) {
  1245. return( GetLastError() );
  1246. }
  1247. return( ERROR_SUCCESS );
  1248. }
  1249. #endif
  1250. //=================================================================================
  1251. DWORD
  1252. ProcessGetUrlCacheEntryInfo(
  1253. DWORD argc,
  1254. LPTSTR *argv
  1255. )
  1256. {
  1257. LPTSTR UrlName;
  1258. TCHAR szIntlString[2*URL_NAME_LENGTH];
  1259. LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer;
  1260. DWORD CacheEntryInfoBufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1261. if( argc < 1 ) {
  1262. _ftprintf(stderr,_T( "Usage: GetUrlCacheEntryInfo UrlName \n" ));
  1263. return( ERROR_INVALID_PARAMETER );
  1264. }
  1265. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1266. UrlName = argv[0];
  1267. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1268. UrlName = GetUrlFromFile ();
  1269. else
  1270. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1271. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1272. UrlName = szIntlString;
  1273. }
  1274. if (!UrlName)
  1275. return ERROR_INTERNET_INVALID_URL;
  1276. StartPerfTimer(&GlobalCommandInfo[CmdGetUrlCacheEntryInfo].PerfInfo, RESET_TIMER);
  1277. if( !GetUrlCacheEntryInfo(
  1278. UrlName,
  1279. lpCacheEntryInfo,
  1280. &CacheEntryInfoBufferSize ) ) {
  1281. return( GetLastError() );
  1282. }
  1283. StopPerfTimer(&GlobalCommandInfo[CmdGetUrlCacheEntryInfo].PerfInfo);
  1284. PrintUrlInfo( lpCacheEntryInfo, (DWORD)(-1) );
  1285. if(g_bPerfMode)
  1286. DisplayPerfResults(&GlobalCommandInfo[CmdGetUrlCacheEntryInfo].PerfInfo, NULL);
  1287. return( ERROR_SUCCESS );
  1288. }
  1289. //=================================================================================
  1290. DWORD
  1291. ProcessSetUrlCacheEntryInfo(
  1292. DWORD argc,
  1293. LPTSTR *argv
  1294. )
  1295. {
  1296. LPTSTR UrlName;
  1297. FILETIME ExpireTime = {0, 0};
  1298. INTERNET_CACHE_ENTRY_INFO UrlInfo;
  1299. LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer;
  1300. TCHAR szIntlString[2*URL_NAME_LENGTH];
  1301. if( argc < 1 ) {
  1302. _ftprintf(stderr, _T( "Usage: SetUrlCacheEntryInfo UrlName " )
  1303. _T( "<ExpireTime (in hours from now)>\n" ));
  1304. return( ERROR_INVALID_PARAMETER );
  1305. }
  1306. memset( &UrlInfo, 0x0, sizeof(INTERNET_CACHE_ENTRY_INFO) );
  1307. UrlName = argv[0];
  1308. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1309. UrlName = GetUrlFromFile ();
  1310. else
  1311. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1312. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1313. UrlName = szIntlString;
  1314. }
  1315. if (!UrlName)
  1316. return ERROR_INTERNET_INVALID_URL;
  1317. UrlInfo.LastModifiedTime = GetGmtTime();
  1318. if( argc > 1 ) {
  1319. DWORD UrlLife;
  1320. UrlLife = _tcstoul( argv[1], NULL, 0 );
  1321. if( UrlLife != 0 ) {
  1322. LONGLONG NewTime;
  1323. ExpireTime = UrlInfo.LastModifiedTime;
  1324. NewTime =
  1325. *(LONGLONG *)(&ExpireTime) +
  1326. (LONGLONG)UrlLife * (LONGLONG)3600 * (LONGLONG)10000000;
  1327. // in 100 of nano seconds.
  1328. ExpireTime = *((FILETIME *)(&NewTime)) ;
  1329. }
  1330. }
  1331. UrlInfo.ExpireTime = ExpireTime;
  1332. StartPerfTimer(&GlobalCommandInfo[CmdSetUrlCacheEntryInfo].PerfInfo, RESET_TIMER);
  1333. if( !SetUrlCacheEntryInfo(
  1334. UrlName,
  1335. &UrlInfo,
  1336. CACHE_ENTRY_MODTIME_FC | CACHE_ENTRY_EXPTIME_FC
  1337. ) ) {
  1338. return( GetLastError() );
  1339. }
  1340. StopPerfTimer(&GlobalCommandInfo[CmdSetUrlCacheEntryInfo].PerfInfo);
  1341. PrintUrlInfo( lpCacheEntryInfo, (DWORD)(-1) );
  1342. if(g_bPerfMode)
  1343. DisplayPerfResults(&GlobalCommandInfo[CmdSetUrlCacheEntryInfo].PerfInfo, NULL);
  1344. return( ERROR_SUCCESS );
  1345. }
  1346. //=================================================================================
  1347. #ifdef IE5
  1348. DWORD
  1349. ProcessSetUrlCacheEntryGroup(
  1350. DWORD argc,
  1351. LPTSTR *argv
  1352. )
  1353. {
  1354. LPTSTR UrlName;
  1355. DWORD dwFlags;
  1356. GROUPID GroupId;
  1357. LONGLONG ExemptTime;
  1358. TCHAR szIntlString[2*URL_NAME_LENGTH];
  1359. if (argc < 3)
  1360. {
  1361. _ftprintf(stderr, _T( "Usage: SetUrlCacheEntryGroup UrlName " )
  1362. _T( "Flags GroupId\n" ));
  1363. return( ERROR_INVALID_PARAMETER );
  1364. }
  1365. UrlName = argv[0];
  1366. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1367. UrlName = GetUrlFromFile ();
  1368. else
  1369. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1370. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1371. UrlName = szIntlString;
  1372. }
  1373. if (!UrlName)
  1374. return ERROR_INTERNET_INVALID_URL;
  1375. dwFlags = atoi(argv[1]);
  1376. GroupId = atoi(argv[2]);
  1377. if( !SetUrlCacheEntryGroup
  1378. (UrlName, dwFlags, GroupId, NULL, 0, NULL))
  1379. {
  1380. return GetLastError();
  1381. }
  1382. return ERROR_SUCCESS;
  1383. }
  1384. #endif
  1385. //=================================================================================
  1386. DWORD ProcessSetExempt (DWORD argc, LPTSTR *argv)
  1387. {
  1388. LPTSTR UrlName;
  1389. INTERNET_CACHE_ENTRY_INFO cei;
  1390. TCHAR szIntlString[2*URL_NAME_LENGTH];
  1391. if (argc < 2)
  1392. {
  1393. _ftprintf (stderr, _T( "Usage: SetGroup UrlName ExemptDelta\n" ));
  1394. return ERROR_INVALID_PARAMETER;
  1395. }
  1396. UrlName = argv[0];
  1397. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1398. UrlName = GetUrlFromFile ();
  1399. else
  1400. if (_tcsicmp (UrlName, RAND_INTL_STRING) == 0) {
  1401. CreateRandomString(URL_NAME_LENGTH, szIntlString);
  1402. UrlName = szIntlString;
  1403. }
  1404. if (!UrlName)
  1405. return ERROR_INTERNET_INVALID_URL;
  1406. cei.dwStructSize = sizeof(cei);
  1407. cei.dwExemptDelta = atoi(argv[1]);
  1408. if (!SetUrlCacheEntryInfo (UrlName, &cei, CACHE_ENTRY_EXEMPT_DELTA_FC))
  1409. {
  1410. return GetLastError();
  1411. }
  1412. return ERROR_SUCCESS;
  1413. }
  1414. //=================================================================================
  1415. #ifdef IE5
  1416. DWORD
  1417. ProcessDeleteUrlCacheEntry(
  1418. DWORD argc,
  1419. LPTSTR *argv
  1420. )
  1421. {
  1422. LPTSTR UrlName;
  1423. DWORD BufferSize;
  1424. HANDLE EnumHandle;
  1425. DWORD Index = 0;
  1426. DWORD dwTotal = 0;
  1427. BOOL QuietMode = g_bQuietMode;
  1428. TCHAR szInternationalString[ URL_NAME_LENGTH ];
  1429. TCHAR Str[256];
  1430. if( argc < 1 ) {
  1431. _ftprintf(stderr,_T( "Usage: DeleteUrlCacheEntry UrlName \n" ));
  1432. return( ERROR_INVALID_PARAMETER );
  1433. }
  1434. if((argc == 2) && (argv[1][0] == _T( 'q' )))
  1435. QuietMode = TRUE;
  1436. UrlName = argv[0];
  1437. if (_tcsicmp (UrlName, UrlListKey) == 0)
  1438. UrlName = GetUrlFromFile ();
  1439. else
  1440. if (_tcsicmp (UrlName, RAND_INTL_STRING ) == 0) {
  1441. CreateRandomString( URL_NAME_LENGTH, szInternationalString );
  1442. UrlName = szInternationalString;
  1443. }
  1444. if (!UrlName)
  1445. return ERROR_INTERNET_INVALID_URL;
  1446. if (_tcsicmp (UrlName, _T( "all" )) == 0)
  1447. {
  1448. StartPerfTimer(&GlobalCommandInfo[CmdDeleteUrlCacheEntry].PerfInfo, RESET_TIMER);
  1449. for ( ;; )
  1450. {
  1451. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1452. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1453. if( Index++ == 0)
  1454. {
  1455. EnumHandle = FindFirstUrlCacheEntryEx (
  1456. NULL, // search pattern
  1457. 0, // flags
  1458. 0xffffffff, // filter
  1459. 0, // groupid
  1460. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  1461. &BufferSize,
  1462. NULL,
  1463. NULL,
  1464. NULL
  1465. );
  1466. if( EnumHandle == NULL ) {
  1467. return( GetLastError() );
  1468. }
  1469. }
  1470. else
  1471. {
  1472. if( !FindNextUrlCacheEntryEx(
  1473. EnumHandle,
  1474. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  1475. &BufferSize, NULL, NULL, NULL))
  1476. {
  1477. DWORD Error;
  1478. Error = GetLastError();
  1479. if( Error != ERROR_NO_MORE_ITEMS ) {
  1480. return( Error );
  1481. }
  1482. break;
  1483. }
  1484. }
  1485. if( !QuietMode )
  1486. _tprintf(_T( "URL = %s\n" ), ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName);
  1487. if( !DeleteUrlCacheEntry( ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName ) ) {
  1488. DWORD dwGLE = GetLastError();
  1489. _tprintf(_T( "DeleteUrlCacheEntry failed for %s. GLE=%d\r\n" ), ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName, dwGLE);
  1490. return( dwGLE );
  1491. }
  1492. dwTotal++;
  1493. }
  1494. StopPerfTimer(&GlobalCommandInfo[CmdDeleteUrlCacheEntry].PerfInfo);
  1495. if(g_bPerfMode)
  1496. {
  1497. _stprintf(Str, _T( "Deleted %d" ), dwTotal);
  1498. DisplayPerfResults(&GlobalCommandInfo[CmdDeleteUrlCacheEntry].PerfInfo, Str);
  1499. }
  1500. return( ERROR_SUCCESS);
  1501. } // if UrlName == all
  1502. if( !DeleteUrlCacheEntry( UrlName ) ) {
  1503. return( GetLastError() );
  1504. }
  1505. return( ERROR_SUCCESS );
  1506. }
  1507. #endif
  1508. //=================================================================================
  1509. DWORD
  1510. ProcessEnumUrlCacheEntries(
  1511. DWORD argc,
  1512. LPTSTR *argv
  1513. )
  1514. {
  1515. DWORD BufferSize, dwSmall=0, dwLarge=0, dwTotal = 0;
  1516. HANDLE EnumHandle;
  1517. DWORD Index = 1, len;
  1518. DWORD ActualSize;
  1519. LPINTERNET_CACHE_ENTRY_INFO lpCEI = (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer;
  1520. BOOL QuietMode = g_bQuietMode;
  1521. BOOL bRC;
  1522. TCHAR Str[256];
  1523. BOOL EnumUrlOnly = FALSE;
  1524. if (argc)
  1525. {
  1526. if (LSTRCMPI(*argv, _T( "q" )) == 0)
  1527. QuietMode = TRUE;
  1528. else if (LSTRCMPI(*argv, _T( "u" )) == 0)
  1529. EnumUrlOnly = TRUE;
  1530. }
  1531. //
  1532. // start enum.
  1533. //
  1534. StartPerfTimer(&GlobalCommandInfo[CmdEnumUrlCacheEntries].PerfInfo, RESET_TIMER);
  1535. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1536. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1537. EnumHandle = FindFirstUrlCacheEntryEx (
  1538. NULL, // search pattern
  1539. 0, // flags
  1540. 0xffffffff, // filter
  1541. 0, // groupid
  1542. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  1543. &BufferSize,
  1544. NULL,
  1545. NULL,
  1546. NULL
  1547. );
  1548. if( EnumHandle == NULL ) {
  1549. return( GetLastError() );
  1550. }
  1551. ++dwTotal;
  1552. /// ActualSize = BufferSize
  1553. /// - LSTRLEN(lpCEI->lpszLocalFileName)
  1554. /// + GetLeafLenFromPath(lpCEI->lpszLocalFileName);
  1555. if(!QuietMode)
  1556. if (EnumUrlOnly) {
  1557. _tprintf(_T( "URL = %s\n" ), ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName);
  1558. } else {
  1559. PrintUrlInfo( (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer, Index++ );
  1560. }
  1561. //
  1562. // get more entries.
  1563. //
  1564. for ( ;; )
  1565. {
  1566. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1567. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1568. if( !FindNextUrlCacheEntryEx(
  1569. EnumHandle,
  1570. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  1571. &BufferSize, NULL, NULL, NULL))
  1572. {
  1573. DWORD Error;
  1574. Error = GetLastError();
  1575. if( Error != ERROR_NO_MORE_ITEMS ) {
  1576. return( Error );
  1577. }
  1578. break;
  1579. }
  1580. ++dwTotal;
  1581. if(!QuietMode)
  1582. {
  1583. /// ActualSize = BufferSize - GetLeafLenFromPath(lpCEI->lpszLocalFileName);
  1584. if (EnumUrlOnly) {
  1585. _tprintf(_T( "URL = %s\n" ), ((LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer)->lpszSourceUrlName);
  1586. } else {
  1587. PrintUrlInfo( (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer, Index++ );
  1588. }
  1589. }
  1590. }
  1591. StopPerfTimer(&GlobalCommandInfo[CmdEnumUrlCacheEntries].PerfInfo);
  1592. if(g_bPerfMode)
  1593. {
  1594. _stprintf(Str, _T( "Enum %d" ), dwTotal);
  1595. DisplayPerfResults(&GlobalCommandInfo[CmdEnumUrlCacheEntries].PerfInfo, Str);
  1596. }
  1597. else
  1598. {
  1599. _tprintf(_T( "\r\nTotal = %d\n" ), dwTotal);
  1600. }
  1601. FindCloseUrlCache(EnumHandle);
  1602. return( ERROR_SUCCESS );
  1603. }
  1604. //=================================================================================
  1605. DWORD
  1606. ProcessEnumGroup(
  1607. DWORD argc,
  1608. LPTSTR *argv
  1609. )
  1610. {
  1611. #ifdef IE5
  1612. HANDLE h = NULL;
  1613. GROUPID gid = 0;
  1614. h = FindFirstUrlCacheGroup(0, 0, NULL, 0, &gid, NULL);
  1615. if( h )
  1616. {
  1617. _tprintf(_T( "GID = %x\n" ), gid);
  1618. PrintGroupInfo(gid);
  1619. while( FindNextUrlCacheGroup(h, &gid, NULL) )
  1620. {
  1621. _tprintf(_T( "GID = %x\n" ), gid);
  1622. PrintGroupInfo(gid);
  1623. }
  1624. }
  1625. else
  1626. {
  1627. _tprintf(_T( "no group found\n" ));
  1628. }
  1629. FindCloseUrlCache(h);
  1630. return( ERROR_SUCCESS );
  1631. #else
  1632. DWORD BufferSize, dwTotal = 0;
  1633. HANDLE EnumHandle;
  1634. DWORD Index = 1, len;
  1635. DWORD ActualSize;
  1636. LPINTERNET_CACHE_ENTRY_INFO lpCEI =
  1637. (LPINTERNET_CACHE_ENTRY_INFO) GlobalCacheEntryInfoBuffer;
  1638. GROUPID GroupId;
  1639. FILETIME ftExempt;
  1640. TCHAR Str[256];
  1641. //
  1642. // start enum.
  1643. //
  1644. if (argc != 1)
  1645. {
  1646. _ftprintf (stderr, "Usage: EnumGroup GroupId");
  1647. return ERROR_INVALID_PARAMETER;
  1648. }
  1649. GroupId = atoi(argv[0]);
  1650. StartPerfTimer(&GlobalCommandInfo[CmdEnumGroup].PerfInfo, RESET_TIMER);
  1651. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1652. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1653. EnumHandle = FindFirstUrlCacheEntryEx
  1654. (NULL, 0, 0, GroupId, lpCEI, &BufferSize, NULL, 0, NULL);
  1655. if( EnumHandle == NULL ) {
  1656. return( GetLastError() );
  1657. }
  1658. ++dwTotal;
  1659. /// ActualSize = BufferSize
  1660. /// - LSTRLEN(lpCEI->lpszLocalFileName)
  1661. /// + GetLeafLenFromPath(lpCEI->lpszLocalFileName);
  1662. if(!g_bQuietMode)
  1663. PrintUrlInfo( (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer, Index++ );
  1664. //
  1665. // get more entries.
  1666. //
  1667. for ( ;; ) {
  1668. memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
  1669. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1670. if( !FindNextUrlCacheEntryEx
  1671. (EnumHandle, lpCEI, &BufferSize, NULL, 0, NULL))
  1672. {
  1673. DWORD Error;
  1674. Error = GetLastError();
  1675. if( Error != ERROR_NO_MORE_ITEMS ) {
  1676. return( Error );
  1677. }
  1678. break;
  1679. }
  1680. ++dwTotal;
  1681. /// ActualSize = BufferSize - GetLeafLenFromPath(lpCEI->lpszLocalFileName);
  1682. if(!g_bQuietMode)
  1683. PrintUrlInfo( (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer, Index++ );
  1684. }
  1685. FindCloseUrlCache (EnumHandle);
  1686. StopPerfTimer(&GlobalCommandInfo[CmdEnumGroup].PerfInfo);
  1687. if(g_bPerfMode)
  1688. {
  1689. _stprintf(Str, _T( "EnumGrp %d" ), dwTotal);
  1690. DisplayPerfResults(&GlobalCommandInfo[CmdEnumGroup].PerfInfo, Str);
  1691. }
  1692. else
  1693. {
  1694. _tprintf(_T( "\r\nTotal = %d\n" ), dwTotal);
  1695. }
  1696. return( ERROR_SUCCESS );
  1697. #endif // IE5
  1698. }
  1699. //=================================================================================
  1700. DWORD
  1701. ProcessSimulateCache(
  1702. DWORD argc,
  1703. LPTSTR *argv
  1704. )
  1705. {
  1706. DWORD Error;
  1707. DWORD i, j;
  1708. TCHAR szUrlName[ URL_NAME_SIZE ];
  1709. TCHAR *UrlName = NULL;
  1710. TCHAR LocalFileName[MAX_PATH];
  1711. DWORD FileSize;
  1712. LONGLONG ExpireTime;
  1713. FILETIME LastModTime;
  1714. TCHAR TimeBuffer[MAX_PATH];
  1715. DWORD NumUrls;
  1716. DWORD UrlLife;
  1717. DWORD BufferSize;
  1718. DWORD CacheHeaderInfoSize;
  1719. DWORD CacheHeaderInfoSizeMax;
  1720. BOOL QuietMode = g_bQuietMode;
  1721. BOOL bRandomInternational = TRUE;
  1722. TCHAR szInternationalString[2*URL_NAME_LENGTH];
  1723. if( argc < 1 ) {
  1724. _ftprintf(stderr, _T( "Usage: ProcessSimulateCache NumUrls <s (silent mode)>\n" ));
  1725. return( ERROR_INVALID_PARAMETER );
  1726. }
  1727. NumUrls = _tcstoul( argv[0], NULL, 0 );
  1728. while ( argc-- )
  1729. {
  1730. if(LSTRCMPI(argv[argc], _T( "q" )) == 0)
  1731. QuietMode = TRUE;
  1732. else if (!_tcsicmp(argv[argc], _T( "dump" )))
  1733. {
  1734. DumpUrlList = _tfopen (_T( "urllist.sim" ), _T( "a+" ));
  1735. _ftprintf(stderr, _T("Dumping Urls to \"urllist.sim\"\n"));
  1736. }
  1737. else if (!_tcsicmp(argv[argc], RAND_INTL_STRING))
  1738. {
  1739. bRandomInternational= TRUE;
  1740. _ftprintf(stderr, _T("Creating random international strings\n"));
  1741. }
  1742. }
  1743. StartPerfTimer(&GlobalCommandInfo[CmdSimulateCache].PerfInfo, RESET_TIMER);
  1744. #ifdef TEST
  1745. for (j=0; j<2; ++j) {
  1746. #endif //TEST
  1747. for( i = 0; i < NumUrls; i++ ) {
  1748. //
  1749. // make a new url name.
  1750. //
  1751. if(!g_bPerfMode) {
  1752. MakeRandomUrlName( szUrlName );
  1753. UrlName = szUrlName;
  1754. } else
  1755. if( bRandomInternational ) {
  1756. CreateRandomString( URL_NAME_LENGTH, szInternationalString );
  1757. UrlName = szInternationalString;
  1758. } else
  1759. _stprintf(szUrlName, _T( "http://serv/URL%ld" ), i);
  1760. //
  1761. // create url file.
  1762. //
  1763. if( !CreateUrlCacheEntry(
  1764. UrlName,
  1765. 0,
  1766. _T( "tmp" ),
  1767. LocalFileName,
  1768. 0 ) ) {
  1769. Error = GetLastError();
  1770. _tprintf( _T( "CreateUrlFile call failed, %ld.\n" ), Error );
  1771. return( Error );
  1772. }
  1773. //
  1774. // create random file size.
  1775. //
  1776. if(g_dwFileSize == 0)
  1777. FileSize = ((rand() % 10) + 1) * 1024 ;
  1778. else
  1779. FileSize = g_dwFileSize;
  1780. //
  1781. // set file size.
  1782. //
  1783. Error = SetFileSizeByName(
  1784. LocalFileName,
  1785. FileSize );
  1786. if( Error != ERROR_SUCCESS ) {
  1787. _tprintf( _T( "SetFileSizeByName call failed, %ld.\n" ), Error );
  1788. return( Error );
  1789. }
  1790. UrlLife = rand() % 48;
  1791. ExpireTime = (LONGLONG)UrlLife * (LONGLONG)36000000000;
  1792. // in 100 of nano seconds.
  1793. LastModTime = GetGmtTime();
  1794. ExpireTime += *((LONGLONG *)&LastModTime);
  1795. //
  1796. // 90% of the time the header info will be less than 256 bytes.
  1797. //
  1798. CacheHeaderInfoSizeMax =
  1799. ((rand() % 100) > 90) ?
  1800. CACHE_HEADER_INFO_SIZE_BIG_MAX :
  1801. CACHE_HEADER_INFO_SIZE_NORMAL_MAX;
  1802. CacheHeaderInfoSize = rand() % CacheHeaderInfoSizeMax;
  1803. //
  1804. // cache this file.
  1805. //
  1806. if( !CommitUrlCacheEntry(
  1807. UrlName,
  1808. LocalFileName,
  1809. *((FILETIME *)&ExpireTime),
  1810. LastModTime,
  1811. NORMAL_CACHE_ENTRY,
  1812. (LPBYTE)GlobalCacheHeaderInfo,
  1813. CacheHeaderInfoSize,
  1814. TEXT("tst"),
  1815. 0 ) ) {
  1816. Error = GetLastError();
  1817. _tprintf( _T( "CreateUrlFile call failed, %ld.\n" ), Error );
  1818. return( Error );
  1819. }
  1820. if(!QuietMode)
  1821. {
  1822. //
  1823. // GET and PRINT url info, we just added.
  1824. //
  1825. BufferSize = CACHE_ENTRY_BUFFER_SIZE;
  1826. if( !GetUrlCacheEntryInfo(
  1827. UrlName,
  1828. (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
  1829. &BufferSize ) ) {
  1830. Error = GetLastError();
  1831. _tprintf( _T( "GetUrlCacheEntryInfoA call failed, %ld.\n" ), Error );
  1832. return( Error );
  1833. }
  1834. if (DumpUrlList)
  1835. _ftprintf(DumpUrlList,_T( "%s\n" ), UrlName);
  1836. // PrintUrlInfo( (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer, (DWORD)(-1) );
  1837. // Display info
  1838. _tprintf(_T( "%d : %s\n" ), i, UrlName );
  1839. #if UNICODE
  1840. _tprintf(_T( "\tTempFileName: %ws\n" ), LocalFileName );
  1841. #else
  1842. _tprintf(_T( "\tTempFileName: %s\n" ), LocalFileName );
  1843. #endif
  1844. _tprintf(_T( "\tSize : %ld\n" ), FileSize );
  1845. _tprintf(_T( "\tExpires at : %s\n" ),
  1846. ConvertGmtTimeToString( *((FILETIME *)&ExpireTime), TimeBuffer ) );
  1847. _tprintf(_T( "HeaderInfoSize=%d\n" ), CacheHeaderInfoSize);
  1848. }
  1849. }
  1850. #ifdef TEST
  1851. if (j==0) {
  1852. _tprintf(_T( "Freeingcache, OK?" ));
  1853. gets(LocalFileName);
  1854. FreeUrlCacheSpace (NULL, 100, 0);
  1855. _tprintf(_T( "Freed cache, OK?" ));
  1856. gets(LocalFileName);
  1857. }
  1858. }
  1859. #endif //TEST
  1860. StopPerfTimer(&GlobalCommandInfo[CmdSimulateCache].PerfInfo);
  1861. if(g_bPerfMode)
  1862. DisplayPerfResults(&GlobalCommandInfo[CmdSimulateCache].PerfInfo, _T( "Create %1!ld!" ), NumUrls);
  1863. return( ERROR_SUCCESS );
  1864. }
  1865. //=================================================================================
  1866. DWORD ProcessCreateFile(DWORD argc, LPTSTR *argv)
  1867. {
  1868. DWORD Error = ERROR_SUCCESS;
  1869. DWORD dwCnt;
  1870. LPCREATE_FILE_INFO lpcfi;
  1871. HANDLE hFile = NULL;
  1872. TCHAR szResultStr[1024];
  1873. if(argc >= 1)
  1874. {
  1875. _stprintf(szResultStr, _T( "%s %s " ), GlobalCommandInfo[CmdCreateFile].CommandName, argv[0]);
  1876. // Process arguments
  1877. for(dwCnt = 1; dwCnt < argc; dwCnt++)
  1878. {
  1879. lpcfi = Create_File_Table;
  1880. lstrcat(szResultStr, argv[dwCnt]);
  1881. lstrcat(szResultStr, _T( " " ));
  1882. while(*lpcfi->lpszVal)
  1883. {
  1884. if(LSTRCMPI(lpcfi->lpszVal, argv[dwCnt]) == 0)
  1885. {
  1886. if(lpcfi->bExclusive)
  1887. *lpcfi->pdwArg = lpcfi->dwVal;
  1888. else
  1889. *lpcfi->pdwArg |= lpcfi->dwVal;
  1890. break;
  1891. }
  1892. lpcfi++;
  1893. }
  1894. }
  1895. StartPerfTimer(&GlobalCommandInfo[CmdCreateFile].PerfInfo, RESET_TIMER);
  1896. g_dwCmdIteration = 0;
  1897. while(g_dwCmdIteration++ < g_dwNumCmdIterations)
  1898. {
  1899. // Create the file
  1900. hFile = CreateFile(
  1901. argv[0],
  1902. g_dwCreate_File_Access_Mode,
  1903. g_dwCreate_File_Share_Mode,
  1904. NULL,
  1905. g_dwCreate_File_Creation,
  1906. g_dwCreate_File_Flags,
  1907. NULL );
  1908. if(Error == ERROR_SUCCESS && hFile == INVALID_HANDLE_VALUE)
  1909. {
  1910. Error = GetLastError();
  1911. }
  1912. if(g_bWriteFile)
  1913. {
  1914. DWORD dwBytesWritten;
  1915. if(!WriteFile(hFile, g_lpWriteFileBuf, g_dwFileSize, &dwBytesWritten, NULL))
  1916. Error = GetLastError();
  1917. }
  1918. CloseHandle(hFile);
  1919. }
  1920. StopPerfTimer(&GlobalCommandInfo[CmdCreateFile].PerfInfo);
  1921. if(g_bPerfMode)
  1922. DisplayPerfResults(&GlobalCommandInfo[CmdCreateFile].PerfInfo, szResultStr);
  1923. }
  1924. else
  1925. {
  1926. Error = ERROR_INVALID_PARAMETER;
  1927. }
  1928. return(Error);
  1929. }
  1930. //=================================================================================
  1931. DWORD
  1932. ProcessLoopCnt(
  1933. DWORD argc,
  1934. LPTSTR *argv
  1935. )
  1936. {
  1937. if( argc < 1 ) {
  1938. _ftprintf(stderr, _T( "Usage: ProcessLoopCnt NumIterations\n" ));
  1939. return( ERROR_INVALID_PARAMETER );
  1940. }
  1941. if(g_dwNumIterations == 1)
  1942. {
  1943. g_dwNumIterations = _tcstoul( argv[0], NULL, 0 );
  1944. if(g_dwNumIterations < 1)
  1945. g_dwNumIterations = 1;
  1946. }
  1947. if(!g_bUseFile)
  1948. DisplayGlobalSettings();
  1949. else
  1950. _tprintf(_T( "\n" ));
  1951. return ERROR_SUCCESS;
  1952. }
  1953. //=================================================================================
  1954. DWORD
  1955. ProcessCmdLoopCnt(
  1956. DWORD argc,
  1957. LPTSTR *argv
  1958. )
  1959. {
  1960. if( argc < 1 ) {
  1961. _ftprintf(stderr, _T( "Usage: ProcessCmdLoopCnt NumIterations\n" ));
  1962. return( ERROR_INVALID_PARAMETER );
  1963. }
  1964. g_dwNumCmdIterations = _tcstoul( argv[0], NULL, 0 );
  1965. if(g_dwNumCmdIterations < 1)
  1966. g_dwNumCmdIterations = 1;
  1967. if(!g_bUseFile)
  1968. DisplayGlobalSettings();
  1969. else
  1970. _tprintf(_T( "\n" ));
  1971. return ERROR_SUCCESS;
  1972. }
  1973. //=================================================================================
  1974. BOOL
  1975. ProcessUseFile (
  1976. DWORD argc,
  1977. LPTSTR *argv
  1978. )
  1979. {
  1980. FILE *BatchFile = NULL;
  1981. DWORD Error;
  1982. DWORD i;
  1983. COMMAND_CODE CommandCode;
  1984. TCHAR InBuffer[DEFAULT_BUFFER_SIZE];
  1985. DWORD CArgc;
  1986. LPTSTR CArgv[MAX_COMMAND_ARGS];
  1987. DWORD CommandArgc;
  1988. LPTSTR *CommandArgv;
  1989. if(argc != 1)
  1990. return FALSE;
  1991. AppTimer.ElapsedTime = 0;
  1992. g_bUseFile = TRUE;
  1993. g_dwNumIterations = 1;
  1994. g_dwIteration = 0;
  1995. while(g_dwIteration++ < g_dwNumIterations)
  1996. {
  1997. if((BatchFile = _tfopen (argv[0], _T( "r" ))) == NULL)
  1998. return FALSE;
  1999. while (fgets( InBuffer, DEFAULT_BUFFER_SIZE, BatchFile ))
  2000. {
  2001. InBuffer[_tcslen(InBuffer) -1] = 0; //kill line feed for no param cmds
  2002. CArgc = 0;
  2003. ParseArguments( InBuffer, CArgv, &CArgc );
  2004. if( CArgc < 1 ) {
  2005. continue;
  2006. }
  2007. //
  2008. // decode command.
  2009. //
  2010. CommandCode = DecodeCommand( CArgv[0] );
  2011. if( CommandCode == UnknownCommand ) {
  2012. _ftprintf(stderr, _T( "Unknown Command '%s'.\n" ), CArgv[0]);
  2013. continue;
  2014. }
  2015. CommandArgc = CArgc - 1;
  2016. CommandArgv = &CArgv[1];
  2017. /// _tprintf(_T( "%s " ), CArgv[0]);
  2018. /// for(i = 0; i < CommandArgc; i++)
  2019. /// _tprintf(_T( "%s " ), CommandArgv[i]);
  2020. /// _tprintf(_T( ", " ));
  2021. StartPerfTimer(&AppTimer, ACCUM_TIMER);
  2022. Error = ProcessCommandCode (CommandCode,CommandArgc,CommandArgv);
  2023. StopPerfTimer(&AppTimer);
  2024. }
  2025. /// _tprintf(_T( "===================[ End processing file ]===================\n" ));
  2026. fclose (BatchFile);
  2027. }
  2028. _tprintf(_T( "UseFile, " ));
  2029. if(g_bPerfMode)
  2030. DisplayPerfResults(&AppTimer, NULL);
  2031. return TRUE;
  2032. }
  2033. //=================================================================================
  2034. DWORD
  2035. ProcessShowTime (
  2036. DWORD argc,
  2037. LPTSTR *argv
  2038. )
  2039. {
  2040. DWORD Error, dwSize;
  2041. FILETIME ftTemp;
  2042. SYSTEMTIME SystemTime;
  2043. #ifdef CONFIGTEST
  2044. TCHAR buff[4096];
  2045. LPINTERNET_CACHE_CONFIG_INFO lpCCI = (LPINTERNET_CACHE_CONFIG_INFO)buff;
  2046. dwSize = sizeof(buff);
  2047. if (GetUrlCacheConfigInfo(lpCCI, &dwSize, CACHE_CONFIG_DISK_CACHE_PATHS_FC)) {
  2048. int i;
  2049. for (i=0; i<lpCCI->dwNumCachePaths; ++i) {
  2050. lpCCI->CachePaths[i].dwCacheSize++;
  2051. }
  2052. SetUrlCacheConfigInfo(lpCCI, CACHE_CONFIG_DISK_CACHE_PATHS_FC);
  2053. }
  2054. #endif //CONFIGTEST
  2055. if(argc != 2)
  2056. return 0xffffffff;
  2057. sscanf(argv[0], _T( "%x" ), &(ftTemp.dwHighDateTime));
  2058. sscanf(argv[1], _T( "%x" ), &(ftTemp.dwLowDateTime));
  2059. if(FileTimeToSystemTime( &ftTemp, &SystemTime )) {
  2060. _tprintf(_T( "%02u/%02u/%04u %02u:%02u:%02u\n " ),
  2061. SystemTime.wMonth,
  2062. SystemTime.wDay,
  2063. SystemTime.wYear,
  2064. SystemTime.wHour,
  2065. SystemTime.wMinute,
  2066. SystemTime.wSecond );
  2067. }
  2068. else {
  2069. _tprintf(_T( "Wrong Times \n" ));
  2070. }
  2071. return ERROR_SUCCESS;
  2072. }
  2073. //=================================================================================
  2074. DWORD AllocWriteFileBuf(void)
  2075. {
  2076. DWORD dwRC = ERROR_SUCCESS;
  2077. if(g_lpWriteFileBuf != NULL)
  2078. LocalFree(g_lpWriteFileBuf);
  2079. if((g_lpWriteFileBuf = LocalAlloc(LPTR, g_dwFileSize * sizeof(TCHAR))) != NULL)
  2080. {
  2081. DWORD dwCnt;
  2082. for(dwCnt = 0; dwCnt < g_dwFileSize; dwCnt++)
  2083. *(g_lpWriteFileBuf + dwCnt) = (TCHAR)dwCnt % 256;
  2084. }
  2085. else
  2086. {
  2087. dwRC = GetLastError();
  2088. }
  2089. return(dwRC);
  2090. }
  2091. //=================================================================================
  2092. DWORD
  2093. ProcessSetFileSize (
  2094. DWORD argc,
  2095. LPTSTR *argv
  2096. )
  2097. {
  2098. DWORD dwOldSize = g_dwFileSize;
  2099. DWORD dwRC = ERROR_SUCCESS;
  2100. g_dwFileSize = _tcstoul( argv[0], NULL, 0 );
  2101. if((g_dwFileSize > 0) && (g_dwFileSize != dwOldSize) && g_bWriteFile)
  2102. dwRC = AllocWriteFileBuf();
  2103. if(!g_bUseFile)
  2104. DisplayGlobalSettings();
  2105. else
  2106. _tprintf(_T( "\n" ));
  2107. return(dwRC);
  2108. }
  2109. //=================================================================================
  2110. DWORD
  2111. ProcessSetDiskCache1 (
  2112. DWORD argc,
  2113. LPTSTR *argv
  2114. )
  2115. {
  2116. g_dwDiskCache = ((argc == 0) || (LSTRCMPI(argv[0], _T( "on" )) == 0)) ?(g_dwDiskCache | FILE_FLAG_NO_BUFFERING) :(g_dwDiskCache & ~FILE_FLAG_NO_BUFFERING);
  2117. if(!g_bUseFile)
  2118. DisplayGlobalSettings();
  2119. else
  2120. _tprintf(_T( "\n" ));
  2121. return ERROR_SUCCESS;
  2122. }
  2123. //=================================================================================
  2124. DWORD
  2125. ProcessSetDiskCache2 (
  2126. DWORD argc,
  2127. LPTSTR *argv
  2128. )
  2129. {
  2130. g_dwDiskCache = ((argc == 0) || (LSTRCMPI(argv[0], _T( "on" )) == 0)) ?(g_dwDiskCache | FILE_FLAG_WRITE_THROUGH) :(g_dwDiskCache & ~FILE_FLAG_WRITE_THROUGH);
  2131. if(!g_bUseFile)
  2132. DisplayGlobalSettings();
  2133. else
  2134. _tprintf(_T( "\n" ));
  2135. return ERROR_SUCCESS;
  2136. }
  2137. //=================================================================================
  2138. DWORD
  2139. ProcessSetQuietMode (
  2140. DWORD argc,
  2141. LPTSTR *argv
  2142. )
  2143. {
  2144. g_bQuietMode = (argc ?(LSTRCMPI(argv[0], _T( "on" )) == 0) :TRUE);
  2145. if(!g_bUseFile)
  2146. DisplayGlobalSettings();
  2147. else
  2148. _tprintf(_T( "\n" ));
  2149. return ERROR_SUCCESS;
  2150. }
  2151. //=================================================================================
  2152. DWORD
  2153. ProcessSetPerfMode (
  2154. DWORD argc,
  2155. LPTSTR *argv
  2156. )
  2157. {
  2158. g_bPerfMode = (argc ?(LSTRCMPI(argv[0], _T( "on" )) == 0) :TRUE);
  2159. if(!g_bUseFile)
  2160. DisplayGlobalSettings();
  2161. else
  2162. _tprintf(_T( "\n" ));
  2163. return ERROR_SUCCESS;
  2164. }
  2165. //=================================================================================
  2166. DWORD
  2167. ProcessWriteFile (
  2168. DWORD argc,
  2169. LPTSTR *argv
  2170. )
  2171. {
  2172. DWORD dwRC = ERROR_SUCCESS;
  2173. if(g_dwFileSize == 0)
  2174. {
  2175. _tprintf(_T( "You must specify a FileSize in order to turn WriteFile On.\n" ));
  2176. dwRC = ERROR_INVALID_FUNCTION;
  2177. }
  2178. else
  2179. {
  2180. g_bWriteFile = (argc ?(LSTRCMPI(argv[0], _T( "on" )) == 0) :TRUE);
  2181. if(g_bWriteFile && g_dwFileSize)
  2182. dwRC = AllocWriteFileBuf();
  2183. }
  2184. if(!g_bUseFile)
  2185. DisplayGlobalSettings();
  2186. else
  2187. _tprintf(_T( "\n" ));
  2188. return(dwRC);
  2189. }
  2190. //=================================================================================
  2191. DWORD
  2192. ProcessCreateGroup(
  2193. DWORD argc,
  2194. LPTSTR *argv
  2195. )
  2196. {
  2197. DWORD dwRC = ERROR_SUCCESS;
  2198. _tprintf(_T( "CreateGroup...\n" ));
  2199. return dwRC;
  2200. }
  2201. DWORD
  2202. ProcessDeleteGroup(
  2203. DWORD argc,
  2204. LPTSTR *argv
  2205. )
  2206. {
  2207. DWORD dwRC = ERROR_SUCCESS;
  2208. _tprintf(_T( "DeleteGroup...\n" ));
  2209. return dwRC;
  2210. }
  2211. //=================================================================================
  2212. DWORD
  2213. ProcessCommandCode (
  2214. DWORD CommandCode,
  2215. DWORD CommandArgc,
  2216. LPTSTR *CommandArgv
  2217. )
  2218. {
  2219. DWORD Error = ERROR_SUCCESS;
  2220. switch( CommandCode ) {
  2221. case CmdCreateUrlCacheEntry :
  2222. Error = ProcessCreateUrlCacheEntry( CommandArgc, CommandArgv );
  2223. break;
  2224. case CmdCommitUrlCacheEntry :
  2225. Error = ProcessCommitUrlCacheEntry( CommandArgc, CommandArgv );
  2226. break;
  2227. case CmdUpdateUrlCacheEntry :
  2228. Error = ProcessUpdateUrlCacheEntry( CommandArgc, CommandArgv );
  2229. break;
  2230. case CmdRetrieveUrlCacheEntryFile :
  2231. Error = ProcessRetrieveUrlCacheEntryFile( CommandArgc, CommandArgv );
  2232. break;
  2233. case CmdRetrieveUrlCacheEntryStream :
  2234. Error = ProcessRetrieveUrlCacheEntryStream( CommandArgc, CommandArgv );
  2235. break;
  2236. #ifdef IE5
  2237. case CmdUnlockUrlCacheEntryFile :
  2238. Error = ProcessUnlockUrlCacheEntryFile( CommandArgc, CommandArgv );
  2239. break;
  2240. #endif
  2241. case CmdGetUrlCacheEntryInfo :
  2242. Error = ProcessGetUrlCacheEntryInfo( CommandArgc, CommandArgv );
  2243. break;
  2244. case CmdSetUrlCacheEntryInfo :
  2245. Error = ProcessSetUrlCacheEntryInfo( CommandArgc, CommandArgv );
  2246. break;
  2247. case CmdSetExempt:
  2248. Error = ProcessSetExempt (CommandArgc, CommandArgv);
  2249. break;
  2250. #ifdef IE5
  2251. case CmdSetUrlCacheEntryGroup:
  2252. Error = ProcessSetUrlCacheEntryGroup (CommandArgc, CommandArgv );
  2253. break;
  2254. case CmdDeleteUrlCacheEntry :
  2255. Error = ProcessDeleteUrlCacheEntry( CommandArgc, CommandArgv );
  2256. break;
  2257. #endif
  2258. case CmdEnumUrlCacheEntries :
  2259. Error = ProcessEnumUrlCacheEntries( CommandArgc, CommandArgv );
  2260. break;
  2261. case CmdEnumGroup :
  2262. Error = ProcessEnumGroup( CommandArgc, CommandArgv );
  2263. break;
  2264. case CmdSimulateCache :
  2265. Error = ProcessSimulateCache( CommandArgc, CommandArgv );
  2266. break;
  2267. case CmdCreateFile :
  2268. Error = ProcessCreateFile( CommandArgc, CommandArgv );
  2269. break;
  2270. case CmdLoopCnt :
  2271. Error = ProcessLoopCnt( CommandArgc, CommandArgv );
  2272. break;
  2273. case CmdCmdLoopCnt :
  2274. Error = ProcessCmdLoopCnt( CommandArgc, CommandArgv );
  2275. break;
  2276. case CmdFreeCacheSpace :
  2277. Error = ProcessFreeCacheSpace( CommandArgc, CommandArgv );
  2278. break;
  2279. case CmdShowTime:
  2280. Error = ProcessShowTime( CommandArgc, CommandArgv );
  2281. break;
  2282. case CmdSetFileSize:
  2283. Error = ProcessSetFileSize( CommandArgc, CommandArgv );
  2284. break;
  2285. case CmdSetDiskCache1:
  2286. Error = ProcessSetDiskCache1( CommandArgc, CommandArgv );
  2287. break;
  2288. case CmdSetDiskCache2:
  2289. Error = ProcessSetDiskCache2( CommandArgc, CommandArgv );
  2290. break;
  2291. case CmdSetQuietMode:
  2292. Error = ProcessSetQuietMode( CommandArgc, CommandArgv );
  2293. break;
  2294. case CmdSetPerfMode:
  2295. Error = ProcessSetPerfMode( CommandArgc, CommandArgv );
  2296. break;
  2297. case CmdWriteFile:
  2298. Error = ProcessWriteFile( CommandArgc, CommandArgv );
  2299. break;
  2300. case CmdCreateGroup:
  2301. Error = ProcessCreateGroup( CommandArgc, CommandArgv );
  2302. break;
  2303. case CmdDeleteGroup:
  2304. Error = ProcessDeleteGroup( CommandArgc, CommandArgv );
  2305. break;
  2306. case CmdHelp :
  2307. DisplayUsage();
  2308. break;
  2309. case CmdGetExQ :
  2310. DisplayExemptQuota();
  2311. break;
  2312. case CmdQuit :
  2313. _tprintf( _T( "---Results---\n" )
  2314. _T( "Total Commands: %d\n" )
  2315. _T( "Failed Commands: %d\n" )
  2316. _T( "Bye Bye..\n" ),
  2317. cCommands, cFails);
  2318. if (DumpUrlList)
  2319. fclose(DumpUrlList);
  2320. if (UrlList)
  2321. fclose(UrlList);
  2322. exit (0);
  2323. case CmdUseFile:
  2324. if (!ProcessUseFile (CommandArgc, CommandArgv))
  2325. {
  2326. Error = ERROR_FILE_NOT_FOUND;
  2327. _tprintf(_T( "File Not Found\n" ));
  2328. }
  2329. break;
  2330. default:
  2331. TestDbgAssert( FALSE );
  2332. _ftprintf(stderr, _T( "Unknown Command Specified.\n" ));
  2333. DisplayUsage();
  2334. break;
  2335. }
  2336. cCommands++;
  2337. if( Error != ERROR_SUCCESS ) {
  2338. LPTSTR LPTSTR;
  2339. cFails++;
  2340. Format_Error(Error, &LPTSTR);
  2341. _tprintf(_T( "FAILED (%s), %ld-%s.\n" ),
  2342. GlobalCommandInfo[CommandCode].CommandName, Error, LPTSTR );
  2343. LocalFree(LPTSTR);
  2344. }
  2345. else {
  2346. if(!g_bQuietMode)
  2347. _tprintf(_T( "Command (%s) successfully completed.\n" ), GlobalCommandInfo[CommandCode].CommandName );
  2348. }
  2349. return Error;
  2350. }
  2351. //=================================================================================
  2352. int __cdecl // _CRTAPI1
  2353. _tmain(
  2354. int argc,
  2355. TCHAR *argv[],
  2356. TCHAR **envp
  2357. )
  2358. {
  2359. TCHAR szInternational[32];
  2360. DWORD cbRet;
  2361. DWORD Error;
  2362. DWORD i;
  2363. COMMAND_CODE CommandCode;
  2364. TCHAR InBuffer[DEFAULT_BUFFER_SIZE];
  2365. DWORD CArgc;
  2366. LPTSTR CArgv[MAX_COMMAND_ARGS];
  2367. DWORD CommandArgc;
  2368. LPTSTR *CommandArgv;
  2369. #ifdef INTERNATIONAL
  2370. //
  2371. // THis is code for testing international strings.
  2372. // intlgent.dll is a module which implements "GetRandomIntlString"
  2373. // You need to install an international langpack
  2374. // for this to work. Also, switch your default codepage
  2375. // or locale to that of the intl pack
  2376. //
  2377. hModule = LoadLibrary(_T("intlgent.dll"));
  2378. if( hModule == NULL ) {
  2379. _tprintf(_T("Unable to Load Library Intlgent.dll , GLE=%d\n"), GetLastError() );
  2380. return 0;
  2381. }
  2382. fnGetRandIntlString = (FNGetRandIntlString)GetProcAddress(hModule,"GetRandIntlString");
  2383. if(!fnGetRandIntlString) {
  2384. _tprintf(_T("Did not find GetRandIntlString\n") );
  2385. return 0;
  2386. }
  2387. cbRet = fnGetRandIntlString(
  2388. 32, //int iMaxChars,
  2389. TRUE, // BOOL bAbs,
  2390. TRUE, // BOOL bCheck,
  2391. szInternational); // string to be returned
  2392. _tprintf(_T("GetRandIntlString() returns %s\n"), szInternational );
  2393. #endif
  2394. #if 0
  2395. //
  2396. // other tests.
  2397. //
  2398. time_t Seed;
  2399. Seed = time(NULL);
  2400. _tprintf(_T( "RAND_MAX = %ld\n" ), RAND_MAX);
  2401. _tprintf(_T( "Seed Random gen. w/ %ld\n" ), Seed);
  2402. srand( Seed );
  2403. TestMakeRandomUrlName();
  2404. #else // 0
  2405. //
  2406. // init GlobalCacheHeaderInfo buffer.
  2407. //
  2408. memset(GlobalCacheHeaderInfo, 0, sizeof(GlobalCacheHeaderInfo));
  2409. //for( i = 0; i < CACHE_HEADER_INFO_SIZE; i++) {
  2410. // GlobalCacheHeaderInfo[i] = (BYTE)((DWORD)_T( '0' ) + i % 10);
  2411. //}
  2412. /* must check for batch mode. if there are command line parms, assume batch mode */
  2413. if (argc > 1)
  2414. {
  2415. //this means that the arguments translate directly into CommandArgc....
  2416. CommandCode = DecodeCommand( argv[1] );
  2417. if( CommandCode == UnknownCommand ) {
  2418. _tprintf(_T( "Unknown Command Specified.\n" ));
  2419. return -1;
  2420. }
  2421. Sleep(2000); // Allow wininet's worker thread to finish so we get good timing
  2422. CommandArgc = argc - 2;
  2423. CommandArgv = &argv[2];
  2424. Error = ProcessCommandCode (CommandCode,CommandArgc,CommandArgv);
  2425. if (DumpUrlList)
  2426. fclose(DumpUrlList);
  2427. if (UrlList)
  2428. fclose(UrlList);
  2429. return 0;
  2430. }
  2431. DisplayUsage();
  2432. for(;;) {
  2433. _ftprintf(stderr, _T( "[" ));
  2434. #ifdef INTERNATIONAL
  2435. _ftprintf(stderr, _T( "INTL " ));
  2436. #endif
  2437. #ifdef UNICODE
  2438. _ftprintf(stderr, _T( "UNICODE" ));
  2439. #else
  2440. _ftprintf(stderr, _T( "ANSI" ));
  2441. #endif
  2442. _ftprintf(stderr, _T( "] Command : "));
  2443. _getts( InBuffer );
  2444. CArgc = 0;
  2445. ParseArguments( InBuffer, CArgv, &CArgc );
  2446. if( CArgc < 1 ) {
  2447. continue;
  2448. }
  2449. //
  2450. // decode command.
  2451. //
  2452. CommandCode = DecodeCommand( CArgv[0] );
  2453. if( CommandCode == UnknownCommand ) {
  2454. _ftprintf(stderr, _T( "Unknown Command Specified.\n" ));
  2455. continue;
  2456. }
  2457. CommandArgc = CArgc - 1;
  2458. CommandArgv = &CArgv[1];
  2459. Error = ProcessCommandCode (CommandCode,CommandArgc,CommandArgv);
  2460. }
  2461. #endif // 0
  2462. FreeLibrary( hModule );
  2463. return 0;
  2464. }
  2465. //=================================================================================
  2466. DWORD
  2467. GetLeafLenFromPath(
  2468. LPTSTR lpszPath
  2469. )
  2470. {
  2471. DWORD len, i;
  2472. LPTSTR lpT;
  2473. if(!lpszPath)
  2474. return(0);
  2475. len = LSTRLEN(lpszPath);
  2476. if (len == 0) {
  2477. return (len);
  2478. }
  2479. lpT = lpszPath+len-1;
  2480. if (*lpT ==_T( '\\' )) {
  2481. --lpT;
  2482. }
  2483. for (; lpT >= lpszPath; --lpT) {
  2484. if (*lpT == _T( '\\' )) {
  2485. break;
  2486. }
  2487. }
  2488. return (LSTRLEN(lpT));
  2489. }
  2490. //=================================================================================
  2491. DWORD WINAPIV Format_String(LPTSTR *plpsz, LPTSTR lpszFmt, ...)
  2492. {
  2493. const TCHAR c_Func_Name[] = _T( "[Format_String] " );
  2494. DWORD dwRet;
  2495. va_list vArgs;
  2496. va_start (vArgs, lpszFmt);
  2497. dwRet = Format_StringV(plpsz, lpszFmt, &vArgs);
  2498. va_end (vArgs);
  2499. return(dwRet);
  2500. }
  2501. //=================================================================================
  2502. DWORD WINAPI Format_Error(DWORD dwErr, LPTSTR *plpsz)
  2503. {
  2504. DWORD dwRet;
  2505. if(dwErr != ERROR_SUCCESS)
  2506. {
  2507. dwRet = Format_MessageV(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  2508. dwErr, plpsz, NULL, NULL);
  2509. }
  2510. else
  2511. {
  2512. const TCHAR szMsg[] = _T( "No Error" );
  2513. Format_String(plpsz, (LPTSTR)szMsg);
  2514. dwRet = LSTRLEN(szMsg);
  2515. }
  2516. return(dwRet);
  2517. }
  2518. //=================================================================================
  2519. DWORD WINAPI Format_StringV(LPTSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs)
  2520. {
  2521. return(Format_MessageV(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
  2522. 0, plpsz, lpszFmt, vArgs));
  2523. }
  2524. // ***************************************************************************
  2525. DWORD WINAPI Format_MessageV(DWORD dwFlags, DWORD dwErr, LPTSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs)
  2526. {
  2527. const TCHAR c_Func_Name[] = _T( "[Format_MessageV]" );
  2528. DWORD dwRet;
  2529. DWORD dwGLE;
  2530. *plpsz = NULL;
  2531. dwRet = FormatMessage(dwFlags, lpszFmt, dwErr, 0, (LPTSTR) plpsz, 0, vArgs);
  2532. if (!dwRet || !*plpsz)
  2533. {
  2534. dwGLE = GetLastError();
  2535. _tprintf(_T( "%s FormatMessage Failed: %s. dwRet: %#lx!. *plpsz:%#lx! GLE:%d\r\n" ), c_Func_Name, lpszFmt, dwRet, *plpsz, dwGLE);
  2536. if (*plpsz)
  2537. LocalFree ((HLOCAL) *plpsz);
  2538. *plpsz = NULL;
  2539. return 0;
  2540. }
  2541. return(dwRet);
  2542. }