回答編集履歴

2

コードの修正

2019/08/16 22:45

投稿

OXamarin
OXamarin

スコア59

test CHANGED
@@ -142,45 +142,29 @@
142
142
 
143
143
 
144
144
 
145
- foreach (var filename in pf.Filenames)
145
+ foreach (var filename in pf.ExeFileNames)
146
146
 
147
147
  {
148
148
 
149
+ //置換対象文字列の抽出
150
+
151
+ var volumeInfo = pf.VolumeInformation
152
+
149
- if (!filename.Contains(pf.Header.ExecutableFilename)) continue;
153
+ .FirstOrDefault(x => filename.StartsWith(x.DeviceName));
154
+
155
+ if (volumeInfo == null) return null;
150
156
 
151
157
 
152
158
 
153
- //置換対象文字列の抽出
159
+ //置換対象文字列の置換
154
160
 
155
- var deviceName = filename.Substring(0, 34);
161
+ var serialNumber = volumeInfo.SerialNumber;
156
162
 
157
- var volumeInformation = pf.VolumeInformation
163
+ string driveName;
158
164
 
159
- .FirstOrDefault(x => x.DeviceName == deviceName);
165
+ _driveVolumeSerialNumberDictionary.TryGetValue(serialNumber, out driveName);
160
166
 
161
- if (volumeInformation == null)
162
-
163
- {
164
-
165
- Console.WriteLine(filename);
166
-
167
- }
168
-
169
- else
170
-
171
- {
172
-
173
- //置換対象文字列の置換
174
-
175
- var serialNumber = volumeInformation.SerialNumber;
176
-
177
- string driveName;
178
-
179
- driveDictionary.TryGetValue(serialNumber, out driveName);
180
-
181
- Console.WriteLine(driveName + filename.Replace(deviceName, string.Empty));
167
+ return driveName + filename.Replace(volumeInfo.DeviceName, string.Empty);
182
-
183
- }
184
168
 
185
169
  }
186
170
 

1

追加情報

2019/08/16 22:45

投稿

OXamarin
OXamarin

スコア59

test CHANGED
@@ -57,3 +57,135 @@
57
57
  プリフェッチファイルの解析に関しては以下のツールが速くて高機能でしたがソースが見当たらなかったのと起動時に管理者権限を毎回求めてくるので深くは調べませんでした。
58
58
 
59
59
  [WinPrefetchView v1.35](http://www.nirsoft.net/utils/win_prefetch_view.html)
60
+
61
+
62
+
63
+ **ファイルがどこのドライブに属しているかを調査していましたが分かったので追記します。**
64
+
65
+
66
+
67
+ 上記のプログラムの出力結果の
68
+
69
+ 「\VOLUME{01d1e631699b3e2a-486a06d0}\ツール一覧\SCREENTOGIF\SCREEN.EXE」
70
+
71
+ でアクセスできると思っていましたが、できませんでした。
72
+
73
+
74
+
75
+ コマンドプロンプト上で「mountvol」と入力すると、以下のような結果が出ます。
76
+
77
+ ![イメージ説明](a1e7592a57b96e720fc7ae8d6f398710.jpeg)
78
+
79
+ 「\?\Volume{475a217f-53d2-4e99-a909-6482929b2582}\」をエクスプローラー上で検索すると、確かにCドライブに飛べました。ただVolumeの後のGuid値がどのドライブとも異なっているので何か別のCドライブを表現しているのだと思いました。
80
+
81
+
82
+
83
+ もう少し調べてみると、各ドライブは製造時に一意のGuidが振られているとのことでした。
84
+
85
+ コマンドプロンプトで「vol」と検索すれば出てきます。
86
+
87
+ 私のCドライブのシリアル番号はこれのようです。(48始まりはNTFSみたいですね。)
88
+
89
+ ![イメージ説明](c9beb63a912c52c116afb3e1adb0b066.jpeg)
90
+
91
+
92
+
93
+ 私のCドライブのVolumuInfoのシリアル番号と一致するデバイス名が出力結果と同じでした。
94
+
95
+ ![イメージ説明](9c226c247dd505a1557fd7ecac105bdd.jpeg)
96
+
97
+
98
+
99
+ ここまで分かれば後はもう組むだけですね。
100
+
101
+
102
+
103
+ ```C#
104
+
105
+ //各ドライブのシリアル番号を取得
106
+
107
+ var drives = DriveInfo.GetDrives();
108
+
109
+ var driveDictionary = new ConcurrentDictionary<string, string>();
110
+
111
+ foreach (var drive in drives)
112
+
113
+ {
114
+
115
+ var driveName = drive.Name[0] + ":";
116
+
117
+ using (var disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + driveName + "\""))
118
+
119
+ {
120
+
121
+ disk.Get();
122
+
123
+ var serialNumber = disk["VolumeSerialNumber"];
124
+
125
+ if (serialNumber != null)
126
+
127
+ {
128
+
129
+ driveDictionary.TryAdd(serialNumber.ToString(), driveName);
130
+
131
+ }
132
+
133
+ }
134
+
135
+ }
136
+
137
+
138
+
139
+ var prefetchFullPath = @"C:\windows\prefetch\SCREEN.EXE-63A051E2.pf";
140
+
141
+ var pf = PrefetchFile.Open(prefetchFullPath);
142
+
143
+
144
+
145
+ foreach (var filename in pf.Filenames)
146
+
147
+ {
148
+
149
+ if (!filename.Contains(pf.Header.ExecutableFilename)) continue;
150
+
151
+
152
+
153
+ //置換対象文字列の抽出
154
+
155
+ var deviceName = filename.Substring(0, 34);
156
+
157
+ var volumeInformation = pf.VolumeInformation
158
+
159
+ .FirstOrDefault(x => x.DeviceName == deviceName);
160
+
161
+ if (volumeInformation == null)
162
+
163
+ {
164
+
165
+ Console.WriteLine(filename);
166
+
167
+ }
168
+
169
+ else
170
+
171
+ {
172
+
173
+ //置換対象文字列の置換
174
+
175
+ var serialNumber = volumeInformation.SerialNumber;
176
+
177
+ string driveName;
178
+
179
+ driveDictionary.TryGetValue(serialNumber, out driveName);
180
+
181
+ Console.WriteLine(driveName + filename.Replace(deviceName, string.Empty));
182
+
183
+ }
184
+
185
+ }
186
+
187
+ ```
188
+
189
+
190
+
191
+ 出力結果: C:\ツール一覧\SCREENTOGIF\SCREEN.EXE