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!
menu contextuel windows explorer [ par WieWeet ]
bonjour, j'ai récupéré ( http://www.codeproject.com/KB/cs/shellContextMenu.aspx ) un exemple qui affiche le menu contextuel de windows explorer. je l'
Problem de Controle invisible [ par sheppertizer ]
Bonjour a tous voila je suis en train de tester plusieurs système de transparence sur une form , le probleme est que mes controles (ProgressBar et Co
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
Help me please, that's really important and urgent [ par RaptorKiller42 ]
Hello, I have a test that I have to complete for tomorrow. I'm not really experienced but I need to pass this test to get a job, that's really importa
Tableaux dans une Structure [ par nykia ]
Bonjour, Je cherche à réaliser un tableau dans une structure. Parce que du code est plus parlant, voici ce que je souhaite faire : namespace IHM {
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|