domingo, 16 de outubro de 2011

Comandos de Drive de CD no Windows


O arquivo abaixo possui a finalidade do código do post anterior, porém funciona no Windows. Interessante como o programa pode crescer! Este código foi capturado na internet e alterado e com ele foi possível fazer um novo formato de executável que funciona tanto em Linux quanto Windows. E, para isto, bastou um IF solicitando o tipo de sistema operacional para escolher qual dos dois algoritmos o sistema irá executar. Este programa executa comandos do Visual Basic dentro do Java. No próximo post vou demonstrar como transformar este arquivo em um executável oculto.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class JEjectDrive {

    // Array contendo as letras das unidades de CD/DVD
    private List<String> driver = new ArrayList<String>();

    /**
        *
        */
    public JEjectDrive() {
        this.getDriver();
    }

    /**
     * Método utilizado para executar os scripts em VB.
     *
     * @param script
     *            Código em VB a ser executado.
     * @return Retorna toda a saída da execução.
     * @throws java.io.IOException
     */
    private String executeVBScript(String script) {
        String output = "";
        String line = null;

        try {
            File f = File.createTempFile("tmp", ".vbs");
            f.deleteOnExit();

            FileWriter fw = new FileWriter(f);
            fw.write(script);
            fw.close();

            Process p = Runtime.getRuntime().exec(
                    "cscript //NoLogo " + f.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p
                    .getInputStream()));

            while ((line = input.readLine()) != null) {
                output += line;
            }

            input.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return output;
    }

    /**
     * Método para checar as unidades existentes.
     */
    private void getDriver() {
        StringBuilder sb = new StringBuilder();
        sb.append("Const DriveTypeCDROM = 4\n");
        sb
                .append("Set oFSO = Wscript.CreateObject(\"Scripting.FileSystemObject\")\n");
        sb.append("Set oDrives = oFSO.Drives\n");
        sb.append("For Each Drive in oDrives\n");
        sb
                .append("If Drive.DriveType = DriveTypeCDROM Then Wscript.Echo Drive.DriveLetter End If\n");
        sb.append("Next");

        String dr = executeVBScript(sb.toString());

        for (int i = 0; i < dr.length(); i++) {
            driver.add(dr.substring(i, i + 1));
        }
    }

    /**
     * Método para abrir/fechar a bandeja do CD/DVD com opção do usuário
     * fecha-lá.
     *
     * @param drv
     *            Letra da unidade para abrir.
     * @param msg
     *            Mensagem perguntando se quer fechar.
     * @param title
     *            Título da Mensagem.
     */
    public void eject(String drv, String msg, String title) {
        if (driver.contains(drv)) {
            StringBuilder sb = new StringBuilder();
            sb.append("Set oWMP = CreateObject(\"WMPlayer.OCX.7\")\n");
            sb.append("Set oCD = oWMP.CdromCollection.getByDriveSpecifier(\"");
            sb.append(drv);
            sb.append(":\\\")\n");
            sb.append("oCD.Eject\n");

            if (msg != null && title != null) {
                sb.append("If vbOK = MsgBox(\"");
                sb.append(msg);
                sb.append("\", vbOKCancel, \"");
                sb.append(title);
                sb.append("\") Then\noCD.Eject\nEnd If");
            }

            String dr = executeVBScript(sb.toString());
        } else {
            throw new IllegalArgumentException("Unidade " + drv
                    + " não encontrada");
        }
    }

    /**
     * Método para abrir/fechar a bandeja do CD/DVD.
     *
     * @param drv
     *            Letra da unidade para abrir.
     */
    public void eject(String drv) {
        eject(drv, null, null);
    }

    /**
     * Método para abrir todas as bandejas de CD/DVD
     */
    public void ejectAll() {
        StringBuilder sb = new StringBuilder();
        sb.append("Set oWMP = CreateObject(\"WMPlayer.OCX.7\")\n");
        sb.append("Set oDrv = oWMP.CdromCollection\n");
        sb.append("If oDrv.Count >= 1 Then\n");
        sb.append("For i = 0 To oDrv.Count - 1\n");
        sb.append("oDrv.Item(i).Eject\n");
        sb.append("Next\nEnd If");

        String dr = executeVBScript(sb.toString());
    }

    /**
     *
     * @return Retorna as letras das unidades de CD/DVD
     */
    public String[] getDrivers() {
        return driver.toArray(new String[driver.size()]);
    }

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        JEjectDrive je = new JEjectDrive();

        for (String drv : je.getDrivers()) {
            System.out.println("Unidade encontrada: " + drv);
            je.eject(drv, "Deseja fechar a gaveta?", "CD/DVD");
        }

        je.ejectAll();
    }
}

CUIDADO: Não me responsabilizo pela forma como este post for utilizado. O arquivo de manipulação de drives é apenas uma amostra para níveis de conhecimento de segurança, e desenvolvimento com segurança, que todo Bacharel em Sistemas deve conhecer e compartilhar.

Nenhum comentário:

Postar um comentário