File - New - Win32 Dynamic-Link Library

A simple DLL project

File - New - C/C++ Header File with a filename of ServUDLL.h

Here is the body of ServUDLL.h
// Serv-U event definitions
// a copy of the list found in the Serv-U manual
#define EVNT_None 0 // none
#define EVNT_IPName 1 // symbolic IP name available
#define EVNT_Connect 2 // connection was made
#define EVNT_Close 3 // closed connection
#define EVNT_BouncedIP 4 // bounced client because of IP address
#define EVNT_TooMany 5 // bounced user because there are too many
#define EVNT_WrongPass 6 // too many times wrong password
#define EVNT_TimeOut 7 // connection timed out
#define EVNT_Login 8 // use logged in
#define EVNT_StartUp 9 // start upload of file
#define EVNT_EndUp 10 // successfull upload of file
#define EVNT_StartDown 11 // start of download of file
#define EVNT_EndDown 12 // successfull download of file
#define EVNT_AbortUp 13 // aborted upload
#define EVNT_AbortDown 14 // aborted download
#define EVNT_Rename 15 // renamed file/dir
#define EVNT_DelFile 16 // deleted file
#define EVNT_DelDir 17 // deleted dir
#define EVNT_ChgDir 18 // changed working directory
#define EVNT_MakeDir 19 // created directory
// Serv-U event hook definitions
#define EVNT_HookDown 100 // hook for file downloads
#define EVNT_HookUp 101 // hook for file uploads
#define EVNT_HookAppend 102 // hook for append file upload
#define EVNT_HookUnique 103 // hook for unique name upload
#define EVNT_HookRename 104 // hook for rename file/dir
#define EVNT_HookDelFile 105 // hook for delete file
#define EVNT_HookDelDir 106 // hook for delete dir
#define EVNT_HookMkd 107 // hook for make directory
#define EVNT_HookRmd 108 // hook for remove directory
// Serv-U sub-event codes
#define SEVNT_None 0 // no sub-event
#define SEVNT_ErrWrite 1 // problem writing to disk
#define SEVNT_ErrRead 2 // problem reading from disk
#define SEVNT_ErrQuota 3 // insufficient disk quota
#define SEVNT_ErrTOut 4 // packet timed out
#define SEVNT_ErrAbort 5 // user aborted transfer
#define SEVNT_ErrUnknown 6 // unknown error
#define SEVNT_ErrClose 7 // data connection closed unexpectedly
// return codes for hooks
#define REVNT_None 0 // nothing
#define REVNT_Proceed 1 // let event pass
#define REVNT_Abort 2 // stop event
#define REVNT_Suspend 3 // suspend event until decision is made
// event information structure for communications with DLL's
struct RFTPEventStr {
// event info
DWORD Event; // event type
DWORD SubEvent; // sub-event type
// user info
DWORD SessionID; // unique ID of the FTP session
char User[40]; // user name
char ClientIP[16]; // IP number of client
char LocalIP[16]; // IP number the client connected to
// event attributes
DWORD Duration; // duration of events
DWORD Size; // size of object (ie. file)
// hook info
HWND hWindow; // window handle to post decision to
UINT Message; // message to post
char* pReplyText; // pointer to text to send to user
// scratch pad area
char AuxOne[512]; // auxiliary area one
char AuxTwo[512]; // auxiliary area two
};
#define SRVU_LoginMesFile 1 // get login message file
#define SRVU_HomeDir 2 // get home dir
#define SRVU_Password 3 // verify password
#define SRVU_IPAccess 4 // verify IP access
#define SRVU_WriteFile 5 // verify write access
#define SRVU_ReadFile 6 // verify read access
#define SRVU_ModifyFile 7 // verify mod./del. file access
#define SRVU_ExecProg 8 // verify execute access
#define SRVU_ListDir 9 // verify dir listing access
#define SRVU_ChangeDir 10 // verify dir change access
#define SRVU_DeleteDir 11 // verify dir delete access
#define SRVU_CreateDir 12 // verify dir create access
#define SRVU_HideHidden 13 // get setting for 'hide hidden files'
#define SRVU_RelPaths 14 // get setting for 'relative paths'
#define SRVU_RatioType 15 // get setting for type of ratios
#define SRVU_RatioDown 16 // get setting for download ratio
#define SRVU_RatioUp 17 // get setting for upload ratio
#define SRVU_RatioCredit 18 // get/adjust ratio credit setting
#define SRVU_RatioFree 19 // verify if file is free for ratios
#define SRVU_QuotaEnable 20 // verify if disk quota is enabled
#define SRVU_QuotaChange 21 // change in disk quota
#define SRVU_QuotaMax 22 // maximum disk quota
#define SRVU_AlwaysLogin 23 // always allow login
#define SRVU_OneLoginPerIP 24 // allow one login per user/IP pair
#define SRVU_LogClientIP 25 // log client from this IP address
#define SRVU_SpeedLimit 26 // maximum transfer speed
#define SRVU_PassChange 27 // change user's password
#define SRVU_TimeOut 28 // get user time-out value
#define SRVU_MaxUsers 29 // max. no. of users for account
#define SRVU_PassChallenge 30 // get password challenge if needed
#define SRVU_Connect 31 // information only: client connected
#define SRVU_Close 32 // information only: client disconnected
#define SRVU_MaxLoginPerIP 33 // max. no. of logins from same IP for user
#define SRVU_VerifyPasswd 34 // verify old password before changing it
#define SRVU_AppendFile 35 // verify append file access
#define SRVU_SignOnMes 36 // get signon message file
#define SRVU_SignOffMes 37 // get signoff message file
#define SRVU_Maintenance 39 // switch to maintenance mode
struct RClientEventStr {
int Event; // event code
int Flag; // flag, meaning depends on event
char User[40]; // user name
char Aux[512]; // auxiliary area, usage depends on event
char HostIP[16]; // server IP home
unsigned long SessionID; // unique session ID
};
// If not using MFC
// exported functions declaration header
#define EXPORT extern "C" __declspec (dllexport)
// End If not using MFC
// function definitions
EXPORT WORD CALLBACK HandleEventHook(RFTPEventStr* pEventStruc);
EXPORT int HandleClientEvent(RClientEventStr* pEventStruc);
File - New - Text File [ProjectName].def
Here is the body of [ProjectName].def
; [ProjectName].def : Declares the module parameters for the DLL. LIBRARY "[ProjectName]" DESCRIPTION '[ProjectName] Windows Dynamic Link Library' EXPORTS HandleEventHook @1 HandleClientEvent @2
#include "ServUDLL.h"
and
WORD CALLBACK HandleEventHook(RFTPEventStr* pEventStruc)
{
WORD Ret=REVNT_Proceed; // return value, default is to allow operation
char* pName=NULL; // pointer to path/file name being uploaded/renamed
// disect event
switch (pEventStruc->Event)
{
// case EVNT_HookDown: // hook for file downloads
// case EVNT_HookUp: // hook for file uploads
// case EVNT_HookAppend: // hook for append file upload
// case EVNT_HookUnique: // hook for unique name upload
// case EVNT_HookRename: // hook for rename file/dir
// case EVNT_HookDelFile: // hook for delete file
// case EVNT_HookDelDir: // hook for delete dir
// case EVNT_HookMkd: // hook for make directory
// case EVNT_HookRmd: // hook for remove directory
case EVNT_StartUp: // start upload of file
::MessageBox(NULL, pEventStruc->AuxOne, "Start Upload", MB_OK);
break;
case EVNT_AbortUp: // aborted upload
::MessageBox(NULL, pEventStruc->AuxOne, "Abort Upload", MB_OK);
break;
case EVNT_EndUp: // successful upload of file
::MessageBox(NULL, pEventStruc->AuxOne, "End Upload", MB_OK);
break;
case EVNT_StartDown: // start of download of file
::MessageBox(NULL, pEventStruc->AuxOne, "Start Download", MB_OK);
break;
case EVNT_AbortDown: // aborted download
::MessageBox(NULL, pEventStruc->AuxOne, "Abort Download", MB_OK);
break;
case EVNT_EndDown: // successful download of file
::MessageBox(NULL, pEventStruc->AuxOne, "End Download", MB_OK);
break;
}
return(Ret);
}
and
int HandleClientEvent(RClientEventStr* pEventStruc)
{
int Ret = 0; // 0 not handled - 1 handled
// disect event
switch (pEventStruc->Event)
{
// case SRVU_LoginMesFile: // get login message file
// case SRVU_HomeDir: // get home dir
// case SRVU_Password: // verify password
// case SRVU_IPAccess: // verify IP access
// case SRVU_WriteFile: // verify write access
// case SRVU_ReadFile: // verify read access
// case SRVU_ModifyFile: // verify mod./del. file access
// case SRVU_ExecProg: // verify execute access
// case SRVU_ListDir: // verify dir listing access
// case SRVU_ChangeDir: // verify dir change access
// case SRVU_DeleteDir: // verify dir delete access
// case SRVU_CreateDir: // verify dir create access
// case SRVU_HideHidden: // get setting for 'hide hidden files'
// case SRVU_RelPaths: // get setting for 'relative paths'
// case SRVU_RatioType: // get setting for type of ratios
// case SRVU_RatioDown: // get setting for download ratio
// case SRVU_RatioUp: // get setting for upload ratio
// case SRVU_RatioCredit: // get/adjust ratio credit setting
// case SRVU_RatioFree: // verify if file is free for ratios
// case SRVU_QuotaEnable: // verify if disk quota is enabled
// case SRVU_QuotaChange: // change in disk quota
// case SRVU_QuotaMax: // maximum disk quota
// case SRVU_AlwaysLogin: // always allow login
// case SRVU_OneLoginPerIP: // allow one login per user/IP pair
// case SRVU_LogClientIP: // log client from this IP address
// case SRVU_SpeedLimit: // maximum transfer speed
// case SRVU_PassChange: // change user's password
// case SRVU_TimeOut: // get user time-out value
// case SRVU_MaxUsers: // max. no. of users for account
// case SRVU_PassChallenge: // get password challenge if needed
// case SRVU_Connect: // information only: client connected
// case SRVU_Close: // information only: client disconnected
// case SRVU_MaxLoginPerIP: // max. no. of logins from same IP for user
// case SRVU_VerifyPasswd: // verify old password before changing it
// case SRVU_AppendFile: // verify append file access
// case SRVU_SignOnMes: // get signon message file
// case SRVU_SignOffMes: // get signoff message file
// case SRVU_Maintenance: // switch to maintenance mode
}
return(Ret);
}
from
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
to
extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
Project - Settings - All Configurations
Preprocessor definitions set to:
WIN32,_WINDOWS,_WINDLL,_MBCS

// Insert your headers here #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h>
with
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT

//#define EXPORT extern "C" __declspec (dllexport)