2011-01-30 39 views
7

Tôi đang chơi về với một trong các ví dụ trình điều khiển hạt nhân trong Win7 DDK. Tôi có thể sửa đổi biên dịch và xây dựng tệp * .sys của tôi. Tôi có thể cài đặt nó với INF của nó (bằng cách sử dụng trình quản lý thiết bị hoặc devcon) hoặc sử dụng trình quản lý điều khiển dịch vụ trực tiếp. Khi tôi thực hiện thay đổi tiếp theo và tạo một tập tin * .sys cập nhật, tôi dường như nhận được một cuộc xung đột giữa tập tin mới này và trình điều khiển đã dừng lại của tôi (tôi đã thử sử dụng Servcie Control Manager 'stop' và 'delete service' etc). Nếu tôi khởi động lại, tôi có thể cài đặt trình điều khiển mới và chạy nó tốt. Tương tự, nếu tôi chọn gỡ cài đặt trong Trình quản lý thiết bị, Windows sẽ nhắc tôi khởi động lại.Có thể gỡ bỏ trình điều khiển hạt nhân mà không cần khởi động lại không?

Vì vậy, làm cách nào để dễ dàng kiểm tra các sửa đổi gia tăng cho trình điều khiển kernal một cách dễ dàng? Cảm ơn

+0

Nói chung, có, điều này là có thể, ít nhất là khi bạn cài đặt trình điều khiển thông qua các chức năng API. Không chắc chắn nếu nó có thể với các trình điều khiển được cài đặt bằng cách sử dụng tập tin INF. –

Trả lời

4

Nhìn vào các bản ghi cài đặt API có thể là một nơi tốt để bắt đầu: http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

Nếu devcon nhắc nhở để khởi động lại, bạn có thể nhìn vào các mã trong DDK, gỡ lỗi tại sao nó hỏi và thâm nhập vào các vấn đề mà cũng vậy.

+0

@ J.Strouse: Điều đó có thể hữu ích, cảm ơn. –

3

Có. sc stop <driver name> nên dừng trình điều khiển của bạn. Nếu trình điều khiển của bạn được liên kết với một devnode PnP cụ thể, nó sẽ được giải phóng sau khi xóa bỏ mã devnode.

+0

@Larry: Nó không liên kết và nó không - nó chỉ là một tập hợp đơn giản của IOTCRL. –

+0

Câu hỏi ngớ ngẩn: bạn đã đặt điểm truy cập tải xuống trình điều khiển trong công văn của trình điều khiển chưa? –

3

Nếu bạn muốn có thể gỡ bỏ trình điều khiển, bạn phải thiết lập một chức năng cơ bản thực hiện mỗi khi trình điều khiển được tải xuống - rất có thể bạn sẽ đặt mã để giải phóng bộ đệm được phân bổ và bất kỳ tài nguyên nào khác có thể "sống "trong suốt vòng đời của người lái xe. Dưới đây là một ví dụ mã:

VOID Unload(IN PDRIVER_OBJECT pDriverObject) { 
       //do whatever you like here 
       //this deletes the device 
     IoDeleteDevice(pDriverObject->DeviceObject); 


    return; 
} 

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING regPath) { 


    //initialize your driver and the major function array 

//set the unload function 
    pDriverObject->DriverUnload = &Unload; 
} 
1

Hãy thử biên dịch, ký kết, và tải mã này:

#include <ntddk.h>  
VOID OnUnload(IN PDRIVER_OBJECT driverObjectA) { 
    DbgPrint("Unload\n"); 
} 
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObjectA, PUNICODE_STRING RegistryPath){ 
    DbgPrint("DriverEntry\n"); 
    driverObjectA->DriverUnload = OnUnload; 
return STATUS_SUCCESS; 
} 

Sau đó tải DebugView, giải nén nó, chạy nó as administrator, và sau đó "Chụp Kernel" dưới Mục menu "Capture". Tải xuống, giải nén và chạy OSR Driver Loader, đăng ký trình điều khiển, "Dịch vụ bắt đầu". Bạn sẽ thấy một thông điệp tường trình "DriverEntry" trong DbgView. Bây giờ trong bộ tải trình điều khiển OSR, "Dừng dịch vụ" và quan sát một thông báo Unload. Hy vọng rằng sẽ giúp bạn đi.

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