Windows XPの WMIにおける Win32_OperatingSystem のバグ

Windows 2000で使われている、仮想メモリについて調べていたら、結構重大なバグがXPでそのまま放置されてることに気づきました。
memv


実は、このバグは 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がいうところの仮想メモリは ページファイルのことではないらしく、 仮想メモリ=ひとつのプロセスから使える仮想的なメモリ空間、だったり、コミットチャージのことだったり するみたいです。

memvw
ちなみに、こちらはページファイルの使用量を調査するために作ったソフト。
バグについて詳しい記述がないので、時間食っちゃったよ ><

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です