Как установить и запустить драйвер
Я написал простой драйвер, который печатает только "Hello World" для отладки. Я использовал Visual Studio 2012 RC с WDK 8 для создания пустого проекта драйвера и написал следующий код:
#include <NTDDK.h>
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
pRegistryPath = pRegistryPath; //unused
DbgPrint("Hello World!");
pDriverObject->DriverUnload = NULL;
return STATUS_SUCCESS;
}
Я скомпилировал его в win7 x64. Я читал, что для того, чтобы установить и запустить этот драйвер, мне нужно написать файл.inf, но я не могу это исправить. Я взял пример файла.inf из WDK 8 и изменил его, чтобы он соответствовал моему файлу.sys, но он разрушил мою виртуальную коробку win7 x64:-). Поэтому я создаю проект драйвера фильтра в VS2012, взял файл.inf и изменил его, чтобы он соответствовал моему файлу.sys, и когда я его установил, ничто не обнадежило. Я пытался запустить новый сервис, созданный с
net start MyDriver
но ничего не было напечатано в отладке, а также я не вижу MyDriver в Computer->Manage->Services. Я использую DebugView, чтобы увидеть, что напечатано в отладке (http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx).
Конечно, со временем я хотел бы написать драйвер, который действительно что-то делает, но в то же время я просто хочу знать, как его запустить.
INF-файл, который я взял из VS2012 и изменил это:
;;;
;;; MyDriver2
;;;
[Version]
Signature = "$Windows NT$"
; TODO - Change the Class and ClassGuid to match the Load Order Group value, see http://msdn.microsoft.com/en-us/windows/hardware/gg462963
; Class = "ActivityMonitor" ;This is determined by the work this filter driver does
; ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} ;This value is determined by the Load Order Group value
Class = "ActivityMonitor"
ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
Provider = %ManufacturerName%
DriverVer = 08/13/2012,1.0.0.0
;CatalogFile = MyDriver2.cat
[DestinationDirs]
DefaultDestDir = 12
MiniFilter.DriverFiles = 12 ;%windir%\system32\drivers
;;
;; Default install sections
;;
[DefaultInstall]
OptionDesc = %ServiceDescription%
CopyFiles = MiniFilter.DriverFiles
[DefaultInstall.Services]
AddService = %ServiceName%,,MiniFilter.Service
;;
;; Default uninstall sections
;;
[DefaultUninstall]
DelFiles = MiniFilter.DriverFiles
[DefaultUninstall.Services]
DelService = %ServiceName%,0x200 ;Ensure service is stopped before deleting
;
; Services Section
;
[MiniFilter.Service]
DisplayName = %ServiceName%
Description = %ServiceDescription%
ServiceBinary = %12%\%DriverName%.sys ;%windir%\system32\drivers\
Dependencies = "FltMgr"
ServiceType = 2 ;SERVICE_FILE_SYSTEM_DRIVER
StartType = 3 ;SERVICE_DEMAND_START
ErrorControl = 1 ;SERVICE_ERROR_NORMAL
; TODO - Change the Load Order Group value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512
; LoadOrderGroup = "FSFilter Activity Monitor"
LoadOrderGroup = "filter"
AddReg = MiniFilter.AddRegistry
;
; Registry Modifications
;
[MiniFilter.AddRegistry]
HKR,,"DebugFlags",0x00010001 ,0x0
HKR,,"SupportedFeatures",0x00010001,0x3
HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance%
HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude%
HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags%
;
; Copy Files
;
[MiniFilter.DriverFiles]
%DriverName%.sys
[SourceDisksFiles]
MyDriver2.sys = 1,,
[SourceDisksNames]
1 = %DiskId1%,,,
;;
;; String Section
;;
[Strings]
; TODO - Add your manufacturer
ManufacturerName = "Template"
ServiceDescription = "MyDriver2 Mini-Filter Driver"
ServiceName = "MyDriver2"
DriverName = "MyDriver2"
DiskId1 = "MyDriver2 Device Installation Disk"
;Instances specific information.
DefaultInstance = "MyDriver2 Instance"
Instance1.Name = "MyDriver2 Instance"
; TODO - Change the altitude value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512
;Instance1.Altitude = "370030"
Instance.Altitude = "370030"
Instance1.Flags = 0x0 ; Allow all attachments
Когда я попытался использовать wdreg.exe для установки и запуска моего драйвера, он сказал: "Не удалось найти раздел" Производитель "в INF-файле". (из http://www.jungo.com/st/support/documentation/windriver/10.3.0/wdpci_manual.mhtml/dyn_windows.html) Я много читаю о файлах.inf (из какой-то книги Microsoft и множества Google) и я до сих пор не знаю, как исправить мой.inf файл.
Если есть более простой способ управлять моим водителем, я хотел бы услышать об этом. Как только я пойму, как его запустить, отладка реального продукта будет легкой.
Спасибо!
РЕДАКТИРОВАТЬ: я также подписал файл.sys с помощью Переопределения принудительного применения подписи драйверов в тестовом режиме (http://www.ngohq.com/home.php?page=dseo).
2 ответа
Оказалось, что Рохан был прав. Я не смог найти способ увидеть отладочную версию в win7 (ссылка Rohan для Vista), поэтому я просто создал файл.
#include <wdm.h>
#include <Ntstrsafe.h>
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
UNICODE_STRING uniName;
OBJECT_ATTRIBUTES objAttr;
RtlInitUnicodeString(&uniName, L"\\SystemRoot\\example12345.txt");
InitializeObjectAttributes(&objAttr, &uniName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL, NULL);
HANDLE handle;
NTSTATUS ntstatus;
IO_STATUS_BLOCK ioStatusBlock;
// Do not try to perform any file operations at higher IRQL levels.
// Instead, you may use a work item or a system worker thread to perform file operations.
if(KeGetCurrentIrql() != PASSIVE_LEVEL){
return STATUS_INVALID_DEVICE_STATE;
}
ntstatus = ZwCreateFile(&handle,
GENERIC_WRITE,
&objAttr, &ioStatusBlock, NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
CHAR buffer[30];
size_t cb;
if(NT_SUCCESS(ntstatus)) {
ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is a test\r\n");
if(NT_SUCCESS(ntstatus)) {
ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);
if(NT_SUCCESS(ntstatus)) {
ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer, (ULONG)cb, NULL, NULL);
}
}
ZwClose(handle);
}
pRegistryPath = pRegistryPath;
pDriverObject = pDriverObject;
return STATUS_SUCCESS;
}
Я использовал тот же.inf, который написал в своем вопросе, а затем набрал в cmd
net start MyDriver2
и файл example12345.txt был создан в C:/Windows.
Когда вы загружаете / запускаете драйвер, он загружается и функционирует в ядре, поэтому, скорее всего, ваш драйвер загружен. Но DbgPrint
сообщение, которое вы, возможно, не видите, потому что после Vista отладочные сообщения, зарегистрированные с DbgPrint
фильтруются и не отображаются в выводе.
Вы можете сослаться на это, чтобы включить показ DbgPrint
Сообщения. Получение вывода DbgPrint для появления в Vista и позже
Другой способ заключается в использовании DbgPrintEx
с соответствующим компонентом и уровнем.