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.
334 lines
6.2 KiB
334 lines
6.2 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
session.h
|
|
|
|
Abstract:
|
|
|
|
Structures, prototypes for session.c
|
|
|
|
Author:
|
|
|
|
Heath Hunnicutt (t-hheath) 21-Jun-1994
|
|
|
|
Revision History:
|
|
|
|
21-Jun-1994 t-heathh
|
|
Created
|
|
|
|
--*/
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
//
|
|
// manifests
|
|
//
|
|
|
|
#define FTP_SESSION_SIGNATURE 0x53707446 // "FtpS" (when viewed via db/dc)
|
|
|
|
//
|
|
// macros
|
|
//
|
|
|
|
#if INET_DEBUG
|
|
|
|
#define SetSessionSignature(lpSessionInfo) \
|
|
(lpSessionInfo)->Signature = FTP_SESSION_SIGNATURE
|
|
|
|
#else
|
|
|
|
#define SetSessionSignature(lpSessionInfo)
|
|
|
|
#endif
|
|
|
|
#define SetSessionLastResponseCode(pSession, prc) \
|
|
CopyMemory(&((pSession)->rcResponseOpenFile), (prc), sizeof(FTP_RESPONSE_CODE))
|
|
|
|
#define GetSessionLastResponseCode(pSession, prc) \
|
|
CopyMemory((prc), &((pSession)->rcResponseOpenFile), sizeof(FTP_RESPONSE_CODE))
|
|
|
|
#define IsPassiveModeSession(lpSessionInfo) \
|
|
(((lpSessionInfo)->Flags & FFTP_PASSIVE_MODE) ? TRUE : FALSE)
|
|
|
|
//
|
|
// types
|
|
//
|
|
|
|
typedef enum {
|
|
FTP_SERVER_TYPE_UNKNOWN = 0,
|
|
FTP_SERVER_TYPE_NT = 1,
|
|
FTP_SERVER_TYPE_UNIX = 2
|
|
} FTP_SERVER_TYPE;
|
|
|
|
//
|
|
// FTP_SESSION_INFO - describes an FTP server and our connection to it
|
|
//
|
|
|
|
typedef struct {
|
|
|
|
//
|
|
// List - SESSION_INFOs are maintained on double-linked list
|
|
//
|
|
|
|
LIST_ENTRY List;
|
|
|
|
//
|
|
// Host - name of the server we are connected to. We only need this for
|
|
// diagnositic purposes - e.g. knowing which server to talk to to
|
|
// reproduce a problem
|
|
//
|
|
|
|
LPSTR Host;
|
|
|
|
//
|
|
// Port - the port at which the FTP server listens
|
|
//
|
|
|
|
INTERNET_PORT Port;
|
|
|
|
//
|
|
// socketListener - listening socket
|
|
//
|
|
|
|
ICSocket *socketListener;
|
|
|
|
|
|
//
|
|
// socketControl - control connection socket
|
|
//
|
|
|
|
ICSocket *socketControl;
|
|
|
|
//
|
|
// socketData - data connection socket
|
|
//
|
|
|
|
ICSocket *socketData;
|
|
|
|
//
|
|
// ServerType - type of FTP server, e.g. NT or *nix
|
|
//
|
|
|
|
FTP_SERVER_TYPE ServerType;
|
|
|
|
//
|
|
// Handle - internally identifies this FTP session
|
|
//
|
|
|
|
HANDLE Handle;
|
|
|
|
//
|
|
// Flags - bitmask of various flags - see below
|
|
//
|
|
|
|
DWORD Flags;
|
|
|
|
//
|
|
// ReferenceCount - keeps object alive whilst we are not holding
|
|
// CriticalSection
|
|
//
|
|
|
|
LONG ReferenceCount;
|
|
|
|
//
|
|
// dwTransferAccess - Indicates, for an ongoing transfer, whether the
|
|
// transfer was begun with GENERIC_READ or GENERIC_WRITE access.
|
|
//
|
|
// {dwTransferAccess} = {GENERIC_READ, GENERIC_WRITE}
|
|
//
|
|
|
|
DWORD dwTransferAccess;
|
|
|
|
//
|
|
// rcResponseOpenFile - The response code sent back when a data connection
|
|
// was opened, either by FtpOpenFile or FtpCommand.
|
|
//
|
|
// Used by FtpCloseFile to determine whether the completion
|
|
// code was already received.
|
|
//
|
|
|
|
FTP_RESPONSE_CODE rcResponseOpenFile;
|
|
|
|
//
|
|
// FindFileList - A linked-list of WIN32_FIND_DATA structures, formed by a
|
|
// call to FtpFindFirstFile, used by FtpFindNextFile and
|
|
// FtpFindClose.
|
|
//
|
|
|
|
LIST_ENTRY FindFileList;
|
|
|
|
//
|
|
// CriticalSection - Synchronize access to this structure's contents
|
|
//
|
|
|
|
CRITICAL_SECTION CriticalSection;
|
|
|
|
//
|
|
// dwFileSizeLow - Size of the file found on the FTP server, should be gotten
|
|
// from response data on openning a data connection
|
|
//
|
|
|
|
DWORD dwFileSizeLow;
|
|
DWORD dwFileSizeHigh;
|
|
|
|
#if INET_DEBUG
|
|
|
|
//
|
|
// Signature - to help us know this is what its supposed to be in debug build
|
|
//
|
|
|
|
DWORD Signature;
|
|
|
|
#endif
|
|
|
|
} FTP_SESSION_INFO, *LPFTP_SESSION_INFO;
|
|
|
|
//
|
|
// Flags defines
|
|
//
|
|
|
|
//
|
|
// FFTP_PASSIVE_MODE - set if the session uses passive mode data connections
|
|
//
|
|
|
|
#define FFTP_PASSIVE_MODE 0x00000001
|
|
|
|
//
|
|
// FFTP_ABORT_TRANSFER - set if we have not completed a file transfer on this
|
|
// (data) connection, and therefore need to send an ABOR command when we close
|
|
// the connection
|
|
//
|
|
|
|
#define FFTP_ABORT_TRANSFER 0x00000002
|
|
|
|
//
|
|
// FFTP_FIND_ACTIVE - set when a directory listing is active on this session
|
|
//
|
|
|
|
#define FFTP_FIND_ACTIVE 0x00000004
|
|
|
|
//
|
|
// FFTP_IN_DESTRUCTOR - set when this session is being terminated
|
|
//
|
|
|
|
#define FFTP_IN_DESTRUCTOR 0x00000008
|
|
|
|
//
|
|
// FFTP_EOF - set when we have reached the end of a (receive) data connection
|
|
//
|
|
|
|
#define FFTP_EOF 0x00000010
|
|
|
|
//
|
|
// FFTP_FILE_ACTIVE - set when a file is open on this session
|
|
//
|
|
|
|
#define FFTP_FILE_ACTIVE 0x00000020
|
|
|
|
//
|
|
// FFTP_KNOWN_FILE_SIZE - set when we know the size of the file we're downloading
|
|
//
|
|
|
|
#define FFTP_KNOWN_FILE_SIZE 0x00000040
|
|
|
|
//
|
|
// prototypes
|
|
//
|
|
|
|
VOID
|
|
CleanupFtpSessions(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateFtpSession(
|
|
IN LPFTP_SESSION_INFO SessionInfo
|
|
);
|
|
|
|
VOID
|
|
DereferenceFtpSession(
|
|
IN LPFTP_SESSION_INFO SessionInfo
|
|
);
|
|
|
|
DWORD
|
|
CreateFtpSession(
|
|
IN LPSTR lpszHost,
|
|
IN INTERNET_PORT Port,
|
|
IN DWORD dwFlags,
|
|
OUT LPFTP_SESSION_INFO* lpSessionInfo
|
|
);
|
|
|
|
BOOL
|
|
FindFtpSession(
|
|
IN HANDLE Handle,
|
|
OUT LPFTP_SESSION_INFO* lpSessionInfo
|
|
);
|
|
|
|
#if INET_DEBUG
|
|
|
|
VOID
|
|
FtpSessionInitialize(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
FtpSessionTerminate(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
AcquireFtpSessionList(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
ReleaseFtpSessionList(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
AcquireFtpSessionLock(
|
|
IN LPFTP_SESSION_INFO SessionInfo
|
|
);
|
|
|
|
VOID
|
|
ReleaseFtpSessionLock(
|
|
IN LPFTP_SESSION_INFO SessionInfo
|
|
);
|
|
|
|
#else
|
|
|
|
//
|
|
// one-line functions replaced by macros in retail version
|
|
//
|
|
|
|
extern SERIALIZED_LIST FtpSessionList;
|
|
|
|
#define FtpSessionInitialize() \
|
|
InitializeSerializedList(&FtpSessionList)
|
|
|
|
#define FtpSessionTerminate() \
|
|
TerminateSerializedList(&FtpSessionList)
|
|
|
|
#define AcquireFtpSessionList() \
|
|
LockSerializedList(&FtpSessionList)
|
|
|
|
#define ReleaseFtpSessionList() \
|
|
UnlockSerializedList(&FtpSessionList)
|
|
|
|
#define AcquireFtpSessionLock(lpSessionInfo) \
|
|
EnterCriticalSection(&lpSessionInfo->CriticalSection)
|
|
|
|
#define ReleaseFtpSessionLock(lpSessionInfo) \
|
|
LeaveCriticalSection(&lpSessionInfo->CriticalSection)
|
|
|
|
#endif // INET_DEBUG
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|