Problemas con GetThreadContext y estructura CONTEXT

6 views
Skip to first unread message

aguml

unread,
May 23, 2020, 6:12:33 AM5/23/20
to CyC++ Buenos Aires
Buenas, estoy liado con un código el cual contiene una clase para crear un depurador de x64 para Windows. Lo estoy creando en Embarcadero RAD 10.3 y el problema que tengo es que al llamar a GetThreadContext me da el error 998 que es que se ha denegado el acceso a la memoria. Según me he estado informando es por la alineación de la estructura ya que se tiene que alinear a 16.
Si miro en la cabecera donde se declara la estructura CONTEXT veo esto:
[CODE]typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
[/CODE]
Miro como se define DECLSPEC_ALIGN y veo esto:
[CODE]#ifndef DECLSPEC_ALIGN
#if (_MSC_VER >= 1300) && !defined(MIDL_PASS) && !defined(__CODEGEARC__)
#define DECLSPEC_ALIGN(x) __declspec(align(x))
#elif defined(__clang__) && !defined(MIDL_PASS)
#define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
#else
#define DECLSPEC_ALIGN(x)
#endif
#endif
[/CODE]
He intentado hacer esto antes de usar la cabecera winnt.h que es donde se declara nodo eso:
[CODE]#ifdef DECLSPEC_ALIGN
#undef DECLSPEC_ALIGN
#endif
#define DECLSPEC_ALIGN(x) __declspec(align(x))
[/CODE]
Pero no me ha funcionado y me sigue dando el mismo error.
Si no hago nada la define como:
[CODE]define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
[/CODE]
¿Podéis ayudarme?

Rafael Ontivero

unread,
May 23, 2020, 6:29:20 AM5/23/20
to cp...@googlegroups.com
Si el problema real es el alineamiento, tendrás que ver cómo se alienan las estructuras en C++ Builder.

Lo mismo esto se sirve:


De todos modos, en win32, para que una aplicación pueda “debuguear”, necesita permisos de debugger, que no tengo ni idea cómo se obtienen.

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver este debate en la Web, visita https://groups.google.com/d/msgid/cppba/5392d48c-b2b5-4c72-9c37-94d2f87f2176%40googlegroups.com.

aguml

unread,
May 23, 2020, 7:39:10 AM5/23/20
to CyC++ Buenos Aires
El tema de privilegio de Debug ya lo tengo resuelto aunque para depurar a un proceso tienes que tener igual privilegios o superior, solo para depurar los procesos SYSTEM se necesita realmente ese privilegio.
Sobre el enlace tengo que mirarlo porque entiendo que como creo la estructura ya debería de funcionar pero vi eso que ponía de #pragma(push,16)
...
#pragma(pop)
Pero no sé dónde debería de probar eso, o sea en qué punto pongo cada uno.

Rafael Ontivero

unread,
May 23, 2020, 8:34:51 AM5/23/20
to cp...@googlegroups.com
¿No viene el C++ Builder con documentación?

Es que realmente no sé cómo se define el alienado de estructuras en C++ Buidler, hace muchos años que no lo uso.

Pero debería ser algo así como:

#pragma align(push,16)
struct LoQueSea
{

};
#pragma align(pop)
> --
> --
> ¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
> En caso de duda visita "http://groups.google.com/group/cppba"
> ---
> Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
> Para ver este debate en la Web, visita https://groups.google.com/d/msgid/cppba/b8e0d362-63c8-4527-b7fe-b9af1f08eedc%40googlegroups.com.

Rafael Ontivero

unread,
May 23, 2020, 8:36:05 AM5/23/20
to cp...@googlegroups.com
Bueno,

#pragma pack(push,16)
Etc

Martin Galvan

unread,
May 23, 2020, 10:54:35 PM5/23/20
to CyC++ Buenos Aires
Si el problema es realmente el alineamiento, C++11 tiene la keyword alignas que capaz puede servirte: https://en.cppreference.com/w/cpp/language/alignas

La ventaja es que es algo propio del lenguaje, y no estarias dependiendo de ningun compilador especifico.

aguml

unread,
May 24, 2020, 1:46:08 AM5/24/20
to CyC++ Buenos Aires
Gracias amigos, al final di con el problema. El código era el de x86 y lo estaba adaptando a x64, pues bien, la dichosa estructura en x86 tiene que estar alineada a 8 bytes y para ello antes de la declaración de la clase había un pragma pack(push,8) y al final estaba su respectivo pragma pop con lo que quitando ambas ya fubciona y me deja depurar y ahora toca ir viendo los fallos que vayan saliendo.
De momento me estoy peleando con el atacheo, que en la versión de x86 va perfecto pero en esta versión se cierra el proceso sin pasar por el evento de exit_process. Algo que vi también es que cuando inició una depuración, si cierro el proceso tampoco pasa por el evento exit_process. Ya os iré comentando.
Reply all
Reply to author
Forward
0 new messages