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.
 
 
 
 
 
 

519 lines
13 KiB

#include "IsapiStress.h"
// Globals
HANDLE hLogFile = INVALID_HANDLE_VALUE;
void Usage()
{
_tprintf(_T("Usage:\n\r"));
_tprintf(_T("IsapiStress /s:<IISServer> /v:<VirtualDirectory> /d:<Directory> /f:<FileName> /l:<LogFileName> /? <Usage>\r\n"));
_tprintf(_T("Where:\r\n"));
_tprintf(_T("\t<IISServer> - Website to upload file to (ie. ocadeviis) \r\n"));
_tprintf(_T("\t<VirualDirectory> - Location on Web server to upload the file(s) to.\r\n"));
_tprintf(_T("\t<Directory> - Path to a directory of .cab files to be uploaded\r\n"));
_tprintf(_T("\t<FileName> - Qualified path of a file to be uploaded.\r\n"));
_tprintf(_T("\t<LogFileName> - Name of file to log OCA response url or errors.\r\n\r\n"));
_tprintf(_T("\tNote: Default iisserver is ocatest. \r\n\t Default VirtualDirectory is OCA"));
}
void
LogMessage(TCHAR *pFormat,...)
{
// Routine to Log Fatal Errors to NT Event Log
TCHAR chMsg[256];
DWORD dwBytesWritten;
va_list pArg;
va_start(pArg, pFormat);
StringCbVPrintf(chMsg, sizeof chMsg,pFormat, pArg);
va_end(pArg);
// add a cr\lf combination for file fomrating.
StringCbCat(chMsg, sizeof chMsg,_T("\r\n"));
if (hLogFile != INVALID_HANDLE_VALUE)
{
/* Write to event log. */
WriteFile(hLogFile,
chMsg,
_tcslen(chMsg) * (DWORD)sizeof TCHAR,
&dwBytesWritten,
NULL);
}
else // write it to the console.
_tprintf(chMsg);
}
DWORD Upload(TCHAR *SourceFileName, TCHAR *VirtualDir, TCHAR *HostName, TCHAR *RemoteFileName)
{
static const TCHAR *pszAccept[] = {_T("*.*"), 0};
//TCHAR RemoteFileName[MAX_PATH]; // Host/Virtualdirectory/filename
TCHAR *pUploadUrl = NULL;
BOOL bRet = FALSE;
BOOL UploadSuccess = FALSE;
DWORD dwBytesRead;
DWORD dwBytesWritten;
DWORD ResponseCode = 0;
DWORD ResLength = 255;
DWORD index = 0;
DWORD ErrorCode = 0;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
INTERNET_BUFFERS BufferIn = {0};
INTERNET_BUFFERS BufferOut = {0};
HANDLE hFile = INVALID_HANDLE_VALUE;
BYTE *pBuffer;
BOOL bOnce = FALSE;
GUID guidNewGuid;
TCHAR *szGuidRaw = NULL;
HRESULT hResult = S_OK;
wchar_t *wszGuidRaw = NULL;
CoInitialize(NULL);
hResult = CoCreateGuid(&guidNewGuid);
if (FAILED(hResult))
{
//-------------What do we send here....
//goto ERRORS;
;
}
else
{
if (UuidToStringW(&guidNewGuid, &wszGuidRaw) == RPC_S_OK)
{
if ( (szGuidRaw = (TCHAR *) malloc ( wcslen(wszGuidRaw)*2 )) != NULL)
{
// clear the memory
ZeroMemory(szGuidRaw, wcslen(wszGuidRaw) * 2);
wcstombs( szGuidRaw, wszGuidRaw, wcslen(wszGuidRaw));
}
else
{
LogMessage(_T("Memory allocation failed: ErrorCode:%d"),GetLastError());
if (wszGuidRaw)
{
RpcStringFreeW(&wszGuidRaw);
}
CoUninitialize();
return GetLastError();
}
}
}
if (wszGuidRaw)
{
RpcStringFreeW(&wszGuidRaw);
}
StringCbPrintf(RemoteFileName, MAX_PATH * sizeof TCHAR, _T("\\%s\\%s%s"),VirtualDir,szGuidRaw + 19, PathFindFileName(SourceFileName));
if (szGuidRaw)
free (szGuidRaw);
hSession = InternetOpen( _T("IsapiStress"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if (!hSession)
{
LogMessage(_T("Failed to create an internet session."));
CoUninitialize();
return GetLastError();
}
hConnect = InternetConnect(hSession,
HostName,
INTERNET_DEFAULT_HTTP_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL);
if (hConnect == INVALID_HANDLE_VALUE)
{
InternetCloseHandle(hSession);
LogMessage(_T("Failed to create an internet connection."));
CoUninitialize();
return GetLastError();
}
LogMessage(_T("Connecting to: %s"),HostName);
LogMessage(_T("Uploading file: %s"),RemoteFileName);
hRequest = HttpOpenRequest( hConnect,
_T("PUT"),
RemoteFileName,
NULL,
NULL,
pszAccept,
INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_NO_CACHE_WRITE ,
0);
if (hRequest != INVALID_HANDLE_VALUE)
{
hFile = CreateFile( SourceFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
// Clear the buffer
if ( (pBuffer = (BYTE *)malloc (70000)) != NULL)
{
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );
BufferIn.Next = NULL;
BufferIn.lpcszHeader = NULL;
BufferIn.dwHeadersLength = 0;
BufferIn.dwHeadersTotal = 0;
BufferIn.lpvBuffer = NULL;
BufferIn.dwBufferLength = 0;
BufferIn.dwOffsetLow = 0;
BufferIn.dwOffsetHigh = 0;
BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
FillMemory(pBuffer, 70000,'/0'); // Fill buffer with data
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
if(!HttpSendRequestEx( hRequest,
&BufferIn,
NULL,
HSR_INITIATE,
0))
{
LogMessage(_T("HttpSendRequestEx Failed."));
}
else
{
do
{
dwBytesRead = 0;
bRet = ReadFile(hFile,
pBuffer,
70000,
&dwBytesRead,
NULL);
if (bRet != 0)
{
bRet = InternetWriteFile(hRequest,
pBuffer,
dwBytesRead,
&dwBytesWritten);
if ( (!bRet) || (dwBytesWritten==0) )
{
LogMessage(_T("Error Writting File: %d"),ErrorCode = GetLastError());
}
}
} while (dwBytesRead == sizeof (pBuffer));
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
bRet = HttpEndRequest( hRequest,
NULL,
0,
0);
if (bRet)
{
ResponseCode = 0;
HttpQueryInfo(hRequest,
HTTP_QUERY_STATUS_CODE |HTTP_QUERY_FLAG_NUMBER,
&ResponseCode,
&ResLength,
&index);
if ( (ResponseCode != 200) && (ResponseCode != 201))
{
ErrorCode=ResponseCode;
LogMessage(_T("IIS Response Code = %d"),ResponseCode);
// Cleanup for retry
}
else
{
ErrorCode = 0;
LogMessage(_T("IIS Response Code = %d"),ResponseCode);
UploadSuccess = TRUE;
}
}
else
{
LogMessage(_T("HttpEndrequest Returned an Error"));
ErrorCode = GetLastError();
}
}
}
else
{
LogMessage(_T("Failed to allocate buffer memory"));
ErrorCode = GetLastError();
}
}
else
{
LogMessage(_T("Failed to Open Source File"));
ErrorCode = GetLastError();
}
}
else
{
LogMessage(_T("Failed to Create Put Request"));
ErrorCode = GetLastError();
}
// Clean up
if (hFile!= INVALID_HANDLE_VALUE)
CloseHandle (hFile);
if (hRequest)
if (!InternetCloseHandle(hRequest))
{
LogMessage(_T("Failed to close the hRequest handle: error: %d"), GetLastError);
}
if (hConnect)
if (!InternetCloseHandle(hConnect))
{
LogMessage(_T("Failed to close the hRequest handle: error: %d"), GetLastError);
}
if (hSession)
if (!InternetCloseHandle(hSession))
{
LogMessage(_T("Failed to close the hRequest handle: error: %d"), GetLastError);
}
if (pUploadUrl)
free (pUploadUrl);
CoUninitialize();
return ErrorCode;
}
DWORD GetResponseUrl(TCHAR * HostName, TCHAR *RemoteFileName,TCHAR *ResponseURL)
{
TCHAR IsapiUrl[255];
TCHAR *pUploadUrl = NULL;
TCHAR *temp = NULL;
BOOL bRet = FALSE;
DWORD dwUrlLength = 0;
DWORD ErrorCode = 0;
DWORD dwLastError = 0;
TCHAR NewState;
HINTERNET hSession;
HINTERNET hRedirUrl;
BOOL bOnce = FALSE;
DWORD dwBuffLen = 0;
DWORD dwFlags = 0;
TCHAR LocalUrl[255];
ZeroMemory (IsapiUrl, sizeof IsapiUrl);
ZeroMemory (LocalUrl, sizeof LocalUrl);
HINTERNET hUrlFile = NULL;
StringCbPrintf (IsapiUrl,sizeof IsapiUrl, _T("http://%s/isapi/oca_extension.dll?id=%s&Type=5"),HostName, RemoteFileName);
LogMessage(_T("Connecting to url: %s"),IsapiUrl);
//StringCbPrintf (IsapiUrl,sizeof IsapiUrl, _T("http://www.microsoft.com"));
hSession = InternetOpen(_T("Isapi Stress"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
if (hSession)
{
// Open the url we want to connect to.
hUrlFile = InternetOpenUrl(hSession,
IsapiUrl,
NULL,
0,
0,
0);
// Read the page returned by the isapi dll.
TCHAR buffer[255] ;
ZeroMemory (buffer, sizeof buffer);
DWORD dwBytesRead = 0;
BOOL bRead = InternetReadFile(hUrlFile,
buffer,
sizeof(buffer),
&dwBytesRead);
//buffer[sizeof (buffer) -1] = _T('\0');
StringCbCopy (ResponseURL, sizeof buffer, buffer);
}
InternetCloseHandle(hUrlFile);
InternetCloseHandle(hSession);
return 0;
}
int __cdecl _tmain( int argc, TCHAR *argv[])
{
TCHAR SourceFileName[MAX_PATH];
TCHAR SourcePath[MAX_PATH];
TCHAR HostName[MAX_PATH];
TCHAR VirtualDir[MAX_PATH];
TCHAR LogPath[MAX_PATH];
TCHAR temp;
TCHAR RemoteFileName[MAX_PATH];
DWORD ErrorCode = 0;
TCHAR ResponseUrl[255];
int i = 1;
ZeroMemory (SourceFileName, sizeof SourceFileName);
ZeroMemory (SourcePath, sizeof SourcePath);
ZeroMemory (HostName, sizeof HostName);
ZeroMemory (VirtualDir, sizeof VirtualDir);
ZeroMemory (LogPath, sizeof LogPath);
ZeroMemory (ResponseUrl,sizeof ResponseUrl);
StringCbCopy (HostName, sizeof HostName, _T("Ocatest"));
StringCbCopy (VirtualDir, sizeof VirtualDir, _T("OCA"));
if ( (argc < 2) || (argc > 6))
{
Usage();
return (1);
}
for (i = 1; i < argc; i++)
{
switch (*argv[i])
{
case _T('/'):
case _T('-'):
{
temp = _toupper( *(argv[i]+1));
switch (temp)
{
case _T('S'): // IIS Sever- Override Default
if(*(argv[i]+2) == _T(':'))
{
StringCbCopy(HostName, sizeof HostName, argv[i]+3);
}
break;
case _T('V'): // Virtual Directory override default
if(*(argv[i]+2) == _T(':'))
{
StringCbCopy(VirtualDir, sizeof VirtualDir, argv[i]+3);
}
break;
case _T('?'):
Usage();
break;
case _T('D'):
if(*(argv[i]+2) == _T(':'))
{
StringCbCopy(SourcePath, sizeof SourcePath, argv[i]+3);
}
break;
case _T('F'): // User specified an offset in days...
if(*(argv[i]+2) == _T(':'))
{
StringCbCopy(SourceFileName, sizeof SourceFileName, argv[i]+3);
}
break;
case _T('L'):
if(*(argv[i]+2) == _T(':'))
{
StringCbCopy(LogPath, sizeof LogPath, argv[i]+3);
}
break;
default:
LogMessage(_T("Unknown option: %s"),argv[i]);
Usage();
return (1);
} // end switch
} // end case
break;
default:
LogMessage(_T("Unknown option: %s\n"),argv[i]);
Usage();
return (1);
break;
}// end switch
}// end for
// Ok now the fun part.
// Create the log file if one was specified.
if (LogPath[0] != _T('\0'))
{
hLogFile = CreateFile(LogPath,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hLogFile == INVALID_HANDLE_VALUE)
{
LogMessage(_T("Failed to open log file: %s, Logging disabled."), LogPath);
}
}
// if we have a file name we just want to upload it.
if (SourceFileName[0] != _T('\0'))
{
LogMessage(_T("Uploading file: %s"), SourceFileName);
ErrorCode = Upload(SourceFileName, VirtualDir, HostName,RemoteFileName);
if(ErrorCode != 0)
{
LogMessage(_T("Upload Failed: ErrorCode = %d"),ErrorCode);
}
else
{
LogMessage(_T("Upload Succeeded. "));
}
ErrorCode = GetResponseUrl(HostName,PathFindFileName(RemoteFileName),ResponseUrl);
if (ErrorCode != 0)
{
LogMessage(_T("GetResponseUrl Failed ErrorCode=%d"),ErrorCode);
}
LogMessage(_T("ResponseUrl = %s"),ResponseUrl);
}
else
{
if (SourcePath[0] != _T('\0'))
{
// if we have a directory we want to walk the directory and submit all the cabs.
;
}
else
{
// If we don't have either we just exit with usage
Usage();
if (hLogFile != INVALID_HANDLE_VALUE)
CloseHandle (hLogFile);
return (1);
}
}
if (hLogFile != INVALID_HANDLE_VALUE)
CloseHandle (hLogFile);
}