2008-08-22 29 views
7

Tôi có thư viện đọc/ghi vào thiết bị USB bằng API CreateFile(). Thiết bị này xảy ra để thực hiện cấu hình thiết bị HID, sao cho nó tương thích với trình điều khiển lớp HID của Microsoft.Tìm hiểu quy trình nào có khóa độc quyền trên thiết bị USB xử lý

Một số ứng dụng khác được cài đặt trên hệ thống đang mở thiết bị ở chế độ đọc/ghi không có chế độ chia sẻ. Điều này ngăn cản thư viện của tôi (và bất kỳ thứ gì tiêu thụ nó) khi làm việc với thiết bị. Tôi cho rằng đó là chà với một thiết bị tương thích với HID - phần mềm trình điều khiển khác (chuột, bộ điều khiển, PHIDGETS, vv) có thể không hợp tác.

Dù sao, đường dẫn tập tin thiết bị có dạng:

 
1: "\\?\hid#hpqremhiddevice&col01#5&21ff20e7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}". 

2: "\\?\hid#vid_045e&pid_0023#7&34aa9ece&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}". 

3: "\?\hid#vid_056a&pid_00b0&col01#6&5b05f29&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}". 

Và tôi đang cố gắng để mở nó bằng mã, như:

// First, open it with minimum permissions, this device may not be ours. 
// we'll re-open it later in read/write 
hid_device_ref = CreateFile(
    device_path, GENERIC_READ, 
    0, NULL, OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, NULL); 

Tôi đã được coi là một công cụ như FileMon hoặc Process Monitor từ SysInternals. Nhưng tôi không thể có được nó để báo cáo việc sử dụng trên các tập tin thiết bị xử lý như một trong những liệt kê ở trên.

Trả lời

1

Đây là những gì tôi sử dụng để đọc từ một đầu đọc thẻ Magtek:

//Open file on the device 
deviceHandle = 
    CreateFile (deviceDetail->DevicePath, 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, 0, NULL); 

Hãy thử những tùy chọn và xem nếu bạn ít nhất có thể đọc từ thiết bị.

Tôi hiểu nỗi đau của bạn ở đây ... Tôi tìm thấy tài liệu USB HID về cơ bản là sai ở một số nơi.

[Chỉnh sửa] Không có nhiều vấn đề ở đây. Dưới đây là một số codeproject link chạm nhẹ vào đối tượng trong một chuỗi ở dưới cùng. Âm thanh như có thể nếu đó là một cửa sổ bàn phím hoặc chuột lấy nó độc quyền.

0

Tuyệt vời - Tôi sẽ thử các tùy chọn đó, vì chúng có thể là mặc định tốt hơn cho ý định của tôi. Thật không may, tôi biết thiết bị của tôi là có và cuối cùng tôi sẽ cần truy cập đọc/ghi sau này (một khi tôi kiểm tra các descriptors và đã xác minh nó là infact thiết bị của tôi).

Điều đó có nghĩa là mục tiêu thực sự của tôi là biết những gì đang sử dụng nó, vì vậy tôi có thể thông báo cho khách hàng/người dùng: "Hey man, 'iexplore.exe' hiện đang sử dụng thiết bị SuperWidget của bạn. Bạn sẽ phải đóng để sử dụng ứng dụng SuperWidget. " (. Nếu không phải ở cấp ứng dụng, sau đó ít nhất là ở mức độ hỗ trợ điện thoại)

tôi quên đề cập đến rằng lỗi cửa sổ báo cáo của GetLastError() là:

0x20. Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một tiến trình khác.

(Vì vậy, các lựa chọn chia sẻ của bạn có thể sẽ mở tệp, giả sử không có FILE_SHARE_NONE thay mặt cho quá trình khác).

[sửa]

Yeah, đó là đau đớn chứ. Tôi đã thấy những con chuột và bàn phím bị khóa bởi bất cứ điều gì Windows sử dụng để đọc từ chúng. Tôi cũng đã nhìn thấy rất nhiều người gặp rắc rối bên trong một máy ảo như Paralells trên OS X, nơi trình điều khiển lớp HID có thiết bị mở độc quyền ngăn máy ảo sử dụng các yêu cầu USB tiêu chuẩn.

Tôi đã thấy một số mã tạo lại những gì ProcessMonitor thực hiện. Có lẽ SysInternals chỉ chọn bỏ qua các tay cầm thiết bị, nhưng phương pháp tương tự (hoặc một biến thể nhỏ) có thể được sử dụng ở đây để xác định PID.

Mike

+0

Điều này những gì bạn cần: [Kiểm tra thông tin về các nguyên tắc cấp hệ thống Windows NT] (http://www.codeguru.com/cpp/wp/system/processesmodules/article.php/c2827/Examine-Information-on- Windows-NT-System-Primitive.htm) –

4

Bạn đã thử các công cụ gọi là handle từ Sysinternals?

Dù sao, không có cửa sổ nào thực hiện điều này (hiển thị tên của ứng dụng đã khóa thiết bị): khi bạn thử đẩy thiết bị USB, Windows chỉ cho biết thiết bị hiện đang được sử dụng và không thể xóa ngay bây giờ.

1

Có một mẹo bạn có thể thực hiện khi mở trình xử lý thiết bị yêu cầu không đọc hoặc viết quyền và tương tác với nó chỉ sử dụng báo cáo tính năng. Jan Axelson đề cập đến mẹo này trong sách của cô về thiết bị USB HID. Tôi tin rằng điều này xung quanh vấn đề với khóa độc quyền, mà bạn sẽ gặp phải (ví dụ) khi cố gắng mở một xử lý cho một thiết bị Windows xem xét một bàn phím hệ thống hoặc chuột. Mặc dù bạn không thể đọc hoặc viết tay cầm, bạn vẫn có thể gửi báo cáo tính năng tới thiết bị bằng cách sử dụng HidD_SetFeature và đọc báo cáo từ thiết bị bằng cách sử dụng HidD_GetFeature. Tôi không biết cách đọc báo cáo đầu vào hoặc gửi báo cáo đầu ra trong những trường hợp này, và có lẽ không thể làm như vậy, nhưng bạn có thể không cần một trong số đó, đặc biệt nếu thiết bị là thiết bị "của bạn" theo nghĩa bạn kiểm soát phần mềm. Nghiêm túc nói điều này không có gì để trả lời câu hỏi của bạn như được hỏi, nhưng nó dường như có khả năng liên quan vì vậy tôi figured tôi muốn ném nó ra khỏi đó.

Các vấn đề liên quan