Windows XPの WMIにおける Win32_OperatingSystem のバグ
Windows 2000で使われている、仮想メモリについて調べていたら、結構重大なバグがXPでそのまま放置されてることに気づきました。
実は、このバグは Windows 2000や 2003にもありました。
Win32_OperatingSystem WMI クラスから返される一部のメモリに関連した結果が Windows 2000 および Windows Server 2003 で正しくない。
しかし、こちらは、2004年の修正で直ってるんですね。(SP4 RollupPackage1-v2では未修正)
でも、Windows XPだと直ってないのです。
WMIを使用して Win32_OperatingSystem へ クエリーを送った結果はこんな感じ。
プロパティ | Win2KSP4 | WinXP | KB892294 |
SizeStoredInPagingFiles | ullTotalPageFileullTotalPageFile | ullAvailVirtual | |
FreeSpaceInPagingFiles | ullAvailPageFile | ullAvailPageFile -ullAvailPhys |
|
FreePhysicalMemory | ≒ullAvailPhys | ||
FreeVirtualMemory | ullAvailPageFile +ullAvailPhys |
≒ullAvailVirtual | ullAvailPageFile |
TotalVisibleMemorySize | ullTotalPhys | ||
TotalVirtualMemorySize | ullTotalPhys +ullTotalPageFile |
ullTotalVirtual | ullTotalPageFile |
仮想メモリの扱いがちょっと微妙だったりするのですが、
MEMORYSTATUSEX GP; GP.dwLength=sizeof(GP); GlobalMemoryStatusEx(&GP); |
こんな感じで構造体から取ってくるのがいいみたいです。
コミットチャージ合計=ullTotalPageFile-ullAvailPageFile
コミットチャージ=Limit ullTotalPageFile
物理メモリ合計=ullTotalPhys
物理メモリ利用可能=ullAvailPhys
なので
FreeSpaceInPagingFiles を ullAvailPageFile で取得するのも誤り、
SizeStoredInPagingFiles を ullTotalPageFileullTotalPageFile として取得するのは誤り。
ついでに、仮想メモリの扱いが Win2000とXPで変わっているようです。
ちなみに、Windowsがいうところの仮想メモリは ページファイルのことではないらしく、 仮想メモリ=ひとつのプロセスから使える仮想的なメモリ空間、だったり、コミットチャージのことだったり するみたいです。
ちなみに、こちらはページファイルの使用量を調査するために作ったソフト。
バグについて詳しい記述がないので、時間食っちゃったよ ><
Comments