📄 processcommand.cpp
字号:
strcpy(pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath,strNewPath);
return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"250 Directory changed to %s.\r\n",strNewPath);
}
else
{
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 %s: No such file or Directory.\r\n",strNewPath);
}
return false;
}
bool ProcessSizeCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char strFileName[128];
strcpy(strFileName,&(pPerIOData->cBuffer.buf[5]));
FormatString (strFileName);
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,strFileName);
HANDLE hQueryFile=CreateFile(strFilePathName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hQueryFile==INVALID_HANDLE_VALUE)
{
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 %s: No such file or Directory.\r\n",strFilePathName);
}
else
{
DWORD dwFileSizeHigh;
return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"213 %d Bytes\r\n",GetFileSize(hQueryFile,&dwFileSizeHigh));
}
return false;
}
bool ProcessRetrCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char strFileName[128];
strcpy(strFileName,&(pPerIOData->cBuffer.buf[5]));
FormatString (strFileName);
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,strFileName);
// printf("DEBUG :FILE Name :%s \r\n",strFilePathName);
HANDLE hSendFile=CreateFile(strFilePathName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hSendFile==INVALID_HANDLE_VALUE)
{
printf("DEBUG :Open File Error %d\r\n",GetLastError ());
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 %s: No such file or Directory.\r\n",strFilePathName);
CloseDataSocket(pPerHandleData);
return false;
}
TRANSMIT_PACKETS_ELEMENT cTransmitData;
DWORD dwFileSizeHigh=0;
cTransmitData.cLength=GetFileSize(hSendFile,&dwFileSizeHigh)-pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition;
cTransmitData.hFile=hSendFile;
if(pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition!=0)
{
if(SetFilePointer(hSendFile,pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition,NULL,FILE_BEGIN)== INVALID_SET_FILE_POINTER)
{
printf("DEBUG :SetFilePointer Error %d\r\n",GetLastError ());
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 Permission denied.\r\n");
CloseDataSocket(pPerHandleData);
return false;
}
}/**/
pPerHandleData->uHandleInfo.cCtrlInfo.hCurrentFileHandle=hSendFile;
cTransmitData.dwElFlags=TP_ELEMENT_FILE;
memset(pPerIOData,0,sizeof(PER_IO_OPERATION_DATA));
pPerIOData->cBuffer.buf=pPerIOData->stBuffer;
pPerIOData->IoType=ControlIoSend;
pPerIOData->uIoInfo.cControlIoSendInfo.enNextToDo=ToSendData;
memcpy(pPerIOData->uIoInfo.cControlIoSendInfo.bWhatToDo,&cTransmitData,sizeof(cTransmitData));
DWORD dwNumberOfDataSended=0;
if(pPerHandleData->uHandleInfo.cCtrlInfo.bBePasv)
{
sprintf(pPerIOData->stBuffer,"150 Opening ASCII mode data connection for /bin/ls.\r\n");
}
else
{
sprintf(pPerIOData->stBuffer,"125 Data connection already open; Transfer starting.\r\n");
}
pPerIOData->cBuffer.len=(DWORD)strlen(pPerIOData->cBuffer.buf);
pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength=0;
if(WSASend(pPerHandleData->Socket,&(pPerIOData->cBuffer),1,&(dwNumberOfDataSended),0,&(pPerIOData->Overlapped),NULL) ==SOCKET_ERROR )
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSASend() fialed with error %d\n",WSAGetLastError());
return false;
}
}
return true;
}
bool ProcessStorCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char strFileName[128];
strcpy(strFileName,&(pPerIOData->cBuffer.buf[5]));
FormatString (strFileName);
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,strFileName);
HANDLE hRecvFile=INVALID_HANDLE_VALUE;
if(pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition!=0)
{
hRecvFile=CreateFile(strFilePathName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
}
else
{
hRecvFile=CreateFile(strFilePathName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
}
if(hRecvFile==INVALID_HANDLE_VALUE)
{
printf("DEBUG :Open File Error %d\r\n",GetLastError ());
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 Permission denied.\r\n");
CloseDataSocket(pPerHandleData);
return false;
}
else
{
if(pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition!=0)
{
DWORD dwFileSizeHigh=0;
printf("DEBUG: Reset to %d\r\n",pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition);
if(SetFilePointer(hRecvFile,NULL,NULL,FILE_END)== INVALID_SET_FILE_POINTER)
{
printf("DEBUG :SetFilePointer Error %d\r\n",GetLastError ());
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 Permission denied.\r\n");
CloseDataSocket(pPerHandleData);
return false;
}
}
pPerHandleData->uHandleInfo.cCtrlInfo.hCurrentFileHandle=hRecvFile;
TRANSMIT_PACKETS_ELEMENT cTransmitData;
cTransmitData.dwElFlags=TP_ELEMENT_FILE;
DWORD dwFileSizeHigh=0;
cTransmitData.cLength=0;
cTransmitData.hFile=hRecvFile;
memset(pPerIOData,0,sizeof(PER_IO_OPERATION_DATA));
pPerIOData->cBuffer.buf=pPerIOData->stBuffer;
pPerIOData->IoType=ControlIoSend;
pPerIOData->uIoInfo.cControlIoSendInfo.enNextToDo=ToReceiveData;
memcpy(pPerIOData->uIoInfo.cControlIoSendInfo.bWhatToDo,&cTransmitData,sizeof(cTransmitData));
DWORD dwNumberOfDataSended=0;
sprintf(pPerIOData->stBuffer,"150 Opening BINARY mode data connection for %s.\r\n",strFileName);
pPerIOData->cBuffer.len=(DWORD)strlen(pPerIOData->cBuffer.buf);
pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength=0;
if(WSASend(pPerHandleData->Socket,&(pPerIOData->cBuffer),1,&(dwNumberOfDataSended),0,&(pPerIOData->Overlapped),NULL) ==SOCKET_ERROR )
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSASend() fialed with error %d\n",WSAGetLastError());
return false;
}
}
}
return true;
}
bool ProcessAppeCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char strFileName[128];
strcpy(strFileName,&(pPerIOData->cBuffer.buf[5]));
FormatString (strFileName);
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,strFileName);
HANDLE hRecvFile=CreateFile(strFilePathName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hRecvFile==INVALID_HANDLE_VALUE)
{
printf("DEBUG :Open File Error %d\r\n",GetLastError ());
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 Permission denied.\r\n");
CloseDataSocket(pPerHandleData);
return false;
}
else
{
if(pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition!=0)
{
DWORD dwFileSizeHigh=0;
printf("DEBUG: Reset to %d\r\n",pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition);
if(SetFilePointer(hRecvFile,NULL,NULL,FILE_END)== INVALID_SET_FILE_POINTER)
{
printf("DEBUG :SetFilePointer Error %d\r\n",GetLastError ());
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"550 Permission denied.\r\n");
CloseDataSocket(pPerHandleData);
return false;
}
}
pPerHandleData->uHandleInfo.cCtrlInfo.hCurrentFileHandle=hRecvFile;
TRANSMIT_PACKETS_ELEMENT cTransmitData;
cTransmitData.dwElFlags=TP_ELEMENT_FILE;
DWORD dwFileSizeHigh=0;
cTransmitData.cLength=0;
cTransmitData.hFile=hRecvFile;
memset(pPerIOData,0,sizeof(PER_IO_OPERATION_DATA));
pPerIOData->cBuffer.buf=pPerIOData->stBuffer;
pPerIOData->IoType=ControlIoSend;
pPerIOData->uIoInfo.cControlIoSendInfo.enNextToDo=ToReceiveData;
memcpy(pPerIOData->uIoInfo.cControlIoSendInfo.bWhatToDo,&cTransmitData,sizeof(cTransmitData));
DWORD dwNumberOfDataSended=0;
sprintf(pPerIOData->stBuffer,"150 Opening BINARY mode data connection for %s.\r\n",strFileName);
pPerIOData->cBuffer.len=(DWORD)strlen(pPerIOData->cBuffer.buf);
pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength=0;
if(WSASend(pPerHandleData->Socket,&(pPerIOData->cBuffer),1,&(dwNumberOfDataSended),0,&(pPerIOData->Overlapped),NULL) ==SOCKET_ERROR )
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSASend() fialed with error %d\n",WSAGetLastError());
return false;
}
}
}
return true;
}
bool ProcessMkdCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char srtNewFolderName[256];
FormatString(srtNewFolderName);
strcpy(srtNewFolderName,&(pPerIOData->cBuffer.buf[4]));
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,srtNewFolderName);
FormatString(strFilePathName);
if(mkdir(strFilePathName)==0)
{
return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"257 \"%s\" directory created.\r\n",strFilePathName);
}
else
{
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"502 Command not implemented.\r\n");
printf("Mkdir Error %d \r\n",GetLastError());
}
return false;
}
bool ProcessRmdCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char srtNewFolderName[256];
FormatString(srtNewFolderName);
strcpy(srtNewFolderName,&(pPerIOData->cBuffer.buf[4]));
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,srtNewFolderName);
FormatString(strFilePathName);
if(rmdir(strFilePathName)==0)
{
return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"250 RMD command successful.\r\n");
}
else
{
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"502 Command not implemented.\r\n");
printf("rmdir Error %d \r\n",GetLastError());
}
return false;
}
bool ProcessDeleCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
char strFileName[128];
strcpy(strFileName,&(pPerIOData->cBuffer.buf[5]));
FormatString (strFileName);
char strFilePathName[1024];
strcpy(strFilePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
FormatString(strFilePathName);
if(strFilePathName[strlen(strFilePathName)-1]!='\\')
{
strcat(strFilePathName,"\\");
}
strcat(strFilePathName,strFileName);
if(DeleteFile(strFilePathName)!=0)
{
return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"250 DELE command successful.\r\n");
}
else
{
ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"502 Command not implemented.\r\n");
printf("DeleteFile Error %d \r\n",GetLastError());
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -