WinRing0 Alpha8
Crystal Dew World の英語ページで WinRing0 の告知を始めました。SysInfo.dll を使いたいというリクエストは数回いただいているのでそのうちコメントもいただけるんじゃないかなぁ~と思っております。(希望的観測)
◆マニュアル 鋭意制作中(現在英語版のみです)
今のところフレームを使用していますが、最終的にはフレームを使わない構成にしようと考えております。日本語への翻訳はもう少し仕様が固まってから行う予定です。
今回の主な修正点
- SetPciMaxBusNo を SetPciMaxBusIndex に変更
- FindPciDeviceById, FindPciDeviceByClass の不具合を修正
◇Alpha8 API (@以下は序数)
- GetDllStatus @1
- GetDllVersion @2
- GetDriverVersion @3
- GetDriverType @4
- IsCpuid @11
- IsMsr @12
- IsTsc @13
- Hlt @20
- Rdmsr @21
- Wrmsr @22
- Rdpmc @23
- Cpuid @24
- Rdtsc @25
- HltEx @30
- RdmsrEx @31
- WrmsrEx @32
- RdpmcEx @33
- CpuidEx @34
- RdtscEx @35
- ReadIoPortByte @41
- ReadIoPortWord @42
- ReadIoPortDword @43
- WriteIoPortByte @44
- WriteIoPortWord @45
- WriteIoPortDword @46
- ReadMemBlock @51
- WriteMemBlock @52
- SetPciMaxBusIndex @60
- ReadPciConfigByte @61
- ReadPciConfigWord @62
- ReadPciConfigDword @63
- WritePciConfigByte @64
- WritePciConfigWord @65
- WritePciConfigDword @66
- FindPciDeviceById @67
- FindPciDeviceByClass @68
ダウンロード:WinRing0 Alpha8
RdmsrEx試しました。
とりあえず、速報っす。
結論:ダメです。
うまくAffinityMaskが機能しないときがあります。
8コの論理プロセッサ搭載マシンで、全論理プロセッサに対してRdmsrExを実行しているのですが、AffinityMaskが機能してくれない論理プロセッサが1,2コ出てしまうときがあります。全部の論理プロセッサでうまくいくときもあります。
まだ規則性も解析できておらず、何が原因なのか、私のプログラムが悪い可能性も含めて、わかっておりません。
もうちっとがんばってみます。。。
自ボケ自ツッコミで恐縮っす。
今更ながらWinRing0のソースを拝読させていただきました。
で、ようやく
hiyohiyoさん>が、マルチスレッド環境ではよく考えて使ってください。
の意味がわかったような気が。
RdmsrEx()でSetProcessAffinityMask()されているってことは、マルチスレッドプログラムとかからRdmsrEx()をAffinityMaskを変えながら同時にcallしちゃダメってことっすね。
複数のスレッドから同時に使うことは考えておりませんでした。複数のスレッドから使うためには、RdmsrEx 内で使用している SetProcessAffinityMask の代わりに SetThreadAffinityMask を使う必要があります。
Process Affinity Mask が必ずしも全論理プロセッサに対して1が立っているとは限らないためこのような仕様にしましたが、この方式だと同時使用できないので、仕様変更をしたいと思います。
二つ論理プロセッサがある場合でもProcess Affinity Mask が 0x1 の時に Thread Affinity Mask を 0x2 に設定することはできないため、プログラマ側が Affinity Mask の状態を理解して使用する必要があります。
ふぅ、英語でこのことを説明するのは大変だなぁ・・・