Bajo el nivel C ++ aplicación falla en Windows Vista / 7 A menos que se ejecute en modo de compatibilidad de XP

StackOverflow https://stackoverflow.com/questions/2169092

Pregunta

Tengo un nivel bajo (como realmente de bajo nivel, que es básicamente todas las llamadas IOCTL y varias llamadas a las API de enumeración) que se bloquea de forma esporádica en Windows Vista / 7 en las máquinas de los clientes. Por desgracia, no he sido capaz de conseguir cualquier volcados pero útil para el usuario no mencionan que ejecutar el programa en modo de compatibilidad con XP resuelto el problema.

La aplicación siempre se puso en marcha con todos los derechos de administrador (que ha lanzado desde otro programa que requiera autorización de administración) así que no es una cuestión de UAC. Yo no uso ninguna API en desuso y no voy a confiar en ningún registro hacks, etc. Sólo estoy emisión de llamadas a los discos enumerar a continuación, utilizando los comandos IOCTL para conseguir algo más de información de bajo nivel sobre todos los dispositivos conectados.

¿Qué ocurre en el modo de compatibilidad de XP? Lo que hace de Windows inyectar en mi solicitud o de otra caja de arena con que le impide chocar en Vista / 7? Que había sospechado inicialmente daños en el montón (aunque he tirado mi pelo a cabo tratando de replicar o para localizar el problema) antes de que nos dijeron que funciona muy bien en el modo de compatibilidad de XP.

Puede alguien sugerir posibles problemas que se evitarían en el modo XP Compat que debería mirar en tratar de solucionar este problema? Gracias!

EDIT:

Una cosa más que probable que sea muy importante mencionar:. Voy a llamar a las funciones DDK / kernel desde el espacio de usuario con el fin de llegar a ciertas características que no están expuestos a través de la API de Win32

Estoy usando ZwReadFile, ZwCreateFile, ZwWriteFile, RtlInitUnicodeString, ZwQueryVolumeInformationFile, ZwDeviceIoControlFile, ZwSetInformationFile, ZwClose.

Los IOCTLs estoy de llamadas incluyen IOCTL_DISK_GET_PARTITION_INFO_EX, IOCTL_STORAGE_GET_DEVICE_NUMBER, IOCTL_DISK_GET_LENGTH_INFO y IOCTL_DISK_GET_DRIVE_LAYOUT_EX.

¿Fue útil?

Solución

Esto es muy raro, pero yo estaba llamando ZwQueryVolumeInformationFile con FsInformationClass conjunto de FileFsVolumeInformation.

I había pasado en un tampón de FILE_FS_VOLUME_INFORMATION primero normalmente asignado, entonces sobreasignado a (sizeof(FILE_FS_VOLUME_INFORMATION) + sizeof(TCHAR)*FILE_FS_VOLUME_INFORMATION->VolumeLabelLength).

Entonces me llamó FILE_FS_VOLUME_INFORMATION->VolumeLabel[FILE_FS_VOLUME_INFORMATION->VolumeLabelLength/2] = _T('\0'); y sólo en algunas máquinas esto daría lugar a una corrupción de memoria.

Sin importar el tamaño de la sobreasignación (incluso intentó asignar un total de 256 caracteres extra!), Esto daría como resultado fiable en daños en la pila incluso cuando se utiliza un vector<unsigned char> como tampón FILE_FS_VOLUME_INFORMATION.

Parece que el kernel coloca algún tipo de protección contra escritura en la memoria intermedia de alguna manera que se traduce en la corrupción, independientemente del tamaño. Copia de los primeros bytes VolumeLableLength a un segundo tampón, después _T('\0') posterior a la pendiente de resolverse el problema. No sabe cómo / por qué Windows estaba haciendo el búfer que I asignado y pasa como un parámetro de sólo lectura o si estaba almacenando después de la estructura FILE_FS_VOLUME_INFORMATION (que debe extremo con el arreglo de caracteres!), sino que simplemente no modificar ningún dato en el buffer que pasé hizo el truco .... que es una locura, ya que sólo ocurre (consistente y reproducible de 100% ) en ciertas máquinas.

En cualquier caso: problema resuelto * * uf

Otros consejos

Ha habido muchos cambios en el controlador de bajo nivel de de XP a Vista. Sospecho que está utilizando un IOCTL que se ve afectado por el mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top