在Dotnet中,假设您只有提供者的GUID,那么您如何侦听来自特定ETW提供者的事件?

问题描述

我有一个提供程序的GUID,在Dotnet中,我如何侦听该提供程序生成的所有事件? 我有两个外部工具可以监听,一个是SDK的tracelog,我可以运行

request({
    url: "http://webservice.xxxxxxxxx.com.br/",method: "POST",headers: {
        "content-type": "application/xml",// <--Very important!!!
    },body: myXMLText
    },function (error,response,body){
    
    })
.pipe(fs.createWriteStream('onix.zip')) //salvo o arquivo zip
.on('finish',()=>{
    console.log('Arquivo baixado do WebService')
    fs.createReadStream('onix.zip')
    .pipe(unzipper.Parse())
    .on('entry',function (entry) {
      console.log('Descompactando arquivo')
      const fileName = entry.path;
      const type = entry.type; // 'Directory' or 'File'
      const size = entry.vars.uncompressedSize; // There is also compressedSize;
      console.log(fileName)
      entry.pipe(fs.createWriteStream('output/onix.xml')
                .on('error',err => console.log('error',err.message))
                .on('ready',()=>{
                    console.log('Lendo arquivo')
                    fs.createReadStream('output/onix.xml')
                    .on('data',function (chunk) { 
                        //console.log('aqui4')
                        xml+=chunk.toString()
                        //console.log(xml); 
                    })
                    .on('end',function (chunk) {
                        //console.log(xml) 
                        console.log('Convertendo de XML p/ JSON')
                        result = convert.xml2js(xml,{alwaysChildren: true}); // or convert.xml2json(xml,options)\
                        
                        console.log('Preparando sql STATMENT | '+result.elements[0].elements.length+' LINHAS')
                        sql='';
                        for(i=0;i<result.elements[0].elements.length;i++){//trocar o 5 por result.elements[0].elements.length
                            table=''
                            value=''
                            for(j=0;j<result.elements[0].elements[i].elements.length;j++){
                                //sql += (result.elements[0].elements[i].elements[j].name);
                                //console.log(JSON.parse(result.elements[0].elements[i].elements[j].elements));                        
                                try{
                                    if(result.elements[0].elements[i].elements[j].name.toLowerCase()=='rod' || result.elements[0].elements[i].elements[j].elements[0].text==null){
                        
                                    }else{
                                        table += result.elements[0].elements[i].elements[j].name.toLowerCase()+(j==(result.elements[0].elements[i].elements.length-1)?'':',')
                                        value += "'"+result.elements[0].elements[i].elements[j].elements[0].text.replace('\'',' ').replace('true','1').replace('false','0')+"'"+(j==(result.elements[0].elements[i].elements.length-1)?'':',')
                                    }                                    
                                }catch{
                        
                                }
                            }
                            sql += 'INSERT INTO onixsat (' + table + ') VALUES (' + value + ')'
                            sql+=';\n'
                        }
                        console.log('Executando sql')
                        //console.log(sql)
                        
                    })
                })
                
            )
    })
})

此工具仅启用提供者并返回。然后,我运行另一个自定义/专用工具(用C ++编写),该工具收集事件并将它们记录到格式漂亮的表中的文件中。 我试图将所有这些都移植到我的dotnet应用程序中,但是我无法监听来自此给定提供程序的事件。 我尝试查看EventProviderTraceListener的MSDN文档,那里有一个代码示例,但我不知道该怎么使我能够侦听任意提供程序。 我还看到了this post about TraceEventSession,我曾尝试尝试以下代码

tracelog -start <providerName> -b 8192 -seq 2000 -f somefile.bin -guid #00000000,1111,2222,3333,444444555555

调用回调,但是对于不同的提供程序GUID和我的提供程序不应该发送的事件名称,仅调用两次(事件名称 EventTrace / BuildInfo EventTrace / DbgIdRsds )。 我还看过at this documentation,它显示了如何实时侦听内核提供程序的事件,并且看起来我的代码做了相同的事情(尽管对于非标准提供程序)。

我为什么要得到这两个事件,我怎么能

  1. 启用事件以监听我拥有其GUID的提供者,并且
  2. 仅捕获来自该提供者的所有事件? (提供者可能正在从usermode和/或kernelmode发出事件,我不知道这是否有区别)

当我运行单独的工具时,收集工作正常,并且所有事件都被捕获而没有问题(它们每秒都非常频繁地生成,因此不必等待足够长的时间就没关系了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)