119 lines
3.1 KiB
C
119 lines
3.1 KiB
C
/*++
|
|
Copyright (c) 2002 - 2006 Microsoft Corporation. All Rights Reserved.
|
|
|
|
THIS CODE AND INFORMATION IS PROVIDED "AS-IS" WITHOUT WARRANTY OF
|
|
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
PARTICULAR PURPOSE.
|
|
|
|
THIS CODE IS NOT SUPPORTED BY MICROSOFT.
|
|
|
|
--*/
|
|
|
|
#define BUFFER_LEN 4096
|
|
#define ERR_MSG_LEN 512
|
|
#define BUFSIZE 65536
|
|
|
|
#define GET 1
|
|
#define POST 2
|
|
|
|
#define GET_REQ 1
|
|
#define POST_REQ 2
|
|
#define POST_RES 3
|
|
#define DEFAULT_TIMEOUT 2 * 60 * 1000 //two minutes
|
|
|
|
#define INVALID_DOWNLOAD_VALUE (DWORD)-1
|
|
|
|
#define STATUS_SUCCESS 0
|
|
#define STATUS_FAILURE 1
|
|
|
|
#define STRUCT_TYPE_MAIN_CONTEXT 1
|
|
#define STRUCT_TYPE_APP_CONTEXT 2
|
|
|
|
//Pointer to RtlNtStatusToDosError
|
|
typedef ULONG ( NTAPI * PRtlNtStatusToDosError) (
|
|
IN NTSTATUS Status );
|
|
|
|
//Structure containing the Session and Connect handles
|
|
typedef struct _MAIN_CONTEXT
|
|
{
|
|
DWORD dwStructType;
|
|
HINTERNET hSession;
|
|
HINTERNET hConnect;
|
|
} MAIN_CONTEXT;
|
|
|
|
//Structure used for storing the context for the asynchronous calls
|
|
//it contains the request handle and a pointer to a structure
|
|
//Containing the Session and connect handle.
|
|
//This allows having only one connection to the server and create multiple
|
|
//request handles using that connection.
|
|
typedef struct _APP_CONTEXT
|
|
{
|
|
DWORD dwStructType;
|
|
MAIN_CONTEXT* mainContext;
|
|
HINTERNET hRequest;
|
|
HANDLE hEvent;
|
|
LPSTR pszOutBuffer;
|
|
DWORD dwDownloaded ;
|
|
DWORD dwRead;
|
|
DWORD dwWritten;
|
|
DWORD dwReadOffset;
|
|
DWORD dwWriteOffset;
|
|
HANDLE hFile;
|
|
HANDLE hRes;
|
|
DWORD dwState;
|
|
LONG lPendingWrites;
|
|
BOOL bReceiveDone;
|
|
CRITICAL_SECTION crSection;
|
|
} APP_CONTEXT;
|
|
|
|
//Structure to be used in the Asynchronous IO operations
|
|
typedef struct
|
|
{
|
|
OVERLAPPED lpo;
|
|
APP_CONTEXT *aContext;
|
|
char buffer[BUFFER_LEN];
|
|
}IO_BUF;
|
|
|
|
//WinInet Callback function
|
|
VOID CALLBACK CallBack( HINTERNET,
|
|
__in DWORD_PTR,
|
|
DWORD,
|
|
__in_bcount(dwStatusInformationLength)LPVOID,
|
|
DWORD dwStatusInformationLength);
|
|
|
|
//File IO related functions
|
|
DWORD DoReadFile(__in APP_CONTEXT*);
|
|
DWORD DoCompleteReadFile(__in APP_CONTEXT* );
|
|
VOID CALLBACK WriteFileCallBack(DWORD ,
|
|
DWORD ,
|
|
__in LPOVERLAPPED);
|
|
VOID CALLBACK ReadFileCallBack(DWORD ,
|
|
DWORD ,
|
|
__in LPOVERLAPPED);
|
|
|
|
//Network IO related functions
|
|
VOID DoInternetWrite(__in APP_CONTEXT*);
|
|
VOID DoInternetRead(__in APP_CONTEXT*);
|
|
|
|
//Initialization functions
|
|
VOID InitMainContext(__inout MAIN_CONTEXT*);
|
|
VOID InitRequestContext(__in MAIN_CONTEXT*,
|
|
__inout APP_CONTEXT*);
|
|
|
|
//Cleanup function
|
|
VOID CleanUp(__in APP_CONTEXT*);
|
|
|
|
//Utility functions
|
|
VOID OpenFiles(__inout APP_CONTEXT*);
|
|
VOID ParseArguments(int argc,
|
|
__in_ecount(argc) LPWSTR *);
|
|
VOID ShowUsage(VOID);
|
|
VOID LogInetError(DWORD,
|
|
__in LPCWSTR);
|
|
VOID LogSysError(DWORD,
|
|
__in LPCWSTR);
|
|
VOID *Malloc(size_t);
|
|
VOID Free(__in VOID*);
|
|
DWORD SetFunctionEntryPoint();
|