2010-01-30 20 views
5

Tôi đang cố gắng ghi vào cổng 0x60 và 0x64, không có may mắn.Cách ghi vào cổng I/O trong Windows XP? (Delphi7)

mã Delphi:

procedure PortOut(IOport: WORD; Value: BYTE); assembler; register; 
asm 
    XCHG DX,AX 
    OUT DX,AL 
end; 

Khi gọi PortOut, tôi nhận được một EPrivilege hướng dẫn Privileged ngoại lệ, bởi vì INOUT chỉ có thể thực hiện như Ring0.

Tôi muốn biết cách tôi có thể nhận được đặc quyền Ring0 của tôi một ứng dụng hoặc cách tôi có thể ghi vào cổng 0x60 và 0x64 bằng một số thư viện bên ngoài hiện có.

+0

Tôi đã giải quyết vấn đề nhanh hơn bằng câu trả lời stukelly của; alexandrul cũng đăng một câu trả lời hoàn hảo chức năng. – Tom

+1

Nếu bạn định sử dụng các cổng DLL khác nhau, bạn chưa giải quyết được vấn đề. Bạn chỉ đào sâu hơn vào nó. Tôi thấy rất nhiều BSOD (hoặc bất cứ thứ gì đã thay thế chúng trong Windows 7) trong tương lai của phần mềm của bạn. –

+0

@ttmrichter Trên thực tế, IO.DLL hoạt động cực kỳ tốt (ngoại trừ việc nó chỉ dành cho 32-bit và tác giả cho biết sẽ rất khó để tạo một cái cho x64 và anh ấy không làm phiền). Tôi đã không có bất kỳ vấn đề ở tất cả và mọi người đều hài lòng với kết quả trên Windows 2000, XP và 7. – Tom

Trả lời

6

Có một cái nhìn tại IO.DLL from Geek Hideout.

IO.DLL cho phép cổng liền mạch I/O hoạt động cho Windows 95/98/NT/2000/XP bằng cách sử dụng cùng một thư viện .

Dưới đây là một ví dụ: Parallel Port I/O Using Delphi V 6.0

+0

Tôi gặp lỗi khi chạy, nhưng đã giải quyết nó bằng cách sử dụng http://www.mycockpit.org/forums/showthread.php?15624-Unable-to-extract-IO-SYS-on-XP – Tom

3

Dĩ nhiên mà có thể gây ra rắc rối cho các thiết bị được điều khiển bởi một người lái xe. Những thứ như IO.DLL chủ yếu dành cho các thẻ giao diện mà không có trình điều khiển Windows tồn tại, hoặc nơi trình điều khiển cửa sổ không hoạt động cho đến khi được kích hoạt.

Và vì cổng 60h là bộ điều khiển bàn phím và bàn phím thường được sử dụng, nó có thể gây ra sự cố.

Nếu bạn không giao tiếp phần cứng cổ, nhưng chỉ cố gắng mã cổng dos (TP), tôi khẩn trương khuyên bạn nên viết lại mã đã nói dựa trên các API Windows thông thường.

6

Cách chính xác để xử lý tình huống này là viết trình điều khiển Windows, nhưng không thể thực hiện được ở Delphi vì thiếu sự hỗ trợ. Nó đòi hỏi DDK và trình biên dịch C. Các giải pháp khác được trình bày ở đây hoạt động, nhưng lưu ý rằng thường cung cấp quyền truy cập vào bất kỳ cổng I/O nào, không chỉ những ứng dụng mà ứng dụng của bạn yêu cầu. Và đó có thể là vấn đề bảo mật - nếu kiến ​​trúc x86 cho phép lập trình viên hệ thống xác định IOPL (cấp đặc quyền I/O) và hầu hết các hệ thống đặt nó là vòng 0, có một lý do. Trình điều khiển cổng I/O truy cập chung rất hữu ích cho các thử nghiệm và có thể tạo mẫu hoặc là các biện pháp tạm dừng, nhưng tôi sẽ rất cẩn thận để triển khai chúng, đặc biệt nếu hệ thống không được kiểm soát chặt chẽ. Nếu bạn cần kiểu truy cập đó, bạn chắc chắn cần hiểu cách nhân Windows và trình điều khiển của nó hoạt động như thế nào, và tại sao - và thực hiện trình điều khiển của riêng bạn. Phần lớn thời gian Windows không phải là không an toàn - nó đang chạy với nhiều phần mềm không an toàn với các đặc quyền sai khiến nó trở thành như vậy.

+0

Câu trả lời hay. Điều quan trọng nhất là toàn bộ vòng 0 là có trình điều khiển để điều phối và/hoặc không cho phép truy cập I/O từ nhiều tiến trình hoặc thậm chí là chuỗi. Muốn truy cập trực tiếp vào các cổng là một dấu hiệu vẫn còn suy nghĩ trong điều khoản DOS - nó không phải là một ý tưởng thần ngay cả dưới 16 bit Windows (với nhiều ứng dụng đồng thời có thể). – mghie

0

Jeez,

Đã lâu rồi. Tôi vừa mới phát hành DPro 2006 để xem VCL về điều này và nó đã bị đánh bom. (Đoán đó là những gì tôi nhận được không làm bất kỳ mã Delphi trong vài năm qua trên máy này ...và cập nhật bản vá, cộng với cài đặt/gỡ cài đặt một nghìn gói trả phí và FOSS khác trên hộp ....)

Nhưng có vẻ như nếu bạn lấy các tệp tiêu đề cho Khung điều khiển Windows hoặc kiểm tra trang web của Dự án JEDI, bạn có thể tìm thấy một cái gì đó để đặt cùng một trình điều khiển Miniport hoặc như vậy.

Chỉ cần tôi $ 0.02 giá trị

/s/BezantSoft

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