Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

210 lines
3.5 KiB

//
// Copyright (C) 2001 Microsoft Corp
//
// FtpControl.cpp
//
// Sanjiv
// JPDup
//
#pragma once
class CFtpControlConnection;
//#include "PreComp.h" // Theis FtpControl.h file get included by MyAlg.h that is used in the ALG.exe build
// so we can't use this precompile file
#include "buffer.h"
#include "list.h"
#define FTP_MAX_MSG_SIZE 1024
typedef enum _READ_TYPE
{
CLIENT_READ = 0x1,
SERVER_READ = 0x2
} READ_TYPE;
typedef enum _CONNECTION_TYPE
{
INCOMING = 0x1,
OUTGOING = 0x2
}CONNECTION_TYPE;
extern CControlObjectList g_ControlObjectList;
#define ERROR_IO_CANCELLED 0xC0000120
#define DATA_CREATION_TIMEO 1000
#define ADD_STR_SIZE 23
class CControlState
{
public:
ULONG m_nAddressNew;
ULONG m_nAddressOld;
USHORT m_nPortNew;
USHORT m_nPortOld;
UCHAR m_szAddressPortNew[ADD_STR_SIZE];
ULONG m_nAddressLenNew;
};
//
//
// Main class that controls the FTP
//
//
class CFtpControlConnection
{
public:
// Constructor(s)
CFtpControlConnection();
// Destruction
~CFtpControlConnection();
//
// Properties
//
SOCKET m_ClientConnectedSocket;
SOCKET m_AlgConnectedSocket;
USHORT m_nSourcePortReplacement;
private:
IPendingProxyConnection* m_pPendingProxy;
CONNECTION_TYPE m_ConnectionType;
CControlState m_ControlState;
volatile LONG m_RefCount;
CDataChannelList m_DataChannelList;
//
// Methods
//
private:
//
void
ProcessFtpMessage(
UCHAR* Buffer,
ULONG* pBytes
);
//
HRESULT
CreateNewAddress(void);
//
HRESULT
SetupDataRedirect(void);
public:
//
ULONG
IncReference();
//
ULONG
DecReference();
//
void
Shutdown();
//
HRESULT
Init(
SOCKET AcceptedSocket,
ULONG ToAddr,
USHORT ToPort,
CONNECTION_TYPE ConnType
);
//
void
DataChannelDeletion(
BOOLEAN TimerOrWait,
PVOID Context
);
//
void
DataChannelCreation(
BOOLEAN TimerOrWait,
PVOID Context
);
//
void
ConnectCompletionRoutine(
ULONG ErrCode,
ULONG BytesTransferred
);
//
void
ReadCompletionRoutine(
ULONG ErrCode,
ULONG BytesTransferred,
PNH_BUFFER Bufferp
);
//
void
WriteCompletionRoutine(
ULONG ErrCode,
ULONG BytesTransferred,
PNH_BUFFER Bufferp
);
};
void
DataChannelCreationCallback(
BOOLEAN TimerOrWait,PVOID Context,PVOID Context2
);
void
DataChannelDeletionCallback(
BOOLEAN TimerOrWait,PVOID Context,PVOID Context2
);
void
MyAcceptCompletion(
ULONG ErrCode,
ULONG BytesTransferred,
PNH_BUFFER Bufferp);
void
MyConnectCompletion(ULONG ErrCode,
ULONG BytesTransferred,
PNH_BUFFER Bufferp);
void
MyReadCompletion(ULONG ErrCode,
ULONG BytesTransferred,
PNH_BUFFER Bufferp);
void
MyWriteCompletion(ULONG ErrCode,
ULONG BytesTransferred,
PNH_BUFFER Bufferp);