public static void ClearCacheItems(bool bClearFiles, bool bClearCookies) { if (!bClearCookies && !bClearFiles) { throw new ArgumentException("You must call ClearCacheItems with at least one target"); } if (!FiddlerApplication.DoClearCache(bClearFiles, bClearCookies)) { FiddlerApplication.Log.LogString("Cache clearing was handled by an extension. Default clearing was skipped."); return; } if (Environment.OSVersion.Version.Major > 5) { FiddlerApplication.Log.LogString(string.Format("Windows Vista+ detected. Calling INETCPL to clear [{0}{1}].", bClearFiles ? "CacheFiles" : string.Empty, bClearCookies ? "Cookies" : string.Empty)); WinINETCache.VistaClearTracks(bClearFiles, bClearCookies); return; } if (bClearCookies) { WinINETCache.ClearCookiesForHost("*"); } if (!bClearFiles) { return; } FiddlerApplication.Log.LogString("Beginning WinINET Cache clearing..."); long groupId = 0L; int num = 0; IntPtr intPtr = IntPtr.Zero; IntPtr intPtr2 = IntPtr.Zero; intPtr2 = WinINETCache.FindFirstUrlCacheGroup(0, 0, IntPtr.Zero, 0, ref groupId, IntPtr.Zero); int lastWin32Error = Marshal.GetLastWin32Error(); bool flag; if (intPtr2 != IntPtr.Zero && 259 != lastWin32Error && 2 != lastWin32Error) { while (true) { flag = WinINETCache.DeleteUrlCacheGroup(groupId, 2, IntPtr.Zero); lastWin32Error = Marshal.GetLastWin32Error(); if (!flag && 2 == lastWin32Error) { flag = WinINETCache.FindNextUrlCacheGroup(intPtr2, ref groupId, IntPtr.Zero); lastWin32Error = Marshal.GetLastWin32Error(); } if (!flag) { if (259 == lastWin32Error) { break; } if (2 == lastWin32Error) { break; } } } } intPtr2 = WinINETCache.FindFirstUrlCacheEntryExA(null, 0, WinINETCache.WININETCACHEENTRYTYPE.ALL, 0L, IntPtr.Zero, ref num, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); lastWin32Error = Marshal.GetLastWin32Error(); if (IntPtr.Zero == intPtr2 && 259 == lastWin32Error) { return; } int num2 = num; intPtr = Marshal.AllocHGlobal(num2); intPtr2 = WinINETCache.FindFirstUrlCacheEntryExA(null, 0, WinINETCache.WININETCACHEENTRYTYPE.ALL, 0L, intPtr, ref num, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); lastWin32Error = Marshal.GetLastWin32Error(); do { WinINETCache.INTERNET_CACHE_ENTRY_INFOA iNTERNET_CACHE_ENTRY_INFOA = (WinINETCache.INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(intPtr, typeof(WinINETCache.INTERNET_CACHE_ENTRY_INFOA)); num = num2; if (WinINETCache.WININETCACHEENTRYTYPE.COOKIE_CACHE_ENTRY != (iNTERNET_CACHE_ENTRY_INFOA.CacheEntryType & WinINETCache.WININETCACHEENTRYTYPE.COOKIE_CACHE_ENTRY)) { flag = WinINETCache.DeleteUrlCacheEntryA(iNTERNET_CACHE_ENTRY_INFOA.lpszSourceUrlName); } flag = WinINETCache.FindNextUrlCacheEntryExA(intPtr2, intPtr, ref num, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); lastWin32Error = Marshal.GetLastWin32Error(); if (!flag && 259 == lastWin32Error) { break; } if (!flag && num > num2) { num2 = num; intPtr = Marshal.ReAllocHGlobal(intPtr, (IntPtr)num2); flag = WinINETCache.FindNextUrlCacheEntryExA(intPtr2, intPtr, ref num, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); } }while (flag); Marshal.FreeHGlobal(intPtr); FiddlerApplication.Log.LogString("Completed WinINET Cache clearing."); }