Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2022-05

definition of "THREADNAME_INFO = record" IN procedure RaiseMSVCExceptionMethod in rtl\win\systhrd.inc

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Martin Frb

https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-raiseexception

|void RaiseException( [in] DWORD dwExceptionCode, [in] DWORD dwExceptionFlags, [in] DWORD nNumberOfArguments, [in] const ULONG_PTR *lpArguments );|

In the below code some fields are 32bit (DWord). But according to msdn they are  "ULONG_PTR" (64 bit on Win64).
(Same in ExceptionRecord, which is delivered to an attached debugger: https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-exception_record )

Well, the fields may be 32bit (if the data stored is that size), as long as they each align on the next 8 byte boundary.
Only they do not.
- dwType (offset 0) => ok
- szName (offset 8) => still in the correct location.
- dwThreadId too (offset 16)
- dwflags (offset 20)  overrides the upper (empty) DWord of dwThreadId   Yes, I checked => dwFlags is aligned at offset 20. But it should be 24.

Further more "div SizeOf(DWord)" => gives 6 params (the record has a size of 24). But there are only 4 params.

https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-set-a-thread-name-in-native-code?view=vs-2022 Microsoft  also has DWord as type for the fields. But I am not sure how they will be aligned.
However they do "sizeof(info) / sizeof(ULONG_PTR)"

-------------------------------------

     procedure RaiseMSVCExceptionMethod(threadHandle: TThreadID; const
ThreadName: AnsiString);
     const
       MS_VC_EXCEPTION: DWord = $406D1388;
     type
       THREADNAME_INFO = record
         dwType: DWord; // Must be 0x1000.
         szName: PAnsiChar; // Pointer to name (in user addr space).
         dwThreadID: DWord; // Thread ID (-1=caller thread).
         dwFlags: DWord; // Reserved for future use, must be zero.
       end;
     var
       thrdinfo: THREADNAME_INFO;
     begin
       thrdinfo.dwType:=$1000;
       ;
       thrdinfo.dwThreadID:=threadHandle;
       thrdinfo.dwFlags:=0;
       try
         RaiseException(MS_VC_EXCEPTION, 0, SizeOf(thrdinfo) div
SizeOf(DWord), @thrdinfo);
       except
         {do nothing}
       end;
     end;

Reply by email