GENERATEUR DE GUID (WIN32)

gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010 - 13 août 2005 à 18:21
Darkvlador Messages postés 19 Date d'inscription mercredi 30 novembre 2005 Statut Membre Dernière intervention 29 octobre 2006 - 27 févr. 2007 à 16:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33227-generateur-de-guid-win32

Darkvlador Messages postés 19 Date d'inscription mercredi 30 novembre 2005 Statut Membre Dernière intervention 29 octobre 2006
27 févr. 2007 à 16:21
quelqu'un connais l'équivalence en perl ?
cs_hakim0 Messages postés 123 Date d'inscription mercredi 27 août 2003 Statut Membre Dernière intervention 12 août 2008 1
5 août 2006 à 14:33
j'ai trouver la reponse sur ce site web:
http://en.wikipedia.org/wiki/Globally_Unique_Identifier
cs_hakim0 Messages postés 123 Date d'inscription mercredi 27 août 2003 Statut Membre Dernière intervention 12 août 2008 1
5 août 2006 à 13:25
j'ai une question:
comment en peut convirtire le CLSID en GUID par exemple;
de {D27CDB6E-AE6D-11CF-96B8-444553540000} CLSID a {0xD27CDB6E,0xAE6D,0x11CF,{0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00}} GUID
Merci pour une reponse.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 juin 2006 à 03:01
j'ai bien la simpliciter du code pour les nouveau :
c = bndwtohexa(gd.be, c);
*c++ ','; *c++ '0'; *c++ = 'x';
c = bndwtohexa(gd.bf, c);
*c++ ','; *c++ '0'; *c++ = 'x';
c = bndwtohexa(gd.bg, c);
*c++ ','; *c++ '0'; *c++ = 'x';
c = bndwtohexa(gd.bh, c);
*c++ ','; *c++ '0'; *c++ = 'x';
c = bndwtohexa(gd.bi, c);
*c++ ','; *c++ '0'; *c++ = 'x';
c = bndwtohexa(gd.bj, c);
*c++ ','; *c++ '0'; *c++ = 'x';

surtout pour une source ti debutant ^^
enfin, tres pratique, quoi que un peu compliquer.
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
12 mars 2006 à 13:13
N'empêche, une grand mère par ci, une autre par là, ça peut rendre service ;)
Merci Brunews. T'es vraiment utile partout où tu es et quoi que tu fasses ;)
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
16 août 2005 à 14:45
tout simplement excellent BN, comme tjs

J'étais effectivt dans ce genre de dev; mais restant en C...

voilà qui est bcp mieux

bonne continuation

Magicalement
Nono.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 août 2005 à 11:23
2 versions dans le zip, j'ai rajouté celle par UuidCreateSequential().
J'ai laissé en comment l'appel UuidToString() si intéresse qlqun, je juge ma méthode de mise en forme plus performante car ne fait pas d'alloc mémoire.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 23:51
Vi c'est son seedRand.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 23:45
UuidSequentialNumber REG_DWORD 0x00d65316
Ca sert justement à générer des GUIDs locaux car il est probable qu'un autre PC ait le même nombre.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 23:21
Vi semble bien que le début de la structure soit rempli avec une adresse MAC si trouvée, une vraie galère à remonter tout le code.
Tu serais passé au dernier salon Linux, je faisais lire de fichiers au choix du code Win à ceux qui le voulaient.
Soyons précis, depuis mon portable connecté sur la base centrale Redmond, c'est moi qui manipulait et photos interdites, on n'est quand même pas chez l'abbé Pierre...
Regarde cette clé: HKLM\\Software\\Microsoft\\Rpc
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 22:55
Elles utilisent l'adresse MAC quand il y'a une carte réseau, sinon elle fournissent un GUID local pour le même PC.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 22:50
Clair que ce qu'on appelle généralement 'aléatoire' est souvent fait à base de date et heure.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 22:49
27 secondes entre nos posts :)
Pourtant MSDN précise que les deux fonctions utilisent l'adresse MAC:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidcreate.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidcreatesequential.asp

Et bravo pour tes fouilles aux entrailles de Windows. C'est trop fort pour moi.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 22:36
Je pense que "Globally" ne veut pas dire "globalement" dans le sens de "en général". Ils l'appellent aussi "Universal Unique Identifier" (UUID) comme dans les noms des fonctions. Ces fonctions peuvent générer deux types de GUIDs. Le premier type GUID est local et unique sur le même ordinateur. Je pense pas qu'il soit aléatoire à 100%. Je crois avoir lu qu'il utilise aussi la date et l'heure. Le deuxième type de GUID est unique et universel (monde entier). Pour cela il utilise l'adresse MAC.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 22:36
Je n'insisterai pas car je ne peux pas le mettre ici mais je suis remonté jusqu'au kernel mode de NtAllocateUuids() appelé par UiidCreateSequential() et nenni adresse MAC, ce sont des séquences de 100 nano secondes qui sont insérées et pas autre chose. Il y a une clé de base de registre qui sert de séquenceur pour la fabric du prochain GUID demandé, faut aussi que j'aille voir cette clé.
Je n'irai malheureusement pas au-delà en public dans l'investigation du code Win, il y a contrat à respecter.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 22:22
Désolé j'ai copié/collé le texte MSDN qui parle de UuidCreateSequential(). Il disent la même chose sur UuidCreate(). La seule différence entre les deux, je viens de l'apprendre, c'est que UuidCreate() utilise l'adresse MAC mais ne la met pas dans le GUID telle quelle. Alors que UiidCreateSequential() la met en clair.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 22:15
Attention au nom, c'est Globally, donc globalement unique.
Je suis justement sur l'étude de UuidCreateSequential(), il y a un appel en plus, je vérifie tout cela mais c'est long à trouver parmi ces milliers de fichiers.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 21:57
Je ne dis pas le contraire, mais si on veut garantir l'unicité globale (universelle) il faut passer par l'adresse MAC. Toujours d'après MSDN:
"The UuidCreateSequential function returns RPC_S_UUID_LOCAL_ONLY when the originating computer does not have an ethernet/token ring (IEEE 802.x) address. In this case, the generated UUID is a valid identifier, and is guaranteed to be unique among all UUIDs generated on the computer. However, the possibility exists that another computer without an ethernet/token ring address generated the identical UUID. Therefore you should never use this UUID to identify an object that is not strictly local to your computer. Computers with ethernet/token ring addresses generate UUIDs that are guaranteed to be globally unique."
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 21:47
Idem sur Server 2003 SP1.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 21:43
Vois que c'est ainsi qu'ils sont faits pour tous les produits à base MFC, et ce sont les plus gros généralement.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 21:41
alors chuuttttt, on ne répètera pas ce que j'ai dit plus haut, mais c'est pourtant ainsi sur Win XP SP2.
Je m'en vais de ce pas (ou de ce clavier) vérifier dans le code Server 2003 SP1.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 21:40
Merci pour le café :)
Normalement ce sont les créateurs du produit qui génerent le GUID et le mettent en dur dans le code pour que le programme l'enregistre dans la base de registre. Pas besoin donc de le créer avec CoCreateGuid ou autre.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 21:35
Désolé pour le double post causé par la fameuse "Erreur 500".
Voici ce que dit MSDN:
For security reasons, UuidCreate was modified so that it no longer uses a machine's MAC address to generate UUIDs. UuidCreateSequential was introduced to allow creation of UUIDs using the MAC address of a machine's Ethernet card.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 21:35
Tu peux aller regarder les dépendances de Guidgen.exe dont tous les progs sous Win se servent pour générer leur GUID, c'est CoCreateGuid qui repasse illico l'affaire à UuidCreate qui la génère tout à fait aléatoirement.
Si tu doutes je t'invite à prendre un café, je te ferai voir le code UuidCreate, peux pas mieux faire.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 21:27
GUID = global unique identifier. La plupart de ceux qui distribuent des produits utilisant un GUID se servent de l'adresse MAC de la carte réseau pour le générer. Cela garantit son unicité et élémine tout risque de ressemlance avec un autre. La même méthode est utilisée par VS mais déconseillée pour raison de sécurité réseau. En effet, 3 codes dans l'adresse MAC d'une carte réseau garantissent l'unicité:
- Le code du constructeur: 3com, intel etc....
- Le code du modèle de la carte.
- Le numéro de série de la carte.
Il est vrai qu'avec 128 bits, la date, l'heure etc... le risque de ressemblance est minime mais pas nul.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 21:17
Absolument pas, on ne regarde rien du tout, on génère 128 bits au hasard et on remplit la structure.
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
13 août 2005 à 21:13
Je te remercie beaucoup pour ce commentaire même si je connais rien en ASM. En résumé, cette fonction génère-t-il un nouveau GUID à partir des listes des GUID qui se trouve dans le registre ou comment?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 21:12
Je peux confirmer, je viens d'aller regarder le code de génération (UuidCreate).
Tout se fait comme ici par fabrication aléatoire sur 128 bits, le code Windows est bien sur tout autre mais tout aussi aléatoire.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 20:46
Un GUID ne donne aucune certitude d'unicité, il n'y a aucun moyen de le faire, d'où son nom d'ailleurs. C'est simplement la longueur de 128 bits qui donne peu de chances de retomber sur le même avant fort longtemps.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 août 2005 à 20:41
salut,
Merci pour le code, c'est très utile.
Moi aussi j'ai une petite précision à demander. Sur quoi se base ton code pour générer un GUID? Pour que ce GUID soit vraiment unique, on se sert de l'adresse MAC de la carte réseau du PC car chacune contient un identifiant unique au monde. Pour un usage limité on peut se passer de cette adresse MAC. Mais pour distribuer un produit il faut garantir que ce GUID soit unique. Comment fait donc ton code?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 20:13
RDTSC lit le time stamp counteur, result 64 bits dans EDX:EAX
EDX <<= 16
Sauve EBX
16 bits bas de EAX vont dans EDX
Place 32 bits de EAX début de pgd (le param, adresse de struct)
Inverse bits de EDX
Multiplie EAX par EBX (214013), result 64 bits dans EDX:EAX
Place 32 bits de EAX dans pgd (adresse + 8), reste +4 et + 12 à faire
EBX += EAX
8 bits bas de EDX passe dans 8 bits bas de EAX
EAX += 2531011
Place 32 bits de EBX dans pgd (adresse + 4), reste +12 à faire
Inverse bits de EAX
Restaure EBX, obligatoire tous registres hormis EAX, ECX et EDX
Place 32 bits de EAX dans pgd (adresse + 12), fini.
Retour pointeur d'instruction avec 0 octet à dépiler.
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
13 août 2005 à 19:43
Cette fonction parait interessante, juste un petit commentaire sur chaque ligne de code(pour cette fonction) s'il te plait.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 19:04
Non non, c'est la dernière grand-mère écrasée que le juge n'a pas apprécié.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 août 2005 à 18:56
BruNews confond la gauche et la droite, voila pourquoi il n'a jamais eu son permis
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2005 à 18:42
Je ne vois pas comment faire à cause de RDTSC, je ne vois pas d'équivalent en C. Sinon le reste serait trivial, à part que ça donnerait surement plus long en code.
Tu as bien fait d'en parler, en regardant je me suis aperçu d'une inversion, SHR au lieu de SHL, les <<= et >>= du C.
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
13 août 2005 à 18:21
Sans hurler, pourrais-tu traduire en C la fonction RemplirGUID(...), si possible?
Rejoignez-nous