雑多2 のバックアップ(No.13)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- 雑多2 へ行く。
- 1 (2016-04-04 (月) 23:08:03)
- 2 (2016-04-05 (火) 01:00:41)
- 3 (2016-04-07 (木) 18:31:14)
- 4 (2016-04-08 (金) 00:06:01)
- 5 (2016-04-09 (土) 00:55:55)
- 6 (2016-04-09 (土) 11:03:40)
- 7 (2016-04-11 (月) 14:03:56)
- 8 (2016-04-13 (水) 21:51:31)
- 9 (2016-04-14 (木) 02:05:00)
- 10 (2016-04-18 (月) 00:36:09)
- 11 (2016-04-22 (金) 19:30:20)
- 12 (2016-05-02 (月) 00:54:10)
- 13 (2016-05-06 (金) 21:45:48)
- 14 (2016-05-22 (日) 22:52:51)
- 15 (2016-06-21 (火) 18:05:20)
- 16 (2016-06-28 (火) 23:42:05)
WMIでディスク関連の情報を取得.js
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);
WMIでパーティションの開始アドレスを取得.js
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);
fsutilでサポートされるコマンド(Windows 10)
---- サポートされる 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 特定のファイルのオリジナルを照会
fsutilのコマンドとWinAPIの対応表
fsutil file createnew | CreateFile() + SetFilePointer() + SetEndOfFile() |
fsutil file queryallocranges | DeviceIoControl(FSCTL_QUERY_ALLOCATED_RANGES) |
fsutil file queryextents | DeviceIoControl(FSCTL_GET_RETRIEVAL_POINTERS) |
fsutil file queryvaliddata | DeviceIoControl(FSCTL_QUERY_FILE_REGIONS) 12 GetFileValidData()という名の関数は無い |
fsutil file setvaliddata | SetFileValidData() |
fsutil file setzerodata | DeviceIoControl(FSCTL_SET_ZERO_DATA) |
fsutil hardlink create | CreateHardLink() |
fsutil fsinfo statistics | DeviceIoControl(FSCTL_FILESYSTEM_GET_STATISTICS(_EX)) |
fsutil volume querycluster | DeviceIoControl(FSCTL_LOOKUP_STREAM_FROM_CLUSTER) |
fsutil volume filelayout | DeviceIoControl(FSCTL_QUERY_FILE_LAYOUT) |
ファイル新規作成時の断片化を軽減する方法
ファイルサイズがゼロの状態から
a. WriteFile() でファイル全体を一気に書き込む
b. SetFilePointer() と SetEndOfFile() でファイルサイズを拡張しておく(NTFSの場合予約だけで書き込みは発生しない)
のどちらかを実行すると、出来るだけ連続した領域がファイルシステム上で探されて確保されるので断片化しづらい。
ファイル関連の操作はSysinternals Process Monitorで確認できる。 12
Windows標準コマンドで各種ハッシュ計算 / Base64エンコードデコード / bin <-> hex変換する方法(Vista以降)
Windowsのcertutilコマンドでメッセージダイジェストを表示する方法
Windowsでbase64エンコード・デコードする方法
Windowsでファイルを16進数テキストに変換したり、16進数テキストをファイルに変換したりする方法 CryptBinaryToString function
Windowsのメモリ上のファイルキャッシュをクリアする方法(Vista以降)
Sysinternals RAMMapの Menu -> Empty -> Empty Standby List を実行すると、ファイルキャッシュを含むスタンバイタイプのデータがクリアされる。 12
NTFS論理ドライブのクラスター番号を論理アドレスに変換.js
//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);
ベンチマークソフトのベンチマーク用ファイルの採取方法 (NTFS用)
1. ベンチマークを実行し、対象論理ドライブ直下を調べるかリソースモニターを見て、ベンチマーク用ファイルが何処に作成されるか特定しておく
2. ベンチマークを実行中、fsutil hardlink create コマンドでベンチマーク用ファイルに別名を付け、ファイルの実態への参照数を増やす
(ベンチマーク実行中にプロセスを強制終了する方法では FILE_FLAG_DELETE_ON_CLOSE が指定されているケースに対応できない)
3. 削除されずに残った(ハードリンクで作成した)ファイルをバイナリエディタで覗いてデータパターンを調べたり、断片化数を調べたり、どの論理アドレスに作成されたかを確認する
RAMDiskの問題点
RAMDiskを使うと、ファイルデータがメモリ上にあるにも関わらず、更に OS のファイルキャッシュに乗ってしまいメモリを二重に消費してしまう。