Windows 2000向けQueryUnbiasedInterruptTime
_declspec(dllexport) _declspec(naked) void WINAPI QueryUnbiasedInterruptTime(PULONGLONG pos){ // (c)2017 BlackWingCat _asm{ push ebp mov ebp,esp sub esp,0x14 lea eax,[ebp-0xc] wait fild qword ptr [ebp-0x14] mov ax,word ptr [ebp-2] fldcw word ptr [ebp-2] |
FPUとパフォーマンスカウンタを使って100nsec 精度のQueryUnbiasedInterruptTime をエミュレートする関数作ってみた・ω・
次の拡張カーネルに実装予定
FPUプログラミング初めてやってみたら、関数ループさせるとなぜかスタックオーバーフローが発生してめちゃくちゃ悩んだ。
単に、FPUのインデックスレジスタがステータスレジスタに格納されていて、そこがあふれると計算できなくなるので
fnstcw / fldcw で保存・復元する必要があったようだ・ω・
Comments