2012-02-27 10 views
8

बड़ा सवाल यह है कि सामान्य रूप से रीयल-टाइम ईटीडब्ल्यू नेटवर्क स्टैक ईवेंट का उपभोग कैसे करें, लेकिन मुझे विशेष रूप से माइक्रोसॉफ्ट-विंडोज-एनडीआईएस-पैकेट कैप्चर प्रदाता में दिलचस्पी है। अन्य सभी नेटवर्क स्टैक प्रदाता आंशिक रूप से काम करते हैं लेकिन एनडीआईएस-पैकेट कैप्चर (एनडीआईएस-पीसी) बिल्कुल काम नहीं करता है, इसलिए शायद यह सबसे सरल सवाल है जिसे मैं यहां पूछ सकता हूं।माइक्रोसॉफ्ट-विंडोज-एनडीआईएस-पैकेट कैप्चर प्रदाता से वास्तविक समय ईटीडब्ल्यू घटनाओं का उपभोग कैसे करें?

मैं आधार के रूप में निम्नलिखित कोड का उपयोग कर रहा है और बहुत कम संशोधित यह वास्तविक समय में काम करने के लिए: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85).aspx

परिवर्तन मैं बनाया है कर रहे हैं:

  1. कॉल StartTrace कुछ भी करने से पहले एनडीआईएस-पीसी सत्र शुरू करने के लिए। संपत्ति संरचना EVENT_TRACE_PROPERTIES में, सेटिंग लॉगफाइलमोड = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, और Wnode.Guid = कुछ यादृच्छिक GUID मैंने बनाया है।

  2. कॉलिंग स्थिति = EnableTraceEx2 (hSession, & Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, शून्य); जहां hSession सत्र StartTrace और उपयोग शुरू कर दिया है और Current_Guid

    {0x2ED6006E, 0x4729,0x4609, {0xB4,0x23,0x3E, 0xE7,0xBC, 0xD6,0x78,0xEF}} है;

  3. LoggerName साथ फिर बुला OpenTrace कुछ विस्तृत स्ट्रिंग, = LogFileName = शून्य, और LogFileMode = EVENT_TRACE_REAL_TIME_MODE;

  4. अंत में ट्रेस हैंडल पर प्रोसेसट्रेस को कॉल करें जो ऊपर खोला गया था।

  5. फिर

    , सब कुछ और कुछ ही जैसे Microsoft-Windows-विनसॉक-AFD के रूप में कुछ और करने के लिए MSDN उदाहरण

में प्रदान प्रदाता का एक परिवर्तन के साथ समान कोड का उपयोग करना छोड़ने या माइक्रोसॉफ्ट-विंडोज-टीसीपीआईपी मुझे रिकॉर्ड कॉलबैक में पर कॉल करता है जिसे मैंने परिभाषित किया था (हालांकि, मैं अभी भी गुणों को पुनर्प्राप्त करने में सक्षम नहीं हूं लेकिन मैं इस प्रोब को जितना आसान कर सकता हूं उतना आसान नहीं रखूंगा) । जब मैं एनडीआईएस-पीसी का उपयोग करता हूं, तो मुझे 0 कॉलबैक मिलते हैं। मैंने बिना किसी सफलता के कंट्रोलट्रेस का उपयोग करके मैन्युअल रूप से फ्लश करने का प्रयास किया है। मैंने बिना किसी सफलता के "EventRecordCallback" के बजाय "EventCallback" को परिभाषित करने का भी प्रयास किया है।

मैंने इस प्रक्रिया में शामिल सभी डेटा संरचनाओं को देखा है और प्रत्येक प्रदाता के बीच तुलना की है और वे सभी सही और समान दिखते हैं। मैंने कार्यों से सभी रिटर्न वैल्यू देखे हैं और डेटा स्ट्रक्चर लौटाए हैं और वे मेरे द्वारा किए गए प्रदाताओं के बीच भी वही दिखते हैं।

मैं बुला "लकड़हारा" मेरे ट्रेस सत्र 04 "-ets" द्वारा सत्र गुण को देखा है और यह NDIS-पीसी और TCPIP के लिए समान लगता है:

सी: \ windows \ system32> लकड़हारा "मेरे ट्रेस सत्र 04" -ets

नाम: मेरे ट्रेस सत्र 04 स्थिति:
रनिंग रूट पथ:% systemdrive% \ PerfLogs \ व्यवस्थापक खंड:
अनुसूचियों बंद: पर

नाम: मेरे ट्रेस सत्र 04 \ एम y ट्रेस सत्र 04 प्रकार:
ट्रेस संलग्न: परिपत्र बंद: ओवरराइट बंद:
बंद बफर आकार: 64 बफ़र खोया: 0 बफ़र लिखित: 0 बफर फ्लश टाइमर: 1 घड़ी प्रकार: प्रदर्शन फ़ाइल मोड: वास्तविक समय

प्रदाता: नाम: माइक्रोसॉफ्ट विंडोज NDIS-PacketCapture प्रदाता Guid: {2ED6006E-4729-4609-B423-3EE7BCD678EF} स्तर:
5 (जीत: शब्दाडंबरपूर्ण) KeywordsAll: 0x0 KeywordsAny:
0xffffffffffffffff (Ethernet802। 3, वायरलेस वैन, सुरंग, नटिव ई802.11, पैकेट स्टार्ट, पैकेटएंड, यूटी: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L 2C कनेक्टपैथ, यूटी: क्लोजपैथ, यूटी: प्रमाणीकरण, यूटी: कॉन्फ़िगरेशन, यूटी: ग्लोबल, यूटी: ड्रॉप, यूटी: पीआईपी प्रेजेंट, यूटी: पैकेट, यूटी: एड्रेस, यूटी: स्टडी टेम्पलेटहिंट, यूटी: स्टेट ट्रांजिशन, जीत: रेस पोंसटाइम , माइक्रोसॉफ्ट-विंडोज-एनडीआईएस-पैकेट कैप्चर/डायग्नोस्टिक, 0x2,0x4,0x8,0x10,0x20, 0x40,0x80,0x100,0x400,0x800,0x1000,0x2000,0x4000,0x20000,0x40000,0x80000,0x10000 0,0x200000, 0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000, 0x20000000,0x400000000000,0x800000000000,0x2000000000000,0x4000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000 , 0x2000000000000000,0x4000000000000000) गुण: 0 फ़िल्टर का प्रकार: 0

आदेश सफलतापूर्वक पूरा हुआ।

मैंने लॉगमैन का उपयोग करके मैन्युअल रूप से सत्र शुरू करने का प्रयास किया है और इसे संसाधित करने के लिए इसे कोड में खोलना है, लेकिन यह मेरे लिए भी काम नहीं करता है। मैंने बस एक ईटीएल फाइल को लिखने की कोशिश की है और यह भी काम नहीं करता है। मैंने कोशिश की है कि कई और चीजें हैं लेकिन कुछ भी काम नहीं कर रहा है।

मैं इन्टरनेट पर सब कुछ है कि वास्तविक समय के साथ ETW खपत करना था निगल लिया है (MSDN, गूगल खोज, Stackoverflow, आदि) और मैं नहीं वास्तविक समय ETW घटना की खपत की एक एकल पूर्ण उदाहरण देखा है। सभी उदाहरण ईटीएल फ़ाइल से ईवेंट खपत दिखाते हैं या रिकॉर्ड की गई घटनाओं को ईटीएल फ़ाइल में निर्यात करते हैं, फिर वास्तविक समय की खपत काम करने के लिए कुछ पैरामीटर परिवर्तन करने के लिए कहते हैं। मेरा मानना ​​है कि ऊपर दिए गए कोड परिवर्तनों में मैंने उन परिवर्तनों को प्रतिबिंबित किया है।

मैं 327 कंसोल ऐप बनाने वाले वीएस -2010 एसपी 1 का उपयोग कर विन 7 अल्टीमेट पर हूं। मैंने 64 बिट ऐप बनाने में भी कोई सुधार नहीं किया है।

दो पदों को फोल्डिंग प्रासंगिक हैं लेकिन जब मैंने कोशिश की/लागू किया तो मेरे लिए कोई फर्क नहीं पड़ता। रीयल-टाइम मोड में, कोड सत्र संरचना को संपत्ति संरचना के अंत में कॉपी करता है और लॉग फ़ाइल ऑफसेट को 0 वैसे भी होना चाहिए।मुझे लगता है मैं किसी भी संरेखण मुद्दे हैं नहीं लगता है के रूप में सभी अन्य प्रदाताओं ठीक काम करते हैं:

Windows ETW: Kernel consumer receives no EventCallback or BufferCallback events

मुझे लगता है कि मैं कुछ छोटे और तुच्छ याद कर रहा हूँ और इस करना चाहिए सिर्फ काम करते हैं। मैं किसी भी मदद की सराहना करता हूं।

उत्तर

8

यदि आप आंतरिक रूप से "नेटस्स ट्रेस" आदेशों को देखते हैं तो आप देखेंगे कि वे विभिन्न नेटवर्क इंटरफेस में एक एनडीआईएस हल्के फ़िल्टर ड्राइवर को संलग्न करते हैं। केवल इस फिल्टर संलग्न और सक्रिय के साथ आप इस प्रदाता से घटनाएं प्राप्त करेंगे। इस सुविधा का विवरण अनियंत्रित है और परिवर्तन के अधीन है। नेटस्स ट्रेस कमांड के सभी तर्क nettrace.dll में लागू किए गए हैं जिन्हें आप माइक्रोसॉफ्ट के सार्वजनिक प्रतीकों की सहायता से इंजीनियर को उलट सकते हैं। विशेष रूप से, CInboxCapture क्लास में कोड होता है जो यह निर्धारित करता है कि ड्राइवर शुरू हो गया है या नहीं, इसे उचित नेटवर्क इंटरफेस से जोड़ता है और इसे शुरू करता है। यदि आप कैप्चरिंग फ़िल्टर ड्राइवर को nettrace.dll के तरीके से शुरू करते हैं, तो आपको अपने पैकेट कैप्चर ईवेंट मिलेंगे।

शुभकामनाएं।

+0

हाय, मैं चलाकर इस सत्यापित किया है "netsh का पता लगाने शुरू कब्जा = हाँ" तो मेरे कार्यक्रम चल रहा है। अब मैं एनडीआईएस-पीसी कार्यक्रम प्राप्त कर रहा हूं! हालांकि, मेरे EventRecordCallback फ़ंक्शन में, BYVENT_RECORD संरचना में पारित TdhGetEventInformation कॉल ERROR_NOT_FOUND के साथ हर बार विफल रहा है ... मैं इसके बारे में सब कुछ लिख रहा था लेकिन मैं टिप्पणियों पर चार सीमाओं में भाग गया, जिसका अर्थ है कि मुझे इसके बारे में एक नई पोस्ट बनाना चाहिए। सहायता के लिए धन्यवाद! –

+0

मैंने अभी यह पता लगाया है कि इस पोस्ट के लिए धन्यवाद: http://social.msdn.microsoft.com/Forums/en-US/etw/thread/473ac036-b4a6-464a-9b49-96e11b88c01c/ –

+0

कोई और विचार यह (माइक्रोसॉफ्ट-एनडीआईएस-पैकेट कैप्चर प्रदाता का उपयोग करते समय कोई घटना कॉलबैक नहीं) मैं कोड के इस टुकड़े का उपयोग करने की कोशिश कर रहा हूं https://blogs.msdn.microsoft.com/vancem/2013/03/09/using-traceevent-to-mine -सूचना-इन-os-पंजीकृत-ETW-प्रदाताओं /। बाहरी रूप से नेटस्स ट्रेस शुरू करने का प्रयास किया लेकिन अभी भी कोई आउटपुट नहीं है? –

0

यहाँ एक C++ उदाहरण आवेदन टिप्पणी की है कि एक साथ वास्तविक समय ETW सत्र दर्शाता है पैकेट कैप्चर और कर्नेल घटनाओं के लिए।

https://github.com/packetzero/etwrealtime

0

इसके बजाय netsh का पता लगाने शुरू चलाने का आदि तो आप इस कोशिश कर सकते:

net start ndiscap 

जब netsh का पता लगाने आदि चल रहा यह आप के लिए यह कर देगा, और मुझे लगता है कि हिस्सा यहाँ याद आ रही है , कि लाइटवेट फ़िल्टर ड्राइवर जिसे पैकेट कैप्चर करने के लिए एनडीआई में इंजेक्शन दिया जाता है (यानी ईटीवी प्रदाता) चल रहा है और घटनाओं को उत्सर्जित नहीं कर रहा है।

जब आप समाप्त कर का उपयोग करना बंद कर सकते हैं:

net stop ndiscap 
संबंधित मुद्दे