26-11-2010, 05:49 PM
هناك جدولين واحد خاص بالـnative threads اسمه KeServiceDescriptorTable ، واخر خاص بالـgui threads اسمه KeServiceDescriptorTableShadow .
كلاهما عبارة عن مصفوفة رباعية من التركيبة SERVICE_DESCRIPTOR_TABLE :
عندما يحدث system call فان عنوان الـServiceTable يكون موجود في KTHREAD.ServiceTable والذي اما ان يشير الى KeServiceDescriptorTable او KeServiceDescriptorTableShadow حسب كون الـthread ألحالي native/gui .
اذا كان الـService Index اقل من 0x1000 فيتم استعمال العنصر الاول من الـServiceTable (هي مصفوفة رباعية كما قلنا) .
اكبر من او يساوي 0x1000 يتم استعمال العنصر الثاني الذي يحتوي على دوال الـGUI ، اذا كان الthread الحالي native وتم استدعاء GUI syscall لأول مرة فانه يتم تحويله الى gui thread .
العنصر الثالث والرابع من SDT لا يستخدم حاليا .
كلاهما عبارة عن مصفوفة رباعية من التركيبة SERVICE_DESCRIPTOR_TABLE :
كود :
[align=left]typedef struct _SERVICE_DESCRIPTOR_TABLE {
PVOID *ServiceTable;
PULONG CounterTable;
ULONG TableSize;
PUCHAR ArgumentTable;
} SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;[/align]اذا كان الـService Index اقل من 0x1000 فيتم استعمال العنصر الاول من الـServiceTable (هي مصفوفة رباعية كما قلنا) .
اكبر من او يساوي 0x1000 يتم استعمال العنصر الثاني الذي يحتوي على دوال الـGUI ، اذا كان الthread الحالي native وتم استدعاء GUI syscall لأول مرة فانه يتم تحويله الى gui thread .
العنصر الثالث والرابع من SDT لا يستخدم حاليا .

