Tôi đang cố gắng để hoàn thành việc hoàn thành CompleteRequest cho CPU ban đầu đã ban hành yêu cầu. Có cách nào để lấy CPU đã đưa ra yêu cầu trong FdoDeviceControl hoặc bất kỳ cách nào khác để xem yêu cầu đến từ đâu trước khi nó được nhập vào hàng đợi công văn không?Có thể truy xuất CPU đã tạo ra WDFREQUEST không?
Trả lời
Một khi bạn đang ở trong một thói quen DPC quá muộn để cho biết nơi yêu cầu có nguồn gốc. Bạn cần gọi KeGetCurrentProcessorNumberEx() trước khi bạn xếp hàng yêu cầu vào hàng đợi DPC. Tôi cho rằng yêu cầu là một IRP ...?
David, tôi đang sử dụng KMDF để xử lý yêu cầu để IRP được bao bọc trong cấu trúc WDFREQUEST. Tại thời điểm tôi thấy yêu cầu, ha đã được chuyển qua hàng đợi I/O –
Nếu bạn đang sử dụng KMDF thì bạn cần gọi WdfDeviceInitSetIoInCallerContextCallback(). Điều này sẽ cho phép bạn nhìn vào yêu cầu I/O trước khi nó được đặt vào hàng đợi I/O kmdf, bạn sẽ chạy trong ngữ cảnh quá trình của trình khởi tạo I/O và bạn sẽ ở trên lõi khởi tạo I/O O. Từ đó bạn có thể gọi KeGetCurrentProcessorNumberEx() và lưu kết quả. –
Được liệt kê là câu trả lời David, cảm ơn. Trên một lưu ý liên quan, tôi có guarateed rằng EvtDeviceWdmIrpPreprocess cũng được gọi trong ngữ cảnh của máy khách (tôi đang sử dụng hàng đợi tiến độ được đảm bảo, vì vậy tôi cần đảm bảo rằng tôi luôn nhận được cuộc gọi, có vẻ như SetIoInCallerContextCallback doesnt do) –
Lấy CPU sau khi công văn đã xảy ra là tất nhiên đủ đơn giản. Nhưng tôi có đảm bảo rằng chức năng gọi lại chạy trên cùng một lõi như các vấn đề? –