begin process at 2012 05 27 16:34:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > GENERATEUR DE GUID (WIN32)

GENERATEUR DE GUID (WIN32)


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :guid, uniqueidentifier, newguid, générateur, win32 Niveau :Débutant Date de création :13/08/2005 Date de mise à jour :06/04/2006 22:06:40 Vu / téléchargé :10 860 / 292

Auteur : BruNews

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (36)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Un générateur de GUID un peu sur le principe de celui fourni avec VS.
Celui-ci par contre ne se sert pas de CoCreateGuid() ni aucun autre appel COM.
void __stdcall OnNewGuid(HWND hdlg)
{
  BNGUID gd;
  char buf[72], *c;
  
  RemplirGuid(&gd); // REMPLIT LES 128 BITS DU GUID
  
  // FORMAT: static const GUID <name> =
  *((DWORD*) buf) = 0x78307B; // "{0x"
  c = bndwtohexa(gd.dwa, buf + 3);
  *c++ = ','; *c++ = '0'; *c++ = 'x';
  c = bndwtohexa(gd.wb, c);
  *c++ = ','; *c++ = '0'; *c++ = 'x';
  c = bndwtohexa(gd.wc, c);
  *c++ = ','; *c++ = '{'; *c++ = '0'; *c++ = 'x';
  c = bndwtohexa(gd.bd, c);
  *c++ = ','; *c++ = '0'; *c++ = 'x';
  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';
  c = bndwtohexa(gd.bk, c);
  *c = '}'; *(c+1) = '}'; *(c+2) = 0;
  SetDlgItemText(hdlg, IDED_CONST, buf);
  
  // FORMAT BASE DE REGISTRES:
  buf[0] = '{';
  c = bndwhex(gd.dwa, buf + 1);
  *c++ = '-';
  c = bnwhex(gd.wb, c);
  *c++ = '-';
  c = bnwhex(gd.wc, c);
  *c++ = '-';
  c = bnbhex(gd.bd, c);
  c = bnbhex(gd.be, c);
  *c++ = '-';
  c = bnbhex(gd.bf, c);
  c = bnbhex(gd.bg, c);
  c = bnbhex(gd.bh, c);
  c = bnbhex(gd.bi, c);
  c = bnbhex(gd.bj, c);
  c = bnbhex(gd.bk, c);
  *c = '}'; *(c+1) = 0;
  SetDlgItemText(hdlg, IDED_REG, buf);
}

C'est du "prêt-à-porter", on utilise le prog tel quel sinon importer les funcs dans son code pour faire du GUID à l'exécution.
Tout est en ASM, regarde qui veut mais pas la peine d'hurler svp.
Renommer fichier toc du dossier release en exe pour utiliser.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   bnGUID
  •   bnGUID1

Télécharger le zip


 Historique

13 août 2005 18:38:23 :
Correction sur RemplirGuid().
14 août 2005 11:19:24 :
2 projets dans zip.
14 août 2005 11:29:13 :
EXEs disponibes, renommer les toc.
26 octobre 2005 16:44:18 :
site
06 avril 2006 22:06:40 :
Commentaire.

 Sources du même auteur

Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64)
Source avec Zip Source avec une capture FIND TEXT (WIN64)
Source avec Zip DELETE DIRECTORY (WIN64)
Source avec Zip ENUM DIRECTORY (WIN64)
Source avec Zip TEMPLATES C/C++ POUR VS 2010

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip WIN32 ET MVVM par dguilmain
Source avec Zip WINDOWCAPTURE par FrancoisGauthier
Source avec Zip Source avec une capture GÉNÉRATEUR FM EXPÉRIMENTAL par tontonCD
Source avec une capture GÉNÉRATEUR DE CLÉS SUR 26 DIGITS AU FORMAT HEXADÉCIMAL par besilent
Source avec Zip EASYLIB WIN32 C++ POUR DU PROTOTYPAGE RAPIDE par gourky

Commentaires et avis

Commentaire de gagah1 le 13/08/2005 18:21:11

Sans hurler, pourrais-tu traduire en C la fonction RemplirGUID(...), si possible?

Commentaire de BruNews le 13/08/2005 18:42:20 administrateur CS

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.

Commentaire de vecchio56 le 13/08/2005 18:56:18 administrateur CS

BruNews confond la gauche et la droite, voila pourquoi il n'a jamais eu son permis

Commentaire de BruNews le 13/08/2005 19:04:53 administrateur CS

Non non, c'est la dernière grand-mère écrasée que le juge n'a pas apprécié.

Commentaire de gagah1 le 13/08/2005 19:43:22

Cette fonction parait interessante, juste un petit commentaire sur chaque ligne de code(pour cette fonction) s'il te plait.

Commentaire de BruNews le 13/08/2005 20:13:38 administrateur CS

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.

Commentaire de racpp le 13/08/2005 20:41:55 administrateur CS

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?

Commentaire de BruNews le 13/08/2005 20:46:36 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 21:12:23 administrateur CS

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.

Commentaire de gagah1 le 13/08/2005 21:13:33

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?

Commentaire de BruNews le 13/08/2005 21:17:31 administrateur CS

Absolument pas, on ne regarde rien du tout, on génère 128 bits au hasard et on remplit la structure.

Commentaire de racpp le 13/08/2005 21:27:48 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 21:35:13 administrateur CS

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.

Commentaire de racpp le 13/08/2005 21:35:17 administrateur CS

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.

Commentaire de racpp le 13/08/2005 21:40:47 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 21:41:46 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 21:43:28 administrateur CS

Vois que c'est ainsi qu'ils sont faits pour tous les produits à base MFC, et ce sont les plus gros généralement.

Commentaire de BruNews le 13/08/2005 21:47:43 administrateur CS

Idem sur Server 2003 SP1.

Commentaire de racpp le 13/08/2005 21:57:26 administrateur CS

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."

Commentaire de BruNews le 13/08/2005 22:15:15 administrateur CS

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.

Commentaire de racpp le 13/08/2005 22:22:09 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 22:36:31 administrateur CS

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.

Commentaire de racpp le 13/08/2005 22:36:58 administrateur CS

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.

Commentaire de racpp le 13/08/2005 22:49:22 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 22:50:17 administrateur CS

Clair que ce qu'on appelle généralement 'aléatoire' est souvent fait à base de date et heure.

Commentaire de racpp le 13/08/2005 22:55:14 administrateur CS

Elles utilisent l'adresse MAC quand il y'a une carte réseau, sinon elle fournissent un GUID local pour le même PC.

Commentaire de BruNews le 13/08/2005 23:21:19 administrateur CS

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

Commentaire de racpp le 13/08/2005 23:45:35 administrateur CS

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.

Commentaire de BruNews le 13/08/2005 23:51:41 administrateur CS

Vi c'est son seedRand.

Commentaire de BruNews le 14/08/2005 11:23:32 administrateur CS

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.

Commentaire de magic_Nono le 16/08/2005 14:45:26

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.

Commentaire de Joky le 12/03/2006 13:13:48

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 ;)

Commentaire de wxccxw le 30/06/2006 03:01:30

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.

Commentaire de hakim0 le 05/08/2006 13:25:15

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.

Commentaire de hakim0 le 05/08/2006 14:33:09

j'ai trouver la reponse sur ce site web:
http://en.wikipedia.org/wiki/Globally_Unique_Identifier

Commentaire de Darkvlador le 27/02/2007 16:21:51

quelqu'un connais l'équivalence en perl ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Win32(control) [ par NitRic ] Bonjour, pour mon premier prog Win32 en C++ j'ai décider de faire un petit NotPad sauf que la j'ai un problème:J'ai fais des menu et dans le menu Édi Où trouver le Win32 SDK ? [ par PierreP ] ... avec un help ou qqchose de ce genre qui explique comment on utilise les fonctions.Impossible de le trouver sur Le site de Microsoft ! changé curseur dans application Win32 [ par Stoomm ] Bonjour, j'aimerais chargé un curseur autre que celui par défault dans une appli Win32.Quelqu'un peut il me donner la marche à suivre svp.Merci d'avan changé curseur dans application Win32 [ par Stoomm ] Bonjour, j'aimerais chargé un curseur autre que celui par défault dans une appli Win32.Quelqu'un peut il me donner la marche à suivre svp.Merci d'avan demande librairie gtk pour win32 [ par francky ] quelqu'un pourrait-il me donner la librairie gtk.h?ou alors des liens vers des exemples d'interface graphique réaliséemerci d'avance. lien vers librairie glut pour win32 [ par francky ] m'étant fait déja passé pour un con ne sachant pas lire,pour tout ceux qui débutent et ne trouve pas la librairie glut pour windows permettant de cree gtk & win32 & Visual C++ [ par Paisible ] je vais peut être me faire jeter, mais bon...j'ai cherché dans le forum... et impossible de trouver la trace d'un quelconque post concernant la config win32 et sous-classement [ par mozert ] hi.mmm... mwai.. voila mon probleme..le sous-classement (subclassing)..est-il possible de sous-classer une fenetre appartenant à un processus differen Bouton en Win32 [ par punx120 ] J'aimearis savoir comment faire pour faire un bouton avecun bitmap, comme on peut le faire avec CBitmapButton, mais en win32merci @ + Win32 [ par NettoyeurFantome ] Je cherche des cours sur l'API Win32.@+Julien IBARZ alias [Nettoyeur]Fantome


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales