function GetObjectTextList(sQuery){ var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}"); var colItems = objWMIService.ExecQuery(sQuery); var s1 = ""; for(var emu = new Enumerator(colItems); !emu.atEnd(); emu.moveNext()) s1 += emu.item().GetObjectText_(); return s1;}var sText = "//Ctrl + C でクリップボードにコピー\n\n\n\n";sText += GetObjectTextList("SELECT * FROM Win32_DiskDrive\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_LogicalDisk\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_DiskPartition\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_DiskDrivePhysicalMedia\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_DiskDriveToDiskPartition\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_LogicalDiskRootDirectory\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_LogicalDiskToPartition\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_IDEController\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_IDEControllerDevice\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_SystemPartitions\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_Volume\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_PhysicalMedia\n\n\n\n");WScript.Echo(sText);
function GetObjectTextList(sQuery){ var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}"); var colItems = objWMIService.ExecQuery(sQuery); var s1 = ""; for(var emu = new Enumerator(colItems); !emu.atEnd(); emu.moveNext()) s1 += emu.item().GetObjectText_(); return s1;}var sText = "//Ctrl + C でクリップボードにコピー\n\n\n\n";sText += GetObjectTextList("SELECT * FROM Win32_DiskPartition\n\n\n\n");sText += GetObjectTextList("SELECT * FROM Win32_LogicalDiskToPartition\n\n\n\n");WScript.Echo(sText);
---- サポートされる 8DOT3NAME コマンド ----query システム上の短い名前の動作について現在の設定を照会scan 影響を受けるレジストリ エントリを検出set システム上の短い名前の動作を制御する設定を変更strip ディレクトリ内のすべてのファイルの短い名前を削除---- サポートされている BEHAVIOR コマンド ----query ファイル システムの behavior パラメーターを照会set ファイル システムの behavior パラメーターを変更---- サポートされる DIRTY コマンド ----query dirty ビットの照会set dirty ビットの設定---- サポートされる FILE コマンド ----createnew 指定されたサイズの新しいファイルの作成findbysid セキュリティ識別子でファイルを検索optimizemetadata ファイルのメタデータの最適化queryallocranges ファイルに割り当てられた範囲の照会queryextents ファイルのエクステントの照会queryfileid 指定されたファイルをファイル ID で照会queryfilenamebyid ファイル ID のランダム リンク名を表示queryoptimizemetadata ファイルの最適化メタデータ状態を照会queryvaliddata ファイルの有効なデータ長の照会setshortname ファイルの短い名前の設定setvaliddata ファイルの有効なデータ長の設定setzerodata ファイルのゼロ データの設定---- サポートされる FSINFO コマンド ----drives ドライブをすべて一覧表示driveType ドライブの種類の照会ntfsInfo NTFS 固有のボリューム情報の照会refsInfo REFS 固有のボリューム情報の照会sectorInfo セクター情報の照会statistics ファイル システム統計情報の照会volumeInfo ボリューム情報の照会---- サポートされる HARDLINK コマンド ----create ハードリンクの作成list ファイルのハードリンクを列挙---- サポートされる OBJECTID コマンド ----create オブジェクト ID の作成delete オブジェクト ID の削除query オブジェクト ID の照会set オブジェクト ID の変更---- サポートされる QUOTA コマンド ----disable クォータの追跡と強制の無効化enforce クォータの強制の有効化modify ユーザーのディスク クォータの設定query ディスク クォータの照会track クォータの追跡の有効化violations クォータ違反の表示---- サポートされる REPAIR コマンド ----enumerate ボリュームの破損ログのエントリの列挙initiate ファイルの修復の開始query ボリュームの自己復旧の状態の照会set ボリュームの自己復旧の状態の設定state ボリュームの破損状態の照会wait 修復が完了するまで待機---- サポートされる REPARSEPOINT コマンド ----delete 再解析ポイントの削除query 再解析ポイントの照会---- サポートされる RESOURCE コマンド ----create 別のトランザクション リソース マネージャーを作成info トランザクション リソース マネージャーに関する情報の表示setautoreset 既定のトランザクション リソース マネージャーで次のマウント時にトランザクションの...setavailable 整合性よりも可用性を優先するようにトランザクション リソース マネージャーを設定setconsistent 可用性よりも整合性を優先するようにトランザクション リソース マネージャーを設定setlog 実行しているトランザクション リソース マネージャーの特性を変更start トランザクション リソース マネージャーを開始stop トランザクション リソース マネージャーを停止---- サポートされる SPARSE コマンド ----queryflag スパースの照会queryrange 範囲の照会setflag スパースに設定setrange スパース範囲の設定---- サポートされる TIERING コマンド ----queryflags ボリュームのティアリング動作フラグの表示setflags ボリュームのティアリング動作フラグの有効化clearflags ボリュームのティアリング動作フラグの無効化tierlist ボリュームに関連付けられている記憶域階層の一覧表示regionlist ボリュームの領域と対応する記憶域階層の一覧表示---- サポートされる TRANSACTION コマンド ----commit 指定されたトランザクションのコミットfileinfo 特定のファイルのトランザクション情報の表示list 現在実行しているトランザクションの表示query 指定したトランザクションに関する情報の表示rollback 指定したトランザクションのロールバック---- サポートされる USN コマンド ----createjournal USN ジャーナルの作成deletejournal USN ジャーナルの削除enumdata USN データの列挙readjournal USN ジャーナル内の USN レコードの読み取りqueryjournal ボリュームの USN データの照会readdata ファイルの USN データの読み取りenablerangetracking ボリュームの書き込み範囲の追跡の有効化---- サポートされる VOLUME コマンド ----diskfree ボリュームの空き領域の照会dismount ボリュームのマウントの解除querycluster 特定のクラスターを使用するファイルの照会filelayout ファイルについて利用できるすべての情報の照会allocationreport 割り当てられたクラスターのレポート---- サポートされる WIM コマンド ----enumfiles WIM でバッキングされているファイルの列挙enumwims バッキング WIM ファイルの列挙removewim バッキング ファイルから WIM を削除queryfile 特定のファイルのオリジナルを照会
ファイルサイズがゼロの状態からa. WriteFile() でファイル全体を一気に書き込むb. SetFilePointer() と SetEndOfFile() でファイルサイズを拡張しておく(NTFSの場合予約だけで書き込みは発生しない)のどちらかを実行すると、出来るだけ連続した領域がファイルシステム上で探されて確保されるので断片化しづらい。
ファイル関連の操作はSysinternals Process Monitorで確認できる。 12
Windowsのcertutilコマンドでメッセージダイジェストを表示する方法Windowsでbase64エンコード・デコードする方法Windowsでファイルを16進数テキストに変換したり、16進数テキストをファイルに変換したりする方法 CryptBinaryToString function
Sysinternals RAMMapの Menu -> Empty -> Empty Standby List を実行すると、ファイルキャッシュを含むスタンバイタイプのデータがクリアされる。 12
ドライブ単位でなら、ドライブレターを一旦削除する事でもファイルキャッシュがクリアされる。
//cDriveLetter で指定されたドライブレターと TargetCluster で指定されたクラスター番号から論理アドレスに変換 (NTFS 用)//BytesPerSector と BytesPerCluster は WinAPI なら GetDiskFreeSpace()で、cmd なら fsutil fsinfo ntfsinfo で取得可能var cDriveLetter = "C";var TargetCluster = 0x100000;function GetBytesPerSectorFromDriveLetter(cDriveLetter){ var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}"); var listWin32LogicalDiskToPartition = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition"); var listWin32DiskDriveToDiskPartition = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDriveToDiskPartition"); var listWin32DiskDrive = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive"); for(var i = 0; i < listWin32LogicalDiskToPartition.Count; i++){ if(/Win32_LogicalDisk\.DeviceID=\"([A-Za-z]):\"/i.exec(listWin32LogicalDiskToPartition.ItemIndex(i).Dependent) != null){ if(RegExp.$1.toUpperCase() == cDriveLetter.toUpperCase()){ for(var i2 = 0; i2 < listWin32DiskDriveToDiskPartition.Count; i2++){ if(listWin32LogicalDiskToPartition.ItemIndex(i).Antecedent.toUpperCase() == listWin32DiskDriveToDiskPartition.ItemIndex(i2).Dependent.toUpperCase()){ if(/Win32_DiskDrive\.DeviceID=\"(.+)\"/i.exec(listWin32DiskDriveToDiskPartition.ItemIndex(i2).Antecedent) != null){ var sDeviceID = RegExp.$1.replace(/\\\\/g, "\\"); for(var i3 = 0; i3 < listWin32DiskDrive.Count; i3++){ if(listWin32DiskDrive.ItemIndex(i3).DeviceID.toUpperCase() == sDeviceID.toUpperCase()){ return parseInt(listWin32DiskDrive.ItemIndex(i3).BytesPerSector); } } } } } } } } return 0;}function GetBytesPerClusterFromDriveLetter(cDriveLetter){ var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}"); var listWin32Volume = objWMIService.ExecQuery("SELECT * FROM Win32_Volume WHERE DriveLetter LIKE '" + cDriveLetter + ":'"); if(listWin32Volume.Count > 0){ return parseInt(listWin32Volume.ItemIndex(0).BlockSize); }else{ return 0; }}function GetPartitionStartAddressFromDriveLetter(cDriveLetter){ var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}"); var listWin32LogicalDiskToPartition = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition"); for(var i = 0; i < listWin32LogicalDiskToPartition.Count; i++){ if(/Win32_LogicalDisk\.DeviceID=\"([A-Za-z]):\"/i.exec(listWin32LogicalDiskToPartition.ItemIndex(i).Dependent) != null){ if(RegExp.$1.toUpperCase() == cDriveLetter.toUpperCase()){ return parseInt(listWin32LogicalDiskToPartition.ItemIndex(i).StartingAddress); } } } return 0;}var BytesPerSector = GetBytesPerSectorFromDriveLetter(cDriveLetter);var BytesPerCluster = GetBytesPerClusterFromDriveLetter(cDriveLetter);var PartitionStartingAddress = GetPartitionStartAddressFromDriveLetter(cDriveLetter);var LogicalAddress = PartitionStartingAddress + (TargetCluster * BytesPerCluster);var LogicalBlockAddress = LogicalAddress / BytesPerSector;var s1 = "//Ctrl + C でクリップボードにコピー" + "\n"; s1 += "cDriveLetter:\t\t" + cDriveLetter + "\n"; s1 += "BytesPerSector:\t\t" + BytesPerSector + "\n"; s1 += "BytesPerCluster:\t\t" + BytesPerCluster + "\n"; s1 += "PartitionStartingAddress:\t" + PartitionStartingAddress + "\n"; s1 += "TargetCluster:\t\t" + TargetCluster + "\n"; s1 += "LogicalAddress:\t\t" + LogicalAddress + "\n"; s1 += "LogicalBlockAddress:\t" + LogicalBlockAddress + "\n";WScript.Echo(s1);
1. ベンチマークを実行し、対象論理ドライブ直下を調べるかリソースモニターを見て、ベンチマーク用ファイルが何処に作成されるか特定しておく2. ベンチマークを実行中、fsutil hardlink create コマンドでベンチマーク用ファイルに別名を付け、ファイルの実態への参照数を増やす(ベンチマーク実行中にプロセスを強制終了する方法では FILE_FLAG_DELETE_ON_CLOSE が指定されているケースに対応できない)3. 削除されずに残った(ハードリンクで作成した)ファイルをバイナリエディタで覗いてデータパターンを調べたり、断片化数を調べたり、どの論理アドレスに作成されたかを確認する
RAMDiskを使うとファイルデータがメモリ上にあるにも関わらず、更に OS のファイルキャッシュに乗ってしまいメモリを二重に消費してしまう。
1MBの読み込みは128KBの読み込み*8回に分割されるという話を Windows 10 (x64) + Transcend 370S の Device Statistics (GP Log 0x04) で検証。手順と結果は以下の通り。
1. CreateFile(FILE_FLAG_NO_BUFFERING) で 2MB 以上のファイルを開く2. ReadFile() で 1MB を読み込むコードをステップ実行3. smartctl で Device Statistics 読み取り4. ReadFile() で 1MB を読み込むコードをステップ実行5. smartctl で Device Statistics 読み取り
Logical Sectors Read の差:2048 * 論理セクターサイズ:512 = 1,048,576bytes //(1MiB)なので、1MBの読み込みが128KBの読み込み*8回に分割されている事が確認できた。
ハイブリッドスリープの書き込み量を検証。
結果は・物理メモリサイズ分の書き込みが発生する訳ではない・"使用中" タイプのメモリデータが保存される・ファイルキャッシュ等の "スタンバイ" タイプのメモリデータは保存されない・メモリデータは圧縮して保存されるので、圧縮しやすいデータか否かで書き込み量が大幅に変わる
NTFS MFTのファイルレコードサイズは通常1KB(Windows 8以降は FORMAT /L で拡張可能)であるものの、読み書きは4KB単位で行われる。読み書き量は fsutil fsinfo statistics で確認できる。
Microsoft Windows [Version 10.0.10586](c) 2015 Microsoft Corporation. All rights reserved.C:\>fsutil fsinfo statistics C:ファイル システムの種類 : NTFSUserFileReads : 135997UserFileReadBytes : 3619900928UserDiskReads : 132814UserFileWrites : 31465UserFileWriteBytes : 2636247040UserDiskWrites : 31365MetaDataReads : 56000MetaDataReadBytes : 237375488MetaDataDiskReads : 87257MetaDataWrites : 32346MetaDataWriteBytes : 163782656MetaDataDiskWrites : 38467MftReads : 52559MftReadBytes : 215281664MftWrites : 20305MftWriteBytes : 97267712Mft2Writes : 0Mft2WriteBytes : 0RootIndexReads : 0RootIndexReadBytes : 0RootIndexWrites : 0RootIndexWriteBytes : 0BitmapReads : 6BitmapReadBytes : 6262784BitmapWrites : 8152BitmapWriteBytes : 40652800MftBitmapReads : 1MftBitmapReadBytes : 65536MftBitmapWrites : 1471MftBitmapWriteBytes : 6033408UserIndexReads : 34336UserIndexReadBytes : 142667776UserIndexWrites : 5937UserIndexWriteBytes : 29556736LogFileReads : 8LogFileReadBytes : 32768LogFileWrites : 20794LogFileWriteBytes : 330182656LogFileFull : 0DiskResourceFailure : 0VolumeTrimCount : 1744AvgVolumeTrimTime (ミリ秒) : 0AvgVolumeTrimSize (KB) : 2654AvgVolumeTrimSpeed (KB/秒) : 4097371VolumeTrimSkippedCount : 0VolumeTrimSkippedSize (KB) : 0FileLevelTrimCount : 3AvgFileLevelTrimTime (ミリ秒) : 168AvgFileLevelTrimSize (KB) : 1885956AvgFileLevelTrimSpeed (KB/秒) : 11205942
元データの書式(インラインプラグイン)を継承する
CrucialWestern DigitalSK hynixSamsungTranscendADATAKingstonSilicon PowerOCZPatriot
IntelSanDiskPlextorMicronToshiba
関連ソフトベンチマークソフト
雑多
SandBoxヘルプfaqサンプル
〔編集:MenuBar〕