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

📄 publicfunctionunit.pas

📁 delphi源代码。iocp远控比较完整的代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  begin
    if op^.ptrBuffer <> nil then
      Dispose(op^.ptrBuffer);
    Dispose(op);
    op := nil;
  end;
end; 

//重置单I/O数据内存
procedure InitIoContext(ovlap_prt : PPerHandleData; const BufLen : integer = MAX_BUFSIZE);
begin
  //重置重叠结构
  ZeroMemory(@ovlap_prt^.Overlapped, sizeof(OVERLAPPED));
  //清空数据缓冲区
  FillChar(ovlap_prt^.Buffer, MAX_BUFSIZE, 0);
  ovlap_prt^.ptrBuffer^.buf := @ovlap_prt^.Buffer[0];
  ovlap_prt^.ptrBuffer^.len := BufLen;
end;

//发送命令
procedure SetCmdSignByte(OperatingSocket : TSocket; CMDHeader : TInterChangeHeader;
  const IsScreenOrder : Boolean = True; const FileName : string = '');
var
  CmdPerHandleData : PPerHandleData;
  CMDDataHeaderInfo : TDataHeaderInfo;
  dwBytes, dwFlags: DWORD;
  nRet : integer;
  //向远程主机发送屏传命令的数组
  CmdSignByteArray : array[0..1] of Byte;   
begin
  if OperatingSocket <> 0 then
  begin
    MakeOverlappedPlus(CmdPerHandleData, IO_WRITE);
    CmdPerHandleData^.Socket := OperatingSocket;
    InitIoContext(CmdPerHandleData);
    //设置发送类型是控制信息
    CmdPerHandleData^.sendCMDtype := CMD_SENDCTRL;
    //初始统计数据量
    CMDDataHeaderInfo.UnCompressedDataSize := 0;
    CMDDataHeaderInfo.CompressedDataSize := sizeof(CmdSignByteArray);
    CmdPerHandleData^.ptrBuffer^.len := Sizeof(CMDDataHeaderInfo) + CMDDataHeaderInfo.CompressedDataSize;
    if IsScreenOrder then
    begin
      case CMDHeader.Order of
        SetPixel1,
        SetPixel4,
        SetPixel8,
        SetPixel16,
        SetPixel24:
          //如果是设置色深的,则第一个字节就是0
          CmdSignByteArray[0] := 0;
        GetSinglePic:
          //如果是单张传输的,则第一个字节就是2
          CmdSignByteArray[0] := 2;
      end;
      CmdSignByteArray[1] := Byte(CMDHeader.Order);
      //将屏传色深或者单张截取控制命令写入buffer
      CopyMemory(@CmdPerHandleData^.Buffer[Sizeof(CMDDataHeaderInfo)],
        @CmdSignByteArray[0], sizeof(CmdSignByteArray));
    end
    else
    begin
      //写入命令头字节
      CopyMemory(@CmdPerHandleData^.Buffer[sizeof(CMDDataHeaderInfo)], @CMDHeader, sizeof(CMDHeader));
      //写入新的文件夹字符串
      CopyMemory(@CmdPerHandleData^.Buffer[sizeof(CMDDataHeaderInfo) + Sizeof(CMDHeader)],
        PChar(FileName), Length(FileName));
      //统计数据量
      CMDDataHeaderInfo.CompressedDataSize := sizeof(CMDHeader) + Length(FileName);
      CmdPerHandleData^.ptrBuffer^.len := Sizeof(CMDDataHeaderInfo) + CMDDataHeaderInfo.CompressedDataSize;
    end;
    //写入数据发送区
    CopyMemory(@CmdPerHandleData^.Buffer[0], @CMDDataHeaderInfo, Sizeof(CMDDataHeaderInfo));
    //申请数据发送
    ZeroMemory(@CmdPerHandleData^.Overlapped, sizeof(OVERLAPPED));
    dwFlags := 0;
    nRet := WSASend(CmdPerHandleData^.Socket, @CmdPerHandleData^.ptrBuffer^, 1,
      dwBytes, dwFlags, @CmdPerHandleData^.Overlapped, nil);
    if((nRet = SOCKET_ERROR) and (WSAGetLastError() <> WSA_IO_PENDING)) then
    begin
      closesocket(CmdPerHandleData^.Socket);
      exit;
    end;
  end;
end;

//发送鼠标和键盘控制
procedure SetCtrlStructure(OperatingSocket: TSocket;
  KeyAndCursorData : TKeyAndCursorData; var CtrlPerHandleData : PPerHandleData);
var
  CtrlDataHeaderInfo : TDataHeaderInfo;
  dwBytes, dwFlags: DWORD;
  nRet : integer;
begin
  if OperatingSocket <> 0 then
  begin
    CtrlPerHandleData^.Socket := OperatingSocket;
    InitIoContext(CtrlPerHandleData, Sizeof(CtrlDataHeaderInfo) + 1 + sizeof(KeyAndCursorData));
    //设置发送类型是控制信息
    CtrlPerHandleData^.sendCMDtype := CMD_SENDMOUSE_KEY_CTRL;
    //发送控制命令
    CtrlDataHeaderInfo.UnCompressedDataSize := 0;
    CtrlDataHeaderInfo.CompressedDataSize := 1 + sizeof(KeyAndCursorData);
    CopyMemory(@CtrlPerHandleData^.Buffer[0], @CtrlDataHeaderInfo, Sizeof(CtrlDataHeaderInfo));
    //设置接收标志是1,告诉client是鼠标和键盘控制的数据
    CtrlPerHandleData^.Buffer[Sizeof(CtrlDataHeaderInfo)] := Char(1);
    CopyMemory(@CtrlPerHandleData^.Buffer[0 + 1 + Sizeof(CtrlDataHeaderInfo)],
      @KeyAndCursorData, sizeof(KeyAndCursorData));
    //申请数据发送
    ZeroMemory(@CtrlPerHandleData^.Overlapped, sizeof(OVERLAPPED));
    dwFlags := 0;
    nRet := WSASend(CtrlPerHandleData^.Socket, @CtrlPerHandleData^.ptrBuffer^, 1,
      dwBytes, dwFlags, @CtrlPerHandleData^.Overlapped, nil);
    if( ( nRet = SOCKET_ERROR ) and ( WSAGetLastError() <> WSA_IO_PENDING ) ) then
    begin
      closesocket(CtrlPerHandleData^.Socket);
      exit;
    end;
  end;
end;

//简单的内存池实现--获取内存
procedure GetMyMem(const Size : DWORD; var P : Pointer; const Pool : array of Char);begin  if Size <= DWORD(sizeof(Pool)) then  begin
    ZeroMemory(@Pool[0], sizeof(Pool));
    P := @Pool[0];
  end
  else
    P := AllocMem(Size);
end;//简单的内存池实现--释放内存procedure FreeMyMem(var P : Pointer; const Pool : array of Char);
begin
  if DWORD(P) <> DWORD(@Pool[0]) then
  begin
    if P <> nil then
      FreeMem(P);
    P := nil;
  end;
end;

//得到主机位置
function GetRemoteAddress(const IP : string) : string;
var
  slIPData: TStringlist;
  IPRecordID: int64;
  QQWry: TQQWry;
begin
  //IP地址->地址信息
  try
    if not FileExists('QQWry.Dat') then
    begin
      Result := '';
      exit;
    end;
    QQWry := TQQWry.Create('QQWry.Dat');
    IPRecordID := QQWry.GetIPDataID(IP);
    slIPData := TStringlist.Create;
    QQWry.GetIPDataByIPRecordID(IPRecordID, slIPData);
    QQWry.Destroy;
    Result := format('%s : %s', [slIPData[2], slIPData[3]]);
    slIPData.Free;
  except
    Result := '';
  end;
end;

//将类函数实例化
function MakeProcInstance(M: TMethod): Pointer;
begin
  // allocate memory
  GetMem(Result, 15);
  asm
    // MOV ECX,
    MOV BYTE PTR [EAX], $B9
    MOV ECX, M.Data
    MOV DWORD PTR [EAX+$1], ECX
    // POP EDX
    MOV BYTE PTR [EAX+$5], $5A
    // PUSH ECX
    MOV BYTE PTR [EAX+$6], $51
    // PUSH EDX
    MOV BYTE PTR [EAX+$7], $52
    // MOV ECX,
    MOV BYTE PTR [EAX+$8], $B9
    MOV ECX, M.Code
    MOV DWORD PTR [EAX+$9], ECX
    // JMP ECX
    MOV BYTE PTR [EAX+$D], $FF
    MOV BYTE PTR [EAX+$E], $E1
  end;
end;

//释放掉实例化占用的内存
procedure FreeProcInstance(ProcInstance: Pointer);
begin
  // free memory
  FreeMem(ProcInstance, 15);
end;

//将文件时间格式转化为日期时间格式
Function FileTimeToDateTime(FileTime : TFileTime) : TDateTime;
var
  LocalTime : TFileTime;
  SystemTime : TSystemTime;
begin
  Result := EncodeDate(1900, 1, 1);
  if FileTimeToLocalFileTime(FileTime, LocalTime) then
    if FileTimeToSystemTime(LocalTime, SystemTime) then
      Result := SystemTimeToDateTime(SystemTime);
end;

//得到文件的大小
function GetFileSize(const FileName : string) : LongInt;
var
  SearchRec : TSearchRec;
begin
  try
    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
      Result := SearchRec.Size
    else Result := -1;
  finally
    SysUtils.FindClose(SearchRec);
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -