Pergunta

Eu estava cortando o código fonte para plink para torná-lo compatível com uníssono.

Se você não sabe, uníssono é uma ferramenta de sincronização de arquivos, ele é executado um comando "ssh" para conectar a um servidor remoto, mas não há nenhuma ssh.exe para janelas; há plink, que é muito perto, mas não perto o suficiente (não se comportar como espera uníssono que ele), para que as pessoas costumam fazer invólucros em torno dele, como este .

um dos problemas é que uníssono espera que a senha prompt para imprimir stderr (mas imprime Plink em stdout, e provoca uníssono para ser confundido), então eu pensei, bem, deve ser suficiente simples, cortar o meu através de código de plink e torná-lo imprimir o prompt para stdout. então eu hackeado meu caminho e fez isso.

Em seguida problema: Eu não posso responder ao aviso !! Não importa o que eu digito, não tem nenhum efeito.

O código para a obtenção de entrada é mais ou menos assim:

hin = GetStdHandle(STD_INPUT_HANDLE);
....
r = ReadFile(hin, .....);

Eu não tenho certeza por isso que é feito desta forma, mas eu não sou um especialista na concepção de ferramentas de linha de comando para o Windows, então o que eu sei! Mas eu figura algo está faltando na criação da alça de entrada.

Eu olhei para o código fonte para o acima ferramenta invólucro Eu vejo isso: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)

e eu experimentá-lo (apenas para os pedaços dele)

hin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
....
r = ReadFile( hin ...... )

e surpreendentemente ele funciona! Agora posso responder ao aviso!

Por que isso? o que é "CONIN $"? e por que é diferente do STD_INPUT_HANDLE?

Posso espécie de "adivinhar" que FILE_SHARE_READ e OPEN_EXISTING estão desempenhando um papel neste (desde ssh está sendo executado de dentro de outro processo), mas eu quero entender o que está acontecendo aqui, e certifique-se que este doesn código' t ter alguns efeitos colaterais indesejados ou falhas de segurança ou algo assustador assim!

Foi útil?

Solução

CONIN$ é o dispositivo de entrada de console. Normalmente, stdin é um identificador de arquivo aberto a isso, mas se stdin é redirecionado por algum motivo, em seguida, usando CONIN$ irá permitir que você tenha acesso ao console apesar do redirecionamento. Referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top