2025-11-28 00:35:46 +09:00

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();