2012-02-27 25 views
8

Câu hỏi lớn hơn là cách sử dụng các sự kiện ngăn xếp mạng ETW theo thời gian thực nói chung nhưng tôi đặc biệt quan tâm đến nhà cung cấp Microsoft-Windows-NDIS-PacketCapture. Tất cả các nhà cung cấp ngăn xếp mạng khác hoạt động một phần nhưng NDIS-PacketCapture (NDIS-PC) không hoạt động chút nào vì vậy đây có lẽ là câu hỏi đơn giản nhất tôi có thể hỏi ở đây.Làm thế nào để tiêu thụ các sự kiện ETW thời gian thực từ nhà cung cấp Microsoft-Windows-NDIS-PacketCapture?

Tôi đang sử dụng đoạn mã sau như là cơ sở và sửa đổi rất ít cho nó hoạt động trong thời gian thực: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85).aspx

thay đổi tôi đã thực hiện là:

  1. Gọi StartTrace để bắt đầu phiên NDIS-PC trước khi thực hiện bất cứ điều gì khác. Trong thuộc tính struct EVENT_TRACE_PROPERTIES, thiết lập LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, và Wnode.Guid = một cái gì đó ngẫu nhiên GUID mà tôi tạo ra.

  2. tình trạng Calling = EnableTraceEx2 (hSession, & Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL); trong đó hSession là phiên bắt đầu sử dụng StartTrace và và Current_Guid là

    {0x2ED6006E, 0x4729,0x4609, {0xB4,0x23,0x78E, 0xE7,0xBC, 0xD6,0x78,0xEF}};

  3. Sau đó gọi OpenTrace bằng LoggerName = một số chuỗi rộng, LogFileName = NULL và LogFileMode = EVENT_TRACE_REAL_TIME_MODE;

  4. Cuối cùng gọi ProcessTrace trên thanh công cụ theo dõi vừa được mở ở trên.

  5. Một lần nữa, để lại mọi thứ khác giống như được cung cấp trong ví dụ MSDN

Sử dụng mã giống hệt với một sự thay đổi duy nhất của nhà cung cấp để bất cứ điều gì khác như Microsoft-Windows-Winsock-AFD hoặc Microsoft-Windows-TCPIP giúp tôi gọi số vào cuộc gọi lại bản ghi mà tôi đã xác định (Tuy nhiên, tôi vẫn không thể truy xuất thuộc tính nhưng tôi sẽ không nghiên cứu sâu hơn để giữ cho prob này đơn giản nhất có thể) . Khi tôi sử dụng NDIS-PC, tôi nhận được 0 cuộc gọi lại. Tôi đã thử xả bằng tay bằng cách sử dụng ControlTrace mà không có bất kỳ thành công. Tôi cũng đã cố gắng xác định "EventCallback" thay vì "EventRecordCallback" mà không thành công.

Tôi đã xem xét TẤT CẢ các cấu trúc dữ liệu liên quan đến quá trình này và so sánh giữa mỗi nhà cung cấp và tất cả đều trông chính xác và giống nhau. Tôi đã xem xét tất cả các giá trị trả về từ các hàm và các cấu trúc dữ liệu được trả về và chúng cũng giống nhau giữa các nhà cung cấp mà tôi đã thử.

Tôi đã xem xét các thuộc tính phiên bằng cách gọi "logman "My vết phiên 04" -ets" và có vẻ giống hệt nhau cho NDIS-PC và TCPIP:

C: \ windows \ system32> logman "My vết phiên 04" -ets

Tên: My vết phiên 04 Tình trạng:
Chạy gốc Đường dẫn:% systemDrive% \ PerfLogs \ Admin Segment:
Tắt Lịch: Trên

Tên: My vết phiên 04 \ M y Dấu vết phiên 04 Loại:
vết Nối: Tắt Thông tư: Tắt Overwrite:
Tắt Buffer Size: 64 Buffers Lost: 0 Buffers viết: 0 Buffer Flush Timer: 1 Clock Loại: Chế độ Performance File: thời gian thực

Provider: Tên: Microsoft-Windows-NDIS-PacketCapture Provider Guid: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Level:
5 (thắng: Verbose) KeywordsAll: 0x0 KeywordsAny:
0xffffffffffffffff (Ethernet802. 3, WirelessWAN, Đường hầm, Nativ e802.11, Gói, Bắt đầu, Gói, ut: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L 2C onnectPath, ut: ClosePath, ut: Xác thực, ut: Cấu hình, ut: Toàn cục, ut: Đã bỏ, ut: PiiSẵn, ut: Gói, ut: Địa chỉ, ut: StdTemplateHint, ut: StateTransition, giành chiến thắng: Res ponseTime , Microsoft-Windows-NDIS-PacketCapture/Chẩn đoán, 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 Loại Bộ lọc: 0

Lệnh đã hoàn tất thành công.

Tôi cũng đã thử bắt đầu các phiên theo cách thủ công bằng cách sử dụng trình đăng nhập và chỉ mở nó trong mã để xử lý nhưng điều đó cũng không hiệu quả đối với tôi. Tôi cũng đã cố gắng để chỉ viết vào một tập tin ETL và điều đó không hoạt động hoặc. Có nhiều thứ tôi đã thử nhưng không có gì làm việc cả.

Tôi đã nuốt tất cả mọi thứ trên Internets mà phải làm với thời gian thực ETW tiêu thụ (MSDN, Google tìm kiếm, Stackoverflow, vv) và tôi đã không nhìn thấy một ví dụ hoàn chỉnh của thời gian thực ETW sự kiện consumptions. Tất cả các ví dụ cho thấy sự kiện tiêu thụ từ một tập tin ETL hoặc xuất khẩu các sự kiện ghi lại vào một tập tin ETL sau đó chỉ nói để thực hiện một vài thay đổi tham số để có được tiêu thụ thời gian thực làm việc. Tôi tin rằng những thay đổi mã tôi tóm tắt ở trên phản ánh những thay đổi đó.

Tôi đang sử dụng Win7 Ultimate bằng cách sử dụng VS2010 SP1 tạo ứng dụng giao diện điều khiển 32 bit. Tôi cũng đã thử tạo ứng dụng 64 bit mà không cần cải thiện.

Follwing hai bài đăng có liên quan nhưng không tạo ra bất kỳ sự khác biệt nào đối với tôi khi tôi cố gắng/thi hành. Trong chế độ thời gian thực, mã sao chép tên phiên vào cuối thuộc tính struct và tệp log offset cần phải là 0.Tôi không nghĩ rằng tôi có bất cứ vấn đề liên kết như tất cả các nhà cung cấp khác chỉ làm việc tốt:

Windows ETW: Kernel consumer receives no EventCallback or BufferCallback events

tôi cảm thấy như tôi là thiếu một cái gì đó nhỏ và tầm thường và điều này nên chỉ làm việc. Tôi đánh giá cao sự giúp đỡ nào.

Trả lời

8

Nếu bạn nhìn vào các lệnh "netsh trace" trong nội bộ, bạn sẽ thấy chúng đính kèm trình điều khiển bộ lọc nhẹ NDIS vào các giao diện mạng khác nhau. Chỉ với bộ lọc này được đính kèm và kích hoạt, bạn sẽ nhận được sự kiện từ nhà cung cấp này. Các chi tiết của cơ sở này không có giấy tờ và có thể thay đổi. Tất cả các logic của lệnh netsh trace được thực hiện trong nettrace.dll mà bạn có thể đảo ngược kỹ sư với sự hỗ trợ của các biểu tượng công cộng của Microsoft. Cụ thể, lớp CInboxCapture có mã xác định xem trình điều khiển đã được khởi động hay chưa, liên kết nó với các giao diện mạng thích hợp và khởi động nó. Nếu bạn bắt đầu trình điều khiển bộ lọc chụp theo cách nettrace.dll, bạn sẽ nhận được các sự kiện chụp gói của bạn.

Chúc may mắn.

+0

Hi, tôi đã xác minh điều này bằng cách chạy "netsh trace chụp bắt đầu = yes", sau đó chạy chương trình của tôi. Tôi hiện đang nhận các sự kiện NDIS-PC! Tuy nhiên, trong chức năng EventRecordCallback của tôi, lệnh gọi TdhGetEventInformation trên cấu trúc PEVENT_RECORD được truyền vào là không thành công mỗi lần với ERROR_NOT_FOUND ... Tôi đã viết tất cả về nó nhưng tôi chạy vào giới hạn char đối với các chú thích có nghĩa là tôi nên tạo một bài đăng mới về nó. Cảm ơn đã giúp đỡ! –

+0

Tôi cũng chỉ ra điều này nhờ bài đăng này: http://social.msdn.microsoft.com/Forums/en-US/etw/thread/473ac036-b4a6-464a-9b49-96e11b88c01c/ –

+0

Mọi ý tưởng khác về này (Không có sự kiện gọi lại khi sử dụng Microsoft-NDIS-PacketCapture Provider) Tôi đang cố gắng sử dụng đoạn mã này https://blogs.msdn.microsoft.com/vancem/2013/03/09/using-traceevent-to-mine -information-in-os-registered-etw-providers /. Đã cố gắng bắt đầu theo dõi netsh bên ngoài nhưng vẫn không có đầu ra? –

0

Dưới đây là một nhận xét C++ ứng dụng ví dụ thể hiện đồng thời thời gian thực phiên ETW cho các sự kiện chụp gói và hạt nhân.

https://github.com/packetzero/etwrealtime

0

Thay vì chạy netsh trace bắt đầu vv bạn có thể thử này:

net start ndiscap 

Khi chạy netsh trace vv nó sẽ làm việc này cho bạn, và tôi nghĩ rằng đó là phần còn thiếu ở đây , rằng trình điều khiển bộ lọc nhẹ được đưa vào ndis để nắm bắt các gói (tức là nhà cung cấp dịch vụ mạng) không chạy và phát ra các sự kiện.

Khi bạn hoàn tất, bạn có thể ngăn chặn nó bằng cách sử:

net stop ndiscap 
Các vấn đề liên quan