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...
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.
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/
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.
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'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.
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/
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.
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...
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.
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...
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...
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/
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...
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/
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.
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.
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.
Manuel Leclerc
Frederic Bonroy a écrit :
[...] dans mon contexte, NtSetLdtEntries me rend un service immense et que donc je veux et dois l'utiliser. [...]
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. :-)
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_*))
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_*))
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_*))