# Thursday, August 20, 2009

La virtualisation, Windows 7 et le 64 bits

Lorsque l’on installe la version 64 bits de Virtual PC 2007 sur un OS 64 bits, on est surpris de voir que le programme souhaite s’installer dans le dossier Program Files(x86) réservé aux applications 32 bits au lieu de s’installer dans le dossier Program Files où reposent les applis 64 bits. Il n’y aucune erreur dans l’installation, le fait est que Virtual PC 2007 64bits reste une application 32 bits mais qui utilise des drivers systèmes 64 bits.

Cependant le fait que Virtual PC reste 32 bits, a un impact important : vous avez beau avoir installé un 0S 64 bits et disposer de Virtual PC 64 bits, il ne vous sera pas possible d’installer un OS 64 bits en Guest dans une machine virtuelle ! Si vous tentez une telle installation vous vous retrouverez avec l’erreur suivante : “Attempting to load a 64-bit application, however this CPU is not compatible with 64-bit mode” :

clip_image001

La même limite existe pour Windows Virtual PC (la version de VPC dédiée à Windows 7) ainsi que pour Virtual Server 2005 R2.

La seule solution possible proposée par Microsoft pour virtualiser du 64 bits est Hyper-V. A noter qu’il n’est pas conçu pour les notebooks et donc supporte assez mal les mode de veille ou d’hibernation.

Autre solution, se passer des solutions Microsoft et utiliser VMWare qui est même capable de faire tourner une machine virtuelle 64 bits dans un OS 32 bits.

# Thursday, August 13, 2009

Savoir si un CPU supporte le 64 bits

Si vous allez changer d’OS (pour migrer vers Windows 7 par exemple) et souhaitez être sûr que votre machine supporte le 64 bits vous avez deux solutions simples.

Si votre CPU fait partie de ceux-cités dans le tableau suivant vous avez votre réponse :

Processeur

32- or 64-bit

Intel Core Solo

32 bit

Intel Core Duo

32 bit

Intel Core 2 Duo

64 bit

Intel Quad-Core Xeon

64 bit

Sinon, vous pouvez utiliser un utilitaire proposé par Intel nommé “Intel Processor Identification Utility” qui vous permettra d’avoir toutes sortes d’infos sur votre CPU comme par exemple celle du support du 64 bits :

clip_image001

# Thursday, February 26, 2009

Attention aux dépendances dynamiques pour le support du 64 bits

Disposer d'une machine virtuelle et d'une compilation en deux phases permet de bénéficier d'un support du 64 bits quasi-automatique. Si l'on compile une assembly en Any Cpu, celle-ci sera compilée en JIT en 32 bits si elle est chargée dans un process 32 bits ou en 64 bits dans le cas d'un chargement dans un process 64 bits. De plus si une assembly a des dépendances vers des assemblys 32 bits ou vers des DLL natives 32 bits,  elle se retrouvera automatiquement compilée en 32 bits même si chargée dans un environnement 64 bits.

Il faut cependant noter que cette analyse de dépendances ne concerne que les dépendances statiques et en aucun cas les dépendances dynamiques (introduites via du code).

J'ai récemment rencontré le problème à propos de l'utilisation d'un filtre DirectShow. Le filtre est instancié via un Activator.CreateInstance afin d'être manipulé et insérer au sein d'un graphe de cette manière :

    /// <summary>
    /// Wrapper of the HttpDestinationFilter
    /// </summary>
    public class HttpDestinationFilter
    {
        private static readonly Guid CLSID_HttpDestination = new Guid("E6788379-AAA3-4516-86EC-158B7A49EA74");

        public static IBaseFilter CreateInstance()
        {
            return (IBaseFilter) Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_HttpDestination, true));
        }
    }

Seul problème, lors de l'exécution de ce code sur une plate-forme 64 bits, l'instanciation peut échouer si le composant en question est en 32 bits et si l'assembly est compilée en Any Cpu.

Etant sur un Windows 64 bits, la base de registres est en grande partie divisée en deux versions, une copie pour les applications 32 bits et une autre copie pour les application 64 bits. Il est ainsi (entre autres raisons) impossible d'utiliser des composants COM 32 bits depuis une application 64 bits car le composant se retrouve introuvable du fait de la redirection. La correction du problème est simple : trouver une version 64 bits du composant en question ou alors définir manuellement la target de compilation afin d'indiquer un compilation en 32 bits.