FindNextFile falla en Windows de 64 bits?

utilizando C ++ Builder 2007, las funciones FindFirstFile y FindNextFile no parecen poder encontrar algunos archivos en las versiones de 64 bits de Vista y XP. Mi aplicación de prueba es de 32 bits.

Si los utilizo para iterar a través de la carpeta C: \ Windows \ System32 \ Drivers, solo encuentran un puñado de archivos, aunque hay 185 cuando emite un comando dir en el símbolo del sistema. El uso del mismo código de ejemplo enumera todos los archivos correctamente en una versión de 32 bits de XP.

Aquí hay un pequeño ejemplo de programa:

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;
}

Al ejecutarlo en la carpeta C: \ Windows \ System32 \ Drivers en 64-bit, XP devuelve esto:

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.

Un comando dir en el mismo sistema devuelve esto:

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.

      Estoy confundido. ¿Cuál es la razón para esto?

      Brian

0
agregado editado
Puntos de vista: 31

6 Respuestas

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
agregado

Lo tengo:

http://msdn.microsoft.com/en-gb /library/aa384187(VS.85).aspx

Cuando una aplicación de 32 bits lee desde una de estas carpetas en un sistema operativo de 64 bits:

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

Windows realmente muestra el contenido de:

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

Gracias por su aporte, Kris, eso me ayudó a descubrir qué está pasando.

EDIT: Gracias Ludvig también :-)

0
agregado

Encontré esto en MSDN:

Si está escribiendo una aplicación de 32 bits para enumerar todos los archivos en un directorio y la aplicación puede ejecutarse en una computadora de 64 bits, debe llamar a la función Wow64DisableWow64FsRedirection antes de llamar a FindFirstFile y llamar a Wow64RevertWow64FsRedirection después de la última llamada a FindNextFile . Para obtener más información, consulte el redirector del sistema de archivos.

Aquí está el enlace

Tendré que actualizar mi código debido a esto :-)

0
agregado

¿Estás seguro de que está buscando en el mismo directorio que el comando dir? No parecen tener ningún archivo en común.

Además, este no es el problema, pero el comodín correcto para "todos los archivos" es *

*. * significa "todos los archivos con al menos uno. en el nombre"

0
agregado

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

0
agregado
Enumero los archivos en C: \ Windows \ System32 \ Drivers pero en realidad obtengo los archivos en C: \ Windows \ SysWOW64 \ Drivers :-)
agregado el autor JubbaJubba, fuente
¿Cuáles son los archivos en C: \ Windows \ System64 \ Drivers?
agregado el autor Kris Kumler, fuente

¿Hay alguna advertencia cuando compila?

¿Ha activado las advertencias TODAS para esta prueba en particular (ya que no está funcionando)?

Asegúrate primero de resolver las advertencias.

0
agregado