2010-08-30 12 views
7

Googled mucho y no pude encontrar ninguna respuesta a este problema ...escritura de archivo de error # 5 "negado el acceso" en Win Vista/siete

Tengo una aplicación de consola de C++ que lee una tarjeta SD de 1 GB que corrige los archivos incorrectamente cerrados y escribe la tabla FAT en consecuencia. La tarjeta SD está escrita al principio por un firmware en un dispositivo hecho a medida. Funcionó bien hasta Xp y dejó de funcionar en Win Vista/seven. Intenté elevar privilegios: dentro de un tipo de cuenta de administrador, abrí una ventana de cmd usando el método "ejecutar como administrador" pero no tuve suerte. También probé con un manifiesto solicitando los privilegios más altos disponibles pero sin suerte.

Leí en una publicación que "Windows Vista no le permite acceder a los discos de los procesos en modo de usuario. ¿Alguien sabe sobre alguna forma de eludir este comportamiento?

estoy trabajando en una solución sin embargo me gustaría saber si esto es imposible o no

Editar:

Este es mi primer post aquí, así que no entiendo muy bien acerca de la la vinculación de tema ... Pero no estoy reated a ningún tipo de spam en absoluto ... sólo pedir en un sitio de comunidad impulsada :)

El código es el siguiente

hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE, 
     FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); 

Luego leo la información de BTB de la tarjeta SD y busco y archivo incorrectamente cerrado.

Finalmente cuando se trata de escribir en el SD

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0) 

consigo un acceso denegado (error # 5)

La cadena de CreateFile() es \ \ g:. Como la letra g corresponde a la tarjeta SD en mi máquina. Todo lo que funciona bien y como dije antes funciona en XP. También intenté usar: DeviceIoControl con FSCTL_LOCK_VOLUME, pero eso da un error de falla de mem.

Espero que esto ayude a entender y gracias por cualquier ayuda

+1

+1 para: "trabajar en una solución" ... – Chubsdad

+0

Tiene que haber una manera de acceder a los archivos de dispositivos en bruto de Vista/Seven - ¿Cómo podría utilidades para preparar las memorias USB de arranque linux instale su gestor de arranque? – bdonlan

+0

@andy, ¿podría publicar un código de ejemplo que muestre lo que está haciendo para que podamos ver qué podría estar mal? – bdonlan

Respuesta

2

Creo que esto se debe a la cadena de ruta "buffer"; Me encontré con el mismo problema. La ruta que está utilizando para obtener acceso al dispositivo debe tener la apariencia de que "\\. \ PhysicalDrive% d" % d es el número decimal de la unidad.

Desde Vista, esta cadena es CASE SENSITIVE. Revisa la ortografía. También necesita derechos de administrador, al igual que antes en XP.

Para volúmenes ,. la carta debe ser CAPITALIZADA p. "\\. \ G:"

También tenga en cuenta que es mucho mejor acceder a la tarjeta SD como un dispositivo en lugar del volumen, ya que si Windows lo monta, puede haber un sistema de archivos montado con una caché de escritura.

Además: Olvidé mencionar que el búfer al que lees/escribes los datos a/desde debe estar alineado con la página y la lectura es un múltiplo del tamaño del sector. VirtualAlloc() hace esto

+1

¡Gracias a Balpha por sus ediciones! Gracias Dominik por su respuesta :) Creo que la sintaxis de lpFileName en CreateFile siempre comienza con \\. \ Como se indica en http://msdn.microsoft.com/en-us/library/aa363858%28VS.85 % 29.aspx Parece que la mayúscula de la letra del volumen no ayuda en absoluto en mi caso. También probé \\. \ PhysicalDriveXX (XX es 1 en mi caso) pero más tarde en ReadFile (hDevice, inf_buffer, SD_SECTOR_SIZE, & tmp, 0); no devuelve nada en inf_buffer, sino uno vacío. Sin embargo, CreateFile no se queja en absoluto. Esta última prueba se realizó bajo la depuración en XP con ms vC++ 6 (máquina dev) – andy

+0

Gracias andy - la ruta que he introducido tenía dos barras inclinadas, pero la barra inclinada es un carácter de escape, por lo que en realidad debes ingresar cuatro para obtener dos . También recordé el bit sobre la alineación del búfer. Si puede abrir el archivo, el nombre y los permisos son correctos, si la lectura falla, es el tamaño/alineación del búfer y/o "bloqueo". Creo que el bloqueo es más importante cuando quieres escribir. –

0

Debe desmontar el volumen antes de escribir los datos brutos.

De MSDN:

Una escritura en un manipulador de volumen tendrá éxito si el volumen no tiene un sistema de archivos montado, o si una de las siguientes condiciones es verdadera:

  • Los sectores para escribir en los sectores de arranque.
  • Los sectores que se escribirán para residir fuera del espacio del sistema de archivos.
  • Ha bloqueado o desmontado explícitamente el volumen utilizando FSCTL_LOCK_VOLUME o FSCTL_DISMOUNT_VOLUME.
  • El volumen no tiene un sistema de archivos real. (En otras palabras, tiene montado un sistema de archivos RAW.)

Una escritura en un mango de disco tendrá éxito si una de las siguientes condiciones es verdadera:

  • Los sectores a escribirse hacer no caer dentro de las extensiones de un volumen.
  • Los sectores que se escribirán caerán dentro de un volumen montado, pero usted ha bloqueado o desmontado explícitamente el volumen utilizando FSCTL_LOCK_VOLUME o FSCTL_DISMOUNT_VOLUME.
  • Los sectores que se escribirán estarán dentro de un volumen que no tiene un sistema de archivos montado que no sea RAW.

Sample code:

BOOL bResult = DeviceIoControl(hDevice,    // device to be queried 
           FSCTL_DISMOUNT_VOLUME, // operation to perform 
           NULL, 0,    // no input buffer 
           pdg, sizeof(*pdg),  // output buffer 
           &junk,     // # of bytes returned 
           (LPOVERLAPPED)NULL); // synchronous I/O 
+5

Siempre incluya los * enlaces * a los artículos/documentación relevantes de MSDN en su respuesta. –

Cuestiones relacionadas