كتلة معلومات مؤشر الترابط Win32
كتلة معلومات الخيط ( TIB ) أو كتلة بيئة الخيط ( TEB ) هي بنية بيانات في نظام التشغيل Win32 على معالجات x86، تخزن معلومات حول الخيط قيد التشغيل حاليًا . وهي مشتقة من بنية مماثلة في نظام التشغيل OS/2 ، ومتوافقة معها على أنظمة 32 بت . [ 1 ]
لا يوجد توثيق رسمي لـ TIB في أنظمة Windows 9x . يتضمن Windows NT series DDK (وكذلك تطبيق MinGW / ReactOSNT_TIB ) بنية بيانات winnt.hتوثق الجزء المستقل عن النظام الفرعي. حتى قبل توثيق TIB بشكل فعلي، بدأت العديد من التطبيقات باستخدام حقوله التي تُعد جزءًا من واجهة برمجة التطبيقات (API) . يُشار إلى الحقل الأول الذي يحتوي على إطار SEH ، على وجه الخصوص، بواسطة الكود الذي ينتجه مُصرّف Microsoft نفسه. [ 1 ] الجزء الخاص بنظام Win32 الفرعي من TEB غير موثق، لكن Wine يتضمن تعريفًا لـ TEB winternl.h. [ 2 ]
يمكن استخدام TIB للحصول على معلومات كثيرة حول العملية دون استدعاء واجهة برمجة تطبيقات Win32. ومن الأمثلة على ذلك محاكاة [اسم العملية] GetLastError(). GetVersion()ومن خلال المؤشر إلى PEB، يمكن الوصول إلى جداول الاستيراد (IAT)، ومعاملات بدء تشغيل العملية، واسم الصورة، وما إلى ذلك. ويتم الوصول إليه من سجل مقطع FS في أنظمة Windows 32 بت، ومن GS في أنظمة Windows 64 بت.
محتويات ملف TIB على نظام التشغيل ويندوز
يستند هذا الجدول إلى عمل Wine على مكونات نظام التشغيل Microsoft Windows الداخلية. [ 2 ]
| بايت/ النوع | الإزاحة (32 بت، نظام الملفات) | الإزاحة (64 بت، GS) | إصدارات ويندوز | وصف |
|---|---|---|---|---|
| مؤشر | FS:[0x00] | GS:[0x00] | ويندوز 9x وإن تي | إطار معالجة الاستثناءات المهيكلة الحالي (SEH) ملاحظة: يستخدم إصدار 64 بت من نظام التشغيل Windows عملية فك المكدس التي تتم في وضع النواة بدلاً من ذلك. |
| مؤشر | FS:[0x04] | GS:[0x08] | ويندوز 9x وإن تي | قاعدة المكدس / أسفل المكدس (عنوان عالي) |
| مؤشر | FS:[0x08] | GS:[0x10] | ويندوز 9x وإن تي | حد المكدس / سقف المكدس (عنوان منخفض) |
| مؤشر | FS:[0x0C] | GS:[0x18] | العهد الجديد | SubSystemTib |
| مؤشر | FS:[0x10] | GS:[0x20] | العهد الجديد | بيانات الألياف |
| مؤشر | FS:[0x14] | GS:[0x28] | ويندوز 9x وإن تي | خانة بيانات عشوائية |
| مؤشر | FS:[0x18] | GS:[0x30] | ويندوز 9x وإن تي | العنوان الخطي لـ TEB |
| نهاية الجزء المستقل عن نظام التشغيل NT ؛ الأجزاء أدناه تعتمد على Win32 | ||||
| مؤشر | FS:[0x1C] | GS:[0x38] | العهد الجديد | مؤشر البيئة |
| مؤشر | FS:[0x20] | GS:[0x40] | العهد الجديد | معرّف العملية (في بعض توزيعات ويندوز، يُستخدم هذا الحقل كـ DebugContext) |
| 4 | FS:[0x24] | GS:[0x48] | العهد الجديد | معرف الخيط الحالي |
| مؤشر | FS:[0x28] | GS:[0x50] | العهد الجديد | معالج RPC نشط |
| مؤشر | FS:[0x2C] | GS:[0x58] | ويندوز 9x وإن تي | العنوان الخطي لمصفوفة التخزين المحلية للخيط |
| مؤشر | FS:[0x30] | GS:[0x60] | العهد الجديد | العنوان الخطي لكتلة بيئة العملية (PEB) |
| 4 | FS:[0x34] | GS:[0x68] | العهد الجديد | رقم الخطأ الأخير |
| 4 | FS:[0x38] | GS:[0x6C] | العهد الجديد | عدد الأقسام الحيوية المملوكة |
| مؤشر | FS:[0x3C] | GS:[0x70] | العهد الجديد | عنوان سلسلة اتصال عميل CSR |
| مؤشر | FS:[0x40] | GS:[0x78] | العهد الجديد | معلومات عن خيوط Win32 |
| 124 | FS:[0x44] | GS:[0x80] | NT، نبيذ | معلومات عميل Win32 (NT)، بيانات user32 الخاصة (Wine)، 0x60 = LastError (Win95&98)، 0x74 = LastError (WinME) |
| مؤشر | FS:[0xC0] | GS:[0x100] | العهد الجديد | محجوز لـ Wow64. يحتوي على مؤشر إلى FastSysCallفي Wow64. |
| 4 | FS:[0xC4] | GS:[0x108] | العهد الجديد | اللغة الحالية |
| 4 | FS:[0xC8] | GS:[0x10C] | العهد الجديد | سجل حالة برامج FP |
| 216 | FS:[0xCC] | GS:[0x110] | NT، نبيذ | محجوز لنظام التشغيل (NT)، بيانات kernel32 الخاصة (Wine) هنا: FS:[0x124] 4 مؤشر NT إلى بنية KTHREAD( )ETHREAD |
| 4 | FS:[0x1A4] | GS:[0x2C0] | العهد الجديد | رمز الاستثناء |
| 18 | FS:[0x1A8] | GS:[0x2C8] | العهد الجديد | مكدس سياق التنشيط |
| 24 | FS:[0x1BC] | GS:[0x2E8] | NT، نبيذ | بايتات احتياطية (NT)، بيانات ntdll الخاصة (Wine) |
| 40 | FS:[0x1D4] | GS:[0x300] | NT، نبيذ | محجوز لنظام التشغيل (NT)، بيانات ntdll الخاصة (Wine) |
| 1248 | FS:[0x1FC] | GS:[0x350] | NT، نبيذ | GDI TEB Batch (نظام التشغيل)، البيانات الخاصة vm86 (النبيذ) |
| 4 | FS:[0x6DC] | GS:[0x838] | العهد الجديد | منطقة GDI |
| 4 | FS:[0x6E0] | GS:[0x840] | العهد الجديد | قلم GDI |
| 4 | FS:[0x6E4] | GS:[0x848] | العهد الجديد | فرشاة GDI |
| 4 | FS:[0x6E8] | GS:[0x850] | العهد الجديد | معرف العملية الحقيقي |
| 4 | FS:[0x6EC] | GS:[0x858] | العهد الجديد | معرف الموضوع الحقيقي |
| 4 | FS:[0x6F0] | GS:[0x860] | العهد الجديد | معالج العملية المخزن مؤقتًا في GDI |
| 4 | FS:[0x6F4] | GS:[0x868] | العهد الجديد | معرّف عملية عميل GDI (PID) |
| 4 | FS:[0x6F8] | GS:[0x86C] | العهد الجديد | معرّف مؤشر ترابط عميل GDI (TID) |
| 4 | FS:[0x6FC] | GS:[0x870] | العهد الجديد | معلومات لغة خيوط GDI |
| 20 | FS:[0x700] | GS:[0x878] | العهد الجديد | مخصص لتطبيق المستخدم |
| 1248 | FS:[0x714] | GS:[0x890] | العهد الجديد | محجوز لـ GL (انظر مرجع النبيذ للاطلاع على التفاصيل الداخلية) [ 2 ] |
| 4 | FS:[0xBF4] | GS:[0x1250] | العهد الجديد | قيمة الحالة الأخيرة |
| 532 | FS:[0xBF8] | GS:[0x1258] | العهد الجديد | UNICODE_STRINGالمخزن المؤقت الثابت |
| مؤشر | FS:[0xE0C] | GS:[0x1478] | العهد الجديد | يُعرف أيضًا باسم DeallocationStack، وهو يُحدد عنوان البداية الفعلي لمخزن المكدس، والذي يُحدد بدوره الحد الأقصى الحقيقي للمكدس. هذا الحد أقل ببضع صفحات من حقل حد المكدس، لأن الأخير يتضمن صفحات الحماية المستخدمة لإدارة نمو المكدس. [ 3 ] |
| مؤشر[] | FS:[0xE10] | GS:[0x1480] | العهد الجديد | فتحات TLS، 4/8 بايت لكل فتحة، 64 فتحة |
| 8 | FS:[0xF10] | GS:[0x1680] | العهد الجديد | روابط TLS ( LIST_ENTRYالبنية) |
| 4 | FS:[0xF18] | GS:[0x1690] | العهد الجديد | VDM |
| 4 | FS:[0xF1C] | GS:[0x1698] | العهد الجديد | محجوز لـ RPC |
| 4 | FS:[0xF28] | GS:[0x16B0] | العهد الجديد | وضع خطأ الخيط ( RtlSetThreadErrorMode) |
| 4 | FS:[0xF78] | GS:[0x1748] | العهد الجديد | بايتات المكدس المضمونة |
| هذا ليس الجدول الكامل؛ راجع مرجع Wine للاطلاع على جميع الحقول حتى FS:[0xfb4] / GS:[17c8]. [ 2 ] تعمل إصدارات Windows الأحدث على توسيع حجم TIB، ليصل إلى 0x1000/0x1838 في Windows 10. وقد أُزيلت بعض الحقول الملحقة، مما أدى إلى تعريفات متضاربة. [ 4 ] | ||||
يشير نظام الملفات (FS) (للأنظمة 32 بت) أو نظام الملفات (GS) (للأنظمة 64 بت) إلى ملف TIB مُضمّن في كتلة بيانات تُعرف باسم TDB (قاعدة بيانات الخيوط). يحتوي ملف TIB على سلسلة معالجة الاستثناءات الخاصة بالخيط ومؤشر إلى TLS (التخزين المحلي للخيط). يختلف التخزين المحلي للخيط عن التخزين المحلي للغة C.
معلومات المكدس المخزنة في TIB
يجب أن يكون بإمكان العملية تحريك مكدس سلاسلها طالما أنها تُحدّث المعلومات المخزنة في جدول معلومات السلاسل (TIB) وفقًا لذلك. تُعدّ بعض الحقول أساسية في هذا الشأن: قاعدة المكدس، وحدود المكدس، ومكدس إلغاء التخصيص، وبايتات المكدس المضمونة، والمخزنة على التوالي عند الإزاحات 0x8و 0x10و 0x1478في 0x174864 بت. تقرأ وظائف نواة ويندوز المختلفة هذه القيم وتكتبها، خاصةً لتمييز تجاوزات المكدس عن أخطاء صفحات القراءة/الكتابة الأخرى (ستؤدي قراءة أو كتابة صفحة محمية ضمن حدود المكدس في بايتات المكدس المضمونة إلى توليد استثناء تجاوز المكدس بدلاً من انتهاك الوصول). يُعدّ مكدس إلغاء التخصيص مهمًا لأن واجهة برمجة تطبيقات ويندوز تسمح بتغيير عدد الصفحات المحمية: SetThreadStackGuaranteeتسمح الدالة بقراءة المساحة الحالية وتوسيعها. لقراءتها، تقرأ الحقل GuaranteedStackBytes، ولتوسيعها، تستخدم لإلغاء تخصيص صفحات المكدس. DeallocationStackقد يؤدي تعيين حدود المكدس دون تعيين SetThreadStackGuaranteeإلى سلوك غير متوقع في . على سبيل المثال، سيتم استبدال حدود المكدس بقيم خاطئة. تستدعي مكتبات مختلفة SetThreadStackGuarantee، على سبيل المثال، يستخدمها .NET CLR لإعداد مكدس سلاسلها.
الوصول إلى TIB
يمكن الوصول إلى TIB الخاص بالخيط الحالي كإزاحة لسجل المقطع FS (x86) أو GS (x64).
ليس من الشائع الوصول إلى حقول TIB عن طريق إزاحة من FS:[0]، بل يتم أولاً الحصول على مؤشر مرجعي خطي ذاتي إليها مخزن في FS:[18h]. يمكن استخدام هذا المؤشر مع عمليات حسابية على المؤشرات أو تحويله إلى مؤشر بنية .
باستخدام Microsoft Windows SDK أو ما شابه، يمكن للمبرمج استخدام دالة مضمنة معرفة في winnt.hnamed NtCurrentTebوالتي تُرجع عنوان كتلة معلومات مؤشر الترابط الحالية كـ NT_TIB *. [ 5 ]
فيما يلي طرق الوصول البديلة لبنى IA-32 :
// gcc (تجميع مضمن على نمط AT&T). void * getTIB ( void ) { register void * pTIB ; #if defined(__x86_64__) || defined(__amd64__) __asm__ ( "movq %%gs:0x30, %0" : "=r" ( pTIB )); #elif defined(__i386__) __asm__ ( "movl %%fs:0x18, %0" : "=r" ( pTIB )); #else #error بنية غير مدعومة #endif return pTIB ; }// gcc (مساحات العناوين المسماة، كما هو الحال في إصدار التجميع المضمن على -O1 أو -ftree-ter). void * getTIB ( void ) { #if defined(__x86_64__) || defined(__amd64__) #ifndef __SEG_GS #error إصدار GCC غير مدعوم #endif return * ( void * __seg_gs * ) 0x30 ; #elif defined(__i386__) #ifndef __SEG_FS #error إصدار GCC غير مدعوم #endif return * ( void * __seg_fs * ) 0x18 ; #else #error بنية غير مدعومة #endif }// Microsoft C __declspec ( naked ) void * getTIB () { __asm mov EAX , FS : [ 18 h ] __asm ret }// استخدام وظائف مايكروسوفت الداخلية بدلاً من التجميع المضمن (يعمل مع معماريتي X86 و X64) void * getTIB () { #ifdef _M_IX86 return ( void * ) __readfsdword ( 0x18 ); #elif _M_AMD64 return ( void * ) __readgsqword ( 0x30 ); #else #error معمارية غير مدعومة #endif }مراجع
- 1 2 بيترك، مات (مايو 1996). "تحت الغطاء" . مجلة أنظمة مايكروسوفت . مؤرشف من الأصل في 14 يونيو 2009. تم الاسترجاع في 7 يوليو 2010 .
- 1 2 3 4 "wine winternl.h: typedef struct _TEB" . GitHub . wine-mirror. 29 أكتوبر 2019.
- ↑ "نظرة فاحصة على صفحة حماية المكدس" . 3 فبراير 2022.
- ↑ تشابيل، جيف. "TEB" .
- ↑ "دالة NtCurrentTeb" . وثائق مايكروسوفت . تم الاطلاع عليها بتاريخ 20 نوفمبر 2019 .
للمزيد من القراءة
- مات بيتريك (مارس 1996). أسرار برمجة ويندوز 95 (pdf) . IDG. ص 136-138 . رقم ISBN 978-1-56884-318-6تم الاطلاع عليه بتاريخ 17-07-2010 .
روابط خارجية
- بنية ويندوز إن تي
- واجهات برمجة تطبيقات مايكروسوفت
- الخيوط (الحوسبة)
