2008-10-06 13 views
6

He desarrollado una aplicación de Windows que usa memoria compartida --- es decir --- archivos mapeados en memoria para comunicación entre procesos. Tengo un servicio de Windows que procesa y escribe datos periódicamente en el archivo asignado a la memoria. Tengo una aplicación de Windows separada que lee desde el archivo mapeado en la memoria y muestra la información. La aplicación funciona como se esperaba en Windows XP, XP Pro y Server 2003, pero NO en Vista.Permisos de acceso a memoria compartida en Windows

Puedo ver que los datos que se escriben en el archivo mapeado de memoria están sucediendo correctamente en el servicio de Windows porque puedo abrir el archivo con un editor de texto y ver los mensajes almacenados, pero la aplicación "consumidor" no puede leer del archivo. Una cosa interesante a tener en cuenta aquí, es que si cierro la aplicación de consumidor y la reinicio, consume los mensajes que se escribieron previamente en el archivo mapeado de memoria.

Además, otra cosa extraña es que obtengo el mismo comportamiento cuando me conecto al host de Windows usando Escritorio remoto e invoco/uso la aplicación del consumidor a través del escritorio remoto. Sin embargo, si invoco el Escritorio remoto y me conecto a la sesión de la consola del host de destino con el siguiente comando: mstsc -v:servername /F -console, todo funciona perfectamente.

Por eso creo que el problema está relacionado con los permisos. ¿Alguien puede comentar sobre esto?

EDIT:

La ACL que estoy usando para crear el archivo de memoria asignada y los objetos mutex que sychronize acceso es el siguiente:

TCHAR * szSD = TEXT("D:") 
       TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)") 
       TEXT("(A;;GA;;;BG)") 
       TEXT("(A;;GA;;;AN)") 
       TEXT("(A;;GA;;;AU)") 
       TEXT("(A;;GA;;;LS)") 
       TEXT("(A;;GA;;;RD)") 
       TEXT("(A;;GA;;;WD)") 
       TEXT("(A;;GA;;;BA)"); 

Creo que esto puede ser parte de la cuestión .

Respuesta

0

Ha intentado mover el archivo a una ubicación diferente. Intente ponerlo en la carpeta 'Documentos compartidos', esta parece ser la carpeta más accesible en Vista.

+0

Los documentos compartidos son una ubicación muy insegura para los archivos relacionados con IPC; no lo haga. –

1

¿Con qué acceso está abriendo la sección de memoria compartida? Pruebe con FILE_MAP_ALL_ACCESS y avance. También asegúrese de no tener una condición de carrera entre el productor y los consumidores: ¿cuál está creando la memoria compartida? Asegúrese de que ths se crea antes de que el otro intente abrirlo. Un método es crear la sección en el elemento primario antes de iniciar el proceso secundario, si está utilizando una arquitectura principal/secundaria.

Es posible que su hijo deba correr elevado en Vista para poder acceder a la memoria compartida. También puede estar relacionado con la sesión de ventana que está utilizando. Los servicios se ejecutan en la sesión 0 (creo) mientras que otras aplicaciones (especialmente si inicia sesión en el escritorio remoto) pueden ejecutarse en otra sesión.

+0

Así que estoy usando FILE_MAP_ALL_ACCESS para mapear la memoria compartida y he diseñado el código para que no importe quién crea la memoria compartida primero. Pero tu sugerencia sobre la sesión es interesante. Voy a ver esto. –

6

Así que he encontrado la solución a mi problema:

En Windows XP, todos los objetos de núcleo denominado como el mutex, semáforos y objetos de memoria asignada se almacenan en el mismo espacio de nombres. Entonces, cuando diferentes procesos en diferentes sesiones de usuario hacen referencia a un objeto particular usando su nombre, obtienen un control para ese objeto. Sin embargo, como precaución de seguridad, los servicios de terminal de Windows crean un espacio de nombres separado para los objetos kernel a los que se hace referencia desde los procesos iniciados en su sesión. Windows Vista tiene este comportamiento incorporado también, por eso es que mi aplicación no funcionaba correctamente en Vista. Para más detalles, tengo un servicio de Windows que se ejecuta en la sesión nula y una aplicación que se ejecuta en una sesión de usuario, por lo que mis objetos nombrados se crearon en espacios de nombres separados.

La solución rápida para este problema era usar el espacio de nombres global anteponiendo "Global \" a cada nombre de objeto kernel que usé y que funcionó.

+0

Probablemente haya creado un agujero de seguridad en su sistema. –

+1

Bueno, hay pensamientos mezclados sobre eso. Hay momentos en los que desea otorgar a un servicio derechos y capacidades superiores (por ejemplo, Sistema local) que una aplicación de usuario que necesita poder interactuar con ese servicio. Es discutible que estés habilitando la seguridad solo dando acceso al servicio y no a la aplicación. Sin embargo, puede ver el hecho de que el servicio existe como un potencial agujero de seguridad. Pero no estoy de acuerdo. – Dan

Cuestiones relacionadas