FindNextFile falha no Windows de 64 bits?

Usando o C ++ Builder 2007, as funções FindFirstFile e FindNextFile não parecem encontrar alguns arquivos em versões de 64 bits do Vista e do XP. Minha aplicação de teste é de 32 bits.

Se eu usá-los para percorrer a pasta C: \ Windows \ System32 \ Drivers, eles só encontrarão um punhado de arquivos, embora haja 185 quando eu emitir um comando dir em um prompt de comando. Usar o mesmo código de exemplo lista todos os arquivos em uma versão de 32 bits do XP.

Aqui está um pequeno programa de exemplo:

int main(int argc, char* argv[])
{
  HANDLE hFind;
  WIN32_FIND_DATA FindData;
  int ErrorCode;
  bool cont = true;

  cout << "FindFirst/Next demo." << endl << endl;

  hFind = FindFirstFile("*.*", &FindData);
  if(hFind == INVALID_HANDLE_VALUE)
  {
    ErrorCode = GetLastError();
    if (ErrorCode == ERROR_FILE_NOT_FOUND)
    {
      cout << "There are no files matching that path/mask\n" << endl;
    }
    else
    {
      cout << "FindFirstFile() returned error code " << ErrorCode << endl;
    }
    cont = false;
  }
  else
  {
    cout << FindData.cFileName << endl;
  }

  if (cont)
  {
    while (FindNextFile(hFind, &FindData))
    {
      cout << FindData.cFileName << endl;
    }

    ErrorCode = GetLastError();
    if (ErrorCode == ERROR_NO_MORE_FILES)
    {
      cout << endl << "All files logged." << endl;
    }
    else
    {
      cout << "FindNextFile() returned error code " << ErrorCode << endl;
    }

    if (!FindClose(hFind))
    {
      ErrorCode = GetLastError();
      cout << "FindClose() returned error code " << ErrorCode << endl;
    }
  }
  return 0;
}

Executá-lo na pasta C: \ Windows \ System32 \ Drivers no XP de 64 bits retorna isso:

C:\WINDOWS\system32\drivers>t:\Project1.exe
FindFirst/Next demo.

.
..
AsIO.sys
ASUSHWIO.SYS
hfile.txt
raspti.zip
stcp2v30.sys
truecrypt.sys

All files logged.

Um comando dir no mesmo sistema retorna isso:

C:\WINDOWS\system32\drivers>dir/p
 Volume in drive C has no label.
 Volume Serial Number is E8E1-0F1E

 Directory of C:\WINDOWS\system32\drivers

16-09-2008  23:12    
    . 16-09-2008 23:12
      .. 17-02-2007 00:02 80.384 1394bus.sys 16-09-2008 23:12 9.453 a.txt 17-02-2007 00:02 322.560 acpi.sys 29-03-2006 14:00 18.432 acpiec.sys 24-03-2005 17:11 188.928 aec.sys 21-06-2008 15:07 291.840 afd.sys 29-03-2006 14:00 51.712 amdk8.sys 17-02-2007 00:03 111.104 arp1394.sys 08-05-2006 20:19 8.192 ASACPI.sys 29-03-2006 14:00 25.088 asyncmac.sys 17-02-2007 00:03 150.016 atapi.sys 17-02-2007 00:03 106.496 atmarpc.sys 29-03-2006 14:00 57.344 atmepvc.sys 17-02-2007 00:03 91.648 atmlane.sys 17-02-2007 00:03 569.856 atmuni.sys 24-03-2005 19:12 5.632 audstub.sys 29-03-2006 14:00 6.144 beep.sys Press any key to continue . . . etc.

      Estou confuso. Qual é a razão para isto?

      Brian

0
adicionado editado
Visualizações: 29

6 Respostas

There are no problems with the example code. I have another application that fails too, written in Delphi. I think I found the answer based on Kris' answer about redirection: http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

0
adicionado

Consegui:

http://msdn.microsoft.com/pt-br /library/aa384187(VS.85).aspx

Quando um aplicativo de 32 bits lê de uma dessas pastas em um sistema operacional de 64 bits:

%windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool 

O Windows realmente lista o conteúdo de:

%windir%\SysWOW64\catroot
%windir%\SysWOW64\catroot2
%windir%\SysWOW64\drivers\etc
%windir%\SysWOW64\logfiles
%windir%\SysWOW64\spool 

Obrigado pela sua contribuição Kris, que me ajudou a descobrir o que está acontecendo.

EDIT: Obrigado Ludvig também :-)

0
adicionado

Eu encontrei isso no MSDN:

Se você estiver escrevendo um aplicativo de 32 bits para listar todos os arquivos em um diretório eo aplicativo pode ser executado em um computador de 64 bits, você deve chamar a função Wow64DisableWow64FsRedirection antes de chamar FindFirstFile e chamar Wow64RevertWow64FsRedirection após a última chamada para FindNextFile . Para obter mais informações, consulte Redirecionador do sistema de arquivos.

Aqui está o link

Vou ter que atualizar meu código por causa disso :-)

0
adicionado

Você tem certeza de que está procurando no mesmo diretório que o comando dir? Eles não parecem ter nenhum arquivo em comum.

Além disso, esse não é o problema, mas o curinga correto para "todos os arquivos" é *

*. * significa "todos os arquivos com pelo menos um. no nome"

0
adicionado

Is there redirection going on? See the remarks on Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

0
adicionado
Eu listo os arquivos em C: \ Windows \ System32 \ Drivers, mas na verdade obtenho os arquivos em C: \ Windows \ SysWOW64 \ Drivers :-)
adicionado o autor JubbaJubba, fonte
Quais são os arquivos em C: \ Windows \ System64 \ Drivers?
adicionado o autor Kris Kumler, fonte

Há algum aviso quando você compila?

Você ativou ALL avisos para este teste em particular (já que não está funcionando)?

Certifique-se primeiro de resolver os avisos.

0
adicionado