fix(licence): l'empreinte ne depend plus de l'ordre de demarrage
BoardUUID s'appuyait sur un COM initialise par quelqu'un d'autre. Appele apres WebView2 il lisait le vrai UUID de carte mere, appele avant il echouait et retombait sur MachineGuid : deux empreintes pour une seule machine, et une licence liee a l'une que l'autre refuse. Il suffisait que licence/status parte avant l'init du navigateur pour verrouiller l'utilisateur hors de son coffre. CoInitializeEx est desormais appele sur place. Pas de CoUninitialize symetrique : essaye, il rend une violation d'acces — les mandataires WMI et le cache de type-info de ComObj se liberent plus tard, dans un appartement qu'on vient de fermer. Verifie avec un harnais qui n'initialise PAS COM : il rend maintenant la meme empreinte que l'application. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,23 @@ var
|
||||
LFetched: LongWord;
|
||||
begin
|
||||
Result := '';
|
||||
|
||||
// COM DOIT ETRE INITIALISE ICI, PAS AILLEURS PAR CHANCE.
|
||||
//
|
||||
// Sans ca, l'empreinte depend de qui a demarre avant nous : appelee apres
|
||||
// l'initialisation de WebView2 elle lit le vrai UUID de la carte mere,
|
||||
// appelee avant elle echoue et retombe sur MachineGuid — DEUX empreintes
|
||||
// differentes pour une seule machine, et une licence liee a l'une que
|
||||
// l'autre refuse. Un identifiant qui depend de l'ordre de demarrage n'est
|
||||
// pas un identifiant.
|
||||
//
|
||||
// ET ON NE LIBERE PAS. Un CoUninitialize symetrique parait propre et se
|
||||
// paie d'une violation d'acces : les mandataires WMI et le cache de
|
||||
// type-info de ComObj survivent a l'appel et se liberent plus tard, dans un
|
||||
// appartement qui n'existe plus. Laisser l'appartement ouvert pour la duree
|
||||
// du processus ne coute rien ici — cette application heberge WebView2, donc
|
||||
// COM y est de toute facon initialise et le reste.
|
||||
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
|
||||
try
|
||||
LLocator := CreateOleObject('WbemScripting.SWbemLocator');
|
||||
LServices := LLocator.ConnectServer('.', 'root\CIMV2');
|
||||
|
||||
Reference in New Issue
Block a user