80596542 8bff mov edi,edi80596544 55 push ebp80596545 8bec mov ebp,esp80596547 837d1803 cmp dword ptr [ebp+18h],38059654b 7760 ja nt!KeAddSystemServiceTable+0x6b (805965ad)8059654d 8b4518 mov eax,dword ptr [ebp+18h]80596550 c1e004 shl eax,480596553 83b88031558000 cmp dword ptr nt!KeServiceDescriptorTable (80553180)[eax],08059655a 7551 jne nt!KeAddSystemServiceTable+0x6b (805965ad)8059655c 8d8840315580 lea ecx,nt!KeServiceDescriptorTableShadow (80553140)[eax]80596562 833900 cmp dword ptr [ecx],080596565 7546 jne nt!KeAddSystemServiceTable+0x6b (805965ad)80596567 837d1801 cmp dword ptr [ebp+18h],18059656b 8b5508 mov edx,dword ptr [ebp+8]kd> dd 8055314080553140 80502030 00000000 0000011c 805024a480553150 bf997600 00000000 0000029b bf99831080553160 00000000 00000000 00000000 0000000080553170 00000000 00000000 00000000 0000000080553180 80502030 00000000 0000011c 805024a480553190 00000000 00000000 00000000 00000000805531a0 00000000 00000000 00000000 00000000805531b0 00000000 00000000 00000000 00000000SOURCE: PAGED_CODE();
// // If a system service table is already defined for the specified // index, then return FALSE. Otherwise, establish the new system // service table. //
if ((Index > NUMBER_SERVICE_TABLES - 1) || (KeServiceDescriptorTable[Index].Base != NULL) || (KeServiceDescriptorTableShadow[Index].Base != NULL)) {
return FALSE;
} else {
// // If the service table index is equal to the Win32 table, then // only update the shadow system service table. Otherwise, both // the shadow and static system service tables are updated. //
KeServiceDescriptorTableShadow[Index].Base = Base; KeServiceDescriptorTableShadow[Index].Count = Count; KeServiceDescriptorTableShadow[Index].Limit = Limit; KeServiceDescriptorTableShadow[Index].Number = Number; if (Index != WIN32K_SERVICE_INDEX) { KeServiceDescriptorTable[Index].Base = Base; KeServiceDescriptorTable[Index].Count = Count; KeServiceDescriptorTable[Index].Limit = Limit; KeServiceDescriptorTable[Index].Number = Number; }
return TRUE; }