Accueil > Forum > > > > Erreur DeviceIOControl : Fonction Incorrecte
Erreur DeviceIOControl : Fonction Incorrecte
samedi 9 février 2008 à 20:45:47 |
Erreur DeviceIOControl : Fonction Incorrecte

tuxama
|
Bonsoir, Je tente de récupérer quelques caractéristiques de mon disque physique principal. DeviceIOControl me retourne une erreur '1' : Fonction Incorrecte Malgrès différents essais je ne parviens pas à trouver de solution. Quelqu'un a t-il une idée, voir même LA solution ?
Merci de votre aide. private void getPhysicalDrive( ) { IntPtr handle = IntPtr.Zero; uint ndevice = 0;
Win32Functions.CHANGER_PRODUCT_DATA cpd = new Win32Functions.CHANGER_PRODUCT_DATA( ); IntPtr pcpd = Marshal.AllocHGlobal( Marshal.SizeOf( cpd ) ); Marshal.StructureToPtr( cpd, pcpd, true );
do { string s = "\\\\.\\PHYSICALDRIVE" + ndevice.ToString( ); Console.WriteLine( s );
handle = Win32Functions.CreateFile( s, 0, Win32Functions.FILE_SHARE_WRITE, IntPtr.Zero, Win32Functions.OPEN_EXISTING, 0, IntPtr.Zero ); if ( handle == IntPtr.Zero ) { Console.WriteLine( "not Found" ); } else { uint nBytes = 0; if ( Win32Functions.DeviceIoControl( handle, Win32Functions.IOCTL_CHANGER_GET_PRODUCT_DATA, IntPtr.Zero, 0, pcpd, ( uint )Marshal.SizeOf( pcpd ), ref nBytes, IntPtr.Zero ) > 0 ) {
Console.WriteLine( cpd.ProductId ); Console.WriteLine( cpd.DeviceType ); } else { Int32 err = Marshal.GetLastWin32Error( ); Console.WriteLine( "The last Win32 Error was: " + err ); Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) );
} Marshal.FreeHGlobal( pcpd ); if ( !Win32Functions.CloseHandle( handle ) ) { Console.WriteLine( "CloseHandle code erreur: {0}", Marshal.GetLastWin32Error( ) ); } ndevice++; } } while ( handle == IntPtr.Zero ); }
static void Main( string[ ] args ) { RawDiskAccess ld = new RawDiskAccess( ); ld.getPhysicalDrive( ); } } //////////////////////////////////////////////////////////////// namespace RawDeviceAccess.Disk { /// <summary> /// Classe Wrapper pour des fonctions Win32 et les structures associées. /// </summary> internal class Win32Functions { // Types d'accès public const uint GENERIC_READ = 0x80000000; public const uint GENERIC_WRITE = 0x40000000; public const uint GENERIC_EXECUTE = 0x20000000; public const uint GENERIC_ALL = 0x10000000;
// Partages public const uint FILE_SHARE_READ = 0x00000001; public const uint FILE_SHARE_WRITE = 0x00000002; public const uint FILE_SHARE_DELETE = 0x00000004;
// Dispositions public const uint CREATE_NEW = 1; public const uint CREATE_ALWAYS = 2; public const uint OPEN_EXISTING = 3; public const uint OPEN_ALWAYS = 4; public const uint TRUNCATE_EXISTING = 5;
// public const uint IOCTL_CHANGER_GET_PRODUCT_DATA = 0x00000002; //0x0002;
[DllImport( "kernel32.dll", SetLastError = true, CharSet = CharSet.Auto )] public extern static IntPtr CreateFile( string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile );
[System.Runtime.InteropServices.DllImport( "kernel32", SetLastError = true, CharSet = CharSet.Auto )] public extern static bool CloseHandle( IntPtr handle );
[System.Runtime.InteropServices.DllImport( "Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto )] public extern static int DeviceIoControl( IntPtr hDevice, uint IoControlCode, IntPtr lpInBuffer, uint InBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, IntPtr lpOverlapped );
[StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )] public struct CHANGER_PRODUCT_DATA { [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )] public byte[ ] VendorId; [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )] public byte[ ] ProductId; [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )] public byte[ ] Revision; [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )] public byte[ ] SerialNumber; [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )] public byte[ ] DeviceType; }; } }L'éternité c'est long surtout vers la fin... 
|
|
samedi 9 février 2008 à 22:41:58 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

wizad
|
A vu de nez (oui un nez peut voire suffit de bien l'éduquer) je dirais que tu te complique beaucoup trop la vie. A priori tu devrais plutôt passer par la couche WMI qui est faite pour ça (entre autre) et qui est accéssible en C# sans devoir wrapper divers couche native.
Pour info : http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html
-- William
Une réponse vous convient? N'oubliez pas le bouton Accepter!
|
|
dimanche 10 février 2008 à 01:29:14 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

coq
|
Réponse acceptée !
Salut, A vue de nez ta définition de la valeur de IOCTL_CHANGER_GET_PRODUCT_DATA me parait louche. /* coq MVP Visual C# CoqBlog*/
|
|
dimanche 10 février 2008 à 11:24:17 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama
|
L'objectif n'est pas ici de répondre à une problématique projet, mais à me former. Je tente donc de découvrir l'utilisation des DLL natives. L'éternité c'est long surtout vers la fin... 
|
|
dimanche 10 février 2008 à 11:28:59 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama
|
J'ai revu la définition de IOCTL_CHANGER_GET_PRODUCT_DATA c'était une des erreurs. Mais il doit en rester d'autre... // CHANGER ChangerBase = EFileDevice.Changer, ChangerGetParameters = ( ChangerBase << 16 ) | ( 0x0000 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerGetStatus = ( ChangerBase << 16 ) | ( 0x0001 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerGetProductData = ( ChangerBase << 16 ) | ( 0x0002 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerSetAccess = ( ChangerBase << 16 ) | ( 0x0004 << 2 ) | EMethod.Buffered | ( ( FileAccess.Read | FileAccess.Write ) << 14 ), ChangerGetElementStatus = ( ChangerBase << 16 ) | ( 0x0005 << 2 ) | EMethod.Buffered | ( ( FileAccess.Read | FileAccess.Write ) << 14 ), ChangerInitializeElementStatus = ( ChangerBase << 16 ) | ( 0x0006 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerSetPosition = ( ChangerBase << 16 ) | ( 0x0007 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerExchangeMedium = ( ChangerBase << 16 ) | ( 0x0008 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerMoveMedium = ( ChangerBase << 16 ) | ( 0x0009 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerReinitializeTarget = ( ChangerBase << 16 ) | ( 0x000A << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ), ChangerQueryVolumeTags = ( ChangerBase << 16 ) | ( 0x000B << 2 ) | EMethod.Buffered | ( ( FileAccess.Read | FileAccess.Write ) << 14 ), public string GetLastWin32ErrorMessage( int errorCode ) { IntPtr buffer = IntPtr.Zero;
uint cnt = FormatMessage ( 0x00000100 | // FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000200 | // FORMAT_MESSAGE_IGNORE_INSERTS 0x00001000, // FORMAT_MESSAGE_FROM_SYSTEM IntPtr.Zero, ( uint )errorCode, 0, // LANGIDs : Neutral, Thread, User, System, en-US ref buffer, 0, IntPtr.Zero );
if ( cnt == 0 || buffer == IntPtr.Zero ) return String.Format( "Unknown error: {0}.", errorCode );
string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt ); Marshal.FreeHGlobal( buffer ); // LocalFree.
return errorMessage; }
private void getPhysicalDrive( ) { IntPtr handle = IntPtr.Zero; uint ndevice = 0;
Win32Functions.CHANGER_PRODUCT_DATA cpd = new Win32Functions.CHANGER_PRODUCT_DATA( ); IntPtr pcpd = Marshal.AllocHGlobal( Marshal.SizeOf( cpd ) ); Marshal.StructureToPtr( cpd, pcpd, true );
do { string s = "\\\\.\\PHYSICALDRIVE" + ndevice.ToString( ); Console.WriteLine( s );
handle = Win32Functions.CreateFile( s, 0, Win32Functions.FILE_SHARE_READ | Win32Functions.FILE_SHARE_WRITE, IntPtr.Zero, Win32Functions.OPEN_EXISTING, 0, IntPtr.Zero ); if ( handle == IntPtr.Zero ) { Console.WriteLine( "not Found" ); } else { uint nBytes = 0; if ( Win32Functions.DeviceIoControl( handle, (uint) EIOControlCode.ChangerGetProductData, IntPtr.Zero, 0, pcpd, ( uint )Marshal.SizeOf( pcpd ), ref nBytes, IntPtr.Zero ) > 0 ) {
Console.WriteLine( cpd.ProductId ); Console.WriteLine( cpd.DeviceType ); } else { Int32 err = Marshal.GetLastWin32Error( ); Console.WriteLine( "The last Win32 Error was: " + err ); Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) );
} Marshal.FreeHGlobal( pcpd ); if ( !Win32Functions.CloseHandle( handle ) ) { Console.WriteLine( "CloseHandle code erreur: {0}", Marshal.GetLastWin32Error( ) ); } ndevice++; } } while ( handle == IntPtr.Zero ); }
static void Main( string[ ] args ) { RawDiskAccess ld = new RawDiskAccess( ); ld.getPhysicalDrive( ); }
L'éternité c'est long surtout vers la fin... 
|
|
dimanche 10 février 2008 à 13:31:59 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

Lutinore
|
Réponse acceptée !
Salut, DeviceIoControl renvoie un bool sur 32 bits, et 1 c'est TRUE.
|
|
dimanche 10 février 2008 à 13:47:25 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama
|
Merci de ton aide. DeviceIOControl retourne effectivmeent un bool et je viens de modifier l'appel et la définition ainsi : if ( Win32Functions.DeviceIoControl( handle, (uint) EIOControlCode.ChangerGetProductData, IntPtr.Zero, 0, pcpd, ( uint )Marshal.SizeOf( pcpd ), ref nBytes, IntPtr.Zero ) ) { Console.WriteLine( cpd.ProductId ); Console.WriteLine( cpd.DeviceType ); }
[System.Runtime.InteropServices.DllImport( "Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto )] public extern static bool DeviceIoControl( IntPtr hDevice, uint IoControlCode, IntPtr lpInBuffer, uint InBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, IntPtr lpOverlapped );
Mais j'ai toujous une erreur "Accès refusé"... L'éternité c'est long surtout vers la fin... 
|
|
dimanche 10 février 2008 à 15:07:04 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

Lutinore
|
Es-tu sûr que IOCTL_CHANGER_GET_PRODUCT_DATA s'applique aux disques et pas aux autres péréiphériques, les codes disque me semblent réunis dans "Disk Management Control Codes" ( IOCTL_DISK_* ).
|
|
dimanche 10 février 2008 à 18:38:18 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

Lutinore
|
Réponse acceptée !
Oui je pense que c'est ça, les disques ne doivent pas être considérés comme des "changer". J'arrive à obtenir les réultats des codes DISK mais pas avec les code CHANGER.
( Exécuter en tant qu'administrateur ).
using System; using System.Runtime.InteropServices;
namespace DeviceIO // compile with -unsafe { internal class Program /*** Run as Administrator !! ***/ { //[ StructLayout( LayoutKind.Sequential ) ] //private unsafe struct CHANGER_PRODUCT_DATA //{ // public fixed byte VendorId[/*VENDOR_ID_LENGTH*/ 8]; // public fixed byte ProductId[/*PRODUCT_ID_LENGTH*/ 16]; // public fixed byte Revision[/*REVISION_LENGTH*/ 4]; // public fixed byte SerialNumber[/*SERIAL_NUMBER_LENGTH*/ 32]; // byte DeviceType; //}
[ DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true ) ] private static extern IntPtr CreateFile ( string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile );
[ DllImport( "kernel32.dll", SetLastError = true ) ] [ return: MarshalAs( UnmanagedType.Bool ) ] private static extern bool CloseHandle( IntPtr hObject );
[ DllImport( "kernel32", SetLastError = true ) ] [ return: MarshalAs( UnmanagedType.Bool ) ] private static extern bool DeviceIoControl ( IntPtr hDevice, uint dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped );
[ DllImport( "kernel32.dll", CharSet = CharSet.Auto/*, SetLastError = true */ ) ] private static extern uint FormatMessage ( uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, ref IntPtr lpBuffer, uint nSize, IntPtr Arguments );
public static string GetLastWin32ErrorMessage( int errorCode ) { IntPtr buffer = IntPtr.Zero;
uint cnt = FormatMessage ( 0x00000100 | 0x00000200 | 0x00001000, IntPtr.Zero, ( uint )errorCode, 0, ref buffer, 0, IntPtr.Zero );
if ( cnt == 0 || buffer == IntPtr.Zero ) return String.Format( "Unknown error: {0}.", errorCode );
string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt ); Marshal.FreeHGlobal( buffer ); // LocalFree.
return errorMessage; }
private const string DISK_NAME = @"\\.\PhysicalDrive0"; // @"\\.\C:" private const uint GENERIC_READ = 0x80000000; private const uint OPEN_EXISTING = 3; private const uint FILE_SHARE_READ = 0x00000001; private const uint FILE_SHARE_WRITE = 0x00000002; //private const uint IOCTL_CHANGER_GET_PRODUCT_DATA = // ( ( 0x00000030 ) << 16 ) | ( ( 0x0001 ) << 14 ) | ( ( 0x0002 ) << 2 ) | ( 0x00 ); private const uint IOCTL_DISK_GET_LENGTH_INFO = ( ( 0x00000007 ) << 16 ) | ( ( 0x0001 ) << 14 ) | ( ( 0x0017 ) << 2 ) | ( 0x00 );
private static readonly IntPtr INVALID_HANDLE_VALUE = ( IntPtr )( -1 );
private static unsafe void Main( ) { IntPtr hDevice = CreateFile( DISK_NAME, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero );
if ( hDevice == INVALID_HANDLE_VALUE ) { Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) ); goto exit; }
Console.WriteLine( "Disk Handle: OK ..\r\n" );
uint lpBytesReturned = 0U; long length = 0L; // GET_LENGTH_INFORMATION.Length
bool res = DeviceIoControl( hDevice, IOCTL_DISK_GET_LENGTH_INFO, IntPtr.Zero, 0, ( IntPtr )( &length ), sizeof( long ), out lpBytesReturned, IntPtr.Zero );
if ( !res ) { Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) ); goto exit; }
Console.WriteLine( "Disk Length: {0}Go / {1}Gio", ( uint )( length / Math.Pow( 1000, 3 ) ), ( uint )( length / Math.Pow( 1024, 3 ) ) );
exit:
Console.ReadLine( ); // Wait.
if ( hDevice != IntPtr.Zero ) { CloseHandle( hDevice ); //hDevice = IntPtr.Zero; } } } }
|
|
lundi 18 février 2008 à 22:32:52 |
Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama
|
Bonsoir Lutinore, Ta réponse est me semble t-il à la fois juste et imcomplète. Car en effet s'il ne faut pas confondre les DISK et les CHANGER il n'en demeure pas moins que la possibilité nous est offerte (dans la doc msdn) de récupérer des infos uniquement accessiblent par IOCTL_GET_CHANGER_PRODUCT_DATA. Pour récupérer comme dans les exemples MS la géométrie du disque pas de problème (en C# et C++ non managé sous VS 2008). En revanche (pas d'exemple MS, j'en trouve pas) je prends un code retour 5, accès refusé, dès lors que je tente de récupérer les infos CHANGER_PRODUCT_DATA (en C# et C++ non managé sous VS 2008). la doc msdnThe following control codes are used with changer devices. voici la structure CHANGER_PRODUCT_DATA typedef struct _CHANGER_PRODUCT_DATA { BYTE VendorId[VENDOR_ID_LENGTH]; BYTE ProductId[PRODUCT_ID_LENGTH]; BYTE Revision[REVISION_LENGTH]; BYTE SerialNumber[SERIAL_NUMBER_LENGTH]; BYTE DeviceType; } CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;Donc je ne vois plus qu'une chose. Comment MS prévoit que nous puissions dialoguer avec ses "pseudo driver", sous XP ou vista d'ailleurs. Pourtant cela est possible car nombre de softs nous affichent (joliement ou pas) ces infos ! L'éternité c'est long surtout vers la fin... 
|
|
Cette discussion est classée dans : public, const, uint, intptr, win32functions
Répondre à ce message
Sujets en rapport avec ce message
Liste processus [ par T103 ]
Bonsoir a tous, Voila j'essaye de faire un programme qui m'affiche tous mes processus actif.Voici le code donc :[DllImport("KERNEL32.DLL",SetLastError
Process WinCE [ par churrros ]
Bonjour!
PropertyGrid : obtenir une dropdown [ par romagny13 ]
Bonjour je suis toujours sur le composant propertygrid lool bon la en fait j'essaie d'avoir pour une propriete en fait une dropdown personnalisée
Intéropérabilité C [ par facdaar ]
Salut,Je désire utiliser une dll native (en l'occurence cellcore.dll, mais peu importe) et j'ai un problème avec une structure en C que je veux déclar
Récupérer l'adresse en mémoire de la dll chargée [ par pcayrol ]
Bonjour, Je charge une dll (C++) dynamiquement (avec [U]LoadLibrary[/U]) dans mon programme C#. J'arrive à invoquer des méthodes, etc, etc... J'aimera
Récupération des données d'une fonction d'une dll native [ par maladebe ]
Salut,Je dois récupérer d'une fonction, dans une dll écrite en C/C++, un pointeur sur une structure. Je pensais avoir trouvé comment récupérer les inf
DEBUTANT - Populer un Dataset dynamique à partir de deux TableAdapter [ par Alex038 ]
Bonjour, Plate forme Visual Studio 2005.Je cherche a relier deux TableAdapter A et B (base de données differentes) pour permettre de faire afficher da
serveur et plusqu'un client [ par houcem001 ]
Salut je suis entrain de programmer une plateforme de discussion mais j'ai un probleme pour envoyer des messages à un client sachant son adresse IP .
C# - Erreur NullReferenceException [ par skyline86 ]
Bonjour, 'ai un message NullReferenceExceptionsur la ligne Program.monFormulaire.lb_log.BeginInvoke(new GPRSListener.Principale.affichageLog(
toggle button rond [ par dan001be ]
Bonjour,j'ai trouver un exemple de code pour dessiner des boutons oval etcj'essaie de creer un togglebutton (on/off) en utilisant ce code, cele foncti
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|