Những thao tác bên trong điều khiển IO (internal IO control operations)

12 151 0
Những thao tác bên trong điều khiển IO (internal IO control operations)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Những thao tác bên điều khiển IO (Internal IO Control Operations) Những thao tác bên điều khiển IO (Internal IO Control Operations) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Hệ thống sử dụng IRP_MJ_DEVICE_CONTROL để thực gọi DeviceIoControl từ kiểu người sử dụng Những trình điều khiển cần nói chuyện với nhau, họ sử dụng IRP_MJ_INTERNAL_DEVICE_CONTROL liên quan để làm Một chuỗi mã tiêu biểu Đi theo Như sau: ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); KEVENT event; KeInitializeEvent(&event, NotificationEvent, FALSE); IO_STATUS_BLOCK iostatus; PIRP Irp = IoBuildDeviceIoControlRequest(IoControlCode, DeviceObject, pInBuffer, cbInBuffer, pOutBuffer, cbOutBuffer, TRUE, &event, &iostatus); NTSTATUS status = IoCallDriver(DeviceObject, Irp); if (NT_SUCCESS(status)) KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); The IoControlCode argument to IoBuildDeviceIoControlRequest mã điều khiển biểu thị thao tác bạn muốn điều khiển thiết bị đích thực Mã 1/12 Những thao tác bên điều khiển IO (Internal IO Control Operations) loại mã Bạn sử dụng với thao tác điều khiển bình thường.DeviceObject trỏ tới DEVICE_OBJECT mà có trình điều khiển thực báo thao tác Đầu vào tham số đệm phục vụ mục đích với họ gọi DeviceIoControl kiểu người sử dụng Đối số(thứ) bảy, mà Tôi rõ TRUE đoạn này, bạn xây dựng thao tác điều khiển (phép toán kiểm tra) bên (Bạn nói FALSE để tạo IRP_MJ_DEVICE_CONTROL thay vào đó.) Tôi mô tả mục đích (của) kiện đối sốiostatus mẩu IoBuildDeviceIoControlRequest builds an IRP khởi tạo định vị (vị trí) chồng để mô tả mã tác vụ đệm bạn rõ Nó trả lại trỏ IRP cho bạn để bạn làm khởi tạo bổ sung mà có lẽ yêu cầu Trong Chương 12, chẳng hạn, Tôi bạn để sử dụng yêu cầu kiểm soát nội để gợi ý khối yêu cầu USB (URB) tới trình điều khiển USB Một phần mà trình bao gồm đặt lĩnh vực tham số chồng tới điểm tới URB Bạn gọi IoCallDriver để gửi IRP cho thiết bị đích Nếu giá trị trở lại qua thử NT_SUCCESS, bạn đợi đối tượng kiện bạn rõ đối số(thứ) tám Tới IoBuildDeviceIoControlRequest The I/O Manager đặt kiện kết thúc IRP, điền vào cấu trúc iostatus (của) bạn với tình trạng cuối thông tin giá trị Cuối gọi IoFreeIrp để giải phóng IRP Vậy thì, Bạn không muốn truy nhập trỏ IRP chút sau bạn gọi IoCallDriver Sẽ ý tưởng tốt sử dụng liên lạc thường lệ (cho) điều khiển bên ngoài, nhân tiện, việc kiểm tra mã chức (của) IRP ví dụ không: Giả thiết trình điều khiển (của) bạn có giao diện điều khiển mà cho phép ứng dụng để hỏi giao diện kiểm soát nội số lưphaanjboj phận điều khiển (của) phiên mà cho phép người gọi kiểu nhân tin cẩn xác định bí mật sống mà bạn không muốn chia sẻ với người sử dụng- chương trình kiểu Rồi giả thiết bạn sử dụng thủ tục để xử lý hai giao diện, ví dụ này: NTSTATUS DriverEntry( ) { DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = DispatchControl; 2/12 Những thao tác bên điều khiển IO (Internal IO Control Operations) } NTSTATUS DispatchControl( ) { switch (code) { case IOCTL_GET_VERSION: case IOCTL_INTERNAL_GET_SECRET: // AssociatedIrp.SystemBuffer; PKEVENT pevent; NTSTATUS status = ObReferenceObjectByHandle(hEvent, EVENT_MODIFY_STATE, *ExEventObjectType, Irp->RequestorMode, (PVOID*) &pevent, NULL); ObReferenceObjectByHandle xem hEvent bảng ô điều khiển (cho) trình thời cất giữ địa (của) đối tượng nhân có liên hệ biến pevent Nếu RequestorMode IRP UserMode, chức kiểm tra hEvent thật ô điều khiển tới đó, mà đối tượng kiện, ô điều khiển mở cách mà bao gồm đặc quyền EVENT_MODIFY_STATE Bất mà bạn yêu cầu đối tượng quản lý viên giải ô điều khiển thu từ kiểu người sử dụng, truy nhập yêu cầu kiểm tra kiểu việc báo UserMode (cho) đối sốkiểu accessor tới đối tượng quản lý viên vận hành bạn gọi (hướng tới) Rốt cuộc, số bạn có từ người sử dụng kiểu Có lẽ không ô điều khiển nào, Có lẽ ô điều khiển tới kiểu khác (của) đối tượng Ngoài ra, tránh chức undocumented ZwSetEvent Trong mệnh lệnh để tạo lỗ an ninh sau đây: dù bạn chắn ô điều khiển ngẫu nhiên (cho) đối tượng kiện, người gọi kiểu người sử dụng (của) bạn đóng ô điều khiển nhận sau ô điều khiển số (cho) kiểu khác đối tượng Bạn không cố ý gây xấu xảy bạn người gọi tin cẩn (của) ZwSetEvent ứng dụng đợi kiện để xảy ra: WaitForSingleObject(hEvent, INFINITE); 4/12 Những thao tác bên điều khiển IO (Internal IO Control Operations) The driver signals the event in the usual way: KeSetEvent(pevent, EVENT_INCREMENT, FALSE); Dần dần, ứng dụng dọn lên việc gọi CloseHandle Trình điều khiển có tham khảo riêng biệt tới đối tượng kiện, mà phải giải phóng việc gọi ObDereferenceObject Đối tượng quản lý viên không phá hủy đối tượng kiện hai thứ xuất Using a Pending IOCTL for Notification ý tưởng trung tâm phương pháp thông báo IOCTL xem xét ứng dụng muốn nhận thông báo kiện từ trình điều khiển, gọiDeviceIoControl: HANDLE hDevice = CreateFile("\\\\.\\", ); BOOL okay = DeviceIoControl(hDevice, IOCTL_WAIT_NOTIFY, ); (IOCTL_WAIT_NOTIFY, nhân tiện, mã điều khiển Tôi dùng mẫu NOTIFY nội dung hướng dẫn.) Trình điều khiển chưa định IOCTL hoàn thành sau Nếu xem xét khác không xâm nhập mã trình điều khiển có lẽ đơn giản điều này: NTSTATUS DispatchControl( ) { switch (code) { case IOCTL_WAIT_NOTIFY: IoMarkIrpPending(Irp); pdx->NotifyIrp = Irp; return STATUS_PENDING; } 5/12 Những thao tác bên điều khiển IO (Internal IO Control Operations) } VOID OnInterestingEvent( ) { CompleteRequest(pdx->NotifyIrp, STATUS_SUCCESS, 0); // [...]... trình điều khiển cleanup Tôi đã tranh luận về việc đọc và viết những thao tác Cuối cùng, nó bao gồm một chức năng giúp đỡ AbortPendingIoctls trong việc sử dụng tại thời gian ngắt điện hay thời gian di chuyển bất ngờ, như sau: VOID AbortPendingIoctls(PDEVICE_EXTENSION pdx, NTSTATUS status) { 11/12 Những thao tác bên trong điều khiển IO (Internal IO Control Operations) InterlockedExchange(&pdx->IoctlAbortStatus,.. .Những thao tác bên trong điều khiển IO (Internal IO Control Operations) return Irp; } 1 Chúng tôi sử dụng một sự khóa quay tròn bảo vệ danh sách (của) IOCTLs đang xem xét và cũng để bảo vệ tất cả các ổ con trỏ mà được dự trữ trỏ vào thể hiện hiện thời của mỗi yêu cầu kiểu IOCTL không đồng bộ khác nhau 2 Điều này là nơi chúng ta Giám sát việc thi hành... có điều là Chúng tôi không có vùng nhớ đệm IRP của chúng tôi, chúng tôi không muốn nó cancelled bất kỳ (cái) nào nữa Nếu IoSetCancelRoutine trả lại NULL ,tuy nhiên, chúng tôi biết IRP này hiện thời trong quá trình (của) cancelled.Chúng tôi trả lại một con trỏ NULLIRP trong trường hợp đó NOTIFY cũng Có một trình điều khiển IRP_MJ_CLEANUP về việc xem xét IOCTLs mà trông thì chỉ giống như những trình điều. .. _Trình điều khiển có lẽ đã có vài kiểu những sự kiện mà thúc đẩy thông báo Bạn đã có thể quyết định thỏa thuận Với chúng bằng cách sử dụng một mã IOCTL đơn, trong trường hợp nào bạn chỉ báo những mã IOCTL kiểu sự kiện bởi loại nào đó (của) dữ liệu ra, hay bằng cách sử dụng nhiều _Bạn có lẽ đã muốn cho phép nhiều luồng đăng ký (cho) sự kiện Nếu mà trường hợp, bạn chắc chắn có một con trỏ IRP đơn trong. .. một thời điểm.) _Sự liên lạc IOCTL (của) Các bạn thường lệ có trong một cuộc đua với hoạt động mà phát sinh những sự kiện Chẳng hạn, trong mẫu USBINT Tôi tranh luận trong Chương 12, chúng tôi có một cuộc đua tiềm tàng giữa thủ tục liên lạc IOCTL và pseudointerrupt thường lệ mà dịch vụ một ngắt endpoint trên một thiết bị USB Tới việc tránh mất những sự kiện hay cầm lấy những hoạt động mâu thuẫn, bạn... DispatchControl (của) chúng ta, chúng tôi cần gọi là IoMarkIrpPending 6 Chúng tôi cần có một cách tới NULL ở ngoài ổ con trỏ bộ đệm khi Chúng tôi hủy bỏ IRP Từ đó ở đó không có cách để có một tham số văn cảnh chuyển cho sự hủy bỏ thường lệ (của) chúng ta , Tôi quyết định kết nạp một trong những lĩnh vực DriverContext trong IRP để giữ một con trỏ tới ổ con trỏ bộ đệm 7 Trong khóa học bình thường (của) những. .. CleanupControlRequests(pdx, status, NULL); } CleanupControlRequests là trình điều khiển IRP_MJ_CLEANUP Tôi viết nó theo một cách mà nó hủy bỏ tất cả IRPs đáng chú ý nếu đối sốthứ ba-bình thường một con trỏ đối tượng tệp tin –là NULL NOTIFY hơi quá đơn giản để được dùng làm một mô hình đầy đủ (cho) một trình điều khiển thế giới- thực sự.Ở đây là một số sự xem xét bổ sung (cho) bạn để tham khảo trong. .. (của) sự kiện Nếu bạn chỉ sử dụng một kiểu đơn của IOCTL (cho) tất cả các thông báo, một cách kiểm tra là để chúng xếp hàng trên PendingIoctlList được chỉ ra trước đó Rồi, khi một sự kiện xuất hiện, bạn thực hiện một vòng mà trong đó bạn gọi ExInterlockedRemoveHeadList và IoCompleteRequestto làm trống rỗng danh sách đang xem xét (Tôi tránh sự phức tạp này trong NOTIFY bởi mệnh lệnh-Tôi quyết định Tôi chỉ... (thì) nổi bật tại một thời gian 3 Điều này nếu sự phát biểu điều tiết thực tế mà chúng tôi có thể cần bắt đầu bỏ quên đầu vào IRPs tại điểm nào đó bởi vì PnP hay những sự kiện sức mạnh 4 Từ đó Chúng tôi nối vào cuối đuôi IRP này cái gì có lẽ đã là một thời gian dài, chúng tôi cần phải có một sự hủy bỏ thường lệ (cho) nó Tôi bàn luận lôgic hủy bỏ rất nhiều thời gian trong sách này mà Tôi cảm thấy chắc... thiết bị USB Tới việc tránh mất những sự kiện hay cầm lấy những hoạt động mâu thuẫn, bạn cần một sự khóa quay tròn Tham chiếu tới mẫu USBINT trong nội dung (cho) một sự minh họa của việc sử dụng sự khóa quay tròn như thế nào phù hợp (Đồng bộ hóa không chảy ra trong NOTIFY bởi vì bằng thời gian một con người (thì) có thể thực hiện nhấn phím mà thả sự kiện báo hiệu, yêu cầu thông báo gần như chắc chắn .. .Những thao tác bên điều khiển IO (Internal IO Control Operations) loại mã Bạn sử dụng với thao tác điều khiển bình thường.DeviceObject trỏ tới DEVICE_OBJECT mà có trình điều khiển thực báo thao. .. DriverObject->MajorFunction[IRP_MJ_DEVICE _CONTROL] = DispatchControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE _CONTROL] = DispatchControl; 2/12 Những thao tác bên điều khiển IO (Internal IO Control Operations). .. lập trình để gọi IOCTL cửa sau phận điều khiển Trong sống thực sự, biến cố phần cứng thực tế phát sinh kiện 3/12 Những thao tác bên điều khiển IO (Internal IO Control Operations) Sự gọi tới CreateEvent

Ngày đăng: 31/12/2015, 22:26

Mục lục

  • Những thao tác bên trong điều khiển IO (Internal IO Control Operations)

  • Using a Shared Event for Notification

  • How the Helper Routines Work

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan