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.
375 lines
9.2 KiB
375 lines
9.2 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
fndquota.c
|
|
|
|
Abstract:
|
|
|
|
Test program to fill you cache to just under your quota.
|
|
|
|
Author:
|
|
|
|
Vince Roggero (vincentr) 27-Jun-1997
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
|
|
#include <wininet.h>
|
|
#include <winineti.h>
|
|
|
|
//=================================================================================
|
|
#define MAX_COMMAND_ARGS 32
|
|
#define DEFAULT_BUFFER_SIZE 1024 // 1k
|
|
#define URL_NAME_SIZE (16 + 1)
|
|
|
|
#define CACHE_ENTRY_BUFFER_SIZE (1024 * 5)
|
|
#define CACHE_DATA_BUFFER_SIZE 1024
|
|
|
|
#define CACHE_HEADER_INFO_SIZE 2048
|
|
#define CACHE_HEADER_INFO_SIZE_NORMAL_MAX 256
|
|
#define CACHE_HEADER_INFO_SIZE_BIG_MAX 512
|
|
|
|
//=================================================================================
|
|
BYTE GlobalCacheEntryInfoBuffer[CACHE_ENTRY_BUFFER_SIZE];
|
|
BYTE GlobalCacheDataBuffer[CACHE_DATA_BUFFER_SIZE];
|
|
BYTE GlobalCacheHeaderInfo[CACHE_HEADER_INFO_SIZE];
|
|
DWORD g_dwFileSize = 16384;
|
|
DWORD g_dwNumEntries = 1;
|
|
DWORD g_dwInitEntries = 0;
|
|
BOOL g_bVerbose = FALSE;
|
|
|
|
//=================================================================================
|
|
DWORD SetFileSizeByName(LPCTSTR FileName, DWORD FileSize)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Set the size of the specified file.
|
|
|
|
Arguments:
|
|
FileName : full path name of the file whose size is asked for.
|
|
FileSize : new size of the file.
|
|
|
|
Return Value:
|
|
Windows Error Code.
|
|
|
|
--*/
|
|
{
|
|
HANDLE FileHandle;
|
|
DWORD FilePointer;
|
|
DWORD Error = ERROR_SUCCESS;
|
|
DWORD dwFlags = 0;
|
|
DWORD dwCreate;
|
|
BOOL BoolError;
|
|
|
|
//
|
|
// get the size of the file being cached.
|
|
//
|
|
dwFlags = 0;
|
|
dwCreate = CREATE_ALWAYS;
|
|
|
|
FileHandle = CreateFile(
|
|
FileName,
|
|
GENERIC_WRITE,
|
|
0, //FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
dwCreate,
|
|
FILE_ATTRIBUTE_NORMAL | dwFlags,
|
|
NULL );
|
|
|
|
if( FileHandle == INVALID_HANDLE_VALUE ) {
|
|
return( GetLastError() );
|
|
}
|
|
|
|
FilePointer = SetFilePointer(FileHandle, FileSize, NULL, FILE_BEGIN );
|
|
|
|
if( FilePointer != 0xFFFFFFFF )
|
|
{
|
|
if(!SetEndOfFile( FileHandle ))
|
|
Error = GetLastError();
|
|
}
|
|
else
|
|
{
|
|
Error = GetLastError();
|
|
}
|
|
|
|
CloseHandle( FileHandle );
|
|
return( Error );
|
|
}
|
|
|
|
//=================================================================================
|
|
FILETIME
|
|
GetGmtTime(
|
|
VOID
|
|
)
|
|
{
|
|
SYSTEMTIME SystemTime;
|
|
FILETIME Time;
|
|
|
|
GetSystemTime( &SystemTime );
|
|
SystemTimeToFileTime( &SystemTime, &Time );
|
|
|
|
return( Time );
|
|
}
|
|
|
|
|
|
//=================================================================================
|
|
DWORD EnumUrlCacheEntries(DWORD *pdwTotal)
|
|
{
|
|
DWORD BufferSize, dwSmall=0, dwLarge=0;
|
|
HANDLE EnumHandle;
|
|
DWORD Index = 1, len;
|
|
DWORD dwTotal = 0;
|
|
LPINTERNET_CACHE_ENTRY_INFO lpCEI = (LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer;
|
|
BOOL bRC;
|
|
char Str[256];
|
|
|
|
//
|
|
// start enum.
|
|
//
|
|
memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
|
|
|
|
BufferSize = CACHE_ENTRY_BUFFER_SIZE;
|
|
EnumHandle = FindFirstUrlCacheEntryEx (
|
|
NULL, // search pattern
|
|
0, // flags
|
|
0xffffffff, // filter
|
|
0, // groupid
|
|
(LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
|
|
&BufferSize,
|
|
NULL,
|
|
NULL,
|
|
NULL
|
|
);
|
|
|
|
if( EnumHandle == NULL )
|
|
{
|
|
return( GetLastError() );
|
|
}
|
|
|
|
++dwTotal;
|
|
|
|
//
|
|
// get more entries.
|
|
//
|
|
for ( ;; )
|
|
{
|
|
memset(GlobalCacheEntryInfoBuffer, 0, CACHE_ENTRY_BUFFER_SIZE);
|
|
BufferSize = CACHE_ENTRY_BUFFER_SIZE;
|
|
if( !FindNextUrlCacheEntryEx(
|
|
EnumHandle,
|
|
(LPINTERNET_CACHE_ENTRY_INFO)GlobalCacheEntryInfoBuffer,
|
|
&BufferSize, NULL, NULL, NULL))
|
|
{
|
|
DWORD Error;
|
|
|
|
Error = GetLastError();
|
|
if( Error != ERROR_NO_MORE_ITEMS ) {
|
|
return( Error );
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
++dwTotal;
|
|
}
|
|
|
|
*pdwTotal = dwTotal;
|
|
|
|
FindCloseUrlCache(EnumHandle);
|
|
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|
|
//=================================================================================
|
|
DWORD ProcessSimulateCache(DWORD dwNumUrls)
|
|
{
|
|
static DWORD dwUrlNum = 0;
|
|
DWORD Error;
|
|
DWORD i, j;
|
|
CHAR UrlName[ URL_NAME_SIZE ];
|
|
TCHAR LocalFileName[MAX_PATH];
|
|
DWORD FileSize;
|
|
LONGLONG ExpireTime;
|
|
FILETIME LastModTime;
|
|
CHAR TimeBuffer[MAX_PATH];
|
|
DWORD UrlLife;
|
|
DWORD BufferSize;
|
|
DWORD CacheHeaderInfoSize;
|
|
|
|
for( i = dwUrlNum; i < (dwUrlNum + dwNumUrls); i++ )
|
|
{
|
|
//
|
|
// make a new url name.
|
|
//
|
|
sprintf(UrlName, "http://serv/URL%ld", i);
|
|
|
|
//
|
|
// create url file.
|
|
//
|
|
if( !CreateUrlCacheEntry(UrlName, 0, "tmp", LocalFileName, 0 ) )
|
|
{
|
|
Error = GetLastError();
|
|
printf( "CreateUrlFile call failed, %ld.\n", Error );
|
|
return( Error );
|
|
}
|
|
|
|
//
|
|
// set file size.
|
|
//
|
|
Error = SetFileSizeByName(LocalFileName, g_dwFileSize);
|
|
if( Error != ERROR_SUCCESS )
|
|
{
|
|
printf( "SetFileSizeByName call failed, %ld.\n", Error );
|
|
return( Error );
|
|
}
|
|
|
|
UrlLife = rand() % 48;
|
|
|
|
ExpireTime = (LONGLONG)UrlLife * (LONGLONG)36000000000;
|
|
// in 100 of nano seconds.
|
|
|
|
LastModTime = GetGmtTime();
|
|
ExpireTime += *((LONGLONG *)&LastModTime);
|
|
|
|
CacheHeaderInfoSize = CACHE_HEADER_INFO_SIZE_NORMAL_MAX;
|
|
|
|
//
|
|
// cache this file.
|
|
//
|
|
if( !CommitUrlCacheEntryA(
|
|
UrlName,
|
|
LocalFileName,
|
|
*((FILETIME *)&ExpireTime),
|
|
LastModTime,
|
|
NORMAL_CACHE_ENTRY,
|
|
(LPBYTE)GlobalCacheHeaderInfo,
|
|
CacheHeaderInfoSize,
|
|
TEXT("tst"),
|
|
0 ) ) {
|
|
Error = GetLastError();
|
|
printf( "CreateUrlFile call failed, %ld.\n", Error );
|
|
return( Error );
|
|
}
|
|
|
|
}
|
|
dwUrlNum = i; // Save last for next call
|
|
|
|
return( ERROR_SUCCESS );
|
|
}
|
|
|
|
//---------------------------------------------------------------------
|
|
void Display_Usage(const char *szApp)
|
|
{
|
|
printf("Usage: %s [Options]\r\n\n", szApp);
|
|
printf("Options:\r\n");
|
|
printf("\t-f# File size of cache entries in bytes.\r\n");
|
|
printf("\t-i# Initial number of entries to create\r\n");
|
|
printf("\t-n# Number of entries to create before checking total.\r\n");
|
|
printf("\t-v Turn on verbose output.\r\n");
|
|
}
|
|
|
|
//---------------------------------------------------------------------
|
|
BOOL ParseCommandLine(int argcIn, char *argvIn[])
|
|
{
|
|
BOOL bRC = TRUE;
|
|
int argc = argcIn;
|
|
char **argv = argvIn;
|
|
|
|
argv++; argc--;
|
|
while( argc > 0 && argv[0][0] == '-' )
|
|
{
|
|
switch (argv[0][1])
|
|
{
|
|
case 'f':
|
|
g_dwFileSize = atoi(&argv[0][2]);
|
|
break;
|
|
case 'i':
|
|
g_dwInitEntries= atoi(&argv[0][2]);
|
|
break;
|
|
case 'n':
|
|
g_dwNumEntries = atoi(&argv[0][2]);
|
|
break;
|
|
case 'v':
|
|
g_bVerbose = TRUE;
|
|
break;
|
|
case '?':
|
|
bRC = FALSE;
|
|
break;
|
|
default:
|
|
bRC = FALSE;
|
|
break;
|
|
}
|
|
argv++; argc--;
|
|
}
|
|
|
|
if(bRC == FALSE)
|
|
{
|
|
Display_Usage(argvIn[0]);
|
|
bRC = FALSE;
|
|
}
|
|
|
|
return(bRC);
|
|
|
|
}
|
|
|
|
//=================================================================================
|
|
void __cdecl main(int argc,char *argv[])
|
|
{
|
|
|
|
DWORD Error;
|
|
DWORD i;
|
|
DWORD dwEntries = 0;
|
|
DWORD dwOldEntries = 0;
|
|
|
|
if(!ParseCommandLine(argc, argv))
|
|
return;
|
|
|
|
//
|
|
// init GlobalCacheHeaderInfo buffer.
|
|
//
|
|
for( i = 0; i < CACHE_HEADER_INFO_SIZE; i++) {
|
|
GlobalCacheHeaderInfo[i] = (BYTE)((DWORD)'0' + i % 10);
|
|
}
|
|
|
|
if(g_bVerbose)
|
|
printf("FileSize=%d InitEntries=%d NumEntries=%d\r\n", g_dwFileSize, g_dwInitEntries, g_dwNumEntries);
|
|
|
|
if(g_dwInitEntries)
|
|
ProcessSimulateCache(g_dwInitEntries);
|
|
|
|
while(TRUE)
|
|
{
|
|
ProcessSimulateCache(g_dwNumEntries);
|
|
|
|
dwOldEntries = dwEntries;
|
|
EnumUrlCacheEntries(&dwEntries);
|
|
if(dwEntries < dwOldEntries) // Quota has been exceeded
|
|
break;
|
|
|
|
if(g_bVerbose)
|
|
printf("Entries=%d\r\n", dwEntries);
|
|
}
|
|
|
|
printf("setperfmode on\n");
|
|
printf("setquietmode on\n");
|
|
printf("setfilesize %d\n", g_dwFileSize);
|
|
printf("simcache %d\n", dwOldEntries - 4);
|
|
|
|
return;
|
|
}
|
|
|