В семерке оригинально реализован сабж. Вот так выглядит экспортируемая функция RtlPrefetchMemoryNonTemporal в памяти:
kd> u 0x82603000+FB9A*4 nt!RtlPrefetchMemoryNonTemporal: 82641e68 90 nop 82641e69 a1b4aa7282 mov eax,[nt!KePrefetchNTAGranularity (8272aab4)] 82641e6e 0f184100 prefetchnta byte ptr [ecx] 82641e72 03c8 add ecx,eax 82641e74 2bd0 sub edx,eax 82641e76 77f6 ja nt!RtlPrefetchMemoryNonTemporal+0x6 (82641e6e) 82641e78 c3 ret 82641e79 90 nop
|
|
А вот так она же выглядит на диске:
kd> u 0x00050800+FB9A*4 0008f668 c3 ret 0008f669 a1b4aa7282 mov eax,[nt!KePrefetchNTAGranularity (8272aab4)] 0008f66e 0f184100 prefetchnta byte ptr [ecx] 0008f672 03c8 add ecx,eax 0008f674 2bd0 sub edx,eax 0008f676 77f6 ja 0008f66e 0008f678 c3 ret 0008f679 90 nop
|
_Winnie C++ Colorizer |
WRK объясняет, откуда взялось отличие - ntldr таким чудесным образом передает знание о свойствах процессора непосредственно ядру. Т.е. он делает что-то в духе:
*(char*)GetProcAddr(ntosBase, "RtlPrefetchMemoryNonTemporal") = 0xC3
|
|
Как по мне, через именованную секцию данных было бы красивее, но и так тоже ничего
No comments:
Post a Comment