Você pode usar a injeção de DLL para chamar SetCurrentDirectory
após o processo já ter sido iniciado. Isso exigiria que você criasse um aplicativo injetor, além da DLL para injetar. Alguns tutoriais existem; provavelmente os dois melhores que encontrei são:
- Três maneiras de injetar seu código em outro processo
- Estendendo o gerenciador de tarefas com injeção de DLL
Você precisará de uma quantidade decente de experiência em programação C ++ (e um ambiente de criação de trabalho) para passar por isso.
No entanto, isso pressupõe que o serviço esteja olhando para o diretório atual. Outra possibilidade é que ele esteja usando %path%
. Você diz que "começa em system32
, tenta mais alguns locais e, eventualmente, seu próprio diretório", então isso parece mais provável para mim.
Compare os diretórios que você vê em procmon
com seu %path%
. Se forem iguais, considere modificar o SYSTEM %path%
ou o %path%
do usuário que está executando o serviço, para que o diretório que você deseja pesquisar seja o primeiro.
Acredito que Fred esteja certo, no entanto - é improvável que você veja qualquer benefício significativo no desempenho fazendo isso, a menos que esteja acontecendo muito com frequência. As operações de abertura de arquivos simples não são particularmente caras, especialmente se for um caminho local e o arquivo não existir realmente.