OVH Cloud OVH Cloud

GetThreadSelectorEntry/GetCurrentThread

11 réponses
Avatar
Frederic Bonroy
Bonjour,

j'ai constaté que GetThreadSelectorEntry(GetCurrentThread, ..., ...)
fonctionne très bien dans le thread principal d'un processus, mais dans
un thread créé par CreateThread, GetThreadSelectorEntry retourne hélas
ERROR_INVALID_THREAD_ID. Inutile de dire que GetCurrentThreadId ne le
rend pas non plus heureux...

Y aurait-il un rapport avec les droits d'accès? Je n'y comprends rien
dans ces fameux attributs de sécurité, alors à la place de
lpThreadAttributes j'ai simplement passé 0.

J'utilise Delphi 6 si cela a une quelleconque importance...

10 réponses

1 2
Avatar
AMcD®
Frederic Bonroy wrote:
Bonjour,

j'ai constaté que GetThreadSelectorEntry(GetCurrentThread, ..., ...)
fonctionne très bien dans le thread principal d'un processus, mais
dans un thread créé par CreateThread, GetThreadSelectorEntry retourne
hélas ERROR_INVALID_THREAD_ID. Inutile de dire que GetCurrentThreadId
ne le rend pas non plus heureux...

Y aurait-il un rapport avec les droits d'accès? Je n'y comprends rien
dans ces fameux attributs de sécurité, alors à la place de
lpThreadAttributes j'ai simplement passé 0.



Mouarf, qu'est-ce que tu fous là toi :-).

As-tu bien calculé/vérifié les droits du thread ? C'est souvent cela qui
génère des gags.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_security_and_access_rights.asp

Sinon, pourquoi utilises-tu cette horreur de GetThreadSelectorEntry(). Tu
veux convertir des adresses ? J'ai posté un truc là-dessus il n'y a pas
longtemps ici même.

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Frederic Bonroy
AMcD® wrote:

Mouarf, qu'est-ce que tu fous là toi :-).



C'est très rare mais c'est pas la première fois. :-)

As-tu bien calculé/vérifié les droits du thread ? C'est souvent cela qui
génère des gags.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_security_and_access_rights.asp



C'est sans doute là le problème. Je crois que le problème c'est
THREAD_QUERY_INFORMATION. Hélas pour créer un thread qui ait ce droit
d'accès, ben... l'ennui c'est que cette structure lpThreadAttributes est
plus que mystérieuse et la documentation ne m'aide pas beaucoup. :-(

Sinon, pourquoi utilises-tu cette horreur de GetThreadSelectorEntry(). Tu
veux convertir des adresses ? J'ai posté un truc là-dessus il n'y a pas
longtemps ici même.



J'utilise NtSetLdtEntries pour ajouter un ou des descripteurs à la LDT.
J'utilise ensuite GetThreadSelectorEntry pour vérifier si le descripteur
ajouté par NtSetLdtEntries a effectivement été rajouté à la LDT ou pas.
Comme NtSetLdtEntries n'est pas documenté*, je ne sais pas comment
interpréter une éventuelle valeur qu'il pourrait retourner, donc je suis
obligé de faire cet affreux détour pour vérifier que le descripteur a
été ajouté.

Si toi ou quelqu'un d'autre sait comment interpréter les valeurs
retournées par NtSetLdtEntries, ça m'arrangerait bien. Ce serait plus
élégant.







* On pourrait mener une discussion interminable si oui ou non c'est bien
d'utiliser une fonction non-documentée susceptible de changer ou
disparaître avec toute nouvelle version de Windows, mais la réalité
c'est que dans mon contexte, NtSetLdtEntries me rend un service immense
et que donc je veux et dois l'utiliser. A moins que tu connaisses une
autre méthode plus élégante et "légale" de manipuler la LDT...
Avatar
AMcD®
Frederic Bonroy wrote:

Si toi ou quelqu'un d'autre sait comment interpréter les valeurs
retournées par NtSetLdtEntries, ça m'arrangerait bien. Ce serait plus
élégant.



Je veux bien te filer un lien mais ailleurs, ici, je vais me faire tuer...

* On pourrait mener une discussion interminable si oui ou non c'est
bien d'utiliser une fonction non-documentée susceptible de changer ou
disparaître avec toute nouvelle version de Windows, mais la réalité
c'est que dans mon contexte, NtSetLdtEntries me rend un service
immense et que donc je veux et dois l'utiliser. A moins que tu
connaisses une autre méthode plus élégante et "légale" de manipuler
la LDT...



Ailleurs :-)

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Frederic Bonroy
AMcD® wrote:

Je veux bien te filer un lien mais ailleurs, ici, je vais me faire tuer...



On est dans un quartier sensible ici ou quoi...? ;-)

* On pourrait mener une discussion interminable si oui ou non c'est
bien d'utiliser une fonction non-documentée susceptible de changer ou
disparaître avec toute nouvelle version de Windows, mais la réalité
c'est que dans mon contexte, NtSetLdtEntries me rend un service
immense et que donc je veux et dois l'utiliser. A moins que tu
connaisses une autre méthode plus élégante et "légale" de manipuler
la LDT...




Ailleurs :-)



Attends que je tente d'ajouter un descripteur bidon... hihihi, ça a
l'air de donner le résultat attendu. :-)

Maintenant un descripteur valide... vouais! Pareil, c'est le résultat
attendu. Du moins sous Windows 2000. Faut espérer que c'est pareil sous
XP et les autres NT.


Sinon j'ai eu une autre idée. Comme à priori tous les threads d'un
processus se partagent la même LDT (non?), je pourrais appeler
GetThreadSelectorEntry avec le handle du thread principal. Mais bon, je
préfère largement la nouvelle solution secrète que je vais appliquer de
ce pas. ;-)

Toujours est-il que si quelqu'un a une méthode *officielle* pour écrire
dans la LDT, je suis preneur.
Avatar
Manuel Leclerc
Frederic Bonroy a écrit :

[...] dans mon contexte, NtSetLdtEntries me rend un service
immense et que donc je veux et dois l'utiliser. [...]



Et c'est quoi le contexte et le service immense ?

--
Minitel : 36 15 Boulet
Police/pompier : 18
7+14 : 21
--ackboo
Avatar
Frederic Bonroy
Manuel Leclerc wrote:

[...] dans mon contexte, NtSetLdtEntries me rend un service
immense et que donc je veux et dois l'utiliser. [...]




Et c'est quoi le contexte et le service immense ?



La création d'un segment de code 16 bits dans un environnement 32 bits.
Avatar
Olivier Huet
"Frederic Bonroy" wrote in message
news:

La création d'un segment de code 16 bits dans un environnement 32 bits.




Pourquoi vouloir faire quelque-chose comme ça : un émulateur ???

Ou bien peut-être quelque-chose de plus méchant...


Olivier Huet
Avatar
AMcD®
Olivier Huet wrote:

Ou bien peut-être quelque-chose de plus méchant...



Non, t'inquiète, je veille au grain :-)

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Frederic Bonroy
Olivier Huet wrote:

Pourquoi vouloir faire quelque-chose comme ça : un émulateur ???



Dans ces eaux là, oui.

Ou bien peut-être quelque-chose de plus méchant...



Hihi, non, si vous pensez ça vous me connaissez mal. :-)
Avatar
Christian ASTOR
Frederic Bonroy wrote:

Comme NtSetLdtEntries n'est pas documenté*, je ne sais pas comment
interpréter une éventuelle valeur qu'il pourrait retourner, donc je suis
obligé de faire cet affreux détour pour vérifier que le descripteur a
été ajouté.



Il renvoie STATUS_SUCCESS si bon
(sinon des valeurs comme STATUS_INVALID_LDT_DESCRIPTOR
ou valeurs de retour de KiSwapThread()(WAIT_*))
1 2