イベントトレース(ETW)セッションから特定のプロセスによってすべての読み取り/書き込み/開く/閉じるファイルを取得するソリューションを探しています。リアルタイムセッションからのデータを処理する)。 このコードを書いてその操作ですべてのイベントを取得しますが、イベントではFileName
またはPath
を取得できません。イベントトレースETWファイルログのFileObjectまたはFileKeyからFileNameを取得します。C#
var sessionName = "ETWEventSession";
using (var session = new TraceEventSession(sessionName, null))
{
session.StopOnDispose = true;
using (var source = new ETWTraceEventSource(sessionName, TraceEventSourceType.Session))
{
Action<TraceEvent> logAction = delegate(TraceEvent data)
{
Console.WriteLine(log);
};
var registerParser = new RegisteredTraceEventParser(source);
registerParser.All += logAction;
var fileProviderGuid = TraceEventSession.GetProviderByName("Microsoft-Windows-Kernel-File");
session.EnableProvider(fileProviderGuid, TraceEventLevel.Informational, 0x0200);
source.Process();
}
}
私は私のエージェントを実行して、このようなイベントを取得:
どのように私はFileName
得ることができます
<Event MSec="0.0000" PID="11376" PName="" TID="24668"
EventName="Write" ProviderName="Microsoft-Windows-Kernel-File"
ByteOffset="102386" Irp="0xffffe00148e8c478" FileObject="0xffffe00146c"
FileKey="0xffffc0019d3f8140" IssuingThreadId="24668"
IOSize="7" IOFlags="0" ExtraFlags="0"/>
は...、ただFileObject
とFileKey
が、これはイベントを取得するために私のコードですこのイベントに影響を受けていますか?
FileObject
またはFileKey
とは何ですか?
FileName
をFileObject
またはFileKey
から取得できますか?ここでは、PIDまたはProcessNameのあたりにフィルタリングし、ここにあなたがdata.FileName
でファイル名を取得することができます
var kernel = session.Source.Kernel;
kernel.FileIORead += HandleFileIoReadWrite;
kernel.FileIOWrite += HandleFileIoReadWrite;
private void HandleFileIoReadWrite(FileIOReadWriteTraceData data)
{
if (data.ProcessID == pid) // (data.ProcessName.Contains("foo"))
{
Console.WriteLine(data.FileName);
}
}
:
このケースについてのリンクを参照してください。http://bcl.codeplex.com/discussions/274260 – lsalamon
@Isalamonありがとうございます。役に立つリンクと私はそこから質問の答えとそれからアイデアを得る。私は答えを共有します。 –
こちらもご覧ください:https://stackoverflow.com/a/26259197/47733 – lsalamon