/******************************************************************* * * DESCRIPTION: * Upload.cpp : Implements Class UploadFile to upload dumps to servers * AUTHOR: * * DATE:8/22/2002 * *******************************************************************/ #include #include #include #include #include "ocaupld.h" BOOL OcaUpldCreate(POCA_UPLOADFILE* pUpload) { *pUpload = (POCA_UPLOADFILE) new UploadFile(); return TRUE; } UploadFile::UploadFile() { m_szFile = NULL; m_Sent = NULL; m_Size = NULL; m_fInitialized = FALSE; m_hFile = NULL; m_hRequest = NULL; m_hSession = NULL; m_hConnect = NULL; m_hCancelEvent = NULL; m_Refs = 0; m_fLastUploadStatus = UploadNotStarted; CreateCancelEventObject(); } UploadFile::~UploadFile() { UnInitialize(); if (m_hCancelEvent) { CloseHandle(m_hCancelEvent); } } STDMETHODIMP UploadFile::QueryInterface( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface ) { HRESULT Status; *Interface = NULL; Status = S_OK; if (IsEqualIID(InterfaceId, IID_IUnknown) || IsEqualIID(InterfaceId, __uuidof(IOcaUploadFile))) { *Interface = (IOcaUploadFile *)this; AddRef(); } else { Status = E_NOINTERFACE; } return Status; } STDMETHODIMP_(ULONG) UploadFile::AddRef( THIS ) { return InterlockedIncrement((PLONG)&m_Refs); } STDMETHODIMP_(ULONG) UploadFile::Release( THIS ) { LONG Refs = InterlockedDecrement((PLONG)&m_Refs); if (Refs == 0) { delete this; } return Refs; } HRESULT UploadFile::SetFileToSend( LPWSTR wszFileName ) { HRESULT Hr; ULONG dwSizeHigh=0; if (m_hFile || m_fInitialized) { // Already in middle of upload return E_FAIL; } m_szFile = wszFileName; m_NumTries = 0; if (m_hCancelEvent == NULL) { CreateCancelEventObject(); } m_hFile = CreateFile(m_szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (m_hFile == NULL || m_hFile == INVALID_HANDLE_VALUE) { m_szFile = NULL; return E_FAIL; } m_Size = GetFileSize(m_hFile, &dwSizeHigh); m_Size += ((ULONG64) dwSizeHigh << 32); m_fLastUploadStatus = UploadNotStarted; m_wszLastUploadResult[0] = 0; m_fInitialized = TRUE; return S_OK; } HRESULT UploadFile::UnInitialize() { if (m_hFile) { CloseHandle(m_hFile); m_hFile = NULL; } CloseSession(); m_fInitialized = FALSE; return S_OK; } // // Lookup registry entry to get default proxy settings from Internet Settings key // HRESULT UploadFile::GetProxySettings( LPWSTR wszServerName, ULONG ServerNameSIze, LPWSTR wszByPass, ULONG ByPassSize ) { HKEY hkey, hkeySettings; const WCHAR c_wszInetSettings[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; BOOL bProxyEnabled = FALSE; DWORD cb, err; if (RegOpenKeyExW(HKEY_CURRENT_USER, c_wszInetSettings, 0, KEY_READ | KEY_WOW64_64KEY, &hkey) == ERROR_SUCCESS) { cb = sizeof(bProxyEnabled); if ((err = RegQueryValueEx(hkey, L"ProxyEnable", NULL, NULL, (PBYTE)&bProxyEnabled, &cb)) != ERROR_SUCCESS) { RegCloseKey(hkey); return err; } if (bProxyEnabled) { cb = ServerNameSIze; if ((err = RegQueryValueEx(hkey, L"ProxyServer", NULL, NULL, (PBYTE)wszServerName, &cb)) != ERROR_SUCCESS) { wszServerName[0] = 0; } cb = ByPassSize; if ((err = RegQueryValueEx(hkey, L"ProxyOverride", NULL, NULL, (PBYTE)wszByPass, &cb)) != ERROR_SUCCESS) { wszByPass[0] = 0; } } else { wszServerName[0] = 0; wszByPass[0] = 0; } RegCloseKey(hkey); } return S_OK; } HRESULT UploadFile::GetSessionRedirUrl( LPWSTR SessionUrl, LPWSTR wszRedirUrl, ULONG SizeofRedirUrl ) { HRESULT Hr; Hr = OpenSession(); if (FAILED(Hr)) { return Hr; } if (!GetRedirServerName(NULL, SessionUrl, NULL, 0, wszRedirUrl, SizeofRedirUrl)) { CloseSession(); Hr = GetLastError(); return Hr; } return Hr; } // // Gets the data on the web page wszUrl. This should be used with pages with small data size only. // HRESULT UploadFile::GetUrlPageData( LPWSTR wszUrl, LPWSTR wszUrlPage, ULONG cbUrlPage ) { HRESULT Hr; BOOL bRet; wchar_t ConnectString [255]; HINTERNET hInet = NULL; HINTERNET hRedirUrl = NULL; HINTERNET hConnect = NULL; DWORD dwDownloaded , dwSize = 0; PCHAR Buffer; Hr = OpenSession(); if (FAILED(Hr)) { return Hr; } hConnect = WinHttpConnect(m_hSession, m_wszServerName, INTERNET_DEFAULT_HTTP_PORT, 0); if (hConnect == NULL) { goto exitPageData; } hRedirUrl = WinHttpOpenRequest(hConnect, L"GET", wszUrl, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); if(!hRedirUrl) { goto exitPageData; } bRet = WinHttpSendRequest( hRedirUrl, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); if (bRet) { bRet = WinHttpReceiveResponse(hRedirUrl, NULL); } if (!bRet) { goto exitPageData; } if (!WinHttpQueryDataAvailable( hRedirUrl, &dwSize)) { goto exitPageData; } // Allocate space for the buffer. Buffer = (PCHAR) malloc(dwSize); if (!Buffer) { goto exitPageData; } if (dwSize >= cbUrlPage/sizeof(WCHAR)) { // ::MessageBoxW(NULL,L"Failed pUploadurl memory allocation",NULL,MB_OK); SetLastError(STG_E_INSUFFICIENTMEMORY); free(Buffer); goto exitPageData; } else { ZeroMemory(Buffer, dwSize); // Read the Data. if (!WinHttpReadData( hRedirUrl, (LPVOID)Buffer, dwSize, &dwDownloaded)) { free(Buffer); goto exitPageData; } ZeroMemory(wszUrlPage, cbUrlPage); if (!MultiByteToWideChar(CP_ACP, 0, Buffer, dwSize, wszUrlPage, cbUrlPage/sizeof(WCHAR))) { } free (Buffer); } CloseSession(); exitPageData: Hr = GetLastError(); return Hr; } HRESULT UploadFile::InitializeSession( LPWSTR OptionCode, LPWSTR wszFileToSend ) { HRESULT Hr; Hr = SetFileToSend(wszFileToSend); if (FAILED(Hr)) { return Hr; } m_fLastUploadStatus = UploadConnecting; m_dwConnectPercentage = 10; Hr = OpenSession(); if (FAILED(Hr)) { return Hr; } if (!GetRedirServerName(OptionCode, NULL, m_wszServerName, sizeof(m_wszServerName), NULL, 0)) { CloseSession(); Hr = GetLastError(); return Hr; } return Hr; } HRESULT UploadFile::SendFile( LPWSTR wszRemoteFileName, BOOL bSecureMode ) { HRESULT Hr; Hr = OpenConnection(wszRemoteFileName, bSecureMode); if (SUCCEEDED(Hr)) { m_fLastUploadStatus = UploadTransferInProgress; Hr = StartSend(); if (SUCCEEDED(Hr)) { Hr = CompleteSend(); } CloseConnection(); } return Hr; } HRESULT UploadFile::OpenSession( void ) { ULONG ErrorCode; WCHAR wszProxyServer[100], wszByPass[100]; if (m_hSession != NULL) { return E_UNEXPECTED; } #ifdef _USE_WINHTTP wszByPass[0] = wszProxyServer[0] = 0; GetProxySettings(wszProxyServer, sizeof(wszProxyServer), wszByPass, sizeof(wszByPass)); if (wszProxyServer[0]) { m_hSession = WinHttpOpen(L"OCARPT Control", WINHTTP_ACCESS_TYPE_NAMED_PROXY, wszProxyServer, wszByPass, //L"itgproxy:80", L"", 0); } else { m_hSession = WinHttpOpen(L"OCARPT Control", WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, // L"itgproxy:80", L"", 0); } #else m_hSession = InternetOpenW(L"OCARPT Control", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); InetCheckTimeouts(m_hSession); if (InternetSetStatusCallback(hSession, (INTERNET_STATUS_CALLBACK) InetCallback) == INTERNET_INVALID_STATUS_CALLBACK) { // Not significant if this fails } #endif if (!m_hSession) { ErrorCode = GetLastError(); return ErrorCode; } return S_OK; } HRESULT UploadFile::OpenConnection( LPWSTR wszRemoteFileName, BOOL bSecureMode ) { #ifndef _USE_WINHTTP INTERNET_BUFFERSW BufferInW = {0}; #endif static const wchar_t *pszAccept[] = {L"*.*", 0}; if (m_hSession == NULL) { return E_UNEXPECTED; } if (m_hFile == NULL || m_hFile == INVALID_HANDLE_VALUE) { return E_UNEXPECTED; } if (m_NumTries > 0) { // m_Size /= 2; } // m_NumTries++; if (!m_hConnect) { #ifdef _USE_WINHTTP m_hConnect = WinHttpConnect(m_hSession, m_wszServerName, (bSecureMode ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT), 0); #else m_hConnect = InternetConnectW(m_hSession, (wchar_t *)m_wszServerName, (bSecureMode ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT), L"", L"", INTERNET_SERVICE_HTTP, 0, NULL); #endif // _USE_WINHTTP if (!m_hConnect) { return GetLastError(); } } if (!m_hRequest) { #ifdef _USE_WINHTTP m_hRequest = WinHttpOpenRequest(m_hConnect, L"PUT", wszRemoteFileName, NULL, WINHTTP_NO_REFERER, pszAccept, //WINHTTP_DEFAULT_ACCEPT_TYPES, (bSecureMode ? WINHTTP_FLAG_SECURE : 0) | WINHTTP_FLAG_REFRESH); #else m_hRequest = HttpOpenRequestW(m_hConnect, L"PUT", wszRemoteFileName, NULL, NULL, pszAccept, INTERNET_FLAG_NEED_FILE| INTERNET_FLAG_NO_CACHE_WRITE | (bSecureMode ? INTERNET_FLAG_SECURE : 0), 0); #endif // _USE_WINHTTP if (!m_hRequest) { // ::MessageBoxW(NULL,L"Put request failed ",NULL,MB_OK); return GetLastError(); } } // Clear the buffer #ifdef _USE_WINHTTP if (!WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, (ULONG) m_Size, 0)) #else InetCheckTimeouts(m_hRequest); BufferInW.dwStructSize = sizeof( INTERNET_BUFFERSW ); BufferInW.Next = NULL; BufferInW.lpcszHeader = NULL; BufferInW.dwHeadersLength = 0; BufferInW.dwHeadersTotal = 0; BufferInW.lpvBuffer = NULL; BufferInW.dwBufferLength = 0; BufferInW.dwOffsetLow = 0; BufferInW.dwOffsetHigh = 0; BufferInW.dwBufferTotal = (ULONG) m_Size; if(!HttpSendRequestExW( m_hRequest, &BufferInW, NULL, 0, 0)) #endif { // ::MessageBoxW(NULL,L"Failed to send request ",NULL,MB_OK); return GetLastError(); } return S_OK; } HRESULT UploadFile::CompleteSend() { BOOL bRet; ULONG ResLength; ULONG ResponseCode; WCHAR Text[500]; ULONG index; ULONG ErrorCode = 0; #ifdef _USE_WINHTTP bRet = WinHttpReceiveResponse(m_hRequest, NULL); #else bRet = HttpEndRequest(m_hRequest, NULL, 0, 0); #endif if (!bRet) { // ::MessageBoxW(NULL,L"End RequestFailed ",NULL,MB_OK); ErrorCode = GetLastError(); } else { ResLength = sizeof(ResponseCode); ResponseCode = 0; #ifdef _USE_WINHTTP WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, &ResponseCode, &ResLength, WINHTTP_NO_HEADER_INDEX); ResLength = sizeof(Text); WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_STATUS_TEXT, WINHTTP_HEADER_NAME_BY_INDEX, Text, &ResLength, &index); if ( ResponseCode >= 400 ) #else HttpQueryInfo(m_hRequest, HTTP_QUERY_STATUS_CODE |HTTP_QUERY_FLAG_NUMBER, &ResponseCode, &ResLength, &index); ResLength = sizeof(Text); HttpQueryInfo(m_hRequest, HTTP_QUERY_STATUS_TEXT, Text, &ResLength, &index); if ( (ResponseCode != HTTP_STATUS_CREATED) && (ResponseCode != HTTP_STATUS_OK)) #endif { ::MessageBoxW(NULL,Text,NULL,MB_OK); ErrorCode= ResponseCode; // Cleanup for retry // InternetCloseHandle(hRequest); hRequest = NULL; // InternetCloseHandle(hConnect); hConnect = NULL; } else { ErrorCode = 0; } } return ErrorCode; } HRESULT UploadFile::CloseConnection() { #ifdef _USE_WINHTTP if (m_hConnect) WinHttpCloseHandle(m_hConnect); if (m_hRequest) WinHttpCloseHandle(m_hRequest); #else if (m_hConnect) InternetCloseHandle(m_hConnect); if (m_hRequest) InternetCloseHandle(m_hRequest); #endif m_hRequest = NULL; m_hConnect = NULL; return S_OK; } HRESULT UploadFile::CloseSession() { if (m_hConnect || m_hRequest) { CloseConnection(); } #ifdef _USE_WINHTTP if (m_hSession) WinHttpCloseHandle(m_hSession); #else if (m_hSession) InternetCloseHandle(m_hSession); #endif // _USE_WINHTTP m_hSession = NULL; return S_OK; } BOOL UploadFile::GetUploadResult( LPTSTR Result, ULONG cbResult ) { if (Result) { if (m_fLastUploadStatus == UploadTransferInProgress) { StringCbPrintfW(Result, cbResult, L"Transferring to server (%ld KB) ...", m_Size / 1024); return TRUE; } else if (m_fLastUploadStatus == UploadConnecting) { StringCbPrintfW(Result, cbResult, L"Connecting to server ..."); return TRUE; } StringCbCopyW(Result, cbResult, m_wszLastUploadResult); } return m_wszLastUploadResult[0] != 0; } HRESULT UploadFile::SetUploadResult( EnumUploadStatus Success, LPCTSTR Text ) { m_fLastUploadStatus = Success; return StringCbCopyW(m_wszLastUploadResult, sizeof(m_wszLastUploadResult), Text); } HRESULT UploadFile::StartSend() { HRESULT Hr = S_OK; BYTE *pBuffer; BOOL bRet; DWORD dwBytesWritten, dwBytesRead = 0; #define MAX_SEND_SIZE 50000 if (m_hFile == NULL || m_hRequest == NULL) { return E_UNEXPECTED; } if (m_hCancelEvent) { ResetEvent(m_hCancelEvent); } // Get the buffer memory from the heap if ( (pBuffer = (BYTE *)malloc (MAX_SEND_SIZE)) == NULL) { // ::MessageBoxW(NULL,L"Failed Memory allocation",NULL,MB_OK); return E_OUTOFMEMORY; } SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN); m_fLastUploadStatus = UploadTransferInProgress; m_Sent = 0; do { bRet = ReadFile(m_hFile, pBuffer, MAX_SEND_SIZE, &dwBytesRead, NULL); if (bRet != 0) { if (dwBytesRead > (ULONG)(m_Size - m_Sent)) { dwBytesRead = (ULONG)(m_Size - m_Sent); } #ifdef _USE_WINHTTP bRet = WinHttpWriteData(m_hRequest, pBuffer, dwBytesRead, &dwBytesWritten); #else bRet = InternetWriteFile(m_hRequest, pBuffer, dwBytesRead, &dwBytesWritten); #endif if ( (!bRet) || (dwBytesWritten==0) ) { // ::MessageBoxW(NULL,L"Failed write ",NULL,MB_OK); Hr = HRESULT_FROM_NT (GetLastError()); break; } m_Sent += dwBytesWritten; if (CheckCancelRequest()) { // Send was aborted Hr = E_ABORT; break; } } else { Hr = E_FAIL; break; } } while (dwBytesRead == MAX_SEND_SIZE && m_Sent < m_Size); if (Hr == S_OK) { m_fLastUploadStatus = UploadSucceded; } free (pBuffer); return Hr; } HRESULT UploadFile::Cancel() { FireCancelEvent(); m_fLastUploadStatus = UploadFailure; return S_OK; } HRESULT UploadFile::CreateCancelEventObject() { m_hCancelEvent = CreateEvent(NULL, TRUE, FALSE, L"OCA_CancelUpload"); if (m_hCancelEvent == NULL) { return E_FAIL; } return S_OK; } BOOL UploadFile::FireCancelEvent() { if (m_hCancelEvent) { return SetEvent(m_hCancelEvent); } return FALSE; } ULONG UploadFile::GetPercentComplete() { if (m_fLastUploadStatus == UploadSucceded) { return 101; } else if (m_fLastUploadStatus == UploadFailure) { return -1; } else if (m_fLastUploadStatus == UploadNotStarted) { return 0; } else if (m_fLastUploadStatus == UploadConnecting) { return m_dwConnectPercentage; } else if (m_fLastUploadStatus == UploadTransferInProgress) { return (ULONG) ((m_Sent * 100) / m_Size); } return 0; } BOOL UploadFile::IsUploadInProgress() { if (m_fLastUploadStatus == UploadNotStarted || m_fLastUploadStatus == UploadSucceded || m_fLastUploadStatus == UploadFailure) { return FALSE; } return m_fInitialized; } BOOL UploadFile::CheckCancelRequest() { DWORD dwWait; if (m_hCancelEvent) { if ((dwWait = WaitForSingleObject(m_hCancelEvent, 1)) == WAIT_TIMEOUT) { return FALSE; } else if (dwWait == WAIT_OBJECT_0) { return TRUE; } } return FALSE; } void InetCheckTimeouts( HINTERNET hInet ) { ULONG dwConnectTimeout; ULONG dwSendTimeOut; ULONG dwSize; dwSize = sizeof(ULONG); #ifndef _USE_WINHTTP if (!InternetQueryOption(hInet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &dwSendTimeOut, &dwSize)) { dwSendTimeOut = 0; } if (!InternetQueryOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwConnectTimeout, &dwSize)) { dwConnectTimeout = 0; } if (dwSendTimeOut != 0) { dwSendTimeOut *= 4; InternetSetOption(hInet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &dwSendTimeOut, dwSize); } if (dwConnectTimeout != 0) { dwConnectTimeout *= 4; InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwConnectTimeout, dwSize); } #endif // _USE_WINHTTP } /********************************************************************************** * * Callback for WinInet APIs * **********************************************************************************/ void __stdcall InetCallback( HINTERNET hInet, DWORD dwContext, DWORD dwInetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength ) { #ifndef _USE_WINHTTP switch (dwInetStatus) { case 0: dwInetStatus = 2; break; default: break; } #endif return; } BOOL LocalCrackUrlServer( LPWSTR lpwszUrlName, DWORD dwUrlLength, DWORD Flags, LPWSTR *lpServerName ) { URL_COMPONENTSW urlComponents; BOOL bRet = FALSE; DWORD dwLastError; ZeroMemory(&urlComponents, sizeof(URL_COMPONENTSW)); urlComponents.dwStructSize = sizeof(URL_COMPONENTSW); urlComponents.lpszHostName = NULL; urlComponents.dwHostNameLength = 512; urlComponents.lpszHostName = (wchar_t*)malloc(urlComponents.dwHostNameLength ); if(!urlComponents.lpszHostName) { return FALSE; } do { ZeroMemory(urlComponents.lpszHostName, urlComponents.dwHostNameLength); #ifdef _USE_WINHTTP bRet = WinHttpCrackUrl(lpwszUrlName, dwUrlLength, 0, &urlComponents); #else bRet = InternetCrackUrlW(lpwszUrlName, dwUrlLength, 0, &urlComponents); #endif if(!bRet) { dwLastError = GetLastError(); // If last error was due to insufficient buffer size, create a new one the correct size. if(dwLastError == ERROR_INSUFFICIENT_BUFFER) { free(urlComponents.lpszHostName); urlComponents.lpszHostName = (wchar_t*)malloc(urlComponents.dwHostNameLength); if(!urlComponents.lpszHostName) { return FALSE; } } else { return FALSE; } } }while(!bRet); *lpServerName = urlComponents.lpszHostName; return TRUE; } LPWSTR UploadFile::GetServerName() { return m_wszServerName; } BOOL UploadFile::GetRedirServerName( LPWSTR OptionCode, LPWSTR ConnectUrl, LPWSTR lpwszServerName, ULONG dwServerNameLength, LPWSTR lpwszUrl, ULONG dwUrlLength ) { wchar_t ConnectString [255]; HINTERNET hInet = NULL; HINTERNET hRedirUrl = NULL; HINTERNET hConnect = NULL; wchar_t* pUploadUrl = NULL; ULONG dwUploadUrlLength; URL_COMPONENTSW urlComponents; BOOL bRet; DWORD dwLastError; LPWSTR lpszHostName = NULL; #ifdef _USE_WINHTTP if (ConnectUrl == NULL) { if (StringCbPrintfW(ConnectString, sizeof (ConnectString), L"/fwlink/?linkid=%s", OptionCode // L"908" // LIVE SITE ) != S_OK) { goto exitServerName; } hConnect = WinHttpConnect(m_hSession, L"go.microsoft.com", INTERNET_DEFAULT_HTTP_PORT, 0); if (hConnect == NULL) { goto exitServerName; } } else { hConnect = WinHttpConnect(m_hSession, m_wszServerName, INTERNET_DEFAULT_HTTP_PORT, 0); if (hConnect == NULL) { goto exitServerName; } if (StringCbCopyW(ConnectString, sizeof(ConnectString), ConnectUrl) != S_OK) { goto exitServerName; } } hRedirUrl = WinHttpOpenRequest(hConnect, L"GET", ConnectString, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); #else if (ConnectUrl == NULL) { if (StringCbPrintfW(ConnectString, sizeof (ConnectString), L"http://go.microsoft.com/fwlink/?linkid=%s", OptionCode // L"908" // LIVE SITE ) != S_OK) { goto exitServerName; } } else { if (StringCbCopyW(ConnectString, sizeof(ConnectString), ConnectUrl) != S_OK) { goto exitServerName; } } hRedirUrl = InternetOpenUrlW(m_hSession, ConnectString, NULL, 0, 0, 0); #endif if(!hRedirUrl) { goto exitServerName; } #ifdef _USE_WINHTTP bRet = WinHttpSendRequest( hRedirUrl, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); if (bRet) { bRet = WinHttpReceiveResponse(hRedirUrl, NULL); } if (!bRet) { goto exitServerName; } #endif // Get the URL returned from the MS Corporate IIS redir.dll isapi URL redirector dwUploadUrlLength = 512; pUploadUrl = (wchar_t*)malloc(dwUploadUrlLength); if(!pUploadUrl) { // ::MessageBoxW(NULL,L"Failed pUploadurl memory allocation",NULL,MB_OK); goto exitServerName; return FALSE; } do { ZeroMemory(pUploadUrl, dwUploadUrlLength); #ifdef _USE_WINHTTP bRet = WinHttpQueryOption(hRedirUrl, WINHTTP_OPTION_URL, pUploadUrl, &dwUploadUrlLength); #else bRet = InternetQueryOptionW(hRedirUrl, INTERNET_OPTION_URL, pUploadUrl, &dwUploadUrlLength); #endif if(!bRet) { dwLastError = GetLastError(); // If last error was due to insufficient buffer size, create a new one the correct size. if(dwLastError == ERROR_INSUFFICIENT_BUFFER) { if (pUploadUrl) { free(pUploadUrl); pUploadUrl = NULL; } pUploadUrl = (wchar_t*)malloc(dwUploadUrlLength); if(!pUploadUrl) { goto exitServerName; } } else { goto exitServerName; } } m_dwConnectPercentage+=10; }while(!bRet); // Strip out the host name from the URL ZeroMemory(&urlComponents, sizeof(URL_COMPONENTSW)); urlComponents.dwStructSize = sizeof(URL_COMPONENTSW); urlComponents.lpszHostName = NULL; urlComponents.dwHostNameLength = 512; urlComponents.lpszHostName = (wchar_t*)malloc(urlComponents.dwHostNameLength ); if(!urlComponents.lpszHostName) { goto exitServerName;; } do { ZeroMemory(urlComponents.lpszHostName, urlComponents.dwHostNameLength); #ifdef _USE_WINHTTP bRet = WinHttpCrackUrl(pUploadUrl, dwUploadUrlLength, 0, &urlComponents); #else bRet = InternetCrackUrlW(pUploadUrl, dwUploadUrlLength, 0, &urlComponents); #endif if(!bRet) { dwLastError = GetLastError(); // If last error was due to insufficient buffer size, create a new one the correct size. if(dwLastError == ERROR_INSUFFICIENT_BUFFER) { free(urlComponents.lpszHostName); urlComponents.lpszHostName = (wchar_t*)malloc(urlComponents.dwHostNameLength); if(!urlComponents.lpszHostName) { goto exitServerName; } } else { goto exitServerName; } } }while(!bRet); bRet = TRUE; if (lpwszServerName) { if (!_wcsicmp(OptionCode, L"908")) { if (StringCbCopyW(lpwszServerName, dwServerNameLength, L"redbgitwb10" ) != S_OK) { SetLastError(ERROR_INSUFFICIENT_BUFFER); bRet = FALSE; } } else if (StringCbCopyW(lpwszServerName, dwServerNameLength, //L"tkbgitwb15" //L"tkbgitwb16" L"redbgitwb10" //L"redbgitwb11" //L"tkbgitwb18" //L"oca.microsoft.com" //urlComponents.lpszHostName ) != S_OK) { SetLastError(ERROR_INSUFFICIENT_BUFFER); bRet = FALSE; } } if (lpwszUrl) { if (StringCbCopyW(lpwszUrl, dwUrlLength, pUploadUrl) != S_OK) { SetLastError(ERROR_INSUFFICIENT_BUFFER); bRet = FALSE; } } exitServerName: if (pUploadUrl) { free (pUploadUrl); } if (urlComponents.lpszHostName) { free (urlComponents.lpszHostName); } if (hRedirUrl) { #ifdef _USE_WINHTTP if (hConnect) WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hRedirUrl); #else InternetCloseHandle(hRedirUrl); #endif } return bRet; }